mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-08-04 08:27:48 +00:00
linux:
- update to linux-2.6.34-rc7 (breaks build, needs changing of kernel configuration)
This commit is contained in:
parent
7adaa3a8d5
commit
59ab047c43
@ -1,14 +1,14 @@
|
|||||||
Index: linux-2.6.16/init/main.c
|
diff -Naur linux-2.6.34-rc7/init/main.c linux-2.6.34-rc7.patch/init/main.c
|
||||||
===================================================================
|
--- linux-2.6.34-rc7/init/main.c 2010-05-10 03:36:28.000000000 +0200
|
||||||
--- linux-2.6.16.orig/init/main.c 2006-03-20 06:53:29.000000000 +0100
|
+++ linux-2.6.34-rc7.patch/init/main.c 2010-05-15 12:28:34.767241760 +0200
|
||||||
+++ linux-2.6.16/init/main.c 2006-03-20 18:42:46.000000000 +0100
|
@@ -886,8 +886,14 @@
|
||||||
@@ -710,8 +712,13 @@
|
do_basic_setup();
|
||||||
system_state = SYSTEM_RUNNING;
|
|
||||||
numa_default_policy();
|
|
||||||
+ char *console = "/dev_console";
|
|
||||||
|
|
||||||
|
/* Open the /dev/console on the rootfs, this should never fail */
|
||||||
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
|
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
|
||||||
- printk(KERN_WARNING "Warning: unable to open an initial console.\n");
|
- printk(KERN_WARNING "Warning: unable to open an initial console.\n");
|
||||||
|
+ char *console = "/dev_console";
|
||||||
|
+
|
||||||
+ if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) {
|
+ if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) {
|
||||||
+ sys_mknod(console, S_IFCHR|0600, (TTYAUX_MAJOR<<8)|1);
|
+ sys_mknod(console, S_IFCHR|0600, (TTYAUX_MAJOR<<8)|1);
|
||||||
+ if (sys_open(console, O_RDWR, 0) < 0)
|
+ if (sys_open(console, O_RDWR, 0) < 0)
|
@ -1,635 +0,0 @@
|
|||||||
Documentation/input/appleir.txt | 46 ++++
|
|
||||||
drivers/hid/hid-apple.c | 4 -
|
|
||||||
drivers/hid/hid-core.c | 5 +-
|
|
||||||
drivers/hid/hid-ids.h | 1 +
|
|
||||||
drivers/input/misc/Kconfig | 13 +
|
|
||||||
drivers/input/misc/Makefile | 1 +
|
|
||||||
drivers/input/misc/appleir.c | 477 +++++++++++++++++++++++++++++++++++++++
|
|
||||||
7 files changed, 541 insertions(+), 6 deletions(-)
|
|
||||||
create mode 100644 Documentation/input/appleir.txt
|
|
||||||
create mode 100644 drivers/input/misc/appleir.c
|
|
||||||
|
|
||||||
diff --git a/Documentation/input/appleir.txt b/Documentation/input/appleir.txt
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..0aaf5fe
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/Documentation/input/appleir.txt
|
|
||||||
@@ -0,0 +1,46 @@
|
|
||||||
+Apple IR receiver Driver (appleir)
|
|
||||||
+----------------------------------
|
|
||||||
+ Copyright (C) 2009 Bastien Nocera <hadess@hadess.net>
|
|
||||||
+
|
|
||||||
+The appleir driver is a kernel input driver to handle Apple's IR
|
|
||||||
+receivers (and associated remotes) in the kernel.
|
|
||||||
+
|
|
||||||
+The driver is an input driver which only handles "official" remotes
|
|
||||||
+as built and sold by Apple.
|
|
||||||
+
|
|
||||||
+Authors
|
|
||||||
+-------
|
|
||||||
+
|
|
||||||
+James McKenzie (original driver)
|
|
||||||
+Alex Karpenko (05ac:8242 support)
|
|
||||||
+Greg Kroah-Hartman (cleanups and original submission)
|
|
||||||
+Bastien Nocera (further cleanups and suspend support)
|
|
||||||
+
|
|
||||||
+Supported hardware
|
|
||||||
+------------------
|
|
||||||
+
|
|
||||||
+- All Apple laptops and desktops from 2005 onwards, except:
|
|
||||||
+ - the unibody Macbook (2009)
|
|
||||||
+ - Mac Pro (all versions)
|
|
||||||
+- Apple TV (all revisions)
|
|
||||||
+
|
|
||||||
+The remote will only support the 6 buttons of the original remotes
|
|
||||||
+as sold by Apple. See the next section if you want to use other remotes
|
|
||||||
+or want to use lirc with the device instead of the kernel driver.
|
|
||||||
+
|
|
||||||
+Using lirc (native) instead of the kernel driver
|
|
||||||
+------------------------------------------------
|
|
||||||
+
|
|
||||||
+First, you will need to disable the kernel driver for the receiver.
|
|
||||||
+
|
|
||||||
+This can be achieved by passing quirks to the usbhid driver.
|
|
||||||
+The quirk line would be:
|
|
||||||
+usbhid.quirks=0x05ac:0x8242:0x08
|
|
||||||
+
|
|
||||||
+With 0x05ac being the vendor ID (Apple, you shouldn't need to change this)
|
|
||||||
+With 0x8242 being the product ID (check the output of lsusb for your hardware)
|
|
||||||
+And 0x08 being "HID_CONNECT_HIDDEV"
|
|
||||||
+
|
|
||||||
+This should force the creation of a hiddev device for the receiver, and
|
|
||||||
+make it usable under lirc.
|
|
||||||
+
|
|
||||||
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
|
||||||
index 4b96e7a..d1fdcd0 100644
|
|
||||||
--- a/drivers/hid/hid-apple.c
|
|
||||||
+++ b/drivers/hid/hid-apple.c
|
|
||||||
@@ -353,10 +353,6 @@ static void apple_remove(struct hid_device *hdev)
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct hid_device_id apple_devices[] = {
|
|
||||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL),
|
|
||||||
- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
|
|
||||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4),
|
|
||||||
- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE),
|
|
||||||
.driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL },
|
|
||||||
|
|
||||||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
|
||||||
index 7d05c4b..3efb0fa 100644
|
|
||||||
--- a/drivers/hid/hid-core.c
|
|
||||||
+++ b/drivers/hid/hid-core.c
|
|
||||||
@@ -1252,8 +1252,6 @@ EXPORT_SYMBOL_GPL(hid_disconnect);
|
|
||||||
static const struct hid_device_id hid_blacklist[] = {
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
|
||||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
|
||||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
|
|
||||||
@@ -1539,6 +1537,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)},
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM2)},
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
|
|
||||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
||||||
index adbef5d..c399110 100644
|
|
||||||
--- a/drivers/hid/hid-ids.h
|
|
||||||
+++ b/drivers/hid/hid-ids.h
|
|
||||||
@@ -90,6 +90,7 @@
|
|
||||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
|
||||||
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
|
|
||||||
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
|
|
||||||
+#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
|
|
||||||
#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
|
||||||
#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
|
||||||
|
|
||||||
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
|
|
||||||
index a9bb254..51b6684 100644
|
|
||||||
--- a/drivers/input/misc/Kconfig
|
|
||||||
+++ b/drivers/input/misc/Kconfig
|
|
||||||
@@ -148,6 +148,19 @@ config INPUT_KEYSPAN_REMOTE
|
|
||||||
To compile this driver as a module, choose M here: the module will
|
|
||||||
be called keyspan_remote.
|
|
||||||
|
|
||||||
+config INPUT_APPLEIR
|
|
||||||
+ tristate "Apple infrared receiver (built in)"
|
|
||||||
+ depends on USB_ARCH_HAS_HCD
|
|
||||||
+ select USB
|
|
||||||
+ help
|
|
||||||
+ Say Y here if you want to use a Apple infrared remote control. All
|
|
||||||
+ the Apple computers from 2005 onwards include such a port, except
|
|
||||||
+ the unibody Macbook (2009), and Mac Pros. This receiver is also
|
|
||||||
+ used in the Apple TV set-top box.
|
|
||||||
+
|
|
||||||
+ To compile this driver as a module, choose M here: the module will
|
|
||||||
+ be called appleir.
|
|
||||||
+
|
|
||||||
config INPUT_POWERMATE
|
|
||||||
tristate "Griffin PowerMate and Contour Jog support"
|
|
||||||
depends on USB_ARCH_HAS_HCD
|
|
||||||
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
|
|
||||||
index a8b8485..041e6f5 100644
|
|
||||||
--- a/drivers/input/misc/Makefile
|
|
||||||
+++ b/drivers/input/misc/Makefile
|
|
||||||
@@ -5,6 +5,7 @@
|
|
||||||
# Each configuration option enables a list of files.
|
|
||||||
|
|
||||||
obj-$(CONFIG_INPUT_APANEL) += apanel.o
|
|
||||||
+obj-$(CONFIG_INPUT_APPLEIR) += appleir.o
|
|
||||||
obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o
|
|
||||||
obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
|
|
||||||
obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o
|
|
||||||
diff --git a/drivers/input/misc/appleir.c b/drivers/input/misc/appleir.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..6e332ab
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/input/misc/appleir.c
|
|
||||||
@@ -0,0 +1,477 @@
|
|
||||||
+/*
|
|
||||||
+ * appleir: USB driver for the apple ir device
|
|
||||||
+ *
|
|
||||||
+ * Original driver written by James McKenzie
|
|
||||||
+ * Ported to recent 2.6 kernel versions by Greg Kroah-Hartman <gregkh@suse.de>
|
|
||||||
+ *
|
|
||||||
+ * Copyright (C) 2006 James McKenzie
|
|
||||||
+ * Copyright (C) 2008 Greg Kroah-Hartman <greg@kroah.com>
|
|
||||||
+ * Copyright (C) 2008 Novell Inc.
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify it
|
|
||||||
+ * under the terms of the GNU General Public License as published by the Free
|
|
||||||
+ * Software Foundation, version 2.
|
|
||||||
+ *
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <linux/kernel.h>
|
|
||||||
+#include <linux/slab.h>
|
|
||||||
+#include <linux/input.h>
|
|
||||||
+#include <linux/usb/input.h>
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/init.h>
|
|
||||||
+#include <linux/usb.h>
|
|
||||||
+#include <linux/usb/input.h>
|
|
||||||
+#include <asm/unaligned.h>
|
|
||||||
+#include <asm/byteorder.h>
|
|
||||||
+
|
|
||||||
+#define DRIVER_VERSION "v1.2"
|
|
||||||
+#define DRIVER_AUTHOR "James McKenzie"
|
|
||||||
+#define DRIVER_DESC "Apple infrared receiver driver"
|
|
||||||
+#define DRIVER_LICENSE "GPL"
|
|
||||||
+
|
|
||||||
+MODULE_AUTHOR(DRIVER_AUTHOR);
|
|
||||||
+MODULE_DESCRIPTION(DRIVER_DESC);
|
|
||||||
+MODULE_LICENSE(DRIVER_LICENSE);
|
|
||||||
+
|
|
||||||
+#define USB_VENDOR_ID_APPLE 0x05ac
|
|
||||||
+#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
|
|
||||||
+#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
|
||||||
+#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
|
||||||
+
|
|
||||||
+#define URB_SIZE 32
|
|
||||||
+
|
|
||||||
+#define MAX_KEYS 8
|
|
||||||
+#define MAX_KEYS_MASK (MAX_KEYS - 1)
|
|
||||||
+
|
|
||||||
+#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0)
|
|
||||||
+
|
|
||||||
+static int debug;
|
|
||||||
+module_param(debug, int, 0644);
|
|
||||||
+MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
|
|
||||||
+
|
|
||||||
+struct appleir {
|
|
||||||
+ struct input_dev *input_dev;
|
|
||||||
+ u8 *data;
|
|
||||||
+ dma_addr_t dma_buf;
|
|
||||||
+ struct usb_device *usbdev;
|
|
||||||
+ unsigned int flags;
|
|
||||||
+ struct urb *urb;
|
|
||||||
+ int timer_initted;
|
|
||||||
+ struct timer_list key_up_timer;
|
|
||||||
+ int current_key;
|
|
||||||
+ char phys[32];
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static DEFINE_MUTEX(appleir_mutex);
|
|
||||||
+
|
|
||||||
+enum {
|
|
||||||
+ APPLEIR_OPENED = 0x1,
|
|
||||||
+ APPLEIR_SUSPENDED = 0x2,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static struct usb_device_id appleir_ids[] = {
|
|
||||||
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
|
||||||
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
|
||||||
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
|
||||||
+ {}
|
|
||||||
+};
|
|
||||||
+MODULE_DEVICE_TABLE(usb, appleir_ids);
|
|
||||||
+
|
|
||||||
+/* I have two devices both of which report the following */
|
|
||||||
+/* 25 87 ee 83 0a + */
|
|
||||||
+/* 25 87 ee 83 0c - */
|
|
||||||
+/* 25 87 ee 83 09 << */
|
|
||||||
+/* 25 87 ee 83 06 >> */
|
|
||||||
+/* 25 87 ee 83 05 >" */
|
|
||||||
+/* 25 87 ee 83 03 menu */
|
|
||||||
+/* 26 00 00 00 00 for key repeat*/
|
|
||||||
+
|
|
||||||
+/* Thomas Glanzmann reports the following responses */
|
|
||||||
+/* 25 87 ee ca 0b + */
|
|
||||||
+/* 25 87 ee ca 0d - */
|
|
||||||
+/* 25 87 ee ca 08 << */
|
|
||||||
+/* 25 87 ee ca 07 >> */
|
|
||||||
+/* 25 87 ee ca 04 >" */
|
|
||||||
+/* 25 87 ee ca 02 menu */
|
|
||||||
+/* 26 00 00 00 00 for key repeat*/
|
|
||||||
+/* He also observes the following event sometimes */
|
|
||||||
+/* sent after a key is release, which I interpret */
|
|
||||||
+/* as a flat battery message */
|
|
||||||
+/* 25 87 e0 ca 06 flat battery */
|
|
||||||
+
|
|
||||||
+/* Alexandre Karpenko reports the following responses for Device ID 0x8242 */
|
|
||||||
+/* 25 87 ee 47 0b + */
|
|
||||||
+/* 25 87 ee 47 0d - */
|
|
||||||
+/* 25 87 ee 47 08 << */
|
|
||||||
+/* 25 87 ee 47 07 >> */
|
|
||||||
+/* 25 87 ee 47 04 >" */
|
|
||||||
+/* 25 87 ee 47 02 menu */
|
|
||||||
+/* 26 87 ee 47 ** for key repeat (** is the code of the key being held) */
|
|
||||||
+
|
|
||||||
+static int keymap[MAX_KEYS] = {
|
|
||||||
+ KEY_RESERVED,
|
|
||||||
+ KEY_MENU,
|
|
||||||
+ KEY_PLAYPAUSE,
|
|
||||||
+ KEY_FORWARD,
|
|
||||||
+ KEY_BACK,
|
|
||||||
+ KEY_VOLUMEUP,
|
|
||||||
+ KEY_VOLUMEDOWN,
|
|
||||||
+ KEY_RESERVED,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void dump_packet(struct appleir *appleir, char *msg, u8 *data, int len)
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ printk(KERN_ERR "appleir: %s (%d bytes)", msg, len);
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < len; ++i)
|
|
||||||
+ printk(" %02x", data[i]);
|
|
||||||
+ printk("\n");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void key_up(struct appleir *appleir, int key)
|
|
||||||
+{
|
|
||||||
+ dbginfo (&appleir->input_dev->dev, "key %d up\n", key);
|
|
||||||
+ input_report_key(appleir->input_dev, key, 0);
|
|
||||||
+ input_sync(appleir->input_dev);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void key_down(struct appleir *appleir, int key)
|
|
||||||
+{
|
|
||||||
+ dbginfo (&appleir->input_dev->dev, "key %d down\n", key);
|
|
||||||
+ input_report_key(appleir->input_dev, key, 1);
|
|
||||||
+ input_sync(appleir->input_dev);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void battery_flat(struct appleir *appleir)
|
|
||||||
+{
|
|
||||||
+ dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void key_up_tick(unsigned long data)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir = (struct appleir *)data;
|
|
||||||
+
|
|
||||||
+ if (appleir->current_key) {
|
|
||||||
+ key_up(appleir, appleir->current_key);
|
|
||||||
+ appleir->current_key = 0;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void new_data(struct appleir *appleir, u8 *data, int len)
|
|
||||||
+{
|
|
||||||
+ static const u8 keydown[] = { 0x25, 0x87, 0xee };
|
|
||||||
+ static const u8 keyrepeat[] = { 0x26, };
|
|
||||||
+ static const u8 flatbattery[] = { 0x25, 0x87, 0xe0 };
|
|
||||||
+
|
|
||||||
+ if (debug)
|
|
||||||
+ dump_packet(appleir, "received", data, len);
|
|
||||||
+
|
|
||||||
+ if (len != 5)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ if (!memcmp(data, keydown, sizeof(keydown))) {
|
|
||||||
+ /*If we already have a key down, take it up before marking */
|
|
||||||
+ /*this one down */
|
|
||||||
+ if (appleir->current_key)
|
|
||||||
+ key_up(appleir, appleir->current_key);
|
|
||||||
+ appleir->current_key = keymap[(data[4] >> 1) & MAX_KEYS_MASK];
|
|
||||||
+
|
|
||||||
+ key_down(appleir, appleir->current_key);
|
|
||||||
+ /*remote doesn't do key up, either pull them up, in the test */
|
|
||||||
+ /*above, or here set a timer which pulls them up after 1/8 s */
|
|
||||||
+ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
|
|
||||||
+
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!memcmp(data, keyrepeat, sizeof(keyrepeat))) {
|
|
||||||
+ key_down(appleir, appleir->current_key);
|
|
||||||
+ /*remote doesn't do key up, either pull them up, in the test */
|
|
||||||
+ /*above, or here set a timer which pulls them up after 1/8 s */
|
|
||||||
+ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!memcmp(data, flatbattery, sizeof(flatbattery))) {
|
|
||||||
+ battery_flat(appleir);
|
|
||||||
+ /* Fall through */
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ dump_packet(appleir, "unknown packet", data, len);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void appleir_urb(struct urb *urb)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir = urb->context;
|
|
||||||
+ int status = urb->status;
|
|
||||||
+ int retval;
|
|
||||||
+
|
|
||||||
+ switch (status) {
|
|
||||||
+ case 0:
|
|
||||||
+ new_data(appleir, urb->transfer_buffer, urb->actual_length);
|
|
||||||
+ break;
|
|
||||||
+ case -ECONNRESET:
|
|
||||||
+ case -ENOENT:
|
|
||||||
+ case -ESHUTDOWN:
|
|
||||||
+ /* this urb is terminated, clean up */
|
|
||||||
+ dbginfo(&appleir->input_dev->dev, "%s - urb shutting down with status: %d", __func__,
|
|
||||||
+ urb->status);
|
|
||||||
+ return;
|
|
||||||
+ default:
|
|
||||||
+ dbginfo(&appleir->input_dev->dev, "%s - nonzero urb status received: %d", __func__,
|
|
||||||
+ urb->status);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
|
|
||||||
+ if (retval)
|
|
||||||
+ err("%s - usb_submit_urb failed with result %d", __func__,
|
|
||||||
+ retval);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int appleir_open(struct input_dev *dev)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir = input_get_drvdata(dev);
|
|
||||||
+ struct usb_interface *intf = usb_ifnum_to_if(appleir->usbdev, 0);
|
|
||||||
+ int r;
|
|
||||||
+
|
|
||||||
+ r = usb_autopm_get_interface(intf);
|
|
||||||
+ if (r) {
|
|
||||||
+ dev_err(&intf->dev,
|
|
||||||
+ "%s(): usb_autopm_get_interface() = %d\n", __func__, r);
|
|
||||||
+ return r;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ mutex_lock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ if (usb_submit_urb(appleir->urb, GFP_KERNEL)) {
|
|
||||||
+ r = -EIO;
|
|
||||||
+ goto fail;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ appleir->flags |= APPLEIR_OPENED;
|
|
||||||
+
|
|
||||||
+ mutex_unlock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ usb_autopm_put_interface(intf);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+fail:
|
|
||||||
+ mutex_unlock(&appleir_mutex);
|
|
||||||
+ usb_autopm_put_interface(intf);
|
|
||||||
+ return r;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void appleir_close(struct input_dev *dev)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir = input_get_drvdata(dev);
|
|
||||||
+
|
|
||||||
+ mutex_lock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ if (!(appleir->flags & APPLEIR_SUSPENDED)) {
|
|
||||||
+ usb_kill_urb(appleir->urb);
|
|
||||||
+ del_timer_sync(&appleir->key_up_timer);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ appleir->flags &= ~APPLEIR_OPENED;
|
|
||||||
+
|
|
||||||
+ mutex_unlock(&appleir_mutex);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int appleir_probe(struct usb_interface *intf,
|
|
||||||
+ const struct usb_device_id *id)
|
|
||||||
+{
|
|
||||||
+ struct usb_device *dev = interface_to_usbdev(intf);
|
|
||||||
+ struct usb_endpoint_descriptor *endpoint;
|
|
||||||
+ struct appleir *appleir = NULL;
|
|
||||||
+ struct input_dev *input_dev;
|
|
||||||
+ int retval = -ENOMEM;
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ appleir = kzalloc(sizeof(struct appleir), GFP_KERNEL);
|
|
||||||
+ if (!appleir)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ appleir->data = usb_buffer_alloc(dev, URB_SIZE, GFP_KERNEL,
|
|
||||||
+ &appleir->dma_buf);
|
|
||||||
+ if (!appleir->data)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ appleir->urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
||||||
+ if (!appleir->urb)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ appleir->usbdev = dev;
|
|
||||||
+
|
|
||||||
+ input_dev = input_allocate_device();
|
|
||||||
+ if (!input_dev)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ appleir->input_dev = input_dev;
|
|
||||||
+
|
|
||||||
+ usb_make_path(dev, appleir->phys, sizeof(appleir->phys));
|
|
||||||
+ strlcpy(appleir->phys, "/input0", sizeof(appleir->phys));
|
|
||||||
+
|
|
||||||
+ input_dev->name = "Apple infrared remote control driver";
|
|
||||||
+ input_dev->phys = appleir->phys;
|
|
||||||
+ usb_to_input_id(dev, &input_dev->id);
|
|
||||||
+ input_dev->dev.parent = &intf->dev;
|
|
||||||
+ input_set_drvdata(input_dev, appleir);
|
|
||||||
+
|
|
||||||
+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
|
|
||||||
+ input_dev->ledbit[0] = 0;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < MAX_KEYS; i++)
|
|
||||||
+ set_bit(keymap[i], input_dev->keybit);
|
|
||||||
+
|
|
||||||
+ clear_bit(0, input_dev->keybit);
|
|
||||||
+
|
|
||||||
+ input_dev->open = appleir_open;
|
|
||||||
+ input_dev->close = appleir_close;
|
|
||||||
+
|
|
||||||
+ endpoint = &intf->cur_altsetting->endpoint[0].desc;
|
|
||||||
+
|
|
||||||
+ usb_fill_int_urb(appleir->urb, dev,
|
|
||||||
+ usb_rcvintpipe(dev, endpoint->bEndpointAddress),
|
|
||||||
+ appleir->data, 8,
|
|
||||||
+ appleir_urb, appleir, endpoint->bInterval);
|
|
||||||
+
|
|
||||||
+ appleir->urb->transfer_dma = appleir->dma_buf;
|
|
||||||
+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
|
||||||
+
|
|
||||||
+ usb_set_intfdata(intf, appleir);
|
|
||||||
+
|
|
||||||
+ init_timer(&appleir->key_up_timer);
|
|
||||||
+
|
|
||||||
+ appleir->key_up_timer.function = key_up_tick;
|
|
||||||
+ appleir->key_up_timer.data = (unsigned long)appleir;
|
|
||||||
+
|
|
||||||
+ appleir->timer_initted++;
|
|
||||||
+
|
|
||||||
+ retval = input_register_device(appleir->input_dev);
|
|
||||||
+ if (retval)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+fail:
|
|
||||||
+ printk(KERN_WARNING "Failed to load appleir\n");
|
|
||||||
+ if (appleir) {
|
|
||||||
+ if (appleir->data)
|
|
||||||
+ usb_buffer_free(dev, URB_SIZE, appleir->data,
|
|
||||||
+ appleir->dma_buf);
|
|
||||||
+
|
|
||||||
+ if (appleir->timer_initted)
|
|
||||||
+ del_timer_sync(&appleir->key_up_timer);
|
|
||||||
+
|
|
||||||
+ if (appleir->input_dev)
|
|
||||||
+ input_free_device(appleir->input_dev);
|
|
||||||
+
|
|
||||||
+ kfree(appleir);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return retval;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void appleir_disconnect(struct usb_interface *intf)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir = usb_get_intfdata(intf);
|
|
||||||
+
|
|
||||||
+ usb_set_intfdata(intf, NULL);
|
|
||||||
+ if (appleir) {
|
|
||||||
+ input_unregister_device(appleir->input_dev);
|
|
||||||
+ if (appleir->timer_initted)
|
|
||||||
+ del_timer_sync(&appleir->key_up_timer);
|
|
||||||
+ usb_kill_urb(appleir->urb);
|
|
||||||
+ usb_free_urb(appleir->urb);
|
|
||||||
+ usb_buffer_free(interface_to_usbdev(intf), URB_SIZE,
|
|
||||||
+ appleir->data, appleir->dma_buf);
|
|
||||||
+ kfree(appleir);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int appleir_suspend(struct usb_interface *interface,
|
|
||||||
+ pm_message_t message)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir;
|
|
||||||
+
|
|
||||||
+ appleir = usb_get_intfdata(interface);
|
|
||||||
+
|
|
||||||
+ mutex_lock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ if (appleir->flags & APPLEIR_OPENED) {
|
|
||||||
+ usb_kill_urb(appleir->urb);
|
|
||||||
+ del_timer_sync(&appleir->key_up_timer);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ appleir->flags |= APPLEIR_SUSPENDED;
|
|
||||||
+
|
|
||||||
+ mutex_unlock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int appleir_resume(struct usb_interface *interface)
|
|
||||||
+{
|
|
||||||
+ struct appleir *appleir;
|
|
||||||
+
|
|
||||||
+ appleir = usb_get_intfdata(interface);
|
|
||||||
+
|
|
||||||
+ mutex_lock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ if (appleir->flags & APPLEIR_OPENED) {
|
|
||||||
+ struct usb_endpoint_descriptor *endpoint;
|
|
||||||
+
|
|
||||||
+ endpoint = &interface->cur_altsetting->endpoint[0].desc;
|
|
||||||
+ usb_fill_int_urb(appleir->urb, appleir->usbdev,
|
|
||||||
+ usb_rcvintpipe(appleir->usbdev, endpoint->bEndpointAddress),
|
|
||||||
+ appleir->data, 8,
|
|
||||||
+ appleir_urb, appleir, endpoint->bInterval);
|
|
||||||
+ appleir->urb->transfer_dma = appleir->dma_buf;
|
|
||||||
+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
|
||||||
+
|
|
||||||
+ init_timer(&appleir->key_up_timer);
|
|
||||||
+
|
|
||||||
+ appleir->key_up_timer.function = key_up_tick;
|
|
||||||
+ appleir->key_up_timer.data = (unsigned long)appleir;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ appleir->flags &= ~APPLEIR_SUSPENDED;
|
|
||||||
+
|
|
||||||
+ mutex_unlock(&appleir_mutex);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static struct usb_driver appleir_driver = {
|
|
||||||
+ .name = "appleir",
|
|
||||||
+ .probe = appleir_probe,
|
|
||||||
+ .disconnect = appleir_disconnect,
|
|
||||||
+ .suspend = appleir_suspend,
|
|
||||||
+ .resume = appleir_resume,
|
|
||||||
+ .reset_resume = appleir_resume,
|
|
||||||
+ .id_table = appleir_ids,
|
|
||||||
+ .supports_autosuspend = 1,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int __init appleir_init(void)
|
|
||||||
+{
|
|
||||||
+ int retval;
|
|
||||||
+
|
|
||||||
+ retval = usb_register(&appleir_driver);
|
|
||||||
+ if (retval)
|
|
||||||
+ goto out;
|
|
||||||
+ printk(KERN_INFO DRIVER_VERSION ":" DRIVER_DESC);
|
|
||||||
+out:
|
|
||||||
+ return retval;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void __exit appleir_exit(void)
|
|
||||||
+{
|
|
||||||
+ usb_deregister(&appleir_driver);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+module_init(appleir_init);
|
|
||||||
+module_exit(appleir_exit);
|
|
||||||
--
|
|
||||||
1.6.5.2
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,18 +1,30 @@
|
|||||||
|
From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Tue, 30 Mar 2010 00:04:29 -0400
|
||||||
|
Subject: die-floppy-die
|
||||||
|
|
||||||
Kill the floppy.ko pnp modalias. We were surviving just fine without
|
Kill the floppy.ko pnp modalias. We were surviving just fine without
|
||||||
autoloading floppy drivers, tyvm.
|
autoloading floppy drivers, tyvm.
|
||||||
|
|
||||||
Please feel free to register all complaints in the wastepaper bin.
|
Please feel free to register all complaints in the wastepaper bin.
|
||||||
|
---
|
||||||
|
drivers/block/floppy.c | 3 +--
|
||||||
|
1 files changed, 1 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
||||||
index 91b7530..2ea84a6 100644
|
index 90c4038..f4a0b90 100644
|
||||||
--- a/drivers/block/floppy.c
|
--- a/drivers/block/floppy.c
|
||||||
+++ b/drivers/block/floppy.c
|
+++ b/drivers/block/floppy.c
|
||||||
@@ -4631,7 +4631,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
|
@@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
|
||||||
{ "PNP0700", 0 },
|
{"PNP0700", 0},
|
||||||
{ }
|
{}
|
||||||
};
|
};
|
||||||
|
-
|
||||||
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
||||||
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
@ -0,0 +1,47 @@
|
|||||||
|
From c69fcbd1f60b0842f7c1ad2c95692ffd19c4932b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:56:08 -0400
|
||||||
|
Subject: hda_intel-prealloc-4mb-dmabuffer
|
||||||
|
|
||||||
|
---
|
||||||
|
sound/pci/hda/hda_intel.c | 14 +++++++++++++-
|
||||||
|
1 files changed, 13 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
||||||
|
index 4bb9067..37db515 100644
|
||||||
|
--- a/sound/pci/hda/hda_intel.c
|
||||||
|
+++ b/sound/pci/hda/hda_intel.c
|
||||||
|
@@ -1986,6 +1986,7 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
|
||||||
|
struct azx_pcm *apcm;
|
||||||
|
int pcm_dev = cpcm->device;
|
||||||
|
int s, err;
|
||||||
|
+ size_t prealloc_min = 64*1024; /* 64KB */
|
||||||
|
|
||||||
|
if (pcm_dev >= HDA_MAX_PCMS) {
|
||||||
|
snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n",
|
||||||
|
@@ -2019,10 +2020,21 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
|
||||||
|
if (cpcm->stream[s].substreams)
|
||||||
|
snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
/* buffer pre-allocation */
|
||||||
|
+
|
||||||
|
+ /* subtle, don't allocate a big buffer for modems...
|
||||||
|
+ * also, don't just test 32BIT_MASK, since azx supports
|
||||||
|
+ * 64-bit DMA in some cases.
|
||||||
|
+ */
|
||||||
|
+ /* lennart wants a 2.2MB buffer for 2sec of 48khz */
|
||||||
|
+ if (pcm->dev_class == SNDRV_PCM_CLASS_GENERIC &&
|
||||||
|
+ chip->pci->dma_mask >= DMA_32BIT_MASK)
|
||||||
|
+ prealloc_min = 4 * 1024 * 1024; /* 4MB */
|
||||||
|
+
|
||||||
|
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
|
||||||
|
snd_dma_pci_data(chip->pci),
|
||||||
|
- 1024 * 64, 32 * 1024 * 1024);
|
||||||
|
+ prealloc_min, 32 * 1024 * 1024);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
@ -1,47 +0,0 @@
|
|||||||
From dce8113d033975f56630cf6d2a6a908cfb66059d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
||||||
Date: Sun, 20 Jul 2008 13:12:16 -0700
|
|
||||||
Subject: [PATCH] fastboot: remove "wait for all devices before mounting root" delay
|
|
||||||
|
|
||||||
In the non-initrd case, we wait for all devices to finish their
|
|
||||||
probing before we try to mount the rootfs.
|
|
||||||
In practice, this means that we end up waiting 2 extra seconds for
|
|
||||||
the PS/2 mouse probing even though the root holding device has been
|
|
||||||
ready since a long time.
|
|
||||||
|
|
||||||
The previous two patches in this series made the RAID autodetect code
|
|
||||||
do it's own "wait for probing to be done" code, and added
|
|
||||||
"wait and retry" functionality in case the root device isn't actually
|
|
||||||
available.
|
|
||||||
|
|
||||||
These two changes should make it safe to remove the delay itself,
|
|
||||||
and this patch does this. On my test laptop, this reduces the boot time
|
|
||||||
by 2 seconds (kernel time goes from 3.9 to 1.9 seconds).
|
|
||||||
|
|
||||||
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
|
|
||||||
---
|
|
||||||
---
|
|
||||||
init/do_mounts.c | 3 +++
|
|
||||||
1 file changed, 3 insertions(+)
|
|
||||||
|
|
||||||
Index: linux-2.6.29/init/do_mounts.c
|
|
||||||
===================================================================
|
|
||||||
--- linux-2.6.29.orig/init/do_mounts.c
|
|
||||||
+++ linux-2.6.29/init/do_mounts.c
|
|
||||||
@@ -370,6 +370,7 @@ void __init prepare_namespace(void)
|
|
||||||
ssleep(root_delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if 0
|
|
||||||
/*
|
|
||||||
* wait for the known devices to complete their probing
|
|
||||||
*
|
|
||||||
@@ -378,6 +379,8 @@ void __init prepare_namespace(void)
|
|
||||||
* for the touchpad of a laptop to initialize.
|
|
||||||
*/
|
|
||||||
wait_for_device_probe();
|
|
||||||
+#endif
|
|
||||||
+ async_synchronize_full();
|
|
||||||
|
|
||||||
md_run_setup();
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
drivers/Makefile | 14 +++++++-------
|
|
||||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
Index: linux-2.6.29/drivers/Makefile
|
|
||||||
===================================================================
|
|
||||||
--- linux-2.6.29.orig/drivers/Makefile
|
|
||||||
+++ linux-2.6.29/drivers/Makefile
|
|
||||||
@@ -25,15 +25,8 @@ obj-$(CONFIG_REGULATOR) += regulator/
|
|
||||||
# default.
|
|
||||||
obj-y += char/
|
|
||||||
|
|
||||||
-# gpu/ comes after char for AGP vs DRM startup
|
|
||||||
-obj-y += gpu/
|
|
||||||
-
|
|
||||||
obj-$(CONFIG_CONNECTOR) += connector/
|
|
||||||
|
|
||||||
-# i810fb and intelfb depend on char/agp/
|
|
||||||
-obj-$(CONFIG_FB_I810) += video/i810/
|
|
||||||
-obj-$(CONFIG_FB_INTEL) += video/intelfb/
|
|
||||||
-
|
|
||||||
obj-y += serial/
|
|
||||||
obj-$(CONFIG_PARPORT) += parport/
|
|
||||||
obj-y += base/ block/ misc/ mfd/ media/
|
|
||||||
@@ -43,6 +36,13 @@ obj-$(CONFIG_IDE) += ide/
|
|
||||||
obj-$(CONFIG_SCSI) += scsi/
|
|
||||||
obj-$(CONFIG_ATA) += ata/
|
|
||||||
obj-y += net/
|
|
||||||
+
|
|
||||||
+# gpu/ comes after char for AGP vs DRM startup
|
|
||||||
+obj-y += gpu/
|
|
||||||
+# i810fb and intelfb depend on char/agp/
|
|
||||||
+obj-$(CONFIG_FB_I810) += video/i810/
|
|
||||||
+obj-$(CONFIG_FB_INTEL) += video/intelfb/
|
|
||||||
+
|
|
||||||
obj-$(CONFIG_ATM) += atm/
|
|
||||||
obj-$(CONFIG_FUSION) += message/
|
|
||||||
obj-$(CONFIG_FIREWIRE) += firewire/
|
|
@ -1,22 +0,0 @@
|
|||||||
--- vanilla-2.6.31-rc4/drivers/gpu/drm/i915/intel_lvds.c~ 2009-07-31 11:23:05.000000000 -0700
|
|
||||||
+++ vanilla-2.6.31-rc4/drivers/gpu/drm/i915/intel_lvds.c 2009-07-31 11:23:05.000000000 -0700
|
|
||||||
@@ -111,19 +111,12 @@ static void intel_lvds_set_power(struct
|
|
||||||
if (on) {
|
|
||||||
I915_WRITE(ctl_reg, I915_READ(ctl_reg) |
|
|
||||||
POWER_TARGET_ON);
|
|
||||||
- do {
|
|
||||||
- pp_status = I915_READ(status_reg);
|
|
||||||
- } while ((pp_status & PP_ON) == 0);
|
|
||||||
-
|
|
||||||
intel_lvds_set_backlight(dev, dev_priv->backlight_duty_cycle);
|
|
||||||
} else {
|
|
||||||
intel_lvds_set_backlight(dev, 0);
|
|
||||||
|
|
||||||
I915_WRITE(ctl_reg, I915_READ(ctl_reg) &
|
|
||||||
~POWER_TARGET_ON);
|
|
||||||
- do {
|
|
||||||
- pp_status = I915_READ(status_reg);
|
|
||||||
- } while (pp_status & PP_ON);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
|||||||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
|
||||||
index a51573d..3dcf5cc 100644
|
|
||||||
--- a/drivers/gpu/drm/i915/intel_drv.h
|
|
||||||
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
|
||||||
@@ -102,6 +102,7 @@ struct intel_output {
|
|
||||||
int type;
|
|
||||||
struct i2c_adapter *i2c_bus;
|
|
||||||
struct i2c_adapter *ddc_bus;
|
|
||||||
+ struct edid *edid;
|
|
||||||
bool load_detect_temp;
|
|
||||||
bool needs_tv_clock;
|
|
||||||
void *dev_priv;
|
|
||||||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
|
||||||
index 3118ce2..fa0299e 100644
|
|
||||||
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
||||||
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
||||||
@@ -716,6 +716,7 @@ static void intel_lvds_destroy(struct drm_connector *connector)
|
|
||||||
acpi_lid_notifier_unregister(&dev_priv->lid_notifier);
|
|
||||||
drm_sysfs_connector_remove(connector);
|
|
||||||
drm_connector_cleanup(connector);
|
|
||||||
+ kfree(intel_output->edid);
|
|
||||||
kfree(connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1189,5 +1190,6 @@ failed:
|
|
||||||
intel_i2c_destroy(intel_output->ddc_bus);
|
|
||||||
drm_connector_cleanup(connector);
|
|
||||||
drm_encoder_cleanup(encoder);
|
|
||||||
+ kfree(intel_output->edid);
|
|
||||||
kfree(intel_output);
|
|
||||||
}
|
|
||||||
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c
|
|
||||||
index 67e2f46..5ac537f 100644
|
|
||||||
--- a/drivers/gpu/drm/i915/intel_modes.c
|
|
||||||
+++ b/drivers/gpu/drm/i915/intel_modes.c
|
|
||||||
@@ -74,6 +74,10 @@ int intel_ddc_get_modes(struct intel_output *intel_output)
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
intel_i2c_quirk_set(intel_output->base.dev, true);
|
|
||||||
+ if (intel_output->edid && intel_output->type == INTEL_OUTPUT_LVDS) {
|
|
||||||
+ printk(KERN_INFO "Skipping EDID probe due to cached edid\n");
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
edid = drm_get_edid(&intel_output->base, intel_output->ddc_bus);
|
|
||||||
intel_i2c_quirk_set(intel_output->base.dev, false);
|
|
||||||
if (edid) {
|
|
||||||
@@ -81,7 +85,10 @@ int intel_ddc_get_modes(struct intel_output *intel_output)
|
|
||||||
edid);
|
|
||||||
ret = drm_add_edid_modes(&intel_output->base, edid);
|
|
||||||
intel_output->base.display_info.raw_edid = NULL;
|
|
||||||
- kfree(edid);
|
|
||||||
+ if (intel_output->type == INTEL_OUTPUT_LVDS)
|
|
||||||
+ intel_output->edid = edid;
|
|
||||||
+ else
|
|
||||||
+ kfree(edid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
@ -1,118 +0,0 @@
|
|||||||
Index: b/drivers/gpu/drm/drm_crtc_helper.c
|
|
||||||
===================================================================
|
|
||||||
--- a/drivers/gpu/drm/drm_crtc_helper.c
|
|
||||||
+++ b/drivers/gpu/drm/drm_crtc_helper.c
|
|
||||||
@@ -29,6 +29,8 @@
|
|
||||||
* Jesse Barnes <jesse.barnes@intel.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
+#include <linux/async.h>
|
|
||||||
+
|
|
||||||
#include "drmP.h"
|
|
||||||
#include "drm_crtc.h"
|
|
||||||
#include "drm_crtc_helper.h"
|
|
||||||
@@ -62,6 +64,8 @@ static void drm_mode_validate_flag(struc
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+LIST_HEAD(drm_async_list);
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* drm_helper_probe_connector_modes - get complete set of display modes
|
|
||||||
* @dev: DRM device
|
|
||||||
@@ -916,6 +920,7 @@ bool drm_helper_plugged_event(struct drm
|
|
||||||
/* FIXME: send hotplug event */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* drm_initial_config - setup a sane initial connector configuration
|
|
||||||
* @dev: DRM device
|
|
||||||
@@ -953,13 +958,26 @@ bool drm_helper_initial_config(struct dr
|
|
||||||
|
|
||||||
drm_setup_crtcs(dev);
|
|
||||||
|
|
||||||
- /* alert the driver fb layer */
|
|
||||||
dev->mode_config.funcs->fb_changed(dev);
|
|
||||||
-
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_helper_initial_config);
|
|
||||||
|
|
||||||
+static void drm_helper_initial_config_helper(void *ptr, async_cookie_t cookie)
|
|
||||||
+{
|
|
||||||
+ struct drm_device *dev = ptr;
|
|
||||||
+ drm_helper_initial_config(dev);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void drm_helper_initial_config_async(struct drm_device *dev)
|
|
||||||
+{
|
|
||||||
+ async_schedule_domain(drm_helper_initial_config_helper,
|
|
||||||
+ dev, &drm_async_list);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(drm_helper_initial_config_async);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder)
|
|
||||||
{
|
|
||||||
int dpms = DRM_MODE_DPMS_OFF;
|
|
||||||
Index: b/drivers/gpu/drm/drm_drv.c
|
|
||||||
===================================================================
|
|
||||||
--- a/drivers/gpu/drm/drm_drv.c
|
|
||||||
+++ b/drivers/gpu/drm/drm_drv.c
|
|
||||||
@@ -49,6 +49,7 @@
|
|
||||||
#include <linux/debugfs.h>
|
|
||||||
#include "drmP.h"
|
|
||||||
#include "drm_core.h"
|
|
||||||
+#include <linux/async.h>
|
|
||||||
|
|
||||||
|
|
||||||
static int drm_version(struct drm_device *dev, void *data,
|
|
||||||
@@ -290,6 +291,9 @@ void drm_exit(struct drm_driver *driver)
|
|
||||||
struct drm_device *dev, *tmp;
|
|
||||||
DRM_DEBUG("\n");
|
|
||||||
|
|
||||||
+ /* make sure all async DRM operations are finished */
|
|
||||||
+ async_synchronize_full_domain(&drm_async_list);
|
|
||||||
+
|
|
||||||
if (driver->driver_features & DRIVER_MODESET) {
|
|
||||||
pci_unregister_driver(&driver->pci_driver);
|
|
||||||
} else {
|
|
||||||
Index: b/include/drm/drmP.h
|
|
||||||
===================================================================
|
|
||||||
--- a/include/drm/drmP.h
|
|
||||||
+++ b/include/drm/drmP.h
|
|
||||||
@@ -328,6 +328,7 @@ struct drm_vma_entry {
|
|
||||||
pid_t pid;
|
|
||||||
};
|
|
||||||
|
|
||||||
+extern struct list_head drm_async_list;
|
|
||||||
/**
|
|
||||||
* DMA buffer.
|
|
||||||
*/
|
|
||||||
Index: b/include/drm/drm_crtc_helper.h
|
|
||||||
===================================================================
|
|
||||||
--- a/include/drm/drm_crtc_helper.h
|
|
||||||
+++ b/include/drm/drm_crtc_helper.h
|
|
||||||
@@ -92,6 +92,7 @@ extern int drm_helper_probe_single_conne
|
|
||||||
extern void drm_helper_disable_unused_functions(struct drm_device *dev);
|
|
||||||
extern int drm_helper_hotplug_stage_two(struct drm_device *dev);
|
|
||||||
extern bool drm_helper_initial_config(struct drm_device *dev);
|
|
||||||
+extern void drm_helper_initial_config_async(struct drm_device *dev);
|
|
||||||
extern int drm_crtc_helper_set_config(struct drm_mode_set *set);
|
|
||||||
extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
|
|
||||||
struct drm_display_mode *mode,
|
|
||||||
Index: b/drivers/gpu/drm/i915/i915_dma.c
|
|
||||||
===================================================================
|
|
||||||
--- a/drivers/gpu/drm/i915/i915_dma.c
|
|
||||||
+++ b/drivers/gpu/drm/i915/i915_dma.c
|
|
||||||
@@ -1045,7 +1045,7 @@ static int i915_load_modeset_init(struct
|
|
||||||
|
|
||||||
intel_modeset_init(dev);
|
|
||||||
|
|
||||||
- drm_helper_initial_config(dev);
|
|
||||||
+ drm_helper_initial_config_async(dev);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
||||||
Date: Fri, 23 Jan 2009
|
|
||||||
|
|
||||||
Small fix changing error msg to info msg in acer wmi driver
|
|
||||||
---
|
|
||||||
---
|
|
||||||
drivers/platform/x86/acer-wmi.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
Index: linux-2.6.29/drivers/platform/x86/acer-wmi.c
|
|
||||||
===================================================================
|
|
||||||
--- linux-2.6.29.orig/drivers/platform/x86/acer-wmi.c
|
|
||||||
+++ linux-2.6.29/drivers/platform/x86/acer-wmi.c
|
|
||||||
@@ -1290,7 +1290,7 @@ static int __init acer_wmi_init(void)
|
|
||||||
AMW0_find_mailled();
|
|
||||||
|
|
||||||
if (!interface) {
|
|
||||||
- printk(ACER_ERR "No or unsupported WMI interface, unable to "
|
|
||||||
+ printk(ACER_INFO "No or unsupported WMI interface, unable to "
|
|
||||||
"load\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
diff -up linux-2.6.30.noarch/drivers/input/misc/pcspkr.c.jx linux-2.6.30.noarch/drivers/input/misc/pcspkr.c
|
|
||||||
--- linux-2.6.30.noarch/drivers/input/misc/pcspkr.c.jx 2009-07-28 16:54:44.000000000 -0400
|
|
||||||
+++ linux-2.6.30.noarch/drivers/input/misc/pcspkr.c 2009-07-28 16:59:36.000000000 -0400
|
|
||||||
@@ -23,7 +23,6 @@
|
|
||||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
|
||||||
MODULE_DESCRIPTION("PC Speaker beeper driver");
|
|
||||||
MODULE_LICENSE("GPL");
|
|
||||||
-MODULE_ALIAS("platform:pcspkr");
|
|
||||||
|
|
||||||
#if defined(CONFIG_MIPS) || defined(CONFIG_X86)
|
|
||||||
/* Use the global PIT lock ! */
|
|
@ -1,14 +0,0 @@
|
|||||||
KERN_ERR is not appropriate for a printk level of a successful operation
|
|
||||||
|
|
||||||
|
|
||||||
--- linux-2.6.30/drivers/hid/hid-wacom.c~ 2009-09-04 10:37:20.000000000 -0700
|
|
||||||
+++ linux-2.6.30/drivers/hid/hid-wacom.c 2009-09-04 10:37:20.000000000 -0700
|
|
||||||
@@ -244,7 +244,7 @@
|
|
||||||
ret = hid_register_driver(&wacom_driver);
|
|
||||||
if (ret)
|
|
||||||
printk(KERN_ERR "can't register wacom driver\n");
|
|
||||||
- printk(KERN_ERR "wacom driver registered\n");
|
|
||||||
+ printk(KERN_INFO "wacom driver registered\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
|||||||
diff -Naur linux-2.6.33.2/sound/pci/hda/hda_beep.c linux-2.6.33.2.patch/sound/pci/hda/hda_beep.c
|
|
||||||
--- linux-2.6.33.2/sound/pci/hda/hda_beep.c 2010-04-02 01:02:33.000000000 +0200
|
|
||||||
+++ linux-2.6.33.2.patch/sound/pci/hda/hda_beep.c 2010-04-09 03:19:43.846329981 +0200
|
|
||||||
@@ -1,3 +1,5 @@
|
|
||||||
+#define __NO_VERSION__
|
|
||||||
+#include "adriver.h"
|
|
||||||
/*
|
|
||||||
* Digital Beep Input Interface for HD-audio codec
|
|
||||||
*
|
|
||||||
@@ -92,7 +94,11 @@
|
|
||||||
static int snd_hda_beep_event(struct input_dev *dev, unsigned int type,
|
|
||||||
unsigned int code, int hz)
|
|
||||||
{
|
|
||||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
|
|
||||||
+ struct hda_beep *beep = dev->private;
|
|
||||||
+#else
|
|
||||||
struct hda_beep *beep = input_get_drvdata(dev);
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
switch (code) {
|
|
||||||
case SND_BELL:
|
|
||||||
@@ -116,8 +122,13 @@
|
|
||||||
static void snd_hda_do_detach(struct hda_beep *beep)
|
|
||||||
{
|
|
||||||
input_unregister_device(beep->dev);
|
|
||||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 15)
|
|
||||||
+ kfree(beep->dev);
|
|
||||||
+#endif
|
|
||||||
beep->dev = NULL;
|
|
||||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
|
|
||||||
cancel_work_sync(&beep->beep_work);
|
|
||||||
+#endif
|
|
||||||
/* turn off beep for sure */
|
|
||||||
snd_hda_codec_write(beep->codec, beep->nid, 0,
|
|
||||||
AC_VERB_SET_BEEP_CONTROL, 0);
|
|
||||||
@@ -129,7 +140,11 @@
|
|
||||||
struct hda_codec *codec = beep->codec;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 15)
|
|
||||||
input_dev = input_allocate_device();
|
|
||||||
+#else
|
|
||||||
+ input_dev = kzalloc(sizeof(*input_dev), GFP_KERNEL);
|
|
||||||
+#endif
|
|
||||||
if (!input_dev) {
|
|
||||||
printk(KERN_INFO "hda_beep: unable to allocate input device\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
@@ -147,15 +162,26 @@
|
|
||||||
input_dev->evbit[0] = BIT_MASK(EV_SND);
|
|
||||||
input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
|
|
||||||
input_dev->event = snd_hda_beep_event;
|
|
||||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
|
|
||||||
input_dev->dev.parent = &codec->bus->pci->dev;
|
|
||||||
input_set_drvdata(input_dev, beep);
|
|
||||||
+#else
|
|
||||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 15)
|
|
||||||
+ input_dev->cdev.dev = &codec->bus->pci->dev;
|
|
||||||
+#endif
|
|
||||||
+ input_dev->private = beep;
|
|
||||||
+#endif /* 2.6.22 */
|
|
||||||
|
|
||||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 15)
|
|
||||||
err = input_register_device(input_dev);
|
|
||||||
if (err < 0) {
|
|
||||||
input_free_device(input_dev);
|
|
||||||
printk(KERN_INFO "hda_beep: unable to register input device\n");
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+ input_register_device(input_dev);
|
|
||||||
+#endif
|
|
||||||
beep->dev = input_dev;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -255,7 +281,9 @@
|
|
||||||
{
|
|
||||||
struct hda_beep *beep = codec->beep;
|
|
||||||
if (beep) {
|
|
||||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
|
|
||||||
cancel_work_sync(&beep->register_work);
|
|
||||||
+#endif
|
|
||||||
cancel_delayed_work(&beep->unregister_work);
|
|
||||||
if (beep->dev)
|
|
||||||
snd_hda_do_detach(beep);
|
|
File diff suppressed because it is too large
Load Diff
@ -1,703 +0,0 @@
|
|||||||
diff -Naur linux-2.6.33.2/drivers/usb/serial/ftdi_sio.c linux-2.6.33.2.patch/drivers/usb/serial/ftdi_sio.c
|
|
||||||
--- linux-2.6.33.2/drivers/usb/serial/ftdi_sio.c 2010-04-02 01:02:33.000000000 +0200
|
|
||||||
+++ linux-2.6.33.2.patch/drivers/usb/serial/ftdi_sio.c 2010-04-25 18:42:20.184548098 +0200
|
|
||||||
@@ -33,12 +33,12 @@
|
|
||||||
#include <linux/errno.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
-#include <linux/smp_lock.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/tty_driver.h>
|
|
||||||
#include <linux/tty_flip.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/spinlock.h>
|
|
||||||
+#include <linux/mutex.h>
|
|
||||||
#include <linux/uaccess.h>
|
|
||||||
#include <linux/usb.h>
|
|
||||||
#include <linux/serial.h>
|
|
||||||
@@ -88,10 +88,10 @@
|
|
||||||
|
|
||||||
unsigned int latency; /* latency setting in use */
|
|
||||||
spinlock_t tx_lock; /* spinlock for transmit state */
|
|
||||||
- unsigned long tx_bytes;
|
|
||||||
unsigned long tx_outstanding_bytes;
|
|
||||||
unsigned long tx_outstanding_urbs;
|
|
||||||
unsigned short max_packet_size;
|
|
||||||
+ struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* struct ftdi_sio_quirk is used by devices requiring special attention. */
|
|
||||||
@@ -818,7 +818,7 @@
|
|
||||||
.name = "ftdi_sio",
|
|
||||||
},
|
|
||||||
.description = "FTDI USB Serial Device",
|
|
||||||
- .usb_driver = &ftdi_driver ,
|
|
||||||
+ .usb_driver = &ftdi_driver,
|
|
||||||
.id_table = id_table_combined,
|
|
||||||
.num_ports = 1,
|
|
||||||
.probe = ftdi_sio_probe,
|
|
||||||
@@ -834,8 +834,8 @@
|
|
||||||
.chars_in_buffer = ftdi_chars_in_buffer,
|
|
||||||
.read_bulk_callback = ftdi_read_bulk_callback,
|
|
||||||
.write_bulk_callback = ftdi_write_bulk_callback,
|
|
||||||
- .tiocmget = ftdi_tiocmget,
|
|
||||||
- .tiocmset = ftdi_tiocmset,
|
|
||||||
+ .tiocmget = ftdi_tiocmget,
|
|
||||||
+ .tiocmset = ftdi_tiocmset,
|
|
||||||
.ioctl = ftdi_ioctl,
|
|
||||||
.set_termios = ftdi_set_termios,
|
|
||||||
.break_ctl = ftdi_break_ctl,
|
|
||||||
@@ -941,7 +941,6 @@
|
|
||||||
unsigned int clear)
|
|
||||||
{
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
- char *buf;
|
|
||||||
unsigned urb_value;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
@@ -950,10 +949,6 @@
|
|
||||||
return 0; /* no change */
|
|
||||||
}
|
|
||||||
|
|
||||||
- buf = kmalloc(1, GFP_NOIO);
|
|
||||||
- if (!buf)
|
|
||||||
- return -ENOMEM;
|
|
||||||
-
|
|
||||||
clear &= ~set; /* 'set' takes precedence over 'clear' */
|
|
||||||
urb_value = 0;
|
|
||||||
if (clear & TIOCM_DTR)
|
|
||||||
@@ -969,9 +964,7 @@
|
|
||||||
FTDI_SIO_SET_MODEM_CTRL_REQUEST,
|
|
||||||
FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
|
|
||||||
urb_value, priv->interface,
|
|
||||||
- buf, 0, WDR_TIMEOUT);
|
|
||||||
-
|
|
||||||
- kfree(buf);
|
|
||||||
+ NULL, 0, WDR_TIMEOUT);
|
|
||||||
if (rv < 0) {
|
|
||||||
dbg("%s Error from MODEM_CTRL urb: DTR %s, RTS %s",
|
|
||||||
__func__,
|
|
||||||
@@ -1130,16 +1123,11 @@
|
|
||||||
static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
|
|
||||||
{
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
- char *buf;
|
|
||||||
__u16 urb_value;
|
|
||||||
__u16 urb_index;
|
|
||||||
__u32 urb_index_value;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
- buf = kmalloc(1, GFP_NOIO);
|
|
||||||
- if (!buf)
|
|
||||||
- return -ENOMEM;
|
|
||||||
-
|
|
||||||
urb_index_value = get_ftdi_divisor(tty, port);
|
|
||||||
urb_value = (__u16)urb_index_value;
|
|
||||||
urb_index = (__u16)(urb_index_value >> 16);
|
|
||||||
@@ -1152,9 +1140,7 @@
|
|
||||||
FTDI_SIO_SET_BAUDRATE_REQUEST,
|
|
||||||
FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
|
|
||||||
urb_value, urb_index,
|
|
||||||
- buf, 0, WDR_SHORT_TIMEOUT);
|
|
||||||
-
|
|
||||||
- kfree(buf);
|
|
||||||
+ NULL, 0, WDR_SHORT_TIMEOUT);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1162,8 +1148,7 @@
|
|
||||||
{
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
struct usb_device *udev = port->serial->dev;
|
|
||||||
- char buf[1];
|
|
||||||
- int rv = 0;
|
|
||||||
+ int rv;
|
|
||||||
int l = priv->latency;
|
|
||||||
|
|
||||||
if (priv->flags & ASYNC_LOW_LATENCY)
|
|
||||||
@@ -1176,8 +1161,7 @@
|
|
||||||
FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
|
|
||||||
FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
|
|
||||||
l, priv->interface,
|
|
||||||
- buf, 0, WDR_TIMEOUT);
|
|
||||||
-
|
|
||||||
+ NULL, 0, WDR_TIMEOUT);
|
|
||||||
if (rv < 0)
|
|
||||||
dev_err(&port->dev, "Unable to write latency timer: %i\n", rv);
|
|
||||||
return rv;
|
|
||||||
@@ -1187,24 +1171,29 @@
|
|
||||||
{
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
struct usb_device *udev = port->serial->dev;
|
|
||||||
- unsigned short latency = 0;
|
|
||||||
- int rv = 0;
|
|
||||||
-
|
|
||||||
+ unsigned char *buf;
|
|
||||||
+ int rv;
|
|
||||||
|
|
||||||
dbg("%s", __func__);
|
|
||||||
|
|
||||||
+ buf = kmalloc(1, GFP_KERNEL);
|
|
||||||
+ if (!buf)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
rv = usb_control_msg(udev,
|
|
||||||
usb_rcvctrlpipe(udev, 0),
|
|
||||||
FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
|
|
||||||
FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
|
|
||||||
0, priv->interface,
|
|
||||||
- (char *) &latency, 1, WDR_TIMEOUT);
|
|
||||||
-
|
|
||||||
- if (rv < 0) {
|
|
||||||
+ buf, 1, WDR_TIMEOUT);
|
|
||||||
+ if (rv < 0)
|
|
||||||
dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
|
|
||||||
- return -EIO;
|
|
||||||
- }
|
|
||||||
- return latency;
|
|
||||||
+ else
|
|
||||||
+ priv->latency = buf[0];
|
|
||||||
+
|
|
||||||
+ kfree(buf);
|
|
||||||
+
|
|
||||||
+ return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int get_serial_info(struct usb_serial_port *port,
|
|
||||||
@@ -1235,7 +1224,7 @@
|
|
||||||
if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
- lock_kernel();
|
|
||||||
+ mutex_lock(&priv->cfg_lock);
|
|
||||||
old_priv = *priv;
|
|
||||||
|
|
||||||
/* Do error checking and permission checking */
|
|
||||||
@@ -1243,7 +1232,7 @@
|
|
||||||
if (!capable(CAP_SYS_ADMIN)) {
|
|
||||||
if (((new_serial.flags & ~ASYNC_USR_MASK) !=
|
|
||||||
(priv->flags & ~ASYNC_USR_MASK))) {
|
|
||||||
- unlock_kernel();
|
|
||||||
+ mutex_unlock(&priv->cfg_lock);
|
|
||||||
return -EPERM;
|
|
||||||
}
|
|
||||||
priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
|
|
||||||
@@ -1254,7 +1243,7 @@
|
|
||||||
|
|
||||||
if ((new_serial.baud_base != priv->baud_base) &&
|
|
||||||
(new_serial.baud_base < 9600)) {
|
|
||||||
- unlock_kernel();
|
|
||||||
+ mutex_unlock(&priv->cfg_lock);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1284,11 +1273,11 @@
|
|
||||||
(priv->flags & ASYNC_SPD_MASK)) ||
|
|
||||||
(((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
|
|
||||||
(old_priv.custom_divisor != priv->custom_divisor))) {
|
|
||||||
- unlock_kernel();
|
|
||||||
change_speed(tty, port);
|
|
||||||
+ mutex_unlock(&priv->cfg_lock);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
- unlock_kernel();
|
|
||||||
+ mutex_unlock(&priv->cfg_lock);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} /* set_serial_info */
|
|
||||||
@@ -1344,20 +1333,20 @@
|
|
||||||
__func__);
|
|
||||||
}
|
|
||||||
} else if (version < 0x200) {
|
|
||||||
- /* Old device. Assume its the original SIO. */
|
|
||||||
+ /* Old device. Assume it's the original SIO. */
|
|
||||||
priv->chip_type = SIO;
|
|
||||||
priv->baud_base = 12000000 / 16;
|
|
||||||
priv->write_offset = 1;
|
|
||||||
} else if (version < 0x400) {
|
|
||||||
- /* Assume its an FT8U232AM (or FT8U245AM) */
|
|
||||||
+ /* Assume it's an FT8U232AM (or FT8U245AM) */
|
|
||||||
/* (It might be a BM because of the iSerialNumber bug,
|
|
||||||
* but it will still work as an AM device.) */
|
|
||||||
priv->chip_type = FT8U232AM;
|
|
||||||
} else if (version < 0x600) {
|
|
||||||
- /* Assume its an FT232BM (or FT245BM) */
|
|
||||||
+ /* Assume it's an FT232BM (or FT245BM) */
|
|
||||||
priv->chip_type = FT232BM;
|
|
||||||
} else {
|
|
||||||
- /* Assume its an FT232R */
|
|
||||||
+ /* Assume it's an FT232R */
|
|
||||||
priv->chip_type = FT232RL;
|
|
||||||
}
|
|
||||||
dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);
|
|
||||||
@@ -1377,7 +1366,7 @@
|
|
||||||
struct usb_endpoint_descriptor *ep_desc = &interface->cur_altsetting->endpoint[1].desc;
|
|
||||||
|
|
||||||
unsigned num_endpoints;
|
|
||||||
- int i = 0;
|
|
||||||
+ int i;
|
|
||||||
|
|
||||||
num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
|
|
||||||
dev_info(&udev->dev, "Number of endpoints %d\n", num_endpoints);
|
|
||||||
@@ -1429,7 +1418,7 @@
|
|
||||||
struct usb_serial_port *port = to_usb_serial_port(dev);
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
int v = simple_strtoul(valbuf, NULL, 10);
|
|
||||||
- int rv = 0;
|
|
||||||
+ int rv;
|
|
||||||
|
|
||||||
priv->latency = v;
|
|
||||||
rv = write_latency_timer(port);
|
|
||||||
@@ -1446,9 +1435,8 @@
|
|
||||||
struct usb_serial_port *port = to_usb_serial_port(dev);
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
struct usb_device *udev = port->serial->dev;
|
|
||||||
- char buf[1];
|
|
||||||
int v = simple_strtoul(valbuf, NULL, 10);
|
|
||||||
- int rv = 0;
|
|
||||||
+ int rv;
|
|
||||||
|
|
||||||
dbg("%s: setting event char = %i", __func__, v);
|
|
||||||
|
|
||||||
@@ -1457,8 +1445,7 @@
|
|
||||||
FTDI_SIO_SET_EVENT_CHAR_REQUEST,
|
|
||||||
FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
|
|
||||||
v, priv->interface,
|
|
||||||
- buf, 0, WDR_TIMEOUT);
|
|
||||||
-
|
|
||||||
+ NULL, 0, WDR_TIMEOUT);
|
|
||||||
if (rv < 0) {
|
|
||||||
dbg("Unable to write event character: %i", rv);
|
|
||||||
return -EIO;
|
|
||||||
@@ -1557,9 +1544,9 @@
|
|
||||||
|
|
||||||
kref_init(&priv->kref);
|
|
||||||
spin_lock_init(&priv->tx_lock);
|
|
||||||
+ mutex_init(&priv->cfg_lock);
|
|
||||||
init_waitqueue_head(&priv->delta_msr_wait);
|
|
||||||
- /* This will push the characters through immediately rather
|
|
||||||
- than queue a task to deliver them */
|
|
||||||
+
|
|
||||||
priv->flags = ASYNC_LOW_LATENCY;
|
|
||||||
|
|
||||||
if (quirk && quirk->port_probe)
|
|
||||||
@@ -1591,7 +1578,8 @@
|
|
||||||
|
|
||||||
ftdi_determine_type(port);
|
|
||||||
ftdi_set_max_packet_size(port);
|
|
||||||
- read_latency_timer(port);
|
|
||||||
+ if (read_latency_timer(port) < 0)
|
|
||||||
+ priv->latency = 16;
|
|
||||||
create_sysfs_attrs(port);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1636,8 +1624,6 @@
|
|
||||||
{
|
|
||||||
struct usb_device *udev = serial->dev;
|
|
||||||
int latency = ndi_latency_timer;
|
|
||||||
- int rv = 0;
|
|
||||||
- char buf[1];
|
|
||||||
|
|
||||||
if (latency == 0)
|
|
||||||
latency = 1;
|
|
||||||
@@ -1647,10 +1633,11 @@
|
|
||||||
dbg("%s setting NDI device latency to %d", __func__, latency);
|
|
||||||
dev_info(&udev->dev, "NDI device with a latency value of %d", latency);
|
|
||||||
|
|
||||||
- rv = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
||||||
+ /* FIXME: errors are not returned */
|
|
||||||
+ usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
||||||
FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
|
|
||||||
FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
|
|
||||||
- latency, 0, buf, 0, WDR_TIMEOUT);
|
|
||||||
+ latency, 0, NULL, 0, WDR_TIMEOUT);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1726,7 +1713,7 @@
|
|
||||||
urb->transfer_buffer_length,
|
|
||||||
ftdi_read_bulk_callback, port);
|
|
||||||
result = usb_submit_urb(urb, mem_flags);
|
|
||||||
- if (result)
|
|
||||||
+ if (result && result != -EPERM)
|
|
||||||
dev_err(&port->dev,
|
|
||||||
"%s - failed submitting read urb, error %d\n",
|
|
||||||
__func__, result);
|
|
||||||
@@ -1738,16 +1725,10 @@
|
|
||||||
struct usb_device *dev = port->serial->dev;
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
unsigned long flags;
|
|
||||||
-
|
|
||||||
- int result = 0;
|
|
||||||
- char buf[1]; /* Needed for the usb_control_msg I think */
|
|
||||||
+ int result;
|
|
||||||
|
|
||||||
dbg("%s", __func__);
|
|
||||||
|
|
||||||
- spin_lock_irqsave(&priv->tx_lock, flags);
|
|
||||||
- priv->tx_bytes = 0;
|
|
||||||
- spin_unlock_irqrestore(&priv->tx_lock, flags);
|
|
||||||
-
|
|
||||||
write_latency_timer(port);
|
|
||||||
|
|
||||||
/* No error checking for this (will get errors later anyway) */
|
|
||||||
@@ -1755,7 +1736,7 @@
|
|
||||||
usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
|
||||||
FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
|
|
||||||
FTDI_SIO_RESET_SIO,
|
|
||||||
- priv->interface, buf, 0, WDR_TIMEOUT);
|
|
||||||
+ priv->interface, NULL, 0, WDR_TIMEOUT);
|
|
||||||
|
|
||||||
/* Termios defaults are set by usb_serial_init. We don't change
|
|
||||||
port->tty->termios - this would lose speed settings, etc.
|
|
||||||
@@ -1783,7 +1764,6 @@
|
|
||||||
static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
|
|
||||||
{
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
- char buf[1];
|
|
||||||
|
|
||||||
mutex_lock(&port->serial->disc_mutex);
|
|
||||||
if (!port->serial->disconnected) {
|
|
||||||
@@ -1792,7 +1772,7 @@
|
|
||||||
usb_sndctrlpipe(port->serial->dev, 0),
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
|
|
||||||
- 0, priv->interface, buf, 0,
|
|
||||||
+ 0, priv->interface, NULL, 0,
|
|
||||||
WDR_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev, "error from flowcontrol urb\n");
|
|
||||||
}
|
|
||||||
@@ -1853,7 +1833,7 @@
|
|
||||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
|
||||||
if (priv->tx_outstanding_urbs > URB_UPPER_LIMIT) {
|
|
||||||
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
|
||||||
- dbg("%s - write limit hit\n", __func__);
|
|
||||||
+ dbg("%s - write limit hit", __func__);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
priv->tx_outstanding_urbs++;
|
|
||||||
@@ -1933,7 +1913,6 @@
|
|
||||||
} else {
|
|
||||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
|
||||||
priv->tx_outstanding_bytes += count;
|
|
||||||
- priv->tx_bytes += count;
|
|
||||||
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2160,8 +2139,7 @@
|
|
||||||
{
|
|
||||||
struct usb_serial_port *port = tty->driver_data;
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
- __u16 urb_value = 0;
|
|
||||||
- char buf[1];
|
|
||||||
+ __u16 urb_value;
|
|
||||||
|
|
||||||
/* break_state = -1 to turn on break, and 0 to turn off break */
|
|
||||||
/* see drivers/char/tty_io.c to see it used */
|
|
||||||
@@ -2177,7 +2155,7 @@
|
|
||||||
FTDI_SIO_SET_DATA_REQUEST,
|
|
||||||
FTDI_SIO_SET_DATA_REQUEST_TYPE,
|
|
||||||
urb_value , priv->interface,
|
|
||||||
- buf, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
+ NULL, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev, "%s FAILED to enable/disable break state "
|
|
||||||
"(state was %d)\n", __func__, break_state);
|
|
||||||
}
|
|
||||||
@@ -2201,7 +2179,6 @@
|
|
||||||
struct ktermios *termios = tty->termios;
|
|
||||||
unsigned int cflag = termios->c_cflag;
|
|
||||||
__u16 urb_value; /* will hold the new flags */
|
|
||||||
- char buf[1]; /* Perhaps I should dynamically alloc this? */
|
|
||||||
|
|
||||||
/* Added for xon/xoff support */
|
|
||||||
unsigned int iflag = termios->c_iflag;
|
|
||||||
@@ -2252,12 +2229,10 @@
|
|
||||||
}
|
|
||||||
if (cflag & CSIZE) {
|
|
||||||
switch (cflag & CSIZE) {
|
|
||||||
- case CS5: urb_value |= 5; dbg("Setting CS5"); break;
|
|
||||||
- case CS6: urb_value |= 6; dbg("Setting CS6"); break;
|
|
||||||
case CS7: urb_value |= 7; dbg("Setting CS7"); break;
|
|
||||||
case CS8: urb_value |= 8; dbg("Setting CS8"); break;
|
|
||||||
default:
|
|
||||||
- dev_err(&port->dev, "CSIZE was set but not CS5-CS8\n");
|
|
||||||
+ dev_err(&port->dev, "CSIZE was set but not CS7-CS8\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2269,7 +2244,7 @@
|
|
||||||
FTDI_SIO_SET_DATA_REQUEST,
|
|
||||||
FTDI_SIO_SET_DATA_REQUEST_TYPE,
|
|
||||||
urb_value , priv->interface,
|
|
||||||
- buf, 0, WDR_SHORT_TIMEOUT) < 0) {
|
|
||||||
+ NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev, "%s FAILED to set "
|
|
||||||
"databits/stopbits/parity\n", __func__);
|
|
||||||
}
|
|
||||||
@@ -2281,7 +2256,7 @@
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
|
|
||||||
0, priv->interface,
|
|
||||||
- buf, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
+ NULL, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev,
|
|
||||||
"%s error from disable flowcontrol urb\n",
|
|
||||||
__func__);
|
|
||||||
@@ -2290,9 +2265,11 @@
|
|
||||||
clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
|
|
||||||
} else {
|
|
||||||
/* set the baudrate determined before */
|
|
||||||
+ mutex_lock(&priv->cfg_lock);
|
|
||||||
if (change_speed(tty, port))
|
|
||||||
dev_err(&port->dev, "%s urb failed to set baudrate\n",
|
|
||||||
__func__);
|
|
||||||
+ mutex_unlock(&priv->cfg_lock);
|
|
||||||
/* Ensure RTS and DTR are raised when baudrate changed from 0 */
|
|
||||||
if (!old_termios || (old_termios->c_cflag & CBAUD) == B0)
|
|
||||||
set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
|
|
||||||
@@ -2307,7 +2284,7 @@
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
|
|
||||||
0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
|
|
||||||
- buf, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
+ NULL, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev,
|
|
||||||
"urb failed to set to rts/cts flow control\n");
|
|
||||||
}
|
|
||||||
@@ -2339,7 +2316,7 @@
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
|
|
||||||
urb_value , (FTDI_SIO_XON_XOFF_HS
|
|
||||||
| priv->interface),
|
|
||||||
- buf, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
+ NULL, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev, "urb failed to set to "
|
|
||||||
"xon/xoff flow control\n");
|
|
||||||
}
|
|
||||||
@@ -2353,7 +2330,7 @@
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
|
|
||||||
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
|
|
||||||
0, priv->interface,
|
|
||||||
- buf, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
+ NULL, 0, WDR_TIMEOUT) < 0) {
|
|
||||||
dev_err(&port->dev,
|
|
||||||
"urb failed to clear flow control\n");
|
|
||||||
}
|
|
||||||
@@ -2367,21 +2344,22 @@
|
|
||||||
{
|
|
||||||
struct usb_serial_port *port = tty->driver_data;
|
|
||||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
|
||||||
- unsigned char buf[2];
|
|
||||||
+ unsigned char *buf;
|
|
||||||
+ int len;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
dbg("%s TIOCMGET", __func__);
|
|
||||||
+
|
|
||||||
+ buf = kmalloc(2, GFP_KERNEL);
|
|
||||||
+ if (!buf)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+ /*
|
|
||||||
+ * The 8U232AM returns a two byte value (the SIO a 1 byte value) in
|
|
||||||
+ * the same format as the data returned from the in point.
|
|
||||||
+ */
|
|
||||||
switch (priv->chip_type) {
|
|
||||||
case SIO:
|
|
||||||
- /* Request the status from the device */
|
|
||||||
- ret = usb_control_msg(port->serial->dev,
|
|
||||||
- usb_rcvctrlpipe(port->serial->dev, 0),
|
|
||||||
- FTDI_SIO_GET_MODEM_STATUS_REQUEST,
|
|
||||||
- FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
|
|
||||||
- 0, 0,
|
|
||||||
- buf, 1, WDR_TIMEOUT);
|
|
||||||
- if (ret < 0)
|
|
||||||
- return ret;
|
|
||||||
+ len = 1;
|
|
||||||
break;
|
|
||||||
case FT8U232AM:
|
|
||||||
case FT232BM:
|
|
||||||
@@ -2389,27 +2367,30 @@
|
|
||||||
case FT232RL:
|
|
||||||
case FT2232H:
|
|
||||||
case FT4232H:
|
|
||||||
- /* the 8U232AM returns a two byte value (the sio is a 1 byte
|
|
||||||
- value) - in the same format as the data returned from the in
|
|
||||||
- point */
|
|
||||||
- ret = usb_control_msg(port->serial->dev,
|
|
||||||
- usb_rcvctrlpipe(port->serial->dev, 0),
|
|
||||||
- FTDI_SIO_GET_MODEM_STATUS_REQUEST,
|
|
||||||
- FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
|
|
||||||
- 0, priv->interface,
|
|
||||||
- buf, 2, WDR_TIMEOUT);
|
|
||||||
- if (ret < 0)
|
|
||||||
- return ret;
|
|
||||||
+ len = 2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
- return -EFAULT;
|
|
||||||
+ ret = -EFAULT;
|
|
||||||
+ goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- return (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
|
|
||||||
+ ret = usb_control_msg(port->serial->dev,
|
|
||||||
+ usb_rcvctrlpipe(port->serial->dev, 0),
|
|
||||||
+ FTDI_SIO_GET_MODEM_STATUS_REQUEST,
|
|
||||||
+ FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
|
|
||||||
+ 0, priv->interface,
|
|
||||||
+ buf, len, WDR_TIMEOUT);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ goto out;
|
|
||||||
+
|
|
||||||
+ ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
|
|
||||||
(buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
|
|
||||||
(buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
|
|
||||||
(buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
|
|
||||||
priv->last_dtr_rts;
|
|
||||||
+out:
|
|
||||||
+ kfree(buf);
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ftdi_tiocmset(struct tty_struct *tty, struct file *file,
|
|
||||||
@@ -2514,8 +2495,7 @@
|
|
||||||
port->throttled = port->throttle_req = 0;
|
|
||||||
spin_unlock_irqrestore(&port->lock, flags);
|
|
||||||
|
|
||||||
- /* Resubmit urb if throttled and open. */
|
|
||||||
- if (was_throttled && test_bit(ASYNCB_INITIALIZED, &port->port.flags))
|
|
||||||
+ if (was_throttled)
|
|
||||||
ftdi_submit_read_urb(port, GFP_KERNEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff -Naur linux-2.6.33.2/drivers/usb/serial/ftdi_sio.h linux-2.6.33.2.patch/drivers/usb/serial/ftdi_sio.h
|
|
||||||
--- linux-2.6.33.2/drivers/usb/serial/ftdi_sio.h 2010-04-02 01:02:33.000000000 +0200
|
|
||||||
+++ linux-2.6.33.2.patch/drivers/usb/serial/ftdi_sio.h 2010-04-25 18:40:02.713423244 +0200
|
|
||||||
@@ -28,13 +28,13 @@
|
|
||||||
#define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
|
|
||||||
#define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
|
|
||||||
#define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of the port */
|
|
||||||
-#define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modern status register */
|
|
||||||
+#define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modem status register */
|
|
||||||
#define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
|
|
||||||
#define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
|
|
||||||
#define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
|
|
||||||
#define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */
|
|
||||||
|
|
||||||
-/* Interface indicies for FT2232, FT2232H and FT4232H devices*/
|
|
||||||
+/* Interface indices for FT2232, FT2232H and FT4232H devices */
|
|
||||||
#define INTERFACE_A 1
|
|
||||||
#define INTERFACE_B 2
|
|
||||||
#define INTERFACE_C 3
|
|
||||||
@@ -270,7 +270,7 @@
|
|
||||||
* BmRequestType: 0100 0000b
|
|
||||||
* bRequest: FTDI_SIO_SET_FLOW_CTRL
|
|
||||||
* wValue: Xoff/Xon
|
|
||||||
- * wIndex: Protocol/Port - hIndex is protocl / lIndex is port
|
|
||||||
+ * wIndex: Protocol/Port - hIndex is protocol / lIndex is port
|
|
||||||
* wLength: 0
|
|
||||||
* Data: None
|
|
||||||
*
|
|
||||||
diff -Naur linux-2.6.33.2/drivers/usb/serial/ftdi_sio_ids.h linux-2.6.33.2.patch/drivers/usb/serial/ftdi_sio_ids.h
|
|
||||||
--- linux-2.6.33.2/drivers/usb/serial/ftdi_sio_ids.h 2010-04-02 01:02:33.000000000 +0200
|
|
||||||
+++ linux-2.6.33.2.patch/drivers/usb/serial/ftdi_sio_ids.h 2010-04-25 18:40:09.930546335 +0200
|
|
||||||
@@ -22,7 +22,7 @@
|
|
||||||
#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
|
|
||||||
#define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
|
|
||||||
#define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */
|
|
||||||
-#define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */
|
|
||||||
+#define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */
|
|
||||||
#define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */
|
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@
|
|
||||||
#define LMI_LM3S_DEVEL_BOARD_PID 0xbcd8
|
|
||||||
#define LMI_LM3S_EVAL_BOARD_PID 0xbcd9
|
|
||||||
|
|
||||||
-#define FTDI_TURTELIZER_PID 0xBDC8 /* JTAG/RS-232 adapter by egnite GmBH */
|
|
||||||
+#define FTDI_TURTELIZER_PID 0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */
|
|
||||||
|
|
||||||
/* OpenDCC (www.opendcc.de) product id */
|
|
||||||
#define FTDI_OPENDCC_PID 0xBFD8
|
|
||||||
@@ -185,7 +185,7 @@
|
|
||||||
#define FTDI_ELV_TFD128_PID 0xE0EC /* ELV Temperatur-Feuchte-Datenlogger TFD 128 */
|
|
||||||
#define FTDI_ELV_FM3RX_PID 0xE0ED /* ELV Messwertuebertragung FM3 RX */
|
|
||||||
#define FTDI_ELV_WS777_PID 0xE0EE /* Conrad WS 777 */
|
|
||||||
-#define FTDI_ELV_EM1010PC_PID 0xE0EF /* Engery monitor EM 1010 PC */
|
|
||||||
+#define FTDI_ELV_EM1010PC_PID 0xE0EF /* Energy monitor EM 1010 PC */
|
|
||||||
#define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */
|
|
||||||
#define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */
|
|
||||||
#define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */
|
|
||||||
@@ -212,8 +212,8 @@
|
|
||||||
* drivers, or possibly the Comedi drivers in some cases. */
|
|
||||||
#define FTDI_ELV_CLI7000_PID 0xFB59 /* Computer-Light-Interface (CLI 7000) */
|
|
||||||
#define FTDI_ELV_PPS7330_PID 0xFB5C /* Processor-Power-Supply (PPS 7330) */
|
|
||||||
-#define FTDI_ELV_TFM100_PID 0xFB5D /* Temperartur-Feuchte Messgeraet (TFM 100) */
|
|
||||||
-#define FTDI_ELV_UDF77_PID 0xFB5E /* USB DCF Funkurh (UDF 77) */
|
|
||||||
+#define FTDI_ELV_TFM100_PID 0xFB5D /* Temperatur-Feuchte-Messgeraet (TFM 100) */
|
|
||||||
+#define FTDI_ELV_UDF77_PID 0xFB5E /* USB DCF Funkuhr (UDF 77) */
|
|
||||||
#define FTDI_ELV_UIO88_PID 0xFB5F /* USB-I/O Interface (UIO 88) */
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -320,7 +320,7 @@
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485,
|
|
||||||
- * USB-TTY activ, USB-TTY passiv. Some PIDs are used by several devices
|
|
||||||
+ * USB-TTY aktiv, USB-TTY passiv. Some PIDs are used by several devices
|
|
||||||
* and I'm not entirely sure which are used by which.
|
|
||||||
*/
|
|
||||||
#define FTDI_4N_GALAXY_DE_1_PID 0xF3C0
|
|
||||||
@@ -330,10 +330,10 @@
|
|
||||||
* Linx Technologies product ids
|
|
||||||
*/
|
|
||||||
#define LINX_SDMUSBQSS_PID 0xF448 /* Linx SDM-USB-QS-S */
|
|
||||||
-#define LINX_MASTERDEVEL2_PID 0xF449 /* Linx Master Development 2.0 */
|
|
||||||
-#define LINX_FUTURE_0_PID 0xF44A /* Linx future device */
|
|
||||||
-#define LINX_FUTURE_1_PID 0xF44B /* Linx future device */
|
|
||||||
-#define LINX_FUTURE_2_PID 0xF44C /* Linx future device */
|
|
||||||
+#define LINX_MASTERDEVEL2_PID 0xF449 /* Linx Master Development 2.0 */
|
|
||||||
+#define LINX_FUTURE_0_PID 0xF44A /* Linx future device */
|
|
||||||
+#define LINX_FUTURE_1_PID 0xF44B /* Linx future device */
|
|
||||||
+#define LINX_FUTURE_2_PID 0xF44C /* Linx future device */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oceanic product ids
|
|
||||||
@@ -508,6 +508,20 @@
|
|
||||||
#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * Contec products (http://www.contec.com)
|
|
||||||
+ * Submitted by Daniel Sangorrin
|
|
||||||
+ */
|
|
||||||
+#define CONTEC_VID 0x06CE /* Vendor ID */
|
|
||||||
+#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Contec products (http://www.contec.com)
|
|
||||||
+ * Submitted by Daniel Sangorrin
|
|
||||||
+ */
|
|
||||||
+#define CONTEC_VID 0x06CE /* Vendor ID */
|
|
||||||
+#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* Definitions for B&B Electronics products.
|
|
||||||
*/
|
|
||||||
#define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */
|
|
||||||
@@ -656,7 +670,7 @@
|
|
||||||
#define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */
|
|
||||||
#define FALCOM_SAMBA_PID 0x0005 /* Falcom Samba USB GPRS modem */
|
|
||||||
|
|
||||||
-/* Larsen and Brusgaard AltiTrack/USBtrack */
|
|
||||||
+/* Larsen and Brusgaard AltiTrack/USBtrack */
|
|
||||||
#define LARSENBRUSGAARD_VID 0x0FD8
|
|
||||||
#define LB_ALTITRACK_PID 0x0001
|
|
||||||
|
|
||||||
@@ -985,7 +999,7 @@
|
|
||||||
#define ALTI2_N3_PID 0x6001 /* Neptune 3 */
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * Dresden Elektronic Sensor Terminal Board
|
|
||||||
+ * Dresden Elektronik Sensor Terminal Board
|
|
||||||
*/
|
|
||||||
#define DE_VID 0x1cf1 /* Vendor ID */
|
|
||||||
#define STB_PID 0x0001 /* Sensor Terminal Board */
|
|
@ -1 +1 @@
|
|||||||
http://eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.4.tar.bz2
|
http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.34-rc7.tar.bz2
|
Loading…
x
Reference in New Issue
Block a user