]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'next' into for-linus
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 2 Jul 2013 16:01:31 +0000 (09:01 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 2 Jul 2013 16:01:31 +0000 (09:01 -0700)
Prepare first set of updates for 3.11 merge window.

12 files changed:
Documentation/devicetree/bindings/input/samsung-keypad.txt
arch/arm/mach-davinci/board-da850-evm.c
drivers/input/joystick/xpad.c
drivers/input/keyboard/Kconfig
drivers/input/keyboard/samsung-keypad.c
drivers/input/serio/Kconfig
drivers/input/tablet/wacom_wac.c
drivers/input/touchscreen/cyttsp_core.c
drivers/input/touchscreen/cyttsp_core.h
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 d6cbfe9df21810efe9255415787af029525d1131..fa061d46527f91e7de8838930a75d863ac7d3f6a 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 },
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 d401a7dccaa7289becff9cea933c10e97951174a..94c17c28d2683e8b76582e711f0a2221534fbf14 100644 (file)
@@ -205,6 +205,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 518282da6d850b180d56572c0517b62424f12e19..384fbcd0cee0d1b65d402beaa0f4f418e22e0a50 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;
 
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..0cf564a79fb55466d83318b01248f76fbc1bcfee 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];
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 */