Merge tag 'v4.2-rc3' into next
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 20 Jul 2015 17:08:17 +0000 (10:08 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 20 Jul 2015 17:08:17 +0000 (10:08 -0700)
Sync up with Linux 4.2-rc3 to bring in infrastructure (OF) pieces.

62 files changed:
Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
Documentation/kernel-parameters.txt
drivers/hid/hid-core.c
drivers/input/ff-core.c
drivers/input/joydev.c
drivers/input/keyboard/adp5589-keys.c
drivers/input/keyboard/cap11xx.c
drivers/input/keyboard/lm8333.c
drivers/input/keyboard/mcs_touchkey.c
drivers/input/keyboard/mpr121_touchkey.c
drivers/input/keyboard/qt1070.c
drivers/input/keyboard/qt2160.c
drivers/input/keyboard/tca8418_keypad.c
drivers/input/misc/adxl34x-i2c.c
drivers/input/misc/bma150.c
drivers/input/misc/cma3000_d0x_i2c.c
drivers/input/misc/drv260x.c
drivers/input/misc/drv2665.c
drivers/input/misc/drv2667.c
drivers/input/misc/gp2ap002a00f.c
drivers/input/misc/kxtj9.c
drivers/input/misc/mpu3050.c
drivers/input/misc/pcf8574_keypad.c
drivers/input/misc/uinput.c
drivers/input/mouse/cyapa.c
drivers/input/mouse/elan_i2c_core.c
drivers/input/mouse/synaptics_i2c.c
drivers/input/serio/ambakmi.c
drivers/input/serio/i8042.c
drivers/input/serio/i8042.h
drivers/input/serio/serio.c
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/Makefile
drivers/input/touchscreen/ad7879-i2c.c
drivers/input/touchscreen/ar1021_i2c.c
drivers/input/touchscreen/atmel_mxt_ts.c
drivers/input/touchscreen/auo-pixcir-ts.c
drivers/input/touchscreen/bu21013_ts.c
drivers/input/touchscreen/chipone_icn8318.c
drivers/input/touchscreen/cy8ctmg110_ts.c
drivers/input/touchscreen/cyttsp4_i2c.c
drivers/input/touchscreen/cyttsp_i2c.c
drivers/input/touchscreen/edt-ft5x06.c
drivers/input/touchscreen/egalax_ts.c
drivers/input/touchscreen/elants_i2c.c
drivers/input/touchscreen/goodix.c
drivers/input/touchscreen/ili210x.c
drivers/input/touchscreen/max11801_ts.c
drivers/input/touchscreen/mms114.c
drivers/input/touchscreen/of_touchscreen.c
drivers/input/touchscreen/pixcir_i2c_ts.c
drivers/input/touchscreen/st1232.c
drivers/input/touchscreen/tsc2005.c
drivers/input/touchscreen/tsc2007.c
drivers/input/touchscreen/wacom_i2c.c
drivers/input/touchscreen/wdt87xx_i2c.c
drivers/input/touchscreen/zforce_ts.c
include/linux/input/pixcir_ts.h [deleted file]
include/linux/input/touchscreen.h
include/linux/platform_data/pixcir_i2c_ts.h [new file with mode: 0644]
include/linux/platform_data/zforce_ts.h
include/linux/serio.h

index 6e55109..8eb240a 100644 (file)
@@ -8,6 +8,9 @@ Required properties:
 - touchscreen-size-x: horizontal resolution of touchscreen (in pixels)
 - touchscreen-size-y: vertical resolution of touchscreen (in pixels)
 
+Optional properties:
+- reset-gpio: GPIO connected to the RESET line of the chip
+
 Example:
 
        i2c@00000000 {
index 1d6f045..d74bcea 100644 (file)
@@ -1315,6 +1315,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                             <bus_id>,<clkrate>
 
        i8042.debug     [HW] Toggle i8042 debug mode
+       i8042.unmask_kbd_data
+                       [HW] Enable printing of interrupt data from the KBD port
+                            (disabled by default, and as a pre-condition
+                            requires that i8042.debug=1 be enabled)
        i8042.direct    [HW] Put keyboard port into non-translated mode
        i8042.dumbkbd   [HW] Pretend that controller can only read data from
                             keyboard and cannot control its state
index 157c627..279898c 100644 (file)
@@ -2267,6 +2267,7 @@ static const struct hid_device_id hid_ignore_list[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
+       { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, 0x0400) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) },
index 8f4a30f..c642082 100644 (file)
@@ -343,9 +343,8 @@ int input_ff_create(struct input_dev *dev, unsigned int max_effects)
        __set_bit(EV_FF, dev->evbit);
 
        /* Copy "true" bits into ff device bitmap */
-       for (i = 0; i <= FF_MAX; i++)
-               if (test_bit(i, dev->ffbit))
-                       __set_bit(i, ff->ffbit);
+       for_each_set_bit(i, dev->ffbit, FF_CNT)
+               __set_bit(i, ff->ffbit);
 
        /* we can emulate RUMBLE with periodic effects */
        if (test_bit(FF_PERIODIC, ff->ffbit))
index 1d247bc..6cb5a3e 100644 (file)
@@ -859,12 +859,11 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
        joydev->handle.handler = handler;
        joydev->handle.private = joydev;
 
-       for (i = 0; i < ABS_CNT; i++)
-               if (test_bit(i, dev->absbit)) {
-                       joydev->absmap[i] = joydev->nabs;
-                       joydev->abspam[joydev->nabs] = i;
-                       joydev->nabs++;
-               }
+       for_each_set_bit(i, dev->absbit, ABS_CNT) {
+               joydev->absmap[i] = joydev->nabs;
+               joydev->abspam[joydev->nabs] = i;
+               joydev->nabs++;
+       }
 
        for (i = BTN_JOYSTICK - BTN_MISC; i < KEY_MAX - BTN_MISC + 1; i++)
                if (test_bit(i + BTN_MISC, dev->keybit)) {
index 6ed83cf..4d446d5 100644 (file)
@@ -1097,7 +1097,6 @@ MODULE_DEVICE_TABLE(i2c, adp5589_id);
 static struct i2c_driver adp5589_driver = {
        .driver = {
                .name = KBUILD_MODNAME,
-               .owner = THIS_MODULE,
                .pm = &adp5589_dev_pm_ops,
        },
        .probe = adp5589_probe,
index f07461a..b58fd9d 100644 (file)
@@ -361,7 +361,6 @@ MODULE_DEVICE_TABLE(i2c, cap11xx_i2c_ids);
 static struct i2c_driver cap11xx_i2c_driver = {
        .driver = {
                .name   = "cap11xx",
-               .owner  = THIS_MODULE,
                .of_match_table = cap11xx_dt_ids,
        },
        .id_table       = cap11xx_i2c_ids,
index 0ad422b..c717e8f 100644 (file)
@@ -223,7 +223,6 @@ MODULE_DEVICE_TABLE(i2c, lm8333_id);
 static struct i2c_driver lm8333_driver = {
        .driver = {
                .name           = "lm8333",
-               .owner          = THIS_MODULE,
        },
        .probe          = lm8333_probe,
        .remove         = lm8333_remove,
index 375b05c..31090d7 100644 (file)
@@ -265,7 +265,6 @@ MODULE_DEVICE_TABLE(i2c, mcs_touchkey_id);
 static struct i2c_driver mcs_touchkey_driver = {
        .driver = {
                .name   = "mcs_touchkey",
-               .owner  = THIS_MODULE,
                .pm     = &mcs_touchkey_pm_ops,
        },
        .probe          = mcs_touchkey_probe,
index 3aa2ec4..0fd612d 100644 (file)
@@ -305,7 +305,6 @@ MODULE_DEVICE_TABLE(i2c, mpr121_id);
 static struct i2c_driver mpr_touchkey_driver = {
        .driver = {
                .name   = "mpr121",
-               .owner  = THIS_MODULE,
                .pm     = &mpr121_touchkey_pm_ops,
        },
        .id_table       = mpr121_id,
index 52cd6e8..5a57787 100644 (file)
@@ -277,7 +277,6 @@ MODULE_DEVICE_TABLE(i2c, qt1070_id);
 static struct i2c_driver qt1070_driver = {
        .driver = {
                .name   = "qt1070",
-               .owner  = THIS_MODULE,
                .pm     = &qt1070_pm_ops,
        },
        .id_table       = qt1070_id,
index 819b228..43b8648 100644 (file)
@@ -497,7 +497,6 @@ MODULE_DEVICE_TABLE(i2c, qt2160_idtable);
 static struct i2c_driver qt2160_driver = {
        .driver = {
                .name   = "qt2160",
-               .owner  = THIS_MODULE,
        },
 
        .id_table       = qt2160_idtable,
index 4e491c1..9002298 100644 (file)
@@ -404,7 +404,6 @@ MODULE_ALIAS("i2c:tca8418");
 static struct i2c_driver tca8418_keypad_driver = {
        .driver = {
                .name   = TCA8418_NAME,
-               .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(tca8418_dt_ids),
        },
        .probe          = tca8418_keypad_probe,
index bdb5d03..a8b0a2e 100644 (file)
@@ -158,7 +158,6 @@ MODULE_DEVICE_TABLE(of, adxl34x_of_id);
 static struct i2c_driver adxl34x_driver = {
        .driver = {
                .name = "adxl34x",
-               .owner = THIS_MODULE,
                .pm = &adxl34x_i2c_pm,
                .of_match_table = of_match_ptr(adxl34x_of_id),
        },
index b36831c..1d0e61d 100644 (file)
@@ -333,10 +333,9 @@ static void bma150_report_xyz(struct bma150_data *bma150)
        y = ((0xc0 & data[2]) >> 6) | (data[3] << 2);
        z = ((0xc0 & data[4]) >> 6) | (data[5] << 2);
 
-       /* sign extension */
-       x = (s16) (x << 6) >> 6;
-       y = (s16) (y << 6) >> 6;
-       z = (s16) (z << 6) >> 6;
+       x = sign_extend32(x, 9);
+       y = sign_extend32(y, 9);
+       z = sign_extend32(z, 9);
 
        input_report_abs(bma150->input, ABS_X, x);
        input_report_abs(bma150->input, ABS_Y, y);
@@ -654,7 +653,6 @@ MODULE_DEVICE_TABLE(i2c, bma150_id);
 
 static struct i2c_driver bma150_driver = {
        .driver = {
-               .owner  = THIS_MODULE,
                .name   = BMA150_DRIVER,
                .pm     = &bma150_pm,
        },
index 4fdef98..c702191 100644 (file)
@@ -118,7 +118,6 @@ static struct i2c_driver cma3000_i2c_driver = {
        .id_table       = cma3000_i2c_id,
        .driver = {
                .name   = "cma3000_i2c_accl",
-               .owner  = THIS_MODULE,
 #ifdef CONFIG_PM
                .pm     = &cma3000_i2c_pm_ops,
 #endif
index e5d60ec..e65496e 100644 (file)
@@ -204,7 +204,7 @@ struct drv260x_data {
        int overdrive_voltage;
 };
 
-static struct reg_default drv260x_reg_defs[] = {
+static const struct reg_default drv260x_reg_defs[] = {
        { DRV260X_STATUS, 0xe0 },
        { DRV260X_MODE, 0x40 },
        { DRV260X_RT_PB_IN, 0x00 },
@@ -720,7 +720,6 @@ static struct i2c_driver drv260x_driver = {
        .probe          = drv260x_probe,
        .driver         = {
                .name   = "drv260x-haptics",
-               .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(drv260x_of_match),
                .pm     = &drv260x_pm_ops,
        },
index 0afaa33..327a63c 100644 (file)
@@ -74,7 +74,7 @@ static const u8 drv2665_sine_wave_form[] = {
        0x9b, 0x9f, 0xa5, 0xad, 0xb8, 0xc4, 0xd2, 0xe0, 0xf0, 0x00,
 };
 
-static struct reg_default drv2665_reg_defs[] = {
+static const struct reg_default drv2665_reg_defs[] = {
        { DRV2665_STATUS, 0x02 },
        { DRV2665_CTRL_1, 0x28 },
        { DRV2665_CTRL_2, 0x40 },
@@ -309,7 +309,6 @@ static struct i2c_driver drv2665_driver = {
        .probe          = drv2665_probe,
        .driver         = {
                .name   = "drv2665-haptics",
-               .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(drv2665_of_match),
                .pm     = &drv2665_pm_ops,
        },
index fc0fddf..46a4be4 100644 (file)
@@ -116,7 +116,7 @@ struct drv2667_data {
        u32 frequency;
 };
 
-static struct reg_default drv2667_reg_defs[] = {
+static const struct reg_default drv2667_reg_defs[] = {
        { DRV2667_STATUS, 0x02 },
        { DRV2667_CTRL_1, 0x28 },
        { DRV2667_CTRL_2, 0x40 },
@@ -484,7 +484,6 @@ static struct i2c_driver drv2667_driver = {
        .probe          = drv2667_probe,
        .driver         = {
                .name   = "drv2667-haptics",
-               .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(drv2667_of_match),
                .pm     = &drv2667_pm_ops,
        },
index 0ac176d..ba301af 100644 (file)
@@ -271,7 +271,6 @@ static const struct i2c_device_id gp2a_i2c_id[] = {
 static struct i2c_driver gp2a_i2c_driver = {
        .driver = {
                .name   = GP2A_I2C_NAME,
-               .owner  = THIS_MODULE,
                .pm     = &gp2a_pm,
        },
        .probe          = gp2a_probe,
index 6e29349..e058d71 100644 (file)
@@ -658,7 +658,6 @@ MODULE_DEVICE_TABLE(i2c, kxtj9_id);
 static struct i2c_driver kxtj9_driver = {
        .driver = {
                .name   = NAME,
-               .owner  = THIS_MODULE,
                .pm     = &kxtj9_pm_ops,
        },
        .probe          = kxtj9_probe,
index 5e50513..f088db3 100644 (file)
@@ -466,7 +466,6 @@ MODULE_DEVICE_TABLE(of, mpu3050_of_match);
 static struct i2c_driver mpu3050_i2c_driver = {
        .driver = {
                .name   = "mpu3050",
-               .owner  = THIS_MODULE,
                .pm     = &mpu3050_pm,
                .of_match_table = mpu3050_of_match,
        },
index 97f711a..4abdf1e 100644 (file)
@@ -208,7 +208,6 @@ MODULE_DEVICE_TABLE(i2c, pcf8574_kp_id);
 static struct i2c_driver pcf8574_kp_driver = {
        .driver = {
                .name  = DRV_NAME,
-               .owner = THIS_MODULE,
 #ifdef CONFIG_PM
                .pm = &pcf8574_kp_pm_ops,
 #endif
index 421e29e..345df9b 100644 (file)
@@ -320,10 +320,8 @@ static int uinput_validate_absbits(struct input_dev *dev)
         * Check if absmin/absmax/absfuzz/absflat are sane.
         */
 
-       for (cnt = 0; cnt < ABS_CNT; cnt++) {
+       for_each_set_bit(cnt, dev->absbit, ABS_CNT) {
                int min, max;
-               if (!test_bit(cnt, dev->absbit))
-                       continue;
 
                min = input_abs_get_min(dev, cnt);
                max = input_abs_get_max(dev, cnt);
@@ -416,7 +414,7 @@ static int uinput_setup_device(struct uinput_device *udev,
        dev->id.product = user_dev->id.product;
        dev->id.version = user_dev->id.version;
 
-       for (i = 0; i < ABS_CNT; i++) {
+       for_each_set_bit(i, dev->absbit, ABS_CNT) {
                input_abs_set_max(dev, i, user_dev->absmax[i]);
                input_abs_set_min(dev, i, user_dev->absmin[i]);
                input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]);
index efe1484..dfbfd49 100644 (file)
@@ -1382,7 +1382,6 @@ MODULE_DEVICE_TABLE(acpi, cyapa_acpi_id);
 static struct i2c_driver cyapa_driver = {
        .driver = {
                .name = "cyapa",
-               .owner = THIS_MODULE,
                .pm = &cyapa_pm_ops,
                .acpi_match_table = ACPI_PTR(cyapa_acpi_id),
        },
index 5b5f403..0a076d3 100644 (file)
@@ -1165,6 +1165,7 @@ MODULE_DEVICE_TABLE(i2c, elan_id);
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id elan_acpi_id[] = {
        { "ELAN0000", 0 },
+       { "ELAN0600", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(acpi, elan_acpi_id);
@@ -1181,7 +1182,6 @@ MODULE_DEVICE_TABLE(of, elan_of_match);
 static struct i2c_driver elan_driver = {
        .driver = {
                .name   = DRIVER_NAME,
-               .owner  = THIS_MODULE,
                .pm     = &elan_pm_ops,
                .acpi_match_table = ACPI_PTR(elan_acpi_id),
                .of_match_table = of_match_ptr(elan_of_match),
index ffceedc..aa7c5da 100644 (file)
@@ -655,7 +655,6 @@ MODULE_DEVICE_TABLE(i2c, synaptics_i2c_id_table);
 static struct i2c_driver synaptics_i2c_driver = {
        .driver = {
                .name   = DRIVER_NAME,
-               .owner  = THIS_MODULE,
                .pm     = &synaptics_i2c_pm,
        },
 
index 8b748d9..c6606ca 100644 (file)
@@ -175,9 +175,9 @@ static int amba_kmi_remove(struct amba_device *dev)
        return 0;
 }
 
-static int amba_kmi_resume(struct amba_device *dev)
+static int __maybe_unused amba_kmi_resume(struct device *dev)
 {
-       struct amba_kmi_port *kmi = amba_get_drvdata(dev);
+       struct amba_kmi_port *kmi = dev_get_drvdata(dev);
 
        /* kick the serio layer to rescan this port */
        serio_reconnect(kmi->io);
@@ -185,6 +185,8 @@ static int amba_kmi_resume(struct amba_device *dev)
        return 0;
 }
 
+static SIMPLE_DEV_PM_OPS(amba_kmi_dev_pm_ops, NULL, amba_kmi_resume);
+
 static struct amba_id amba_kmi_idtable[] = {
        {
                .id     = 0x00041050,
@@ -199,11 +201,11 @@ static struct amba_driver ambakmi_driver = {
        .drv            = {
                .name   = "kmi-pl050",
                .owner  = THIS_MODULE,
+               .pm     = &amba_kmi_dev_pm_ops,
        },
        .id_table       = amba_kmi_idtable,
        .probe          = amba_kmi_probe,
        .remove         = amba_kmi_remove,
-       .resume         = amba_kmi_resume,
 };
 
 module_amba_driver(ambakmi_driver);
index cb5ece7..c9c98f0 100644 (file)
@@ -88,6 +88,10 @@ MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings");
 static bool i8042_debug;
 module_param_named(debug, i8042_debug, bool, 0600);
 MODULE_PARM_DESC(debug, "Turn i8042 debugging mode on and off");
+
+static bool i8042_unmask_kbd_data;
+module_param_named(unmask_kbd_data, i8042_unmask_kbd_data, bool, 0600);
+MODULE_PARM_DESC(unmask_kbd_data, "Unconditional enable (may reveal sensitive data) of normally sanitize-filtered kbd data traffic debug log [pre-condition: i8042.debug=1 enabled]");
 #endif
 
 static bool i8042_bypass_aux_irq_test;
@@ -116,6 +120,7 @@ struct i8042_port {
        struct serio *serio;
        int irq;
        bool exists;
+       bool driver_bound;
        signed char mux;
 };
 
@@ -133,6 +138,7 @@ static bool i8042_kbd_irq_registered;
 static bool i8042_aux_irq_registered;
 static unsigned char i8042_suppress_kbd_ack;
 static struct platform_device *i8042_platform_device;
+static struct notifier_block i8042_kbd_bind_notifier_block;
 
 static irqreturn_t i8042_interrupt(int irq, void *dev_id);
 static bool (*i8042_platform_filter)(unsigned char data, unsigned char str,
@@ -528,10 +534,10 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
        port = &i8042_ports[port_no];
        serio = port->exists ? port->serio : NULL;
 
-       dbg("%02x <- i8042 (interrupt, %d, %d%s%s)\n",
-           data, port_no, irq,
-           dfl & SERIO_PARITY ? ", bad parity" : "",
-           dfl & SERIO_TIMEOUT ? ", timeout" : "");
+       filter_dbg(port->driver_bound, data, "<- i8042 (interrupt, %d, %d%s%s)\n",
+                  port_no, irq,
+                  dfl & SERIO_PARITY ? ", bad parity" : "",
+                  dfl & SERIO_TIMEOUT ? ", timeout" : "");
 
        filtered = i8042_filter(data, str, serio);
 
@@ -1438,6 +1444,29 @@ static int __init i8042_setup_kbd(void)
        return error;
 }
 
+static int i8042_kbd_bind_notifier(struct notifier_block *nb,
+                                  unsigned long action, void *data)
+{
+       struct device *dev = data;
+       struct serio *serio = to_serio_port(dev);
+       struct i8042_port *port = serio->port_data;
+
+       if (serio != i8042_ports[I8042_KBD_PORT_NO].serio)
+               return 0;
+
+       switch (action) {
+       case BUS_NOTIFY_BOUND_DRIVER:
+               port->driver_bound = true;
+               break;
+
+       case BUS_NOTIFY_UNBIND_DRIVER:
+               port->driver_bound = false;
+               break;
+       }
+
+       return 0;
+}
+
 static int __init i8042_probe(struct platform_device *dev)
 {
        int error;
@@ -1507,6 +1536,10 @@ static struct platform_driver i8042_driver = {
        .shutdown       = i8042_shutdown,
 };
 
+static struct notifier_block i8042_kbd_bind_notifier_block = {
+       .notifier_call = i8042_kbd_bind_notifier,
+};
+
 static int __init i8042_init(void)
 {
        struct platform_device *pdev;
@@ -1528,6 +1561,7 @@ static int __init i8042_init(void)
                goto err_platform_exit;
        }
 
+       bus_register_notifier(&serio_bus, &i8042_kbd_bind_notifier_block);
        panic_blink = i8042_panic_blink;
 
        return 0;
@@ -1543,6 +1577,7 @@ static void __exit i8042_exit(void)
        platform_driver_unregister(&i8042_driver);
        i8042_platform_exit();
 
+       bus_unregister_notifier(&serio_bus, &i8042_kbd_bind_notifier_block);
        panic_blink = NULL;
 }
 
index fc080be..1db0a40 100644 (file)
@@ -73,6 +73,17 @@ static unsigned long i8042_start_time;
                        printk(KERN_DEBUG KBUILD_MODNAME ": [%d] " format,      \
                               (int) (jiffies - i8042_start_time), ##arg);      \
        } while (0)
+
+#define filter_dbg(filter, data, format, args...)              \
+       do {                                                    \
+               if (!i8042_debug)                               \
+                       break;                                  \
+                                                               \
+               if (!filter || i8042_unmask_kbd_data)           \
+                       dbg("%02x " format, data, ##args);      \
+               else                                            \
+                       dbg("** " format, ##args);              \
+       } while (0)
 #else
 #define dbg_init() do { } while (0)
 #define dbg(format, arg...)                                                    \
@@ -80,6 +91,8 @@ static unsigned long i8042_start_time;
                if (0)                                                          \
                        printk(KERN_DEBUG pr_fmt(format), ##arg);               \
        } while (0)
+
+#define filter_dbg(filter, data, format, args...) do { } while (0)
 #endif
 
 #endif /* _I8042_H */
index a05a517..8f82897 100644 (file)
@@ -49,8 +49,6 @@ static DEFINE_MUTEX(serio_mutex);
 
 static LIST_HEAD(serio_list);
 
-static struct bus_type serio_bus;
-
 static void serio_add_port(struct serio *serio);
 static int serio_reconnect_port(struct serio *serio);
 static void serio_disconnect_port(struct serio *serio);
@@ -1017,7 +1015,7 @@ irqreturn_t serio_interrupt(struct serio *serio,
 }
 EXPORT_SYMBOL(serio_interrupt);
 
-static struct bus_type serio_bus = {
+struct bus_type serio_bus = {
        .name           = "serio",
        .drv_groups     = serio_driver_groups,
        .match          = serio_bus_match,
@@ -1029,6 +1027,7 @@ static struct bus_type serio_bus = {
        .pm             = &serio_pm_ops,
 #endif
 };
+EXPORT_SYMBOL(serio_bus);
 
 static int __init serio_init(void)
 {
index a854c6e..5b272ba 100644 (file)
@@ -11,9 +11,9 @@ menuconfig INPUT_TOUCHSCREEN
 
 if INPUT_TOUCHSCREEN
 
-config OF_TOUCHSCREEN
+config TOUCHSCREEN_PROPERTIES
        def_tristate INPUT
-       depends on INPUT && OF
+       depends on INPUT
 
 config TOUCHSCREEN_88PM860X
        tristate "Marvell 88PM860x touchscreen"
index fa3d33b..c85aae2 100644 (file)
@@ -6,7 +6,7 @@
 
 wm97xx-ts-y := wm97xx-core.o
 
-obj-$(CONFIG_OF_TOUCHSCREEN)           += of_touchscreen.o
+obj-$(CONFIG_TOUCHSCREEN_PROPERTIES)   += of_touchscreen.o
 obj-$(CONFIG_TOUCHSCREEN_88PM860X)     += 88pm860x-ts.o
 obj-$(CONFIG_TOUCHSCREEN_AD7877)       += ad7877.o
 obj-$(CONFIG_TOUCHSCREEN_AD7879)       += ad7879.o
index dcf3907..d66962c 100644 (file)
@@ -94,7 +94,6 @@ MODULE_DEVICE_TABLE(i2c, ad7879_id);
 static struct i2c_driver ad7879_i2c_driver = {
        .driver = {
                .name   = "ad7879",
-               .owner  = THIS_MODULE,
                .pm     = &ad7879_pm_ops,
        },
        .probe          = ad7879_i2c_probe,
index f0b954d..71b5a63 100644 (file)
@@ -166,7 +166,6 @@ MODULE_DEVICE_TABLE(of, ar1021_i2c_of_match);
 static struct i2c_driver ar1021_i2c_driver = {
        .driver = {
                .name   = "ar1021_i2c",
-               .owner  = THIS_MODULE,
                .pm     = &ar1021_i2c_pm,
                .of_match_table = ar1021_i2c_of_match,
        },
index dfc7309..8efe7a0 100644 (file)
@@ -2666,7 +2666,6 @@ MODULE_DEVICE_TABLE(i2c, mxt_id);
 static struct i2c_driver mxt_driver = {
        .driver = {
                .name   = "atmel_mxt_ts",
-               .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(mxt_of_match),
                .acpi_match_table = ACPI_PTR(mxt_acpi_id),
                .pm     = &mxt_pm_ops,
index 40e02dd..38c06f7 100644 (file)
@@ -686,7 +686,6 @@ MODULE_DEVICE_TABLE(of, auo_pixcir_ts_dt_idtable);
 
 static struct i2c_driver auo_pixcir_driver = {
        .driver = {
-               .owner  = THIS_MODULE,
                .name   = "auo_pixcir_ts",
                .pm     = &auo_pixcir_pm_ops,
                .of_match_table = of_match_ptr(auo_pixcir_ts_dt_idtable),
index b9b5dda..931417e 100644 (file)
@@ -716,7 +716,6 @@ MODULE_DEVICE_TABLE(i2c, bu21013_id);
 static struct i2c_driver bu21013_driver = {
        .driver = {
                .name   =       DRIVER_TP,
-               .owner  =       THIS_MODULE,
 #ifdef CONFIG_PM
                .pm     =       &bu21013_dev_pm_ops,
 #endif
index 32e9db0..22a6fea 100644 (file)
@@ -300,7 +300,6 @@ MODULE_DEVICE_TABLE(i2c, icn8318_i2c_id);
 
 static struct i2c_driver icn8318_driver = {
        .driver = {
-               .owner  = THIS_MODULE,
                .name   = "chipone_icn8318",
                .pm     = &icn8318_pm_ops,
                .of_match_table = icn8318_of_match,
index f2119ee..cc1d135 100644 (file)
@@ -347,7 +347,6 @@ MODULE_DEVICE_TABLE(i2c, cy8ctmg110_idtable);
 
 static struct i2c_driver cy8ctmg110_driver = {
        .driver         = {
-               .owner  = THIS_MODULE,
                .name   = CY8CTMG110_DRIVER_NAME,
                .pm     = &cy8ctmg110_pm,
        },
index 8e2012c..9a323dd 100644 (file)
@@ -74,7 +74,6 @@ MODULE_DEVICE_TABLE(i2c, cyttsp4_i2c_id);
 static struct i2c_driver cyttsp4_i2c_driver = {
        .driver = {
                .name   = CYTTSP4_I2C_NAME,
-               .owner  = THIS_MODULE,
                .pm     = &cyttsp4_pm_ops,
        },
        .probe          = cyttsp4_i2c_probe,
index 63104a8..519e2de 100644 (file)
@@ -74,7 +74,6 @@ MODULE_DEVICE_TABLE(i2c, cyttsp_i2c_id);
 static struct i2c_driver cyttsp_i2c_driver = {
        .driver = {
                .name   = CY_I2C_NAME,
-               .owner  = THIS_MODULE,
                .pm     = &cyttsp_pm_ops,
        },
        .probe          = cyttsp_i2c_probe,
index 394b1de..48de1e8 100644 (file)
@@ -1041,7 +1041,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
                             0, tsdata->num_y * 64 - 1, 0, 0);
 
        if (!pdata)
-               touchscreen_parse_of_params(input, true);
+               touchscreen_parse_properties(input, true);
 
        error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, INPUT_MT_DIRECT);
        if (error) {
@@ -1134,7 +1134,6 @@ MODULE_DEVICE_TABLE(of, edt_ft5x06_of_match);
 
 static struct i2c_driver edt_ft5x06_ts_driver = {
        .driver = {
-               .owner = THIS_MODULE,
                .name = "edt_ft5x06",
                .of_match_table = of_match_ptr(edt_ft5x06_of_match),
                .pm = &edt_ft5x06_ts_pm_ops,
index 4c56299..7bce2d9 100644 (file)
@@ -268,7 +268,6 @@ static const struct of_device_id egalax_ts_dt_ids[] = {
 static struct i2c_driver egalax_ts_driver = {
        .driver = {
                .name   = "egalax_ts",
-               .owner  = THIS_MODULE,
                .pm     = &egalax_ts_pm_ops,
                .of_match_table = egalax_ts_dt_ids,
        },
index 0efd766..7461376 100644 (file)
@@ -1261,7 +1261,6 @@ static struct i2c_driver elants_i2c_driver = {
        .id_table = elants_i2c_id,
        .driver = {
                .name = DEVICE_NAME,
-               .owner = THIS_MODULE,
                .pm = &elants_i2c_pm_ops,
                .acpi_match_table = ACPI_PTR(elants_acpi_id),
                .of_match_table = of_match_ptr(elants_of_match),
index b4d12e2..ccd9dca 100644 (file)
@@ -412,7 +412,6 @@ static struct i2c_driver goodix_ts_driver = {
        .id_table = goodix_ts_id,
        .driver = {
                .name = "Goodix-TS",
-               .owner = THIS_MODULE,
                .acpi_match_table = ACPI_PTR(goodix_acpi_match),
                .of_match_table = of_match_ptr(goodix_of_match),
        },
index da6dc81..cf0dc2f 100644 (file)
@@ -343,7 +343,6 @@ MODULE_DEVICE_TABLE(i2c, ili210x_i2c_id);
 static struct i2c_driver ili210x_ts_driver = {
        .driver = {
                .name = "ili210x_i2c",
-               .owner = THIS_MODULE,
                .pm = &ili210x_i2c_pm,
        },
        .id_table = ili210x_i2c_id,
index a68ec14..82079cd 100644 (file)
@@ -229,7 +229,6 @@ MODULE_DEVICE_TABLE(i2c, max11801_ts_id);
 static struct i2c_driver max11801_ts_driver = {
        .driver = {
                .name   = "max11801_ts",
-               .owner  = THIS_MODULE,
        },
        .id_table       = max11801_ts_id,
        .probe          = max11801_ts_probe,
index 67c0d31..6b69f46 100644 (file)
@@ -577,7 +577,6 @@ static const struct of_device_id mms114_dt_match[] = {
 static struct i2c_driver mms114_driver = {
        .driver = {
                .name   = "mms114",
-               .owner  = THIS_MODULE,
                .pm     = &mms114_pm_ops,
                .of_match_table = of_match_ptr(mms114_dt_match),
        },
index 806cd0a..bb6f2fe 100644 (file)
@@ -9,12 +9,12 @@
  *
  */
 
-#include <linux/of.h>
+#include <linux/property.h>
 #include <linux/input.h>
 #include <linux/input/mt.h>
 #include <linux/input/touchscreen.h>
 
-static bool touchscreen_get_prop_u32(struct device_node *np,
+static bool touchscreen_get_prop_u32(struct device *dev,
                                     const char *property,
                                     unsigned int default_value,
                                     unsigned int *value)
@@ -22,7 +22,7 @@ static bool touchscreen_get_prop_u32(struct device_node *np,
        u32 val;
        int error;
 
-       error = of_property_read_u32(np, property, &val);
+       error = device_property_read_u32(dev, property, &val);
        if (error) {
                *value = default_value;
                return false;
@@ -39,13 +39,9 @@ static void touchscreen_set_params(struct input_dev *dev,
        struct input_absinfo *absinfo;
 
        if (!test_bit(axis, dev->absbit)) {
-               /*
-                * Emit a warning only if the axis is not a multitouch
-                * axis, which might not be set by the driver.
-                */
-               if (!input_is_mt_axis(axis))
-                       dev_warn(&dev->dev,
-                                "DT specifies parameters but the axis is not set up\n");
+               dev_warn(&dev->dev,
+                        "DT specifies parameters but the axis %lu is not set up\n",
+                        axis);
                return;
        }
 
@@ -55,52 +51,58 @@ static void touchscreen_set_params(struct input_dev *dev,
 }
 
 /**
- * touchscreen_parse_of_params - parse common touchscreen DT properties
- * @dev: device that should be parsed
+ * touchscreen_parse_properties - parse common touchscreen DT properties
+ * @input: input device that should be parsed
+ * @multitouch: specifies whether parsed properties should be applied to
+ *     single-touch or multi-touch axes
  *
  * This function parses common DT properties for touchscreens and setups the
- * input device accordingly. The function keeps previously setuped default
+ * input device accordingly. The function keeps previously set up default
  * values if no value is specified via DT.
  */
-void touchscreen_parse_of_params(struct input_dev *dev, bool multitouch)
+void touchscreen_parse_properties(struct input_dev *input, bool multitouch)
 {
-       struct device_node *np = dev->dev.parent->of_node;
+       struct device *dev = input->dev.parent;
        unsigned int axis;
        unsigned int maximum, fuzz;
        bool data_present;
 
-       input_alloc_absinfo(dev);
-       if (!dev->absinfo)
+       input_alloc_absinfo(input);
+       if (!input->absinfo)
                return;
 
        axis = multitouch ? ABS_MT_POSITION_X : ABS_X;
-       data_present = touchscreen_get_prop_u32(np, "touchscreen-size-x",
-                                               input_abs_get_max(dev, axis),
+       data_present = touchscreen_get_prop_u32(dev, "touchscreen-size-x",
+                                               input_abs_get_max(input,
+                                                                 axis) + 1,
                                                &maximum) |
-                      touchscreen_get_prop_u32(np, "touchscreen-fuzz-x",
-                                               input_abs_get_fuzz(dev, axis),
+                      touchscreen_get_prop_u32(dev, "touchscreen-fuzz-x",
+                                               input_abs_get_fuzz(input, axis),
                                                &fuzz);
        if (data_present)
-               touchscreen_set_params(dev, axis, maximum, fuzz);
+               touchscreen_set_params(input, axis, maximum - 1, fuzz);
 
        axis = multitouch ? ABS_MT_POSITION_Y : ABS_Y;
-       data_present = touchscreen_get_prop_u32(np, "touchscreen-size-y",
-                                               input_abs_get_max(dev, axis),
+       data_present = touchscreen_get_prop_u32(dev, "touchscreen-size-y",
+                                               input_abs_get_max(input,
+                                                                 axis) + 1,
                                                &maximum) |
-                      touchscreen_get_prop_u32(np, "touchscreen-fuzz-y",
-                                               input_abs_get_fuzz(dev, axis),
+                      touchscreen_get_prop_u32(dev, "touchscreen-fuzz-y",
+                                               input_abs_get_fuzz(input, axis),
                                                &fuzz);
        if (data_present)
-               touchscreen_set_params(dev, axis, maximum, fuzz);
+               touchscreen_set_params(input, axis, maximum - 1, fuzz);
 
        axis = multitouch ? ABS_MT_PRESSURE : ABS_PRESSURE;
-       data_present = touchscreen_get_prop_u32(np, "touchscreen-max-pressure",
-                                               input_abs_get_max(dev, axis),
+       data_present = touchscreen_get_prop_u32(dev,
+                                               "touchscreen-max-pressure",
+                                               input_abs_get_max(input, axis),
                                                &maximum) |
-                      touchscreen_get_prop_u32(np, "touchscreen-fuzz-pressure",
-                                               input_abs_get_fuzz(dev, axis),
+                      touchscreen_get_prop_u32(dev,
+                                               "touchscreen-fuzz-pressure",
+                                               input_abs_get_fuzz(input, axis),
                                                &fuzz);
        if (data_present)
-               touchscreen_set_params(dev, axis, maximum, fuzz);
+               touchscreen_set_params(input, axis, maximum, fuzz);
 }
-EXPORT_SYMBOL(touchscreen_parse_of_params);
+EXPORT_SYMBOL(touchscreen_parse_properties);
index 8f3e243..9162172 100644 (file)
 #include <linux/i2c.h>
 #include <linux/input.h>
 #include <linux/input/mt.h>
-#include <linux/input/pixcir_ts.h>
+#include <linux/input/touchscreen.h>
 #include <linux/gpio.h>
-#include <linux/of.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
+/*#include <linux/of.h>*/
 #include <linux/of_device.h>
+#include <linux/platform_data/pixcir_i2c_ts.h>
 
 #define PIXCIR_MAX_SLOTS       5 /* Max fingers supported by driver */
 
 struct pixcir_i2c_ts_data {
        struct i2c_client *client;
        struct input_dev *input;
-       const struct pixcir_ts_platform_data *pdata;
-       bool running;
+       struct gpio_desc *gpio_attb;
+       struct gpio_desc *gpio_reset;
+       const struct pixcir_i2c_chip_data *chip;
        int max_fingers;        /* Max fingers supported in this instance */
+       bool running;
 };
 
 struct pixcir_touch {
@@ -60,7 +63,7 @@ static void pixcir_ts_parse(struct pixcir_i2c_ts_data *tsdata,
        u8 touch;
        int ret, i;
        int readsize;
-       const struct pixcir_i2c_chip_data *chip = &tsdata->pdata->chip;
+       const struct pixcir_i2c_chip_data *chip = tsdata->chip;
 
        memset(report, 0, sizeof(struct pixcir_report_data));
 
@@ -113,13 +116,13 @@ static void pixcir_ts_report(struct pixcir_i2c_ts_data *ts,
        struct pixcir_touch *touch;
        int n, i, slot;
        struct device *dev = &ts->client->dev;
-       const struct pixcir_i2c_chip_data *chip = &ts->pdata->chip;
+       const struct pixcir_i2c_chip_data *chip = ts->chip;
 
        n = report->num_touches;
        if (n > PIXCIR_MAX_SLOTS)
                n = PIXCIR_MAX_SLOTS;
 
-       if (!chip->has_hw_ids) {
+       if (!ts->chip->has_hw_ids) {
                for (i = 0; i < n; i++) {
                        touch = &report->touches[i];
                        pos[i].x = touch->x;
@@ -161,7 +164,6 @@ static void pixcir_ts_report(struct pixcir_i2c_ts_data *ts,
 static irqreturn_t pixcir_ts_isr(int irq, void *dev_id)
 {
        struct pixcir_i2c_ts_data *tsdata = dev_id;
-       const struct pixcir_ts_platform_data *pdata = tsdata->pdata;
        struct pixcir_report_data report;
 
        while (tsdata->running) {
@@ -171,7 +173,7 @@ static irqreturn_t pixcir_ts_isr(int irq, void *dev_id)
                /* report it */
                pixcir_ts_report(tsdata, &report);
 
-               if (gpio_get_value(pdata->gpio_attb)) {
+               if (gpiod_get_value_cansleep(tsdata->gpio_attb)) {
                        if (report.num_touches) {
                                /*
                                 * Last report with no finger up?
@@ -189,6 +191,17 @@ static irqreturn_t pixcir_ts_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static void pixcir_reset(struct pixcir_i2c_ts_data *tsdata)
+{
+       if (!IS_ERR_OR_NULL(tsdata->gpio_reset)) {
+               gpiod_set_value_cansleep(tsdata->gpio_reset, 1);
+               ndelay(100);    /* datasheet section 1.2.3 says 80ns min. */
+               gpiod_set_value_cansleep(tsdata->gpio_reset, 0);
+               /* wait for controller ready. 100ms guess. */
+               msleep(100);
+       }
+}
+
 static int pixcir_set_power_mode(struct pixcir_i2c_ts_data *ts,
                                 enum pixcir_power_mode mode)
 {
@@ -411,85 +424,59 @@ static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,
 #ifdef CONFIG_OF
 static const struct of_device_id pixcir_of_match[];
 
-static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
+static int pixcir_parse_dt(struct device *dev,
+                          struct pixcir_i2c_ts_data *tsdata)
 {
-       struct pixcir_ts_platform_data *pdata;
-       struct device_node *np = dev->of_node;
        const struct of_device_id *match;
 
        match = of_match_device(of_match_ptr(pixcir_of_match), dev);
        if (!match)
-               return ERR_PTR(-EINVAL);
-
-       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
-       if (!pdata)
-               return ERR_PTR(-ENOMEM);
-
-       pdata->chip = *(const struct pixcir_i2c_chip_data *)match->data;
-
-       pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0);
-       /* gpio_attb validity is checked in probe */
-
-       if (of_property_read_u32(np, "touchscreen-size-x", &pdata->x_max)) {
-               dev_err(dev, "Failed to get touchscreen-size-x property\n");
-               return ERR_PTR(-EINVAL);
-       }
-       pdata->x_max -= 1;
-
-       if (of_property_read_u32(np, "touchscreen-size-y", &pdata->y_max)) {
-               dev_err(dev, "Failed to get touchscreen-size-y property\n");
-               return ERR_PTR(-EINVAL);
-       }
-       pdata->y_max -= 1;
+               return -EINVAL;
 
-       dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__,
-               pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb);
+       tsdata->chip = (const struct pixcir_i2c_chip_data *)match->data;
+       if (!tsdata->chip)
+               return -EINVAL;
 
-       return pdata;
+       return 0;
 }
 #else
-static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
+static int pixcir_parse_dt(struct device *dev,
+                          struct pixcir_i2c_ts_data *tsdata)
 {
-       return ERR_PTR(-EINVAL);
+       return -EINVAL;
 }
 #endif
 
 static int pixcir_i2c_ts_probe(struct i2c_client *client,
-                                        const struct i2c_device_id *id)
+                              const struct i2c_device_id *id)
 {
        const struct pixcir_ts_platform_data *pdata =
                        dev_get_platdata(&client->dev);
        struct device *dev = &client->dev;
-       struct device_node *np = dev->of_node;
        struct pixcir_i2c_ts_data *tsdata;
        struct input_dev *input;
        int error;
 
-       if (np && !pdata) {
-               pdata = pixcir_parse_dt(dev);
-               if (IS_ERR(pdata))
-                       return PTR_ERR(pdata);
-       }
+       tsdata = devm_kzalloc(dev, sizeof(*tsdata), GFP_KERNEL);
+       if (!tsdata)
+               return -ENOMEM;
 
-       if (!pdata) {
+       if (pdata) {
+               tsdata->chip = &pdata->chip;
+       } else if (dev->of_node) {
+               error = pixcir_parse_dt(dev, tsdata);
+               if (error)
+                       return error;
+       } else {
                dev_err(&client->dev, "platform data not defined\n");
                return -EINVAL;
        }
 
-       if (!gpio_is_valid(pdata->gpio_attb)) {
-               dev_err(dev, "Invalid gpio_attb in pdata\n");
+       if (!tsdata->chip->max_fingers) {
+               dev_err(dev, "Invalid max_fingers in chip data\n");
                return -EINVAL;
        }
 
-       if (!pdata->chip.max_fingers) {
-               dev_err(dev, "Invalid max_fingers in pdata\n");
-               return -EINVAL;
-       }
-
-       tsdata = devm_kzalloc(dev, sizeof(*tsdata), GFP_KERNEL);
-       if (!tsdata)
-               return -ENOMEM;
-
        input = devm_input_allocate_device(dev);
        if (!input) {
                dev_err(dev, "Failed to allocate input device\n");
@@ -498,7 +485,6 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
 
        tsdata->client = client;
        tsdata->input = input;
-       tsdata->pdata = pdata;
 
        input->name = client->name;
        input->id.bustype = BUS_I2C;
@@ -506,15 +492,21 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
        input->close = pixcir_input_close;
        input->dev.parent = &client->dev;
 
-       __set_bit(EV_KEY, input->evbit);
-       __set_bit(EV_ABS, input->evbit);
-       __set_bit(BTN_TOUCH, input->keybit);
-       input_set_abs_params(input, ABS_X, 0, pdata->x_max, 0, 0);
-       input_set_abs_params(input, ABS_Y, 0, pdata->y_max, 0, 0);
-       input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0);
-       input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0);
+       if (pdata) {
+               input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0);
+               input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0);
+       } else {
+               input_set_capability(input, EV_ABS, ABS_MT_POSITION_X);
+               input_set_capability(input, EV_ABS, ABS_MT_POSITION_Y);
+               touchscreen_parse_properties(input, true);
+               if (!input_abs_get_max(input, ABS_MT_POSITION_X) ||
+                   !input_abs_get_max(input, ABS_MT_POSITION_Y)) {
+                       dev_err(dev, "Touchscreen size is not specified\n");
+                       return -EINVAL;
+               }
+       }
 
-       tsdata->max_fingers = tsdata->pdata->chip.max_fingers;
+       tsdata->max_fingers = tsdata->chip->max_fingers;
        if (tsdata->max_fingers > PIXCIR_MAX_SLOTS) {
                tsdata->max_fingers = PIXCIR_MAX_SLOTS;
                dev_info(dev, "Limiting maximum fingers to %d\n",
@@ -530,10 +522,18 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
 
        input_set_drvdata(input, tsdata);
 
-       error = devm_gpio_request_one(dev, pdata->gpio_attb,
-                                     GPIOF_DIR_IN, "pixcir_i2c_attb");
-       if (error) {
-               dev_err(dev, "Failed to request ATTB gpio\n");
+       tsdata->gpio_attb = devm_gpiod_get(dev, "attb", GPIOD_IN);
+       if (IS_ERR(tsdata->gpio_attb)) {
+               error = PTR_ERR(tsdata->gpio_attb);
+               dev_err(dev, "Failed to request ATTB gpio: %d\n", error);
+               return error;
+       }
+
+       tsdata->gpio_reset = devm_gpiod_get_optional(dev, "reset",
+                                                    GPIOD_OUT_LOW);
+       if (IS_ERR(tsdata->gpio_reset)) {
+               error = PTR_ERR(tsdata->gpio_reset);
+               dev_err(dev, "Failed to request RESET gpio: %d\n", error);
                return error;
        }
 
@@ -545,6 +545,8 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
                return error;
        }
 
+       pixcir_reset(tsdata);
+
        /* Always be in IDLE mode to save power, device supports auto wake */
        error = pixcir_set_power_mode(tsdata, PIXCIR_POWER_IDLE);
        if (error) {
@@ -602,7 +604,6 @@ MODULE_DEVICE_TABLE(of, pixcir_of_match);
 
 static struct i2c_driver pixcir_i2c_ts_driver = {
        .driver = {
-               .owner  = THIS_MODULE,
                .name   = "pixcir_ts",
                .pm     = &pixcir_dev_pm_ops,
                .of_match_table = of_match_ptr(pixcir_of_match),
index 697e26e..e943678 100644 (file)
@@ -296,7 +296,6 @@ static struct i2c_driver st1232_ts_driver = {
        .id_table       = st1232_ts_id,
        .driver = {
                .name   = ST1232_TS_NAME,
-               .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(st1232_ts_dt_ids),
                .pm     = &st1232_ts_pm_ops,
        },
index d8c025b..aaf9475 100644 (file)
@@ -709,7 +709,7 @@ static int tsc2005_probe(struct spi_device *spi)
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0);
 
        if (np)
-               touchscreen_parse_of_params(input_dev, false);
+               touchscreen_parse_properties(input_dev, false);
 
        input_dev->open = tsc2005_open;
        input_dev->close = tsc2005_close;
index ccc8aa6..5d0cd51 100644 (file)
@@ -482,7 +482,6 @@ MODULE_DEVICE_TABLE(of, tsc2007_of_match);
 
 static struct i2c_driver tsc2007_driver = {
        .driver = {
-               .owner  = THIS_MODULE,
                .name   = "tsc2007",
                .of_match_table = of_match_ptr(tsc2007_of_match),
        },
index 32f8ac0..8d7a285 100644 (file)
@@ -271,7 +271,6 @@ MODULE_DEVICE_TABLE(i2c, wacom_i2c_id);
 static struct i2c_driver wacom_i2c_driver = {
        .driver = {
                .name   = "wacom_i2c",
-               .owner  = THIS_MODULE,
                .pm     = &wacom_i2c_pm,
        },
 
index fb92ae1..515c20a 100644 (file)
@@ -23,7 +23,7 @@
 #include <asm/unaligned.h>
 
 #define WDT87XX_NAME           "wdt87xx_i2c"
-#define WDT87XX_DRV_VER                "0.9.6"
+#define WDT87XX_DRV_VER                "0.9.7"
 #define WDT87XX_FW_NAME                "wdt87xx_fw.bin"
 #define WDT87XX_CFG_NAME       "wdt87xx_cfg.bin"
 
 #define CTL_PARAM_OFFSET_PHY_H         24
 #define CTL_PARAM_OFFSET_FACTOR                32
 
+/* The definition of the device descriptor */
+#define WDT_GD_DEVICE                  1
+#define DEV_DESC_OFFSET_VID            8
+#define DEV_DESC_OFFSET_PID            10
+
 /* Communication commands */
 #define PACKET_SIZE                    56
 #define VND_REQ_READ                   0x06
 /* Controller requires minimum 300us between commands */
 #define WDT_COMMAND_DELAY_MS           2
 #define WDT_FLASH_WRITE_DELAY_MS       4
+#define WDT_FW_RESET_TIME              2500
 
 struct wdt87xx_sys_param {
        u16     fw_id;
@@ -165,6 +171,8 @@ struct wdt87xx_sys_param {
        u16     scaling_factor;
        u32     max_x;
        u32     max_y;
+       u16     vendor_id;
+       u16     product_id;
 };
 
 struct wdt87xx_data {
@@ -208,6 +216,32 @@ static int wdt87xx_i2c_xfer(struct i2c_client *client,
        return 0;
 }
 
+static int wdt87xx_get_desc(struct i2c_client *client, u8 desc_idx,
+                           u8 *buf, size_t len)
+{
+       u8 tx_buf[] = { 0x22, 0x00, 0x10, 0x0E, 0x23, 0x00 };
+       int error;
+
+       tx_buf[2] |= desc_idx & 0xF;
+
+       error = wdt87xx_i2c_xfer(client, tx_buf, sizeof(tx_buf),
+                                buf, len);
+       if (error) {
+               dev_err(&client->dev, "get desc failed: %d\n", error);
+               return error;
+       }
+
+       if (buf[0] != len) {
+               dev_err(&client->dev, "unexpected response to get desc: %d\n",
+                       buf[0]);
+               return -EINVAL;
+       }
+
+       mdelay(WDT_COMMAND_DELAY_MS);
+
+       return 0;
+}
+
 static int wdt87xx_get_string(struct i2c_client *client, u8 str_idx,
                              u8 *buf, size_t len)
 {
@@ -373,7 +407,7 @@ static int wdt87xx_sw_reset(struct i2c_client *client)
        }
 
        /* Wait the device to be ready */
-       msleep(200);
+       msleep(WDT_FW_RESET_TIME);
 
        return 0;
 }
@@ -403,6 +437,15 @@ static int wdt87xx_get_sysparam(struct i2c_client *client,
        u8 buf[PKT_READ_SIZE];
        int error;
 
+       error = wdt87xx_get_desc(client, WDT_GD_DEVICE, buf, 18);
+       if (error) {
+               dev_err(&client->dev, "failed to get device desc\n");
+               return error;
+       }
+
+       param->vendor_id = get_unaligned_le16(buf + DEV_DESC_OFFSET_VID);
+       param->product_id = get_unaligned_le16(buf + DEV_DESC_OFFSET_PID);
+
        error = wdt87xx_get_string(client, STRIDX_PARAMETERS, buf, 34);
        if (error) {
                dev_err(&client->dev, "failed to get parameters\n");
@@ -994,6 +1037,8 @@ static int wdt87xx_ts_create_input_device(struct wdt87xx_data *wdt)
 
        input->name = "WDT87xx Touchscreen";
        input->id.bustype = BUS_I2C;
+       input->id.vendor = wdt->param.vendor_id;
+       input->id.product = wdt->param.product_id;
        input->phys = wdt->phys;
 
        input_set_abs_params(input, ABS_MT_POSITION_X, 0,
index f58a196..0aa934c 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/i2c.h>
 #include <linux/delay.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/device.h>
 #include <linux/sysfs.h>
 #include <linux/input/mt.h>
 #include <linux/platform_data/zforce_ts.h>
 #include <linux/regulator/consumer.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 
 #define WAIT_TIMEOUT           msecs_to_jiffies(1000)
 
@@ -120,6 +119,9 @@ struct zforce_ts {
 
        struct regulator        *reg_vdd;
 
+       struct gpio_desc        *gpio_int;
+       struct gpio_desc        *gpio_rst;
+
        bool                    suspending;
        bool                    suspended;
        bool                    boot_complete;
@@ -161,6 +163,16 @@ static int zforce_command(struct zforce_ts *ts, u8 cmd)
        return 0;
 }
 
+static void zforce_reset_assert(struct zforce_ts *ts)
+{
+       gpiod_set_value_cansleep(ts->gpio_rst, 1);
+}
+
+static void zforce_reset_deassert(struct zforce_ts *ts)
+{
+       gpiod_set_value_cansleep(ts->gpio_rst, 0);
+}
+
 static int zforce_send_wait(struct zforce_ts *ts, const char *buf, int len)
 {
        struct i2c_client *client = ts->client;
@@ -479,7 +491,6 @@ static irqreturn_t zforce_irq_thread(int irq, void *dev_id)
 {
        struct zforce_ts *ts = dev_id;
        struct i2c_client *client = ts->client;
-       const struct zforce_ts_platdata *pdata = ts->pdata;
        int ret;
        u8 payload_buffer[FRAME_MAXSIZE];
        u8 *payload;
@@ -499,7 +510,7 @@ static irqreturn_t zforce_irq_thread(int irq, void *dev_id)
        if (!ts->suspending && device_may_wakeup(&client->dev))
                pm_stay_awake(&client->dev);
 
-       while (!gpio_get_value(pdata->gpio_int)) {
+       while (gpiod_get_value_cansleep(ts->gpio_int)) {
                ret = zforce_read_packet(ts, payload_buffer);
                if (ret < 0) {
                        dev_err(&client->dev,
@@ -690,7 +701,7 @@ static void zforce_reset(void *data)
 {
        struct zforce_ts *ts = data;
 
-       gpio_set_value(ts->pdata->gpio_rst, 0);
+       zforce_reset_assert(ts);
 
        udelay(10);
 
@@ -712,18 +723,6 @@ static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev)
                return ERR_PTR(-ENOMEM);
        }
 
-       pdata->gpio_int = of_get_gpio(np, 0);
-       if (!gpio_is_valid(pdata->gpio_int)) {
-               dev_err(dev, "failed to get interrupt gpio\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       pdata->gpio_rst = of_get_gpio(np, 1);
-       if (!gpio_is_valid(pdata->gpio_rst)) {
-               dev_err(dev, "failed to get reset gpio\n");
-               return ERR_PTR(-EINVAL);
-       }
-
        if (of_property_read_u32(np, "x-size", &pdata->x_max)) {
                dev_err(dev, "failed to get x-size property\n");
                return ERR_PTR(-EINVAL);
@@ -755,19 +754,22 @@ static int zforce_probe(struct i2c_client *client,
        if (!ts)
                return -ENOMEM;
 
-       ret = devm_gpio_request_one(&client->dev, pdata->gpio_int, GPIOF_IN,
-                                   "zforce_ts_int");
-       if (ret) {
-               dev_err(&client->dev, "request of gpio %d failed, %d\n",
-                       pdata->gpio_int, ret);
+       /* INT GPIO */
+       ts->gpio_int = devm_gpiod_get_index(&client->dev, NULL, 0, GPIOD_IN);
+       if (IS_ERR(ts->gpio_int)) {
+               ret = PTR_ERR(ts->gpio_int);
+               dev_err(&client->dev,
+                       "failed to request interrupt GPIO: %d\n", ret);
                return ret;
        }
 
-       ret = devm_gpio_request_one(&client->dev, pdata->gpio_rst,
-                                   GPIOF_OUT_INIT_LOW, "zforce_ts_rst");
-       if (ret) {
-               dev_err(&client->dev, "request of gpio %d failed, %d\n",
-                       pdata->gpio_rst, ret);
+       /* RST GPIO */
+       ts->gpio_rst = devm_gpiod_get_index(&client->dev, NULL, 1,
+                                           GPIOD_OUT_HIGH);
+       if (IS_ERR(ts->gpio_rst)) {
+               ret = PTR_ERR(ts->gpio_rst);
+               dev_err(&client->dev,
+                       "failed to request reset GPIO: %d\n", ret);
                return ret;
        }
 
@@ -863,7 +865,7 @@ static int zforce_probe(struct i2c_client *client,
        i2c_set_clientdata(client, ts);
 
        /* let the controller boot */
-       gpio_set_value(pdata->gpio_rst, 1);
+       zforce_reset_deassert(ts);
 
        ts->command_waiting = NOTIFICATION_BOOTCOMPLETE;
        if (wait_for_completion_timeout(&ts->command_done, WAIT_TIMEOUT) == 0)
@@ -917,7 +919,6 @@ MODULE_DEVICE_TABLE(of, zforce_dt_idtable);
 
 static struct i2c_driver zforce_driver = {
        .driver = {
-               .owner  = THIS_MODULE,
                .name   = "zforce-ts",
                .pm     = &zforce_pm_ops,
                .of_match_table = of_match_ptr(zforce_dt_idtable),
diff --git a/include/linux/input/pixcir_ts.h b/include/linux/input/pixcir_ts.h
deleted file mode 100644 (file)
index 7bae83b..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef        _PIXCIR_I2C_TS_H
-#define        _PIXCIR_I2C_TS_H
-
-/*
- * Register map
- */
-#define PIXCIR_REG_POWER_MODE  51
-#define PIXCIR_REG_INT_MODE    52
-
-/*
- * Power modes:
- * active: max scan speed
- * idle: lower scan speed with automatic transition to active on touch
- * halt: datasheet says sleep but this is more like halt as the chip
- *       clocks are cut and it can only be brought out of this mode
- *      using the RESET pin.
- */
-enum pixcir_power_mode {
-       PIXCIR_POWER_ACTIVE,
-       PIXCIR_POWER_IDLE,
-       PIXCIR_POWER_HALT,
-};
-
-#define PIXCIR_POWER_MODE_MASK 0x03
-#define PIXCIR_POWER_ALLOW_IDLE (1UL << 2)
-
-/*
- * Interrupt modes:
- * periodical: interrupt is asserted periodicaly
- * diff coordinates: interrupt is asserted when coordinates change
- * level on touch: interrupt level asserted during touch
- * pulse on touch: interrupt pulse asserted druing touch
- *
- */
-enum pixcir_int_mode {
-       PIXCIR_INT_PERIODICAL,
-       PIXCIR_INT_DIFF_COORD,
-       PIXCIR_INT_LEVEL_TOUCH,
-       PIXCIR_INT_PULSE_TOUCH,
-};
-
-#define PIXCIR_INT_MODE_MASK   0x03
-#define PIXCIR_INT_ENABLE      (1UL << 3)
-#define PIXCIR_INT_POL_HIGH    (1UL << 2)
-
-/**
- * struct pixcir_irc_chip_data - chip related data
- * @max_fingers:       Max number of fingers reported simultaneously by h/w
- * @has_hw_ids:                Hardware supports finger tracking IDs
- *
- */
-struct pixcir_i2c_chip_data {
-       u8 max_fingers;
-       bool has_hw_ids;
-};
-
-struct pixcir_ts_platform_data {
-       int x_max;
-       int y_max;
-       int gpio_attb;          /* GPIO connected to ATTB line */
-       struct pixcir_i2c_chip_data chip;
-};
-
-#endif
index eecc9ea..c91e137 100644 (file)
@@ -9,15 +9,8 @@
 #ifndef _TOUCHSCREEN_H
 #define _TOUCHSCREEN_H
 
-#include <linux/input.h>
+struct input_dev;
 
-#ifdef CONFIG_OF
-void touchscreen_parse_of_params(struct input_dev *dev, bool multitouch);
-#else
-static inline void touchscreen_parse_of_params(struct input_dev *dev,
-                                              bool multitouch)
-{
-}
-#endif
+void touchscreen_parse_properties(struct input_dev *dev, bool multitouch);
 
 #endif
diff --git a/include/linux/platform_data/pixcir_i2c_ts.h b/include/linux/platform_data/pixcir_i2c_ts.h
new file mode 100644 (file)
index 0000000..646af6f
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef        _PIXCIR_I2C_TS_H
+#define        _PIXCIR_I2C_TS_H
+
+/*
+ * Register map
+ */
+#define PIXCIR_REG_POWER_MODE  51
+#define PIXCIR_REG_INT_MODE    52
+
+/*
+ * Power modes:
+ * active: max scan speed
+ * idle: lower scan speed with automatic transition to active on touch
+ * halt: datasheet says sleep but this is more like halt as the chip
+ *       clocks are cut and it can only be brought out of this mode
+ *      using the RESET pin.
+ */
+enum pixcir_power_mode {
+       PIXCIR_POWER_ACTIVE,
+       PIXCIR_POWER_IDLE,
+       PIXCIR_POWER_HALT,
+};
+
+#define PIXCIR_POWER_MODE_MASK 0x03
+#define PIXCIR_POWER_ALLOW_IDLE (1UL << 2)
+
+/*
+ * Interrupt modes:
+ * periodical: interrupt is asserted periodicaly
+ * diff coordinates: interrupt is asserted when coordinates change
+ * level on touch: interrupt level asserted during touch
+ * pulse on touch: interrupt pulse asserted druing touch
+ *
+ */
+enum pixcir_int_mode {
+       PIXCIR_INT_PERIODICAL,
+       PIXCIR_INT_DIFF_COORD,
+       PIXCIR_INT_LEVEL_TOUCH,
+       PIXCIR_INT_PULSE_TOUCH,
+};
+
+#define PIXCIR_INT_MODE_MASK   0x03
+#define PIXCIR_INT_ENABLE      (1UL << 3)
+#define PIXCIR_INT_POL_HIGH    (1UL << 2)
+
+/**
+ * struct pixcir_irc_chip_data - chip related data
+ * @max_fingers:       Max number of fingers reported simultaneously by h/w
+ * @has_hw_ids:                Hardware supports finger tracking IDs
+ *
+ */
+struct pixcir_i2c_chip_data {
+       u8 max_fingers;
+       bool has_hw_ids;
+};
+
+struct pixcir_ts_platform_data {
+       int x_max;
+       int y_max;
+       struct pixcir_i2c_chip_data chip;
+};
+
+#endif
index 0472ab2..7bdece8 100644 (file)
@@ -16,9 +16,6 @@
 #define _LINUX_INPUT_ZFORCE_TS_H
 
 struct zforce_ts_platdata {
-       int gpio_int;
-       int gpio_rst;
-
        unsigned int x_max;
        unsigned int y_max;
 };
index 9f779c7..df4ab5d 100644 (file)
@@ -18,6 +18,8 @@
 #include <linux/mod_devicetable.h>
 #include <uapi/linux/serio.h>
 
+extern struct bus_type serio_bus;
+
 struct serio {
        void *port_data;