Merge branch 'next' into for-linus
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 7 Sep 2013 03:23:44 +0000 (20:23 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 7 Sep 2013 03:23:44 +0000 (20:23 -0700)
Merge first round of changes for 3.12 merge window.

24 files changed:
Documentation/devicetree/bindings/input/samsung-keypad.txt
arch/arm/mach-davinci/board-da850-evm.c
drivers/hid/hid-apple.c
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/input/joystick/xpad.c
drivers/input/keyboard/Kconfig
drivers/input/keyboard/samsung-keypad.c
drivers/input/mouse/bcm5974.c
drivers/input/mouse/elantech.c
drivers/input/mouse/elantech.h
drivers/input/serio/Kconfig
drivers/input/tablet/wacom_wac.c
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/cyttsp4_core.c
drivers/input/touchscreen/cyttsp4_core.h
drivers/input/touchscreen/cyttsp4_spi.c
drivers/input/touchscreen/cyttsp_core.c
drivers/input/touchscreen/cyttsp_core.h
drivers/input/touchscreen/cyttsp_i2c_common.c
drivers/input/touchscreen/cyttsp_spi.c
drivers/input/touchscreen/tps6507x-ts.c
include/linux/input/tps6507x-ts.h
include/linux/mfd/tps6507x.h

index ce3e394c0e64942527af9a7aa6523b62aa03847e..942d071baaa5da93303785e4d6edc38cc86a5536 100644 (file)
@@ -25,14 +25,6 @@ Required Board Specific Properties:
 - samsung,keypad-num-columns: Number of column lines connected to the
   keypad controller.
 
-- row-gpios: List of gpios used as row lines. The gpio specifier for
-  this property depends on the gpio controller to which these row lines
-  are connected.
-
-- col-gpios: List of gpios used as column lines. The gpio specifier for
-  this property depends on the gpio controller to which these column
-  lines are connected.
-
 - Keys represented as child nodes: Each key connected to the keypad
   controller is represented as a child node to the keypad controller
   device node and should include the following properties.
@@ -41,6 +33,9 @@ Required Board Specific Properties:
   - linux,code: the key-code to be reported when the key is pressed
     and released.
 
+- pinctrl-0: Should specify pin control groups used for this controller.
+- pinctrl-names: Should contain only one value - "default".
+
 Optional Properties specific to linux:
 - linux,keypad-no-autorepeat: do no enable autorepeat feature.
 - linux,keypad-wakeup: use any event on keypad as wakeup event.
@@ -56,17 +51,8 @@ Example:
                linux,input-no-autorepeat;
                linux,input-wakeup;
 
-               row-gpios = <&gpx2 0 3 3 0
-                            &gpx2 1 3 3 0>;
-
-               col-gpios = <&gpx1 0 3 0 0
-                            &gpx1 1 3 0 0
-                            &gpx1 2 3 0 0
-                            &gpx1 3 3 0 0
-                            &gpx1 4 3 0 0
-                            &gpx1 5 3 0 0
-                            &gpx1 6 3 0 0
-                            &gpx1 7 3 0 0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&keypad_rows &keypad_columns>;
 
                key_1 {
                        keypad,row = <0>;
index 8a24b6c6339f4005c11611f0d2ec2980bbfaa0c8..bea6793a7ede41cb04822303956d28347037460b 100644 (file)
@@ -985,7 +985,6 @@ static struct regulator_init_data tps65070_regulator_data[] = {
 static struct touchscreen_init_data tps6507x_touchscreen_data = {
        .poll_period =  30,     /* ms between touch samples */
        .min_pressure = 0x30,   /* minimum pressure to trigger touch */
-       .vref = 0,              /* turn off vref when not using A/D */
        .vendor = 0,            /* /sys/class/input/input?/id/vendor */
        .product = 65070,       /* /sys/class/input/input?/id/product */
        .version = 0x100,       /* /sys/class/input/input?/id/version */
index feae88b53fcd7597bc477aeef4dae7182f8f05ed..c7710b5c69afbf009d0e9f2d727668e6cdae5045 100644 (file)
@@ -524,6 +524,12 @@ static const struct hid_device_id apple_devices[] = {
                .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS),
                .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI),
+               .driver_data = APPLE_HAS_FN },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO),
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS),
+               .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
                .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
index 264f550999406f7b924be6634917e3826e80a161..402f48689943b839c3e873c7180d66ad599f2a0c 100644 (file)
@@ -1547,6 +1547,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
@@ -2179,6 +2182,9 @@ static const struct hid_device_id hid_mouse_ignore_list[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
        { }
index 38535c9243d532b36d8cd321638fd4f2aeabb9c4..216888538c50e81c8bf93d3e5a500ad81a4ba06b 100644 (file)
 #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS   0x023b
 #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI  0x0255
 #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO   0x0256
+#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI   0x0291
+#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO    0x0292
+#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS    0x0293
 #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
index d6cbfe9df21810efe9255415787af029525d1131..75e3b102ce450878bfc83c37572498efba4c92fd 100644 (file)
@@ -137,7 +137,7 @@ static const struct xpad_device {
        { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
        { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
-       { 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", XTYPE_XBOX360 },
+       { 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
        { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
        { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
@@ -167,6 +167,7 @@ static const struct xpad_device {
        { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
        { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
+       { 0x1689, 0xfd01, "Razer Onza Classic Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
        { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
        { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
        { 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
index 77412d8249632d549de2583b66408bbfd946bb33..269d4c3658cb062926972f9cae6ede7faa8d9522 100644 (file)
@@ -441,6 +441,7 @@ config KEYBOARD_TEGRA
 
 config KEYBOARD_OPENCORES
        tristate "OpenCores Keyboard Controller"
+       depends on HAS_IOMEM
        help
          Say Y here if you want to use the OpenCores Keyboard Controller
          http://www.opencores.org/project,keyboardcontroller
index 7b938b481bd5626566bba8d3b69a29709a40fd2f..ac43a486c77536c6267aa33f766b104d698784d7 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/sched.h>
 #include <linux/input/samsung-keypad.h>
 
@@ -79,10 +78,6 @@ struct samsung_keypad {
        unsigned int rows;
        unsigned int cols;
        unsigned int row_state[SAMSUNG_MAX_COLS];
-#ifdef CONFIG_OF
-       int row_gpios[SAMSUNG_MAX_ROWS];
-       int col_gpios[SAMSUNG_MAX_COLS];
-#endif
        unsigned short keycodes[];
 };
 
@@ -304,45 +299,6 @@ static struct samsung_keypad_platdata *samsung_keypad_parse_dt(
 
        return pdata;
 }
-
-static void samsung_keypad_parse_dt_gpio(struct device *dev,
-                               struct samsung_keypad *keypad)
-{
-       struct device_node *np = dev->of_node;
-       int gpio, error, row, col;
-
-       for (row = 0; row < keypad->rows; row++) {
-               gpio = of_get_named_gpio(np, "row-gpios", row);
-               keypad->row_gpios[row] = gpio;
-               if (!gpio_is_valid(gpio)) {
-                       dev_err(dev, "keypad row[%d]: invalid gpio %d\n",
-                                       row, gpio);
-                       continue;
-               }
-
-               error = devm_gpio_request(dev, gpio, "keypad-row");
-               if (error)
-                       dev_err(dev,
-                               "keypad row[%d] gpio request failed: %d\n",
-                               row, error);
-       }
-
-       for (col = 0; col < keypad->cols; col++) {
-               gpio = of_get_named_gpio(np, "col-gpios", col);
-               keypad->col_gpios[col] = gpio;
-               if (!gpio_is_valid(gpio)) {
-                       dev_err(dev, "keypad column[%d]: invalid gpio %d\n",
-                                       col, gpio);
-                       continue;
-               }
-
-               error = devm_gpio_request(dev, gpio, "keypad-col");
-               if (error)
-                       dev_err(dev,
-                               "keypad column[%d] gpio request failed: %d\n",
-                               col, error);
-       }
-}
 #else
 static
 struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev)
@@ -424,15 +380,11 @@ static int samsung_keypad_probe(struct platform_device *pdev)
        keypad->stopped = true;
        init_waitqueue_head(&keypad->wait);
 
-       if (pdev->dev.of_node) {
-#ifdef CONFIG_OF
-               samsung_keypad_parse_dt_gpio(&pdev->dev, keypad);
+       if (pdev->dev.of_node)
                keypad->type = of_device_is_compatible(pdev->dev.of_node,
                                        "samsung,s5pv210-keypad");
-#endif
-       } else {
+       else
                keypad->type = platform_get_device_id(pdev)->driver_data;
-       }
 
        input_dev->name = pdev->name;
        input_dev->id.bustype = BUS_HOST;
index 2baff1b79a5596eb33eaaaa31577c193d80f099e..4ef4d5e198ae47547dbe4ca106dd6ee52627699f 100644 (file)
 #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI  0x0259
 #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO   0x025a
 #define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS   0x025b
+/* MacbookAir6,2 (unibody, June 2013) */
+#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI   0x0291
+#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO    0x0292
+#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS    0x0293
 
 #define BCM5974_DEVICE(prod) {                                 \
        .match_flags = (USB_DEVICE_ID_MATCH_DEVICE |            \
@@ -145,6 +149,10 @@ static const struct usb_device_id bcm5974_table[] = {
        BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI),
        BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO),
        BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS),
+       /* MacbookAir6,2 */
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_ISO),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_JIS),
        /* Terminating entry */
        {}
 };
@@ -172,15 +180,18 @@ struct bt_data {
 /* trackpad header types */
 enum tp_type {
        TYPE1,                  /* plain trackpad */
-       TYPE2                   /* button integrated in trackpad */
+       TYPE2,                  /* button integrated in trackpad */
+       TYPE3                   /* additional header fields since June 2013 */
 };
 
 /* trackpad finger data offsets, le16-aligned */
 #define FINGER_TYPE1           (13 * sizeof(__le16))
 #define FINGER_TYPE2           (15 * sizeof(__le16))
+#define FINGER_TYPE3           (19 * sizeof(__le16))
 
 /* trackpad button data offsets */
 #define BUTTON_TYPE2           15
+#define BUTTON_TYPE3           23
 
 /* list of device capability bits */
 #define HAS_INTEGRATED_BUTTON  1
@@ -400,6 +411,19 @@ static const struct bcm5974_config bcm5974_config_table[] = {
                { SN_COORD, -150, 6730 },
                { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION }
        },
+       {
+               USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI,
+               USB_DEVICE_ID_APPLE_WELLSPRING8_ISO,
+               USB_DEVICE_ID_APPLE_WELLSPRING8_JIS,
+               HAS_INTEGRATED_BUTTON,
+               0, sizeof(struct bt_data),
+               0x83, TYPE3, FINGER_TYPE3, FINGER_TYPE3 + SIZEOF_ALL_FINGERS,
+               { SN_PRESSURE, 0, 300 },
+               { SN_WIDTH, 0, 2048 },
+               { SN_COORD, -4620, 5140 },
+               { SN_COORD, -150, 6600 },
+               { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION }
+       },
        {}
 };
 
@@ -557,6 +581,9 @@ static int report_tp_state(struct bcm5974 *dev, int size)
                input_report_key(input, BTN_LEFT, ibt);
        }
 
+       if (c->tp_type == TYPE3)
+               input_report_key(input, BTN_LEFT, dev->tp_data[BUTTON_TYPE3]);
+
        input_sync(input);
 
        return 0;
@@ -572,9 +599,14 @@ static int report_tp_state(struct bcm5974 *dev, int size)
 
 static int bcm5974_wellspring_mode(struct bcm5974 *dev, bool on)
 {
-       char *data = kmalloc(8, GFP_KERNEL);
        int retval = 0, size;
+       char *data;
+
+       /* Type 3 does not require a mode switch */
+       if (dev->cfg.tp_type == TYPE3)
+               return 0;
 
+       data = kmalloc(8, GFP_KERNEL);
        if (!data) {
                dev_err(&dev->intf->dev, "out of memory\n");
                retval = -ENOMEM;
index 57b2637e153a1603db3ed62bc4968135b7b0f868..8551dcaf24dbadc854a7f6a6664128598c99a067 100644 (file)
@@ -672,6 +672,7 @@ static int elantech_packet_check_v2(struct psmouse *psmouse)
  */
 static int elantech_packet_check_v3(struct psmouse *psmouse)
 {
+       struct elantech_data *etd = psmouse->private;
        const u8 debounce_packet[] = { 0xc4, 0xff, 0xff, 0x02, 0xff, 0xff };
        unsigned char *packet = psmouse->packet;
 
@@ -682,19 +683,48 @@ static int elantech_packet_check_v3(struct psmouse *psmouse)
        if (!memcmp(packet, debounce_packet, sizeof(debounce_packet)))
                return PACKET_DEBOUNCE;
 
-       if ((packet[0] & 0x0c) == 0x04 && (packet[3] & 0xcf) == 0x02)
-               return PACKET_V3_HEAD;
+       /*
+        * If the hardware flag 'crc_enabled' is set the packets have
+        * different signatures.
+        */
+       if (etd->crc_enabled) {
+               if ((packet[3] & 0x09) == 0x08)
+                       return PACKET_V3_HEAD;
+
+               if ((packet[3] & 0x09) == 0x09)
+                       return PACKET_V3_TAIL;
+       } else {
+               if ((packet[0] & 0x0c) == 0x04 && (packet[3] & 0xcf) == 0x02)
+                       return PACKET_V3_HEAD;
 
-       if ((packet[0] & 0x0c) == 0x0c && (packet[3] & 0xce) == 0x0c)
-               return PACKET_V3_TAIL;
+               if ((packet[0] & 0x0c) == 0x0c && (packet[3] & 0xce) == 0x0c)
+                       return PACKET_V3_TAIL;
+       }
 
        return PACKET_UNKNOWN;
 }
 
 static int elantech_packet_check_v4(struct psmouse *psmouse)
 {
+       struct elantech_data *etd = psmouse->private;
        unsigned char *packet = psmouse->packet;
        unsigned char packet_type = packet[3] & 0x03;
+       bool sanity_check;
+
+       /*
+        * Sanity check based on the constant bits of a packet.
+        * The constant bits change depending on the value of
+        * the hardware flag 'crc_enabled' but are the same for
+        * every packet, regardless of the type.
+        */
+       if (etd->crc_enabled)
+               sanity_check = ((packet[3] & 0x08) == 0x00);
+       else
+               sanity_check = ((packet[0] & 0x0c) == 0x04 &&
+                               (packet[3] & 0x1c) == 0x10);
+
+       if (!sanity_check)
+               return PACKET_UNKNOWN;
 
        switch (packet_type) {
        case 0:
@@ -1313,6 +1343,12 @@ static int elantech_set_properties(struct elantech_data *etd)
                        etd->reports_pressure = true;
        }
 
+       /*
+        * The signatures of v3 and v4 packets change depending on the
+        * value of this hardware flag.
+        */
+       etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000);
+
        return 0;
 }
 
index 46db3be45ac988710a821450bd37f5127bfc90c3..036a04abaef72314a8dcc7d444f6ab3feea377f9 100644 (file)
@@ -129,6 +129,7 @@ struct elantech_data {
        bool paritycheck;
        bool jumpy_cursor;
        bool reports_pressure;
+       bool crc_enabled;
        unsigned char hw_version;
        unsigned int fw_version;
        unsigned int single_finger_reports;
index d401a7dccaa7289becff9cea933c10e97951174a..1e691a3a79cbaffd054789bb4b7f586cff792bba 100644 (file)
@@ -22,7 +22,8 @@ config SERIO_I8042
        tristate "i8042 PC Keyboard controller" if EXPERT || !X86
        default y
        depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \
-                  (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN && !S390
+                  (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN && !S390 && \
+                  !ARC
        help
          i8042 is the chip over which the standard AT keyboard and PS/2
          mouse are connected to the computer. If you use these devices,
@@ -205,6 +206,7 @@ config SERIO_XILINX_XPS_PS2
 
 config SERIO_ALTERA_PS2
        tristate "Altera UP PS/2 controller"
+       depends on HAS_IOMEM
        help
          Say Y here if you have Altera University Program PS/2 ports.
 
index 541197b7b9733521dfd3a9f30218f51a09de3347..b2aa503c16b1fb08c7d94817c533794d6d9375bd 100644 (file)
@@ -363,6 +363,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
                case 0x140802: /* Intuos4/5 13HD/24HD Classic Pen */
                case 0x160802: /* Cintiq 13HD Pro Pen */
                case 0x180802: /* DTH2242 Pen */
+               case 0x100802: /* Intuos4/5 13HD/24HD General Pen */
                        wacom->tool[idx] = BTN_TOOL_PEN;
                        break;
 
@@ -401,6 +402,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
                case 0x10080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */
                case 0x16080a: /* Cintiq 13HD Pro Pen Eraser */
                case 0x18080a: /* DTH2242 Eraser */
+               case 0x10080a: /* Intuos4/5 13HD/24HD General Pen Eraser */
                        wacom->tool[idx] = BTN_TOOL_RUBBER;
                        break;
 
@@ -2099,7 +2101,7 @@ static const struct wacom_features wacom_features_0xDA =
        { "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN,  14720,  9200, 1023,
          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
          .touch_max = 2 };
-static struct wacom_features wacom_features_0xDB =
+static const struct wacom_features wacom_features_0xDB =
        { "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN,  21648, 13700, 1023,
          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
          .touch_max = 2 };
@@ -2114,6 +2116,12 @@ static const struct wacom_features wacom_features_0xDF =
         { "Wacom Bamboo 16FG 6x8", WACOM_PKGLEN_BBPEN,    21648, 13700, 1023,
          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
          .touch_max = 16 };
+static const struct wacom_features wacom_features_0x300 =
+       { "Wacom Bamboo One S",    WACOM_PKGLEN_BBPEN,    14720,  9225, 1023,
+         31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x301 =
+       { "Wacom Bamboo One M",    WACOM_PKGLEN_BBPEN,    21648, 13530, 1023,
+         31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x6004 =
        { "ISD-V4",               WACOM_PKGLEN_GRAPHIRE,  12800,  8000,  255,
          0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2240,6 +2248,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x100) },
        { USB_DEVICE_WACOM(0x101) },
        { USB_DEVICE_WACOM(0x10D) },
+       { USB_DEVICE_WACOM(0x300) },
+       { USB_DEVICE_WACOM(0x301) },
        { USB_DEVICE_WACOM(0x304) },
        { USB_DEVICE_WACOM(0x4001) },
        { USB_DEVICE_WACOM(0x47) },
index 2d70089c1183dc25b309b433babec8df40fe4330..3b9758b5f4d7addee5e5d5ec4e706b2421e1a4b7 100644 (file)
@@ -909,6 +909,7 @@ config TOUCHSCREEN_STMPE
 config TOUCHSCREEN_TPS6507X
        tristate "TPS6507x based touchscreens"
        depends on I2C
+       select INPUT_POLLDEV
        help
          Say Y here if you have a TPS6507x based touchscreen
          controller.
index 580004049b9e4063f6089b14456f27672cba49f1..d038575f49db3a6d70e16ee640fb67cfbcab24be 100644 (file)
@@ -153,7 +153,7 @@ static int cyttsp4_hw_reset(struct cyttsp4 *cd)
  */
 static int cyttsp4_bits_2_bytes(unsigned int nbits, size_t *max)
 {
-       *max = 1 << nbits;
+       *max = 1UL << nbits;
        return (nbits + 7) / 8;
 }
 
@@ -1447,11 +1447,6 @@ static void cyttsp4_watchdog_work(struct work_struct *work)
        u8 *mode;
        int retval;
 
-       if (cd == NULL) {
-               dev_err(cd->dev, "%s: NULL context pointer\n", __func__);
-               return;
-       }
-
        mutex_lock(&cd->system_lock);
        retval = cyttsp4_load_status_regs(cd);
        if (retval < 0) {
@@ -2027,7 +2022,7 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
        if (!cd->xfer_buf) {
                dev_err(dev, "%s: Error, kzalloc\n", __func__);
                rc = -ENOMEM;
-               goto error_alloc_data;
+               goto error_free_cd;
        }
 
        /* Initialize device info */
@@ -2051,7 +2046,7 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
        cd->irq = gpio_to_irq(cd->cpdata->irq_gpio);
        if (cd->irq < 0) {
                rc = -EINVAL;
-               goto error_gpio_irq;
+               goto error_free_xfer;
        }
 
        dev_set_drvdata(dev, cd);
@@ -2119,7 +2114,9 @@ error_request_irq:
        if (cd->cpdata->init)
                cd->cpdata->init(cd->cpdata, 0, dev);
        dev_set_drvdata(dev, NULL);
-error_gpio_irq:
+error_free_xfer:
+       kfree(cd->xfer_buf);
+error_free_cd:
        kfree(cd);
 error_alloc_data:
 error_no_pdata:
index 86a254354136e96eede0d308c8707e169b2a1652..8e0d4d490b20ecb68540390b0e9a4dddae67652a 100644 (file)
@@ -369,9 +369,9 @@ struct cyttsp4 {
 
 struct cyttsp4_bus_ops {
        u16 bustype;
-       int (*write)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length,
+       int (*write)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length,
                        const void *values);
-       int (*read)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length,
+       int (*read)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length,
                        void *values);
 };
 
@@ -448,13 +448,13 @@ enum cyttsp4_event_id {
 /* y-axis, 0:origin is on top side of panel, 1: bottom */
 #define CY_PCFG_ORIGIN_Y_MASK          0x80
 
-static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u8 addr, int size,
+static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u16 addr, int size,
                void *buf)
 {
        return ts->bus_ops->read(ts->dev, ts->xfer_buf, addr, size, buf);
 }
 
-static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u8 addr, int size,
+static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u16 addr, int size,
                const void *buf)
 {
        return ts->bus_ops->write(ts->dev, ts->xfer_buf, addr, size, buf);
@@ -463,9 +463,9 @@ static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u8 addr, int size,
 extern struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
                struct device *dev, u16 irq, size_t xfer_buf_size);
 extern int cyttsp4_remove(struct cyttsp4 *ts);
-int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u8 addr,
+int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
                u8 length, const void *values);
-int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u8 addr,
+int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
                u8 length, void *values);
 extern const struct dev_pm_ops cyttsp4_pm_ops;
 
index f8f891bead34759d83759fa55374e4b22fd003b7..a71e1141d6386f9546fe32e5496437e72e393885 100644 (file)
@@ -44,7 +44,7 @@
 #define CY_SPI_DATA_BUF_SIZE   (CY_SPI_CMD_BYTES + CY_SPI_DATA_SIZE)
 
 static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf,
-                          u8 op, u8 reg, u8 *buf, int length)
+                          u8 op, u16 reg, u8 *buf, int length)
 {
        struct spi_device *spi = to_spi_device(dev);
        struct spi_message msg;
@@ -63,14 +63,12 @@ static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf,
        memset(wr_buf, 0, CY_SPI_DATA_BUF_SIZE);
        memset(rd_buf, 0, CY_SPI_CMD_BYTES);
 
-       if (reg > 255)
-               wr_buf[0] = op + CY_SPI_A8_BIT;
-       else
-               wr_buf[0] = op;
-       if (op == CY_SPI_WR_OP)
-               wr_buf[1] = reg % 256;
-       if (op == CY_SPI_WR_OP && length > 0)
-               memcpy(wr_buf + CY_SPI_CMD_BYTES, buf, length);
+       wr_buf[0] = op + (((reg >> 8) & 0x1) ? CY_SPI_A8_BIT : 0);
+       if (op == CY_SPI_WR_OP) {
+               wr_buf[1] = reg & 0xFF;
+               if (length > 0)
+                       memcpy(wr_buf + CY_SPI_CMD_BYTES, buf, length);
+       }
 
        memset(xfer, 0, sizeof(xfer));
        spi_message_init(&msg);
@@ -130,7 +128,7 @@ static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf,
 }
 
 static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf,
-                                     u8 addr, u8 length, void *data)
+                                     u16 addr, u8 length, void *data)
 {
        int rc;
 
@@ -143,7 +141,7 @@ static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf,
 }
 
 static int cyttsp_spi_write_block_data(struct device *dev, u8 *xfer_buf,
-                                      u8 addr, u8 length, const void *data)
+                                      u16 addr, u8 length, const void *data)
 {
        return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_WR_OP, addr, (void *)data,
                        length);
index 4824fa3438979ade60c4c870b522341297fef88b..d53e0b72a4078aadcb05ab43c319fce8b786da76 100644 (file)
@@ -118,6 +118,15 @@ static int ttsp_send_command(struct cyttsp *ts, u8 cmd)
        return ttsp_write_block_data(ts, CY_REG_BASE, sizeof(cmd), &cmd);
 }
 
+static int cyttsp_handshake(struct cyttsp *ts)
+{
+       if (ts->pdata->use_hndshk)
+               return ttsp_send_command(ts,
+                               ts->xy_data.hst_mode ^ CY_HNDSHK_BIT);
+
+       return 0;
+}
+
 static int cyttsp_load_bl_regs(struct cyttsp *ts)
 {
        memset(&ts->bl_data, 0, sizeof(ts->bl_data));
@@ -135,7 +144,7 @@ static int cyttsp_exit_bl_mode(struct cyttsp *ts)
        memcpy(bl_cmd, bl_command, sizeof(bl_command));
        if (ts->pdata->bl_keys)
                memcpy(&bl_cmd[sizeof(bl_command) - CY_NUM_BL_KEYS],
-                       ts->pdata->bl_keys, sizeof(bl_command));
+                       ts->pdata->bl_keys, CY_NUM_BL_KEYS);
 
        error = ttsp_write_block_data(ts, CY_REG_BASE,
                                      sizeof(bl_cmd), bl_cmd);
@@ -169,6 +178,10 @@ static int cyttsp_set_operational_mode(struct cyttsp *ts)
        if (error)
                return error;
 
+       error = cyttsp_handshake(ts);
+       if (error)
+               return error;
+
        return ts->xy_data.act_dist == CY_ACT_DIST_DFLT ? -EIO : 0;
 }
 
@@ -190,6 +203,10 @@ static int cyttsp_set_sysinfo_mode(struct cyttsp *ts)
        if (error)
                return error;
 
+       error = cyttsp_handshake(ts);
+       if (error)
+               return error;
+
        if (!ts->sysinfo_data.tts_verh && !ts->sysinfo_data.tts_verl)
                return -EIO;
 
@@ -346,12 +363,9 @@ static irqreturn_t cyttsp_irq(int irq, void *handle)
                goto out;
 
        /* provide flow control handshake */
-       if (ts->pdata->use_hndshk) {
-               error = ttsp_send_command(ts,
-                               ts->xy_data.hst_mode ^ CY_HNDSHK_BIT);
-               if (error)
-                       goto out;
-       }
+       error = cyttsp_handshake(ts);
+       if (error)
+               goto out;
 
        if (unlikely(ts->state == CY_IDLE_STATE))
                goto out;
index d0c9e488b05db81020a43d5f57a37e3741ed0bec..07074110a902136eeb53dad02260302d7f5637c9 100644 (file)
@@ -67,8 +67,8 @@ struct cyttsp_xydata {
 /* TTSP System Information interface definition */
 struct cyttsp_sysinfo_data {
        u8 hst_mode;
-       u8 mfg_cmd;
        u8 mfg_stat;
+       u8 mfg_cmd;
        u8 cid[3];
        u8 tt_undef1;
        u8 uid[8];
@@ -112,9 +112,9 @@ struct cyttsp;
 
 struct cyttsp_bus_ops {
        u16 bustype;
-       int (*write)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length,
+       int (*write)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length,
                        const void *values);
-       int (*read)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length,
+       int (*read)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length,
                        void *values);
 };
 
@@ -145,9 +145,9 @@ struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops,
                            struct device *dev, int irq, size_t xfer_buf_size);
 void cyttsp_remove(struct cyttsp *ts);
 
-int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u8 addr,
+int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
                u8 length, const void *values);
-int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u8 addr,
+int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
                u8 length, void *values);
 extern const struct dev_pm_ops cyttsp_pm_ops;
 
index 07c553fbcef2a4ecf77018afa5fe829f1116d20c..1d7b6f154168cc213e75ea64ee4f973782d0a108 100644 (file)
 #include <linux/types.h>
 
 int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf,
-                                     u8 addr, u8 length, void *values)
+                                     u16 addr, u8 length, void *values)
 {
        struct i2c_client *client = to_i2c_client(dev);
+       u8 client_addr = client->addr | ((addr >> 8) & 0x1);
+       u8 addr_lo = addr & 0xFF;
        struct i2c_msg msgs[] = {
                {
-                       .addr = client->addr,
+                       .addr = client_addr,
                        .flags = 0,
                        .len = 1,
-                       .buf = &addr,
+                       .buf = &addr_lo,
                },
                {
-                       .addr = client->addr,
+                       .addr = client_addr,
                        .flags = I2C_M_RD,
                        .len = length,
                        .buf = values,
@@ -60,17 +62,29 @@ int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf,
 EXPORT_SYMBOL_GPL(cyttsp_i2c_read_block_data);
 
 int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf,
-                                      u8 addr, u8 length, const void *values)
+                                      u16 addr, u8 length, const void *values)
 {
        struct i2c_client *client = to_i2c_client(dev);
+       u8 client_addr = client->addr | ((addr >> 8) & 0x1);
+       u8 addr_lo = addr & 0xFF;
+       struct i2c_msg msgs[] = {
+               {
+                       .addr = client_addr,
+                       .flags = 0,
+                       .len = length + 1,
+                       .buf = xfer_buf,
+               },
+       };
        int retval;
 
-       xfer_buf[0] = addr;
+       xfer_buf[0] = addr_lo;
        memcpy(&xfer_buf[1], values, length);
 
-       retval = i2c_master_send(client, xfer_buf, length + 1);
+       retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+       if (retval < 0)
+               return retval;
 
-       return retval < 0 ? retval : 0;
+       return retval != ARRAY_SIZE(msgs) ? -EIO : 0;
 }
 EXPORT_SYMBOL_GPL(cyttsp_i2c_write_block_data);
 
index 1df625337b84c53557587441934d8e157bbdc79c..4728bcb1916c37f9a3ce379689d3dc7e8101a8a0 100644 (file)
@@ -41,7 +41,7 @@
 #define CY_SPI_BITS_PER_WORD   8
 
 static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf,
-                          u8 op, u8 reg, u8 *buf, int length)
+                          u8 op, u16 reg, u8 *buf, int length)
 {
        struct spi_device *spi = to_spi_device(dev);
        struct spi_message msg;
@@ -126,14 +126,14 @@ static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf,
 }
 
 static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf,
-                                     u8 addr, u8 length, void *data)
+                                     u16 addr, u8 length, void *data)
 {
        return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_RD_OP, addr, data,
                        length);
 }
 
 static int cyttsp_spi_write_block_data(struct device *dev, u8 *xfer_buf,
-                                      u8 addr, u8 length, const void *data)
+                                      u16 addr, u8 length, const void *data)
 {
        return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_WR_OP, addr, (void *)data,
                        length);
index 820a066c3b8a9f1256b20022fbd910ab4ff33590..94cde2cb14917cbdfac37dc787c172ec1dd120c8 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/workqueue.h>
 #include <linux/slab.h>
 #include <linux/input.h>
+#include <linux/input-polldev.h>
 #include <linux/platform_device.h>
 #include <linux/mfd/tps6507x.h>
 #include <linux/input/tps6507x-ts.h>
@@ -38,20 +39,13 @@ struct ts_event {
 };
 
 struct tps6507x_ts {
-       struct input_dev        *input_dev;
        struct device           *dev;
+       struct input_polled_dev *poll_dev;
+       struct tps6507x_dev     *mfd;
        char                    phys[32];
-       struct delayed_work     work;
-       unsigned                polling;        /* polling is active */
        struct ts_event         tc;
-       struct tps6507x_dev     *mfd;
-       u16                     model;
-       unsigned                pendown;
-       int                     irq;
-       void                    (*clear_penirq)(void);
-       unsigned long           poll_period;    /* ms */
        u16                     min_pressure;
-       int                     vref;           /* non-zero to leave vref on */
+       bool                    pendown;
 };
 
 static int tps6507x_read_u8(struct tps6507x_ts *tsc, u8 reg, u8 *data)
@@ -161,18 +155,15 @@ static s32 tps6507x_adc_standby(struct tps6507x_ts *tsc)
        return ret;
 }
 
-static void tps6507x_ts_handler(struct work_struct *work)
+static void tps6507x_ts_poll(struct input_polled_dev *poll_dev)
 {
-       struct tps6507x_ts *tsc =  container_of(work,
-                               struct tps6507x_ts, work.work);
-       struct input_dev *input_dev = tsc->input_dev;
-       int pendown;
-       int schd;
-       int poll = 0;
+       struct tps6507x_ts *tsc = poll_dev->private;
+       struct input_dev *input_dev = poll_dev->input;
+       bool pendown;
        s32 ret;
 
-       ret =  tps6507x_adc_conversion(tsc, TPS6507X_TSCMODE_PRESSURE,
-                                      &tsc->tc.pressure);
+       ret = tps6507x_adc_conversion(tsc, TPS6507X_TSCMODE_PRESSURE,
+                                     &tsc->tc.pressure);
        if (ret)
                goto done;
 
@@ -183,7 +174,7 @@ static void tps6507x_ts_handler(struct work_struct *work)
                input_report_key(input_dev, BTN_TOUCH, 0);
                input_report_abs(input_dev, ABS_PRESSURE, 0);
                input_sync(input_dev);
-               tsc->pendown = 0;
+               tsc->pendown = false;
        }
 
        if (pendown) {
@@ -208,76 +199,69 @@ static void tps6507x_ts_handler(struct work_struct *work)
                input_report_abs(input_dev, ABS_Y, tsc->tc.y);
                input_report_abs(input_dev, ABS_PRESSURE, tsc->tc.pressure);
                input_sync(input_dev);
-               tsc->pendown = 1;
-               poll = 1;
+               tsc->pendown = true;
        }
 
 done:
-       /* always poll if not using interrupts */
-       poll = 1;
-
-       if (poll) {
-               schd = schedule_delayed_work(&tsc->work,
-                                       msecs_to_jiffies(tsc->poll_period));
-               if (schd)
-                       tsc->polling = 1;
-               else {
-                       tsc->polling = 0;
-                       dev_err(tsc->dev, "re-schedule failed");
-               }
-       } else
-               tsc->polling = 0;
-
-       ret = tps6507x_adc_standby(tsc);
+       tps6507x_adc_standby(tsc);
 }
 
 static int tps6507x_ts_probe(struct platform_device *pdev)
 {
-       int error;
-       struct tps6507x_ts *tsc;
        struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent);
-       struct touchscreen_init_data *init_data;
+       const struct tps6507x_board *tps_board;
+       const struct touchscreen_init_data *init_data;
+       struct tps6507x_ts *tsc;
+       struct input_polled_dev *poll_dev;
        struct input_dev *input_dev;
-       struct tps6507x_board *tps_board;
-       int schd;
+       int error;
 
-       /**
+       /*
         * tps_board points to pmic related constants
         * coming from the board-evm file.
         */
-
-       tps_board = (struct tps6507x_board *)tps6507x_dev->dev->platform_data;
-
+       tps_board = dev_get_platdata(tps6507x_dev->dev);
        if (!tps_board) {
                dev_err(tps6507x_dev->dev,
                        "Could not find tps6507x platform data\n");
-               return -EIO;
+               return -ENODEV;
        }
 
-       /**
+       /*
         * init_data points to array of regulator_init structures
         * coming from the board-evm file.
         */
-
        init_data = tps_board->tps6507x_ts_init_data;
 
        tsc = kzalloc(sizeof(struct tps6507x_ts), GFP_KERNEL);
        if (!tsc) {
                dev_err(tps6507x_dev->dev, "failed to allocate driver data\n");
-               error = -ENOMEM;
-               goto err0;
+               return -ENOMEM;
        }
 
-       tps6507x_dev->ts = tsc;
        tsc->mfd = tps6507x_dev;
        tsc->dev = tps6507x_dev->dev;
-       input_dev = input_allocate_device();
-       if (!input_dev) {
-               dev_err(tsc->dev, "Failed to allocate input device.\n");
+       tsc->min_pressure = init_data ?
+                       init_data->min_pressure : TPS_DEFAULT_MIN_PRESSURE;
+
+       snprintf(tsc->phys, sizeof(tsc->phys),
+                "%s/input0", dev_name(tsc->dev));
+
+       poll_dev = input_allocate_polled_device();
+       if (!poll_dev) {
+               dev_err(tsc->dev, "Failed to allocate polled input device.\n");
                error = -ENOMEM;
-               goto err1;
+               goto err_free_mem;
        }
 
+       tsc->poll_dev = poll_dev;
+
+       poll_dev->private = tsc;
+       poll_dev->poll = tps6507x_ts_poll;
+       poll_dev->poll_interval = init_data ?
+                       init_data->poll_period : TSC_DEFAULT_POLL_PERIOD;
+
+       input_dev = poll_dev->input;
        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
        input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
 
@@ -286,76 +270,42 @@ static int tps6507x_ts_probe(struct platform_device *pdev)
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_10BIT, 0, 0);
 
        input_dev->name = "TPS6507x Touchscreen";
-       input_dev->id.bustype = BUS_I2C;
-       input_dev->dev.parent = tsc->dev;
-
-       snprintf(tsc->phys, sizeof(tsc->phys),
-                "%s/input0", dev_name(tsc->dev));
        input_dev->phys = tsc->phys;
-
-       dev_dbg(tsc->dev, "device: %s\n", input_dev->phys);
-
-       input_set_drvdata(input_dev, tsc);
-
-       tsc->input_dev = input_dev;
-
-       INIT_DELAYED_WORK(&tsc->work, tps6507x_ts_handler);
-
+       input_dev->dev.parent = tsc->dev;
+       input_dev->id.bustype = BUS_I2C;
        if (init_data) {
-               tsc->poll_period = init_data->poll_period;
-               tsc->vref = init_data->vref;
-               tsc->min_pressure = init_data->min_pressure;
                input_dev->id.vendor = init_data->vendor;
                input_dev->id.product = init_data->product;
                input_dev->id.version = init_data->version;
-       } else {
-               tsc->poll_period = TSC_DEFAULT_POLL_PERIOD;
-               tsc->min_pressure = TPS_DEFAULT_MIN_PRESSURE;
        }
 
        error = tps6507x_adc_standby(tsc);
        if (error)
-               goto err2;
+               goto err_free_polled_dev;
 
-       error = input_register_device(input_dev);
+       error = input_register_polled_device(poll_dev);
        if (error)
-               goto err2;
+               goto err_free_polled_dev;
 
-       schd = schedule_delayed_work(&tsc->work,
-                                    msecs_to_jiffies(tsc->poll_period));
-
-       if (schd)
-               tsc->polling = 1;
-       else {
-               tsc->polling = 0;
-               dev_err(tsc->dev, "schedule failed");
-               goto err2;
-        }
-       platform_set_drvdata(pdev, tps6507x_dev);
+       platform_set_drvdata(pdev, tsc);
 
        return 0;
 
-err2:
-       cancel_delayed_work_sync(&tsc->work);
-       input_free_device(input_dev);
-err1:
+err_free_polled_dev:
+       input_free_polled_device(poll_dev);
+err_free_mem:
        kfree(tsc);
-       tps6507x_dev->ts = NULL;
-err0:
        return error;
 }
 
 static int tps6507x_ts_remove(struct platform_device *pdev)
 {
-       struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(pdev);
-       struct tps6507x_ts *tsc = tps6507x_dev->ts;
-       struct input_dev *input_dev = tsc->input_dev;
-
-       cancel_delayed_work_sync(&tsc->work);
+       struct tps6507x_ts *tsc = platform_get_drvdata(pdev);
+       struct input_polled_dev *poll_dev = tsc->poll_dev;
 
-       input_unregister_device(input_dev);
+       input_unregister_polled_device(poll_dev);
+       input_free_polled_device(poll_dev);
 
-       tps6507x_dev->ts = NULL;
        kfree(tsc);
 
        return 0;
index ab1440313924108fb78ef43f01f74a362b098192..b433df801d92c0ecfc252d8b4e71c1e8f6613459 100644 (file)
@@ -14,7 +14,6 @@
 /* Board specific touch screen initial values */
 struct touchscreen_init_data {
        int     poll_period;    /* ms */
-       int     vref;           /* non-zero to leave vref on */
        __u16   min_pressure;   /* min reading to be treated as a touch */
        __u16   vendor;
        __u16   product;
index c923e4864f557e9fa51290d2518925a0848e0fa8..c2ae56933539495f71253daf4943e547a8621505 100644 (file)
@@ -163,7 +163,6 @@ struct tps6507x_dev {
 
        /* Client devices */
        struct tps6507x_pmic *pmic;
-       struct tps6507x_ts *ts;
 };
 
 #endif /*  __LINUX_MFD_TPS6507X_H */
This page took 0.068039 seconds and 5 git commands to generate.