Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 18 Dec 2012 20:46:37 +0000 (12:46 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 18 Dec 2012 20:46:37 +0000 (12:46 -0800)
Pull second round of input updates from Dmitry Torokhov:
 "As usual, there are a couple of new drivers, input core now supports
  managed input devices (devres), a slew of drivers now have device tree
  support and a bunch of fixes and cleanups."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (71 commits)
  Input: walkera0701 - fix crash on startup
  Input: matrix-keymap - provide a proper module license
  Input: gpio_keys_polled - switch to using gpio_request_one()
  Input: gpio_keys - switch to using gpio_request_one()
  Input: wacom - fix touch support for Bamboo Fun CTH-461
  Input: xpad - add a few new VID/PID combinations
  Input: xpad - minor formatting fixes
  Input: gpio-keys-polled - honor 'autorepeat' setting in platform data
  Input: tca8418-keypad - switch to using managed resources
  Input: tca8418_keypad - increase severity of failures in probe()
  Input: tca8418_keypad - move device ID tables closer to where they are used
  Input: tca8418_keypad - use dev_get_platdata() to retrieve platform data
  Input: tca8418_keypad - use a temporary variable for parent device
  Input: tca8418_keypad - add support for shared interrupt
  Input: tca8418_keypad - add support for device tree bindings
  Input: remove Compaq iPAQ H3600 (Bitsy) touchscreen driver
  Input: bu21013_ts - add support for Device Tree booting
  Input: bu21013_ts - move GPIO init and exit functions into the driver
  Input: bu21013_ts - request regulator that actually exists
  ARM: ux500: Strip out duplicate touch screen platform information
  ...

175 files changed:
Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt [new file with mode: 0644]
Documentation/devicetree/bindings/input/pwm-beeper.txt [new file with mode: 0644]
Documentation/devicetree/bindings/input/stmpe-keypad.txt [new file with mode: 0644]
Documentation/devicetree/bindings/input/tca8418_keypad.txt [new file with mode: 0644]
Documentation/devicetree/bindings/input/touchscreen/mms114.txt [new file with mode: 0644]
Documentation/devicetree/bindings/input/touchscreen/stmpe.txt [new file with mode: 0644]
arch/arm/mach-omap1/board-nokia770.c
arch/arm/mach-ux500/board-mop500-stuib.c
drivers/input/gameport/emu10k1-gp.c
drivers/input/gameport/fm801-gp.c
drivers/input/input-mt.c
drivers/input/input.c
drivers/input/joystick/as5011.c
drivers/input/joystick/maplecontrol.c
drivers/input/joystick/walkera0701.c
drivers/input/joystick/xpad.c
drivers/input/keyboard/Kconfig
drivers/input/keyboard/adp5520-keys.c
drivers/input/keyboard/adp5588-keys.c
drivers/input/keyboard/adp5589-keys.c
drivers/input/keyboard/bf54x-keys.c
drivers/input/keyboard/davinci_keyscan.c
drivers/input/keyboard/ep93xx_keypad.c
drivers/input/keyboard/gpio_keys.c
drivers/input/keyboard/gpio_keys_polled.c
drivers/input/keyboard/hilkbd.c
drivers/input/keyboard/imx_keypad.c
drivers/input/keyboard/jornada680_kbd.c
drivers/input/keyboard/jornada720_kbd.c
drivers/input/keyboard/lm8323.c
drivers/input/keyboard/lm8333.c
drivers/input/keyboard/locomokbd.c
drivers/input/keyboard/lpc32xx-keys.c
drivers/input/keyboard/matrix_keypad.c
drivers/input/keyboard/max7359_keypad.c
drivers/input/keyboard/mcs_touchkey.c
drivers/input/keyboard/mpr121_touchkey.c
drivers/input/keyboard/nomadik-ske-keypad.c
drivers/input/keyboard/omap-keypad.c
drivers/input/keyboard/omap4-keypad.c
drivers/input/keyboard/opencores-kbd.c
drivers/input/keyboard/pmic8xxx-keypad.c
drivers/input/keyboard/pxa27x_keypad.c
drivers/input/keyboard/pxa930_rotary.c
drivers/input/keyboard/qt1070.c
drivers/input/keyboard/qt2160.c
drivers/input/keyboard/samsung-keypad.c
drivers/input/keyboard/sh_keysc.c
drivers/input/keyboard/spear-keyboard.c
drivers/input/keyboard/stmpe-keypad.c
drivers/input/keyboard/tc3589x-keypad.c
drivers/input/keyboard/tca6416-keypad.c
drivers/input/keyboard/tca8418_keypad.c
drivers/input/keyboard/tegra-kbc.c
drivers/input/keyboard/tnetv107x-keypad.c
drivers/input/keyboard/twl4030_keypad.c
drivers/input/keyboard/w90p910_keypad.c
drivers/input/matrix-keymap.c
drivers/input/misc/88pm80x_onkey.c
drivers/input/misc/88pm860x_onkey.c
drivers/input/misc/Kconfig
drivers/input/misc/Makefile
drivers/input/misc/ab8500-ponkey.c
drivers/input/misc/ad714x-i2c.c
drivers/input/misc/ad714x-spi.c
drivers/input/misc/adxl34x-i2c.c
drivers/input/misc/adxl34x-spi.c
drivers/input/misc/bfin_rotary.c
drivers/input/misc/bma150.c
drivers/input/misc/cma3000_d0x_i2c.c
drivers/input/misc/cobalt_btns.c
drivers/input/misc/da9052_onkey.c
drivers/input/misc/da9055_onkey.c [new file with mode: 0644]
drivers/input/misc/dm355evm_keys.c
drivers/input/misc/gp2ap002a00f.c
drivers/input/misc/gpio_tilt_polled.c
drivers/input/misc/ixp4xx-beeper.c
drivers/input/misc/kxtj9.c
drivers/input/misc/m68kspkr.c
drivers/input/misc/max8925_onkey.c
drivers/input/misc/max8997_haptic.c
drivers/input/misc/mc13783-pwrbutton.c
drivers/input/misc/mma8450.c
drivers/input/misc/mpu3050.c
drivers/input/misc/pcap_keys.c
drivers/input/misc/pcf50633-input.c
drivers/input/misc/pcf8574_keypad.c
drivers/input/misc/pcspkr.c
drivers/input/misc/pm8xxx-vibrator.c
drivers/input/misc/pmic8xxx-pwrkey.c
drivers/input/misc/pwm-beeper.c
drivers/input/misc/rb532_button.c
drivers/input/misc/retu-pwrbutton.c [new file with mode: 0644]
drivers/input/misc/rotary_encoder.c
drivers/input/misc/sgi_btns.c
drivers/input/misc/sparcspkr.c
drivers/input/misc/twl4030-pwrbutton.c
drivers/input/misc/twl4030-vibra.c
drivers/input/misc/twl6040-vibra.c
drivers/input/misc/wistron_btns.c
drivers/input/misc/wm831x-on.c
drivers/input/misc/xen-kbdfront.c
drivers/input/mouse/alps.c
drivers/input/mouse/gpio_mouse.c
drivers/input/mouse/maplemouse.c
drivers/input/mouse/navpoint.c
drivers/input/mouse/pxa930_trkball.c
drivers/input/mouse/synaptics_i2c.c
drivers/input/serio/Kconfig
drivers/input/serio/Makefile
drivers/input/serio/altera_ps2.c
drivers/input/serio/ambakmi.c
drivers/input/serio/arc_ps2.c [new file with mode: 0644]
drivers/input/serio/ct82c710.c
drivers/input/serio/gscps2.c
drivers/input/serio/hil_mlc.c
drivers/input/serio/i8042-io.h
drivers/input/serio/i8042-sparcio.h
drivers/input/serio/i8042.c
drivers/input/serio/maceps2.c
drivers/input/serio/pcips2.c
drivers/input/serio/q40kbd.c
drivers/input/serio/rpckbd.c
drivers/input/serio/sa1111ps2.c
drivers/input/serio/serio.c
drivers/input/serio/xilinx_ps2.c
drivers/input/tablet/wacom_sys.c
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.h
drivers/input/touchscreen/88pm860x-ts.c
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/Makefile
drivers/input/touchscreen/ad7877.c
drivers/input/touchscreen/ad7879-i2c.c
drivers/input/touchscreen/ad7879-spi.c
drivers/input/touchscreen/ads7846.c
drivers/input/touchscreen/atmel_mxt_ts.c
drivers/input/touchscreen/atmel_tsadcc.c
drivers/input/touchscreen/auo-pixcir-ts.c
drivers/input/touchscreen/bu21013_ts.c
drivers/input/touchscreen/cy8ctmg110_ts.c
drivers/input/touchscreen/cyttsp_i2c.c
drivers/input/touchscreen/cyttsp_spi.c
drivers/input/touchscreen/da9034-ts.c
drivers/input/touchscreen/da9052_tsi.c
drivers/input/touchscreen/edt-ft5x06.c
drivers/input/touchscreen/eeti_ts.c
drivers/input/touchscreen/egalax_ts.c
drivers/input/touchscreen/h3600_ts_input.c [deleted file]
drivers/input/touchscreen/htcpen.c
drivers/input/touchscreen/ili210x.c
drivers/input/touchscreen/intel-mid-touch.c
drivers/input/touchscreen/jornada720_ts.c
drivers/input/touchscreen/lpc32xx_ts.c
drivers/input/touchscreen/max11801_ts.c
drivers/input/touchscreen/mc13783_ts.c
drivers/input/touchscreen/mcs5000_ts.c
drivers/input/touchscreen/mms114.c
drivers/input/touchscreen/pcap_ts.c
drivers/input/touchscreen/pixcir_i2c_ts.c
drivers/input/touchscreen/s3c2410_ts.c
drivers/input/touchscreen/st1232.c
drivers/input/touchscreen/stmpe-ts.c
drivers/input/touchscreen/ti_am335x_tsc.c
drivers/input/touchscreen/tnetv107x-ts.c
drivers/input/touchscreen/tps6507x-ts.c
drivers/input/touchscreen/tsc2005.c
drivers/input/touchscreen/tsc2007.c
drivers/input/touchscreen/ucb1400_ts.c
drivers/input/touchscreen/w90p910_ts.c
drivers/input/touchscreen/wacom_i2c.c
drivers/input/touchscreen/wm831x-ts.c
drivers/mfd/stmpe.c
include/linux/input.h
include/linux/input/bu21013.h

diff --git a/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt b/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt
new file mode 100644 (file)
index 0000000..ead641c
--- /dev/null
@@ -0,0 +1,46 @@
+* GPIO driven matrix keypad device tree bindings
+
+GPIO driven matrix keypad is used to interface a SoC with a matrix keypad.
+The matrix keypad supports multiple row and column lines, a key can be
+placed at each intersection of a unique row and a unique column. The matrix
+keypad can sense a key-press and key-release by means of GPIO lines and
+report the event using GPIO interrupts to the cpu.
+
+Required Properties:
+- compatible:          Should be "gpio-matrix-keypad"
+- 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.
+- linux,keymap:                The definition can be found at
+                       bindings/input/matrix-keymap.txt
+
+Optional Properties:
+- linux,no-autorepeat: do no enable autorepeat feature.
+- linux,wakeup:                use any event on keypad as wakeup event.
+- debounce-delay-ms:   debounce interval in milliseconds
+- col-scan-delay-us:   delay, measured in microseconds, that is needed
+                       before we can scan keypad after activating column gpio
+
+Example:
+       matrix-keypad {
+               compatible = "gpio-matrix-keypad";
+               debounce-delay-ms = <5>;
+               col-scan-delay-us = <2>;
+
+               row-gpios = <&gpio2 25 0
+                            &gpio2 26 0
+                            &gpio2 27 0>;
+
+               col-gpios = <&gpio2 21 0
+                            &gpio2 22 0>;
+
+               linux,keymap = <0x0000008B
+                               0x0100009E
+                               0x02000069
+                               0x0001006A
+                               0x0101001C
+                               0x0201006C>;
+       };
diff --git a/Documentation/devicetree/bindings/input/pwm-beeper.txt b/Documentation/devicetree/bindings/input/pwm-beeper.txt
new file mode 100644 (file)
index 0000000..be332ae
--- /dev/null
@@ -0,0 +1,7 @@
+* PWM beeper device tree bindings
+
+Registers a PWM device as beeper.
+
+Required properties:
+- compatible: should be "pwm-beeper"
+- pwms: phandle to the physical PWM device
diff --git a/Documentation/devicetree/bindings/input/stmpe-keypad.txt b/Documentation/devicetree/bindings/input/stmpe-keypad.txt
new file mode 100644 (file)
index 0000000..1b97222
--- /dev/null
@@ -0,0 +1,39 @@
+* STMPE Keypad
+
+Required properties:
+ - compatible               : "st,stmpe-keypad"
+ - linux,keymap             : See ./matrix-keymap.txt
+
+Optional properties:
+ - debounce-interval        : Debouncing interval time in milliseconds
+ - st,scan-count            : Scanning cycles elapsed before key data is updated
+ - st,no-autorepeat         : If specified device will not autorepeat
+
+Example:
+
+       stmpe_keypad {
+               compatible = "st,stmpe-keypad";
+
+               debounce-interval = <64>;
+               st,scan-count = <8>;
+               st,no-autorepeat;
+
+               linux,keymap = <0x205006b
+                               0x4010074
+                               0x3050072
+                               0x1030004
+                               0x502006a
+                               0x500000a
+                               0x5008b
+                               0x706001c
+                               0x405000b
+                               0x6070003
+                               0x3040067
+                               0x303006c
+                               0x60400e7
+                               0x602009e
+                               0x4020073
+                               0x5050002
+                               0x4030069
+                               0x3020008>;
+       };
diff --git a/Documentation/devicetree/bindings/input/tca8418_keypad.txt b/Documentation/devicetree/bindings/input/tca8418_keypad.txt
new file mode 100644 (file)
index 0000000..2a1538f
--- /dev/null
@@ -0,0 +1,8 @@
+
+Required properties:
+- compatible: "ti,tca8418"
+- reg: the I2C address
+- interrupts: IRQ line number, should trigger on falling edge
+- keypad,num-rows: The number of rows
+- keypad,num-columns: The number of columns
+- linux,keymap: Keys definitions, see keypad-matrix.
diff --git a/Documentation/devicetree/bindings/input/touchscreen/mms114.txt b/Documentation/devicetree/bindings/input/touchscreen/mms114.txt
new file mode 100644 (file)
index 0000000..89d4c56
--- /dev/null
@@ -0,0 +1,34 @@
+* MELFAS MMS114 touchscreen controller
+
+Required properties:
+- compatible: must be "melfas,mms114"
+- reg: I2C address of the chip
+- interrupts: interrupt to which the chip is connected
+- x-size: horizontal resolution of touchscreen
+- y-size: vertical resolution of touchscreen
+
+Optional properties:
+- contact-threshold:
+- moving-threshold:
+- x-invert: invert X axis
+- y-invert: invert Y axis
+
+Example:
+
+       i2c@00000000 {
+               /* ... */
+
+               touchscreen@48 {
+                       compatible = "melfas,mms114";
+                       reg = <0x48>;
+                       interrupts = <39 0>;
+                       x-size = <720>;
+                       y-size = <1280>;
+                       contact-threshold = <10>;
+                       moving-threshold = <10>;
+                       x-invert;
+                       y-invert;
+               };
+
+               /* ... */
+       };
diff --git a/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt b/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt
new file mode 100644 (file)
index 0000000..127baa3
--- /dev/null
@@ -0,0 +1,43 @@
+STMPE Touchscreen
+----------------
+
+Required properties:
+ - compatible: "st,stmpe-ts"
+
+Optional properties:
+- st,sample-time: ADC converstion time in number of clock.  (0 -> 36 clocks, 1 ->
+  44 clocks, 2 -> 56 clocks, 3 -> 64 clocks, 4 -> 80 clocks, 5 -> 96 clocks, 6
+  -> 144 clocks), recommended is 4.
+- st,mod-12b: ADC Bit mode (0 -> 10bit ADC, 1 -> 12bit ADC)
+- st,ref-sel: ADC reference source (0 -> internal reference, 1 -> external
+  reference)
+- st,adc-freq: ADC Clock speed (0 -> 1.625 MHz, 1 -> 3.25 MHz, 2 || 3 -> 6.5 MHz)
+- st,ave-ctrl: Sample average control (0 -> 1 sample, 1 -> 2 samples, 2 -> 4
+  samples, 3 -> 8 samples)
+- st,touch-det-delay: Touch detect interrupt delay (0 -> 10 us, 1 -> 50 us, 2 ->
+  100 us, 3 -> 500 us, 4-> 1 ms, 5 -> 5 ms, 6 -> 10 ms, 7 -> 50 ms) recommended
+  is 3
+- st,settling: Panel driver settling time (0 -> 10 us, 1 -> 100 us, 2 -> 500 us, 3
+  -> 1 ms, 4 -> 5 ms, 5 -> 10 ms, 6 for 50 ms, 7 -> 100 ms) recommended is 2
+- st,fraction-z: Length of the fractional part in z (fraction-z ([0..7]) = Count of
+  the fractional part) recommended is 7
+- st,i-drive: current limit value of the touchscreen drivers (0 -> 20 mA typical 35
+  mA max, 1 -> 50 mA typical 80 mA max)
+
+Node name must be stmpe_touchscreen and should be child node of stmpe node to
+which it belongs.
+
+Example:
+
+       stmpe_touchscreen {
+               compatible = "st,stmpe-ts";
+               st,sample-time = <4>;
+               st,mod-12b = <1>;
+               st,ref-sel = <0>;
+               st,adc-freq = <1>;
+               st,ave-ctrl = <1>;
+               st,touch-det-delay = <2>;
+               st,settling = <2>;
+               st,fraction-z = <7>;
+               st,i-drive = <1>;
+       };
index 3e8ead6..24d2f2d 100644 (file)
@@ -112,17 +112,6 @@ static void __init mipid_dev_init(void)
        omapfb_set_lcd_config(&nokia770_lcd_config);
 }
 
-static void __init ads7846_dev_init(void)
-{
-       if (gpio_request(ADS7846_PENDOWN_GPIO, "ADS7846 pendown") < 0)
-               printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
-}
-
-static int ads7846_get_pendown_state(void)
-{
-       return !gpio_get_value(ADS7846_PENDOWN_GPIO);
-}
-
 static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = {
        .x_max          = 0x0fff,
        .y_max          = 0x0fff,
@@ -131,7 +120,7 @@ static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata =
        .debounce_max   = 10,
        .debounce_tol   = 3,
        .debounce_rep   = 1,
-       .get_pendown_state      = ads7846_get_pendown_state,
+       .gpio_pendown   = ADS7846_PENDOWN_GPIO,
 };
 
 static struct spi_board_info nokia770_spi_board_info[] __initdata = {
@@ -241,7 +230,6 @@ static void __init omap_nokia770_init(void)
        omap_serial_init();
        omap_register_i2c_bus(1, 100, NULL, 0);
        hwa742_dev_init();
-       ads7846_dev_init();
        mipid_dev_init();
        omap1_usb_init(&nokia770_usb_config);
        nokia770_mmc_init();
index 564f57d..7e1f294 100644 (file)
@@ -77,9 +77,6 @@ static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
  * BU21013 ROHM touchscreen interface on the STUIBs
  */
 
-/* tracks number of bu21013 devices being enabled */
-static int bu21013_devices;
-
 #define TOUCH_GPIO_PIN  84
 
 #define TOUCH_XMAX     384
@@ -88,73 +85,8 @@ static int bu21013_devices;
 #define PRCMU_CLOCK_OCR                0x1CC
 #define TSC_EXT_CLOCK_9_6MHZ   0x840000
 
-/**
- * bu21013_gpio_board_init : configures the touch panel.
- * @reset_pin: reset pin number
- * This function can be used to configures
- * the voltage and reset the touch panel controller.
- */
-static int bu21013_gpio_board_init(int reset_pin)
-{
-       int retval = 0;
-
-       bu21013_devices++;
-       if (bu21013_devices == 1) {
-               retval = gpio_request(reset_pin, "touchp_reset");
-               if (retval) {
-                       printk(KERN_ERR "Unable to request gpio reset_pin");
-                       return retval;
-               }
-               retval = gpio_direction_output(reset_pin, 1);
-               if (retval < 0) {
-                       printk(KERN_ERR "%s: gpio direction failed\n",
-                                       __func__);
-                       return retval;
-               }
-       }
-
-       return retval;
-}
-
-/**
- * bu21013_gpio_board_exit : deconfigures the touch panel controller
- * @reset_pin: reset pin number
- * This function can be used to deconfigures the chip selection
- * for touch panel controller.
- */
-static int bu21013_gpio_board_exit(int reset_pin)
-{
-       int retval = 0;
-
-       if (bu21013_devices == 1) {
-               retval = gpio_direction_output(reset_pin, 0);
-               if (retval < 0) {
-                       printk(KERN_ERR "%s: gpio direction failed\n",
-                                       __func__);
-                       return retval;
-               }
-               gpio_set_value(reset_pin, 0);
-       }
-       bu21013_devices--;
-
-       return retval;
-}
-
-/**
- * bu21013_read_pin_val : get the interrupt pin value
- * This function can be used to get the interrupt pin value for touch panel
- * controller.
- */
-static int bu21013_read_pin_val(void)
-{
-       return gpio_get_value(TOUCH_GPIO_PIN);
-}
-
 static struct bu21013_platform_device tsc_plat_device = {
-       .cs_en = bu21013_gpio_board_init,
-       .cs_dis = bu21013_gpio_board_exit,
-       .irq_read_val = bu21013_read_pin_val,
-       .irq = NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN),
+       .touch_pin = TOUCH_GPIO_PIN,
        .touch_x_max = TOUCH_XMAX,
        .touch_y_max = TOUCH_YMAX,
        .ext_clk = false,
@@ -171,7 +103,6 @@ static struct i2c_board_info __initdata u8500_i2c3_devices_stuib[] = {
                I2C_BOARD_INFO("bu21013_tp", 0x5D),
                .platform_data = &tsc_plat_device,
        },
-
 };
 
 void __init mop500_stuib_init(void)
index daceafe..fa7a95c 100644 (file)
@@ -57,7 +57,7 @@ static const struct pci_device_id emu_tbl[] = {
 
 MODULE_DEVICE_TABLE(pci, emu_tbl);
 
-static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct emu *emu;
        struct gameport *port;
@@ -107,7 +107,7 @@ static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id
        return error;
 }
 
-static void __devexit emu_remove(struct pci_dev *pdev)
+static void emu_remove(struct pci_dev *pdev)
 {
        struct emu *emu = pci_get_drvdata(pdev);
 
@@ -122,7 +122,7 @@ static struct pci_driver emu_driver = {
         .name =         "Emu10k1_gameport",
         .id_table =     emu_tbl,
         .probe =        emu_probe,
-        .remove =       __devexit_p(emu_remove),
+       .remove =       emu_remove,
 };
 
 module_pci_driver(emu_driver);
index 48ad382..ae912d3 100644 (file)
@@ -78,7 +78,7 @@ static int fm801_gp_open(struct gameport *gameport, int mode)
        return 0;
 }
 
-static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id)
+static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id)
 {
        struct fm801_gp *gp;
        struct gameport *port;
@@ -129,7 +129,7 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device
        return error;
 }
 
-static void __devexit fm801_gp_remove(struct pci_dev *pci)
+static void fm801_gp_remove(struct pci_dev *pci)
 {
        struct fm801_gp *gp = pci_get_drvdata(pci);
 
@@ -150,7 +150,7 @@ static struct pci_driver fm801_gp_driver = {
        .name =         "FM801_gameport",
        .id_table =     fm801_gp_id_table,
        .probe =        fm801_gp_probe,
-       .remove =       __devexit_p(fm801_gp_remove),
+       .remove =       fm801_gp_remove,
 };
 
 module_pci_driver(fm801_gp_driver);
index 8c4b50f..47a6009 100644 (file)
@@ -194,7 +194,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
        if (!mt)
                return;
 
-       oldest = 0;
+       oldest = NULL;
        oldid = mt->trkid;
        count = 0;
 
index 53a0dde..ce01332 100644 (file)
@@ -534,8 +534,11 @@ EXPORT_SYMBOL(input_grab_device);
 static void __input_release_device(struct input_handle *handle)
 {
        struct input_dev *dev = handle->dev;
+       struct input_handle *grabber;
 
-       if (dev->grab == handle) {
+       grabber = rcu_dereference_protected(dev->grab,
+                                           lockdep_is_held(&dev->mutex));
+       if (grabber == handle) {
                rcu_assign_pointer(dev->grab, NULL);
                /* Make sure input_pass_event() notices that grab is gone */
                synchronize_rcu();
@@ -1723,7 +1726,7 @@ EXPORT_SYMBOL_GPL(input_class);
 /**
  * input_allocate_device - allocate memory for new input device
  *
- * Returns prepared struct input_dev or NULL.
+ * Returns prepared struct input_dev or %NULL.
  *
  * NOTE: Use input_free_device() to free devices that have not been
  * registered; input_unregister_device() should be used for already
@@ -1750,6 +1753,70 @@ struct input_dev *input_allocate_device(void)
 }
 EXPORT_SYMBOL(input_allocate_device);
 
+struct input_devres {
+       struct input_dev *input;
+};
+
+static int devm_input_device_match(struct device *dev, void *res, void *data)
+{
+       struct input_devres *devres = res;
+
+       return devres->input == data;
+}
+
+static void devm_input_device_release(struct device *dev, void *res)
+{
+       struct input_devres *devres = res;
+       struct input_dev *input = devres->input;
+
+       dev_dbg(dev, "%s: dropping reference to %s\n",
+               __func__, dev_name(&input->dev));
+       input_put_device(input);
+}
+
+/**
+ * devm_input_allocate_device - allocate managed input device
+ * @dev: device owning the input device being created
+ *
+ * Returns prepared struct input_dev or %NULL.
+ *
+ * Managed input devices do not need to be explicitly unregistered or
+ * freed as it will be done automatically when owner device unbinds from
+ * its driver (or binding fails). Once managed input device is allocated,
+ * it is ready to be set up and registered in the same fashion as regular
+ * input device. There are no special devm_input_device_[un]register()
+ * variants, regular ones work with both managed and unmanaged devices.
+ *
+ * NOTE: the owner device is set up as parent of input device and users
+ * should not override it.
+ */
+
+struct input_dev *devm_input_allocate_device(struct device *dev)
+{
+       struct input_dev *input;
+       struct input_devres *devres;
+
+       devres = devres_alloc(devm_input_device_release,
+                             sizeof(struct input_devres), GFP_KERNEL);
+       if (!devres)
+               return NULL;
+
+       input = input_allocate_device();
+       if (!input) {
+               devres_free(devres);
+               return NULL;
+       }
+
+       input->dev.parent = dev;
+       input->devres_managed = true;
+
+       devres->input = input;
+       devres_add(dev, devres);
+
+       return input;
+}
+EXPORT_SYMBOL(devm_input_allocate_device);
+
 /**
  * input_free_device - free memory occupied by input_dev structure
  * @dev: input device to free
@@ -1766,8 +1833,14 @@ EXPORT_SYMBOL(input_allocate_device);
  */
 void input_free_device(struct input_dev *dev)
 {
-       if (dev)
+       if (dev) {
+               if (dev->devres_managed)
+                       WARN_ON(devres_destroy(dev->dev.parent,
+                                               devm_input_device_release,
+                                               devm_input_device_match,
+                                               dev));
                input_put_device(dev);
+       }
 }
 EXPORT_SYMBOL(input_free_device);
 
@@ -1888,6 +1961,38 @@ static void input_cleanse_bitmasks(struct input_dev *dev)
        INPUT_CLEANSE_BITMASK(dev, SW, sw);
 }
 
+static void __input_unregister_device(struct input_dev *dev)
+{
+       struct input_handle *handle, *next;
+
+       input_disconnect_device(dev);
+
+       mutex_lock(&input_mutex);
+
+       list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
+               handle->handler->disconnect(handle);
+       WARN_ON(!list_empty(&dev->h_list));
+
+       del_timer_sync(&dev->timer);
+       list_del_init(&dev->node);
+
+       input_wakeup_procfs_readers();
+
+       mutex_unlock(&input_mutex);
+
+       device_del(&dev->dev);
+}
+
+static void devm_input_device_unregister(struct device *dev, void *res)
+{
+       struct input_devres *devres = res;
+       struct input_dev *input = devres->input;
+
+       dev_dbg(dev, "%s: unregistering device %s\n",
+               __func__, dev_name(&input->dev));
+       __input_unregister_device(input);
+}
+
 /**
  * input_register_device - register device with input core
  * @dev: device to be registered
@@ -1903,11 +2008,21 @@ static void input_cleanse_bitmasks(struct input_dev *dev)
 int input_register_device(struct input_dev *dev)
 {
        static atomic_t input_no = ATOMIC_INIT(0);
+       struct input_devres *devres = NULL;
        struct input_handler *handler;
        unsigned int packet_size;
        const char *path;
        int error;
 
+       if (dev->devres_managed) {
+               devres = devres_alloc(devm_input_device_unregister,
+                                     sizeof(struct input_devres), GFP_KERNEL);
+               if (!devres)
+                       return -ENOMEM;
+
+               devres->input = dev;
+       }
+
        /* Every input device generates EV_SYN/SYN_REPORT events. */
        __set_bit(EV_SYN, dev->evbit);
 
@@ -1923,8 +2038,10 @@ int input_register_device(struct input_dev *dev)
 
        dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2;
        dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL);
-       if (!dev->vals)
-               return -ENOMEM;
+       if (!dev->vals) {
+               error = -ENOMEM;
+               goto err_devres_free;
+       }
 
        /*
         * If delay and period are pre-set by the driver, then autorepeating
@@ -1949,7 +2066,7 @@ int input_register_device(struct input_dev *dev)
 
        error = device_add(&dev->dev);
        if (error)
-               return error;
+               goto err_free_vals;
 
        path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
        pr_info("%s as %s\n",
@@ -1958,10 +2075,8 @@ int input_register_device(struct input_dev *dev)
        kfree(path);
 
        error = mutex_lock_interruptible(&input_mutex);
-       if (error) {
-               device_del(&dev->dev);
-               return error;
-       }
+       if (error)
+               goto err_device_del;
 
        list_add_tail(&dev->node, &input_dev_list);
 
@@ -1972,7 +2087,21 @@ int input_register_device(struct input_dev *dev)
 
        mutex_unlock(&input_mutex);
 
+       if (dev->devres_managed) {
+               dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n",
+                       __func__, dev_name(&dev->dev));
+               devres_add(dev->dev.parent, devres);
+       }
        return 0;
+
+err_device_del:
+       device_del(&dev->dev);
+err_free_vals:
+       kfree(dev->vals);
+       dev->vals = NULL;
+err_devres_free:
+       devres_free(devres);
+       return error;
 }
 EXPORT_SYMBOL(input_register_device);
 
@@ -1985,24 +2114,20 @@ EXPORT_SYMBOL(input_register_device);
  */
 void input_unregister_device(struct input_dev *dev)
 {
-       struct input_handle *handle, *next;
-
-       input_disconnect_device(dev);
-
-       mutex_lock(&input_mutex);
-
-       list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
-               handle->handler->disconnect(handle);
-       WARN_ON(!list_empty(&dev->h_list));
-
-       del_timer_sync(&dev->timer);
-       list_del_init(&dev->node);
-
-       input_wakeup_procfs_readers();
-
-       mutex_unlock(&input_mutex);
-
-       device_unregister(&dev->dev);
+       if (dev->devres_managed) {
+               WARN_ON(devres_destroy(dev->dev.parent,
+                                       devm_input_device_unregister,
+                                       devm_input_device_match,
+                                       dev));
+               __input_unregister_device(dev);
+               /*
+                * We do not do input_put_device() here because it will be done
+                * when 2nd devres fires up.
+                */
+       } else {
+               __input_unregister_device(dev);
+               input_put_device(dev);
+       }
 }
 EXPORT_SYMBOL(input_unregister_device);
 
index c96653b..121cd63 100644 (file)
@@ -85,7 +85,10 @@ static int as5011_i2c_write(struct i2c_client *client,
 {
        uint8_t data[2] = { aregaddr, avalue };
        struct i2c_msg msg = {
-               client->addr, I2C_M_IGNORE_NAK, 2, (uint8_t *)data
+               .addr = client->addr,
+               .flags = I2C_M_IGNORE_NAK,
+               .len = 2,
+               .buf = (uint8_t *)data
        };
        int error;
 
@@ -98,8 +101,18 @@ static int as5011_i2c_read(struct i2c_client *client,
 {
        uint8_t data[2] = { aregaddr };
        struct i2c_msg msg_set[2] = {
-               { client->addr, I2C_M_REV_DIR_ADDR, 1, (uint8_t *)data },
-               { client->addr, I2C_M_RD | I2C_M_NOSTART, 1, (uint8_t *)data }
+               {
+                       .addr = client->addr,
+                       .flags = I2C_M_REV_DIR_ADDR,
+                       .len = 1,
+                       .buf = (uint8_t *)data
+               },
+               {
+                       .addr = client->addr,
+                       .flags = I2C_M_RD | I2C_M_NOSTART,
+                       .len = 1,
+                       .buf = (uint8_t *)data
+               }
        };
        int error;
 
@@ -144,7 +157,7 @@ out:
        return IRQ_HANDLED;
 }
 
-static int __devinit as5011_configure_chip(struct as5011_device *as5011,
+static int as5011_configure_chip(struct as5011_device *as5011,
                                const struct as5011_platform_data *plat_dat)
 {
        struct i2c_client *client = as5011->i2c_client;
@@ -212,8 +225,8 @@ static int __devinit as5011_configure_chip(struct as5011_device *as5011,
        return 0;
 }
 
-static int __devinit as5011_probe(struct i2c_client *client,
-                               const struct i2c_device_id *id)
+static int as5011_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        const struct as5011_platform_data *plat_data;
        struct as5011_device *as5011;
@@ -328,7 +341,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit as5011_remove(struct i2c_client *client)
+static int as5011_remove(struct i2c_client *client)
 {
        struct as5011_device *as5011 = i2c_get_clientdata(client);
 
@@ -353,7 +366,7 @@ static struct i2c_driver as5011_driver = {
                .name = "as5011",
        },
        .probe          = as5011_probe,
-       .remove         = __devexit_p(as5011_remove),
+       .remove         = as5011_remove,
        .id_table       = as5011_id,
 };
 
index 77cfde5..59c10ec 100644 (file)
@@ -78,7 +78,7 @@ static void dc_pad_close(struct input_dev *dev)
 }
 
 /* allow the controller to be used */
-static int __devinit probe_maple_controller(struct device *dev)
+static int probe_maple_controller(struct device *dev)
 {
        static const short btn_bit[32] = {
                BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1,
@@ -157,7 +157,7 @@ fail:
        return error;
 }
 
-static int __devexit remove_maple_controller(struct device *dev)
+static int remove_maple_controller(struct device *dev)
 {
        struct maple_device *mdev = to_maple_dev(dev);
        struct dc_pad *pad = maple_get_drvdata(mdev);
@@ -175,7 +175,7 @@ static struct maple_driver dc_pad_driver = {
        .drv = {
                .name   = "Dreamcast_controller",
                .probe  = probe_maple_controller,
-               .remove = __devexit_p(remove_maple_controller),
+               .remove = remove_maple_controller,
        },
 };
 
index 4dfa1ee..f8f892b 100644 (file)
@@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev)
        struct walkera_dev *w = input_get_drvdata(dev);
 
        parport_disable_irq(w->parport);
+       hrtimer_cancel(&w->timer);
 }
 
 static int walkera0701_connect(struct walkera_dev *w, int parport)
@@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
        if (parport_claim(w->pardevice))
                goto init_err1;
 
+       hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+       w->timer.function = timer_handler;
+
        w->input_dev = input_allocate_device();
        if (!w->input_dev)
                goto init_err2;
@@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
        if (err)
                goto init_err3;
 
-       hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-       w->timer.function = timer_handler;
        return 0;
 
  init_err3:
@@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
 
 static void walkera0701_disconnect(struct walkera_dev *w)
 {
-       hrtimer_cancel(&w->timer);
        input_unregister_device(w->input_dev);
        parport_release(w->pardevice);
        parport_unregister_device(w->pardevice);
index 83811e4..d6cbfe9 100644 (file)
@@ -118,11 +118,12 @@ static const struct xpad_device {
        u8 xtype;
 } xpad_device[] = {
        { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
-       { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
        { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
        { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
+       { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
+       { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
+       { 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
        { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
-       { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
        { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
        { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
        { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
@@ -136,9 +137,12 @@ 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, 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 },
        { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
+       { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
        { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
        { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
        { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
@@ -148,24 +152,28 @@ static const struct xpad_device {
        { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
        { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
        { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
-       { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
+       { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
        { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
+       { 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
        { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
+       { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
+       { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
        { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
        { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
        { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
-       { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
-       { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
+       { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
        { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
-       { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
+       { 0x1689, 0xfd00, "Razer Onza Tournament 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 },
-       { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
-       { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
-       { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
+       { 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
+       { 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
+       { 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
+       { 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
+       { 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
        { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
        { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
 };
@@ -235,7 +243,7 @@ static const signed short xpad_abs_triggers[] = {
        { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
        { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
 
-static struct usb_device_id xpad_table [] = {
+static struct usb_device_id xpad_table[] = {
        { USB_INTERFACE_INFO('X', 'B', 0) },    /* X-Box USB-IF not approved class */
        XPAD_XBOX360_VENDOR(0x045e),            /* Microsoft X-Box 360 controllers */
        XPAD_XBOX360_VENDOR(0x046d),            /* Logitech X-Box 360 style controllers */
@@ -248,10 +256,11 @@ static struct usb_device_id xpad_table [] = {
        XPAD_XBOX360_VENDOR(0x1bad),            /* Harminix Rock Band Guitar and Drums */
        XPAD_XBOX360_VENDOR(0x0f0d),            /* Hori Controllers */
        XPAD_XBOX360_VENDOR(0x1689),            /* Razer Onza */
+       XPAD_XBOX360_VENDOR(0x24c6),            /* PowerA Controllers */
        { }
 };
 
-MODULE_DEVICE_TABLE (usb, xpad_table);
+MODULE_DEVICE_TABLE(usb, xpad_table);
 
 struct usb_xpad {
        struct input_dev *dev;          /* input device interface */
@@ -783,7 +792,7 @@ static int xpad_open(struct input_dev *dev)
        struct usb_xpad *xpad = input_get_drvdata(dev);
 
        /* URB was submitted in probe */
-       if(xpad->xtype == XTYPE_XBOX360W)
+       if (xpad->xtype == XTYPE_XBOX360W)
                return 0;
 
        xpad->irq_in->dev = xpad->udev;
index febead4..5a240c6 100644 (file)
@@ -134,7 +134,7 @@ config KEYBOARD_QT1070
 
 config KEYBOARD_QT2160
        tristate "Atmel AT42QT2160 Touch Sensor Chip"
-       depends on I2C && EXPERIMENTAL
+       depends on I2C
        help
          If you say yes here you get support for Atmel AT42QT2160 Touch
          Sensor chip as a keyboard input.
index e9e8674..ef26b17 100644 (file)
@@ -69,7 +69,7 @@ static int adp5520_keys_notifier(struct notifier_block *nb,
        return 0;
 }
 
-static int __devinit adp5520_keys_probe(struct platform_device *pdev)
+static int adp5520_keys_probe(struct platform_device *pdev)
 {
        struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data;
        struct input_dev *input;
@@ -182,7 +182,7 @@ err:
        return ret;
 }
 
-static int __devexit adp5520_keys_remove(struct platform_device *pdev)
+static int adp5520_keys_remove(struct platform_device *pdev)
 {
        struct adp5520_keys *dev = platform_get_drvdata(pdev);
 
@@ -200,7 +200,7 @@ static struct platform_driver adp5520_keys_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = adp5520_keys_probe,
-       .remove         = __devexit_p(adp5520_keys_remove),
+       .remove         = adp5520_keys_remove,
 };
 module_platform_driver(adp5520_keys_driver);
 
index b083bf1..dbd2047 100644 (file)
@@ -145,7 +145,7 @@ static int adp5588_gpio_direction_output(struct gpio_chip *chip,
        return ret;
 }
 
-static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad,
+static int adp5588_build_gpiomap(struct adp5588_kpad *kpad,
                                const struct adp5588_kpad_platform_data *pdata)
 {
        bool pin_used[ADP5588_MAXGPIO];
@@ -170,7 +170,7 @@ static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad,
        return n_unused;
 }
 
-static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad)
+static int adp5588_gpio_add(struct adp5588_kpad *kpad)
 {
        struct device *dev = &kpad->client->dev;
        const struct adp5588_kpad_platform_data *pdata = dev->platform_data;
@@ -224,7 +224,7 @@ static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad)
        return 0;
 }
 
-static void __devexit adp5588_gpio_remove(struct adp5588_kpad *kpad)
+static void adp5588_gpio_remove(struct adp5588_kpad *kpad)
 {
        struct device *dev = &kpad->client->dev;
        const struct adp5588_kpad_platform_data *pdata = dev->platform_data;
@@ -319,7 +319,7 @@ static irqreturn_t adp5588_irq(int irq, void *handle)
        return IRQ_HANDLED;
 }
 
-static int __devinit adp5588_setup(struct i2c_client *client)
+static int adp5588_setup(struct i2c_client *client)
 {
        const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;
        const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data;
@@ -382,7 +382,7 @@ static int __devinit adp5588_setup(struct i2c_client *client)
        return 0;
 }
 
-static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad)
+static void adp5588_report_switch_state(struct adp5588_kpad *kpad)
 {
        int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1);
        int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2);
@@ -420,8 +420,8 @@ static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad)
 }
 
 
-static int __devinit adp5588_probe(struct i2c_client *client,
-                                       const struct i2c_device_id *id)
+static int adp5588_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct adp5588_kpad *kpad;
        const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;
@@ -587,7 +587,7 @@ static int __devinit adp5588_probe(struct i2c_client *client,
        return error;
 }
 
-static int __devexit adp5588_remove(struct i2c_client *client)
+static int adp5588_remove(struct i2c_client *client)
 {
        struct adp5588_kpad *kpad = i2c_get_clientdata(client);
 
@@ -650,7 +650,7 @@ static struct i2c_driver adp5588_driver = {
 #endif
        },
        .probe    = adp5588_probe,
-       .remove   = __devexit_p(adp5588_remove),
+       .remove   = adp5588_remove,
        .id_table = adp5588_id,
 };
 
index 74e6032..67d12b3 100644 (file)
@@ -464,7 +464,7 @@ static int adp5589_gpio_direction_output(struct gpio_chip *chip,
        return ret;
 }
 
-static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad,
+static int adp5589_build_gpiomap(struct adp5589_kpad *kpad,
                                const struct adp5589_kpad_platform_data *pdata)
 {
        bool pin_used[ADP5589_MAXGPIO];
@@ -496,7 +496,7 @@ static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad,
        return n_unused;
 }
 
-static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad)
+static int adp5589_gpio_add(struct adp5589_kpad *kpad)
 {
        struct device *dev = &kpad->client->dev;
        const struct adp5589_kpad_platform_data *pdata = dev->platform_data;
@@ -550,7 +550,7 @@ static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad)
        return 0;
 }
 
-static void __devexit adp5589_gpio_remove(struct adp5589_kpad *kpad)
+static void adp5589_gpio_remove(struct adp5589_kpad *kpad)
 {
        struct device *dev = &kpad->client->dev;
        const struct adp5589_kpad_platform_data *pdata = dev->platform_data;
@@ -641,8 +641,7 @@ static irqreturn_t adp5589_irq(int irq, void *handle)
        return IRQ_HANDLED;
 }
 
-static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad,
-                                       unsigned short key)
+static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key)
 {
        int i;
 
@@ -655,7 +654,7 @@ static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad,
        return -EINVAL;
 }
 
-static int __devinit adp5589_setup(struct adp5589_kpad *kpad)
+static int adp5589_setup(struct adp5589_kpad *kpad)
 {
        struct i2c_client *client = kpad->client;
        const struct adp5589_kpad_platform_data *pdata =
@@ -820,7 +819,7 @@ static int __devinit adp5589_setup(struct adp5589_kpad *kpad)
        return 0;
 }
 
-static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad)
+static void adp5589_report_switch_state(struct adp5589_kpad *kpad)
 {
        int gpi_stat_tmp, pin_loc;
        int i;
@@ -860,8 +859,8 @@ static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad)
        input_sync(kpad->input);
 }
 
-static int __devinit adp5589_probe(struct i2c_client *client,
-                                  const struct i2c_device_id *id)
+static int adp5589_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct adp5589_kpad *kpad;
        const struct adp5589_kpad_platform_data *pdata =
@@ -1045,7 +1044,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit adp5589_remove(struct i2c_client *client)
+static int adp5589_remove(struct i2c_client *client)
 {
        struct adp5589_kpad *kpad = i2c_get_clientdata(client);
 
@@ -1104,7 +1103,7 @@ static struct i2c_driver adp5589_driver = {
                .pm = &adp5589_dev_pm_ops,
        },
        .probe = adp5589_probe,
-       .remove = __devexit_p(adp5589_remove),
+       .remove = adp5589_remove,
        .id_table = adp5589_id,
 };
 
index 8eb9116..20b9fa9 100644 (file)
@@ -177,7 +177,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit bfin_kpad_probe(struct platform_device *pdev)
+static int bfin_kpad_probe(struct platform_device *pdev)
 {
        struct bf54x_kpad *bf54x_kpad;
        struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;
@@ -331,7 +331,7 @@ out:
        return error;
 }
 
-static int __devexit bfin_kpad_remove(struct platform_device *pdev)
+static int bfin_kpad_remove(struct platform_device *pdev)
 {
        struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;
        struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev);
@@ -390,7 +390,7 @@ static struct platform_driver bfin_kpad_device_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = bfin_kpad_probe,
-       .remove         = __devexit_p(bfin_kpad_remove),
+       .remove         = bfin_kpad_remove,
        .suspend        = bfin_kpad_suspend,
        .resume         = bfin_kpad_resume,
 };
index d5bacbb..4e4e453 100644 (file)
@@ -303,7 +303,7 @@ fail1:
        return error;
 }
 
-static int __devexit davinci_ks_remove(struct platform_device *pdev)
+static int davinci_ks_remove(struct platform_device *pdev)
 {
        struct davinci_ks *davinci_ks = platform_get_drvdata(pdev);
 
@@ -326,7 +326,7 @@ static struct platform_driver davinci_ks_driver = {
                .name = "davinci_keyscan",
                .owner = THIS_MODULE,
        },
-       .remove = __devexit_p(davinci_ks_remove),
+       .remove = davinci_ks_remove,
 };
 
 static int __init davinci_ks_init(void)
index 7363402..9857e8f 100644 (file)
@@ -232,7 +232,7 @@ static int ep93xx_keypad_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,
                         ep93xx_keypad_suspend, ep93xx_keypad_resume);
 
-static int __devinit ep93xx_keypad_probe(struct platform_device *pdev)
+static int ep93xx_keypad_probe(struct platform_device *pdev)
 {
        struct ep93xx_keypad *keypad;
        const struct matrix_keymap_data *keymap_data;
@@ -346,7 +346,7 @@ failed_free:
        return err;
 }
 
-static int __devexit ep93xx_keypad_remove(struct platform_device *pdev)
+static int ep93xx_keypad_remove(struct platform_device *pdev)
 {
        struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
        struct resource *res;
@@ -380,7 +380,7 @@ static struct platform_driver ep93xx_keypad_driver = {
                .pm     = &ep93xx_keypad_pm_ops,
        },
        .probe          = ep93xx_keypad_probe,
-       .remove         = __devexit_p(ep93xx_keypad_remove),
+       .remove         = ep93xx_keypad_remove,
 };
 module_platform_driver(ep93xx_keypad_driver);
 
index 6a68041..d327f5a 100644 (file)
@@ -423,10 +423,10 @@ out:
        return IRQ_HANDLED;
 }
 
-static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
-                                        struct input_dev *input,
-                                        struct gpio_button_data *bdata,
-                                        const struct gpio_keys_button *button)
+static int gpio_keys_setup_key(struct platform_device *pdev,
+                               struct input_dev *input,
+                               struct gpio_button_data *bdata,
+                               const struct gpio_keys_button *button)
 {
        const char *desc = button->desc ? button->desc : "gpio_keys";
        struct device *dev = &pdev->dev;
@@ -440,21 +440,13 @@ static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
 
        if (gpio_is_valid(button->gpio)) {
 
-               error = gpio_request(button->gpio, desc);
+               error = gpio_request_one(button->gpio, GPIOF_IN, desc);
                if (error < 0) {
                        dev_err(dev, "Failed to request GPIO %d, error %d\n",
                                button->gpio, error);
                        return error;
                }
 
-               error = gpio_direction_input(button->gpio);
-               if (error < 0) {
-                       dev_err(dev,
-                               "Failed to configure direction for GPIO %d, error %d\n",
-                               button->gpio, error);
-                       goto fail;
-               }
-
                if (button->debounce_interval) {
                        error = gpio_set_debounce(button->gpio,
                                        button->debounce_interval * 1000);
@@ -526,12 +518,35 @@ fail:
        return error;
 }
 
+static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata)
+{
+       struct input_dev *input = ddata->input;
+       int i;
+
+       for (i = 0; i < ddata->pdata->nbuttons; i++) {
+               struct gpio_button_data *bdata = &ddata->data[i];
+               if (gpio_is_valid(bdata->button->gpio))
+                       gpio_keys_gpio_report_event(bdata);
+       }
+       input_sync(input);
+}
+
 static int gpio_keys_open(struct input_dev *input)
 {
        struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
        const struct gpio_keys_platform_data *pdata = ddata->pdata;
+       int error;
+
+       if (pdata->enable) {
+               error = pdata->enable(input->dev.parent);
+               if (error)
+                       return error;
+       }
+
+       /* Report current state of buttons that are connected to GPIOs */
+       gpio_keys_report_state(ddata);
 
-       return pdata->enable ? pdata->enable(input->dev.parent) : 0;
+       return 0;
 }
 
 static void gpio_keys_close(struct input_dev *input)
@@ -551,7 +566,7 @@ static void gpio_keys_close(struct input_dev *input)
 /*
  * Translate OpenFirmware node properties into platform_data
  */
-static struct gpio_keys_platform_data * __devinit
+static struct gpio_keys_platform_data *
 gpio_keys_get_devtree_pdata(struct device *dev)
 {
        struct device_node *node, *pp;
@@ -658,7 +673,7 @@ static void gpio_remove_key(struct gpio_button_data *bdata)
                gpio_free(bdata->button->gpio);
 }
 
-static int __devinit gpio_keys_probe(struct platform_device *pdev)
+static int gpio_keys_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
@@ -731,14 +746,6 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
                goto fail3;
        }
 
-       /* get current state of buttons that are connected to GPIOs */
-       for (i = 0; i < pdata->nbuttons; i++) {
-               struct gpio_button_data *bdata = &ddata->data[i];
-               if (gpio_is_valid(bdata->button->gpio))
-                       gpio_keys_gpio_report_event(bdata);
-       }
-       input_sync(input);
-
        device_init_wakeup(&pdev->dev, wakeup);
 
        return 0;
@@ -760,7 +767,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit gpio_keys_remove(struct platform_device *pdev)
+static int gpio_keys_remove(struct platform_device *pdev)
 {
        struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
        struct input_dev *input = ddata->input;
@@ -788,6 +795,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
 static int gpio_keys_suspend(struct device *dev)
 {
        struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
+       struct input_dev *input = ddata->input;
        int i;
 
        if (device_may_wakeup(dev)) {
@@ -796,6 +804,11 @@ static int gpio_keys_suspend(struct device *dev)
                        if (bdata->button->wakeup)
                                enable_irq_wake(bdata->irq);
                }
+       } else {
+               mutex_lock(&input->mutex);
+               if (input->users)
+                       gpio_keys_close(input);
+               mutex_unlock(&input->mutex);
        }
 
        return 0;
@@ -804,18 +817,27 @@ static int gpio_keys_suspend(struct device *dev)
 static int gpio_keys_resume(struct device *dev)
 {
        struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
+       struct input_dev *input = ddata->input;
+       int error = 0;
        int i;
 
-       for (i = 0; i < ddata->pdata->nbuttons; i++) {
-               struct gpio_button_data *bdata = &ddata->data[i];
-               if (bdata->button->wakeup && device_may_wakeup(dev))
-                       disable_irq_wake(bdata->irq);
-
-               if (gpio_is_valid(bdata->button->gpio))
-                       gpio_keys_gpio_report_event(bdata);
+       if (device_may_wakeup(dev)) {
+               for (i = 0; i < ddata->pdata->nbuttons; i++) {
+                       struct gpio_button_data *bdata = &ddata->data[i];
+                       if (bdata->button->wakeup)
+                               disable_irq_wake(bdata->irq);
+               }
+       } else {
+               mutex_lock(&input->mutex);
+               if (input->users)
+                       error = gpio_keys_open(input);
+               mutex_unlock(&input->mutex);
        }
-       input_sync(ddata->input);
 
+       if (error)
+               return error;
+
+       gpio_keys_report_state(ddata);
        return 0;
 }
 #endif
@@ -824,7 +846,7 @@ static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume);
 
 static struct platform_driver gpio_keys_device_driver = {
        .probe          = gpio_keys_probe,
-       .remove         = __devexit_p(gpio_keys_remove),
+       .remove         = gpio_keys_remove,
        .driver         = {
                .name   = "gpio-keys",
                .owner  = THIS_MODULE,
index f2142de..f686fd9 100644 (file)
@@ -103,8 +103,7 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev)
 }
 
 #ifdef CONFIG_OF
-static struct gpio_keys_platform_data * __devinit
-gpio_keys_polled_get_devtree_pdata(struct device *dev)
+static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)
 {
        struct device_node *node, *pp;
        struct gpio_keys_platform_data *pdata;
@@ -196,7 +195,7 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev)
 }
 #endif
 
-static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
+static int gpio_keys_polled_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
@@ -246,7 +245,6 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
 
        input = poll_dev->input;
 
-       input->evbit[0] = BIT(EV_KEY);
        input->name = pdev->name;
        input->phys = DRV_NAME"/input0";
        input->dev.parent = &pdev->dev;
@@ -256,6 +254,10 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
        input->id.product = 0x0001;
        input->id.version = 0x0100;
 
+       __set_bit(EV_KEY, input->evbit);
+       if (pdata->rep)
+               __set_bit(EV_REP, input->evbit);
+
        for (i = 0; i < pdata->nbuttons; i++) {
                struct gpio_keys_button *button = &pdata->buttons[i];
                struct gpio_keys_button_data *bdata = &bdev->data[i];
@@ -268,22 +270,14 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
                        goto err_free_gpio;
                }
 
-               error = gpio_request(gpio,
-                                    button->desc ? button->desc : DRV_NAME);
+               error = gpio_request_one(gpio, GPIOF_IN,
+                                        button->desc ?: DRV_NAME);
                if (error) {
                        dev_err(dev, "unable to claim gpio %u, err=%d\n",
                                gpio, error);
                        goto err_free_gpio;
                }
 
-               error = gpio_direction_input(gpio);
-               if (error) {
-                       dev_err(dev,
-                               "unable to set direction on gpio %u, err=%d\n",
-                               gpio, error);
-                       goto err_free_gpio;
-               }
-
                bdata->can_sleep = gpio_cansleep(gpio);
                bdata->last_state = -1;
                bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
@@ -329,7 +323,7 @@ err_free_pdata:
        return error;
 }
 
-static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
+static int gpio_keys_polled_remove(struct platform_device *pdev)
 {
        struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev);
        const struct gpio_keys_platform_data *pdata = bdev->pdata;
@@ -357,7 +351,7 @@ static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
 
 static struct platform_driver gpio_keys_polled_driver = {
        .probe  = gpio_keys_polled_probe,
-       .remove = __devexit_p(gpio_keys_polled_remove),
+       .remove = gpio_keys_polled_remove,
        .driver = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index 5f72440..198dc07 100644 (file)
@@ -200,7 +200,7 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
 
 
 /* initialize HIL */
-static int __devinit hil_keyb_init(void)
+static int hil_keyb_init(void)
 {
        unsigned char c;
        unsigned int i, kbid;
@@ -286,7 +286,7 @@ err1:
        return err;
 }
 
-static void __devexit hil_keyb_exit(void)
+static void hil_keyb_exit(void)
 {
        if (HIL_IRQ)
                free_irq(HIL_IRQ, hil_dev.dev_id);
@@ -299,7 +299,7 @@ static void __devexit hil_keyb_exit(void)
 }
 
 #if defined(CONFIG_PARISC)
-static int __devinit hil_probe_chip(struct parisc_device *dev)
+static int hil_probe_chip(struct parisc_device *dev)
 {
        /* Only allow one HIL keyboard */
        if (hil_dev.dev)
@@ -320,7 +320,7 @@ static int __devinit hil_probe_chip(struct parisc_device *dev)
        return hil_keyb_init();
 }
 
-static int __devexit hil_remove_chip(struct parisc_device *dev)
+static int hil_remove_chip(struct parisc_device *dev)
 {
        hil_keyb_exit();
 
@@ -341,7 +341,7 @@ static struct parisc_driver hil_driver = {
        .name           = "hil",
        .id_table       = hil_tbl,
        .probe          = hil_probe_chip,
-       .remove         = __devexit_p(hil_remove_chip),
+       .remove         = hil_remove_chip,
 };
 
 static int __init hil_init(void)
index cdc2526..6d150e3 100644 (file)
@@ -362,7 +362,8 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)
        writew(reg_val, keypad->mmio_base + KPSR);
 
        /* Colums as open drain and disable all rows */
-       writew(0xff00, keypad->mmio_base + KPCR);
+       reg_val = (keypad->cols_en_mask & 0xff) << 8;
+       writew(reg_val, keypad->mmio_base + KPCR);
 }
 
 static void imx_keypad_close(struct input_dev *dev)
@@ -413,7 +414,7 @@ open_err:
        return -EIO;
 }
 
-static int __devinit imx_keypad_probe(struct platform_device *pdev)
+static int imx_keypad_probe(struct platform_device *pdev)
 {
        const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data;
        struct imx_keypad *keypad;
@@ -554,7 +555,7 @@ failed_rel_mem:
        return error;
 }
 
-static int __devexit imx_keypad_remove(struct platform_device *pdev)
+static int imx_keypad_remove(struct platform_device *pdev)
 {
        struct imx_keypad *keypad = platform_get_drvdata(pdev);
        struct resource *res;
@@ -632,7 +633,7 @@ static struct platform_driver imx_keypad_driver = {
                .pm     = &imx_kbd_pm_ops,
        },
        .probe          = imx_keypad_probe,
-       .remove         = __devexit_p(imx_keypad_remove),
+       .remove         = imx_keypad_remove,
 };
 module_platform_driver(imx_keypad_driver);
 
index 24f3ea0..74e75a6 100644 (file)
@@ -179,7 +179,7 @@ static void jornadakbd680_poll(struct input_polled_dev *dev)
        memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE);
 }
 
-static int __devinit jornada680kbd_probe(struct platform_device *pdev)
+static int jornada680kbd_probe(struct platform_device *pdev)
 {
        struct jornadakbd *jornadakbd;
        struct input_polled_dev *poll_dev;
@@ -240,7 +240,7 @@ static int __devinit jornada680kbd_probe(struct platform_device *pdev)
 
 }
 
-static int __devexit jornada680kbd_remove(struct platform_device *pdev)
+static int jornada680kbd_remove(struct platform_device *pdev)
 {
        struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
 
@@ -258,7 +258,7 @@ static struct platform_driver jornada680kbd_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = jornada680kbd_probe,
-       .remove = __devexit_p(jornada680kbd_remove),
+       .remove = jornada680kbd_remove,
 };
 module_platform_driver(jornada680kbd_driver);
 
index 9d639fa..5ceef63 100644 (file)
@@ -94,7 +94,7 @@ static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 };
 
-static int __devinit jornada720_kbd_probe(struct platform_device *pdev)
+static int jornada720_kbd_probe(struct platform_device *pdev)
 {
        struct jornadakbd *jornadakbd;
        struct input_dev *input_dev;
@@ -152,7 +152,7 @@ static int __devinit jornada720_kbd_probe(struct platform_device *pdev)
        return err;
 };
 
-static int __devexit jornada720_kbd_remove(struct platform_device *pdev)
+static int jornada720_kbd_remove(struct platform_device *pdev)
 {
        struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
 
@@ -173,6 +173,6 @@ static struct platform_driver jornada720_kbd_driver = {
                .owner  = THIS_MODULE,
         },
        .probe   = jornada720_kbd_probe,
-       .remove  = __devexit_p(jornada720_kbd_remove),
+       .remove  = jornada720_kbd_remove,
 };
 module_platform_driver(jornada720_kbd_driver);
index 39ac278..93c8126 100644 (file)
@@ -624,7 +624,7 @@ static ssize_t lm8323_set_disable(struct device *dev,
 }
 static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable);
 
-static int __devinit lm8323_probe(struct i2c_client *client,
+static int lm8323_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
        struct lm8323_platform_data *pdata = client->dev.platform_data;
@@ -764,7 +764,7 @@ fail1:
        return err;
 }
 
-static int __devexit lm8323_remove(struct i2c_client *client)
+static int lm8323_remove(struct i2c_client *client)
 {
        struct lm8323_chip *lm = i2c_get_clientdata(client);
        int i;
@@ -846,7 +846,7 @@ static struct i2c_driver lm8323_i2c_driver = {
                .pm     = &lm8323_pm_ops,
        },
        .probe          = lm8323_probe,
-       .remove         = __devexit_p(lm8323_remove),
+       .remove         = lm8323_remove,
        .id_table       = lm8323_id,
 };
 MODULE_DEVICE_TABLE(i2c, lm8323_id);
index 081fd9e..5a8ca35 100644 (file)
@@ -128,7 +128,7 @@ static irqreturn_t lm8333_irq_thread(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit lm8333_probe(struct i2c_client *client,
+static int lm8333_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
        const struct lm8333_platform_data *pdata = client->dev.platform_data;
@@ -202,7 +202,7 @@ static int __devinit lm8333_probe(struct i2c_client *client,
        return err;
 }
 
-static int __devexit lm8333_remove(struct i2c_client *client)
+static int lm8333_remove(struct i2c_client *client)
 {
        struct lm8333 *lm8333 = i2c_get_clientdata(client);
 
@@ -225,7 +225,7 @@ static struct i2c_driver lm8333_driver = {
                .owner          = THIS_MODULE,
        },
        .probe          = lm8333_probe,
-       .remove         = __devexit_p(lm8333_remove),
+       .remove         = lm8333_remove,
        .id_table       = lm8333_id,
 };
 module_i2c_driver(lm8333_driver);
index b1ab298..c94d610 100644 (file)
@@ -46,7 +46,7 @@ MODULE_LICENSE("GPL");
 #define KEY_CENTER             KEY_F15
 
 static const unsigned char
-locomokbd_keycode[LOCOMOKBD_NUMKEYS] __devinitconst = {
+locomokbd_keycode[LOCOMOKBD_NUMKEYS] = {
        0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0,                          /* 0 - 9 */
        0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT,                   /* 10 - 19 */
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                                           /* 20 - 29 */
@@ -236,7 +236,7 @@ static void locomokbd_close(struct input_dev *dev)
        locomo_writel(r, locomokbd->base + LOCOMO_KIC);
 }
 
-static int __devinit locomokbd_probe(struct locomo_dev *dev)
+static int locomokbd_probe(struct locomo_dev *dev)
 {
        struct locomokbd *locomokbd;
        struct input_dev *input_dev;
@@ -321,7 +321,7 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev)
        return err;
 }
 
-static int __devexit locomokbd_remove(struct locomo_dev *dev)
+static int locomokbd_remove(struct locomo_dev *dev)
 {
        struct locomokbd *locomokbd = locomo_get_drvdata(dev);
 
@@ -345,7 +345,7 @@ static struct locomo_driver keyboard_driver = {
        },
        .devid  = LOCOMO_DEVID_KEYBOARD,
        .probe  = locomokbd_probe,
-       .remove = __devexit_p(locomokbd_remove),
+       .remove = locomokbd_remove,
 };
 
 static int __init locomokbd_init(void)
index dd786c8..1b8add6 100644 (file)
@@ -139,7 +139,7 @@ static void lpc32xx_kscan_close(struct input_dev *dev)
        clk_disable_unprepare(kscandat->clk);
 }
 
-static int __devinit lpc32xx_parse_dt(struct device *dev,
+static int lpc32xx_parse_dt(struct device *dev,
                                      struct lpc32xx_kscan_drv *kscandat)
 {
        struct device_node *np = dev->of_node;
@@ -166,7 +166,7 @@ static int __devinit lpc32xx_parse_dt(struct device *dev,
        return 0;
 }
 
-static int __devinit lpc32xx_kscan_probe(struct platform_device *pdev)
+static int lpc32xx_kscan_probe(struct platform_device *pdev)
 {
        struct lpc32xx_kscan_drv *kscandat;
        struct input_dev *input;
@@ -310,7 +310,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit lpc32xx_kscan_remove(struct platform_device *pdev)
+static int lpc32xx_kscan_remove(struct platform_device *pdev)
 {
        struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev);
 
@@ -377,7 +377,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_kscan_match);
 
 static struct platform_driver lpc32xx_kscan_driver = {
        .probe          = lpc32xx_kscan_probe,
-       .remove         = __devexit_p(lpc32xx_kscan_remove),
+       .remove         = lpc32xx_kscan_remove,
        .driver         = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index 18b7237..f4ff0dd 100644 (file)
@@ -23,6 +23,9 @@
 #include <linux/gpio.h>
 #include <linux/input/matrix_keypad.h>
 #include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/of_platform.h>
 
 struct matrix_keypad {
        const struct matrix_keypad_platform_data *pdata;
@@ -37,8 +40,6 @@ struct matrix_keypad {
        bool scan_pending;
        bool stopped;
        bool gpio_all_disabled;
-
-       unsigned short keycodes[];
 };
 
 /*
@@ -118,6 +119,7 @@ static void matrix_keypad_scan(struct work_struct *work)
        struct matrix_keypad *keypad =
                container_of(work, struct matrix_keypad, work.work);
        struct input_dev *input_dev = keypad->input_dev;
+       const unsigned short *keycodes = input_dev->keycode;
        const struct matrix_keypad_platform_data *pdata = keypad->pdata;
        uint32_t new_state[MATRIX_MAX_COLS];
        int row, col, code;
@@ -153,7 +155,7 @@ static void matrix_keypad_scan(struct work_struct *work)
                        code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
                        input_event(input_dev, EV_MSC, MSC_SCAN, code);
                        input_report_key(input_dev,
-                                        keypad->keycodes[code],
+                                        keycodes[code],
                                         new_state[col] & (1 << row));
                }
        }
@@ -299,8 +301,8 @@ static int matrix_keypad_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops,
                         matrix_keypad_suspend, matrix_keypad_resume);
 
-static int __devinit matrix_keypad_init_gpio(struct platform_device *pdev,
-                                            struct matrix_keypad *keypad)
+static int matrix_keypad_init_gpio(struct platform_device *pdev,
+                                  struct matrix_keypad *keypad)
 {
        const struct matrix_keypad_platform_data *pdata = keypad->pdata;
        int i, err;
@@ -394,33 +396,95 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
                gpio_free(pdata->col_gpios[i]);
 }
 
-static int __devinit matrix_keypad_probe(struct platform_device *pdev)
+#ifdef CONFIG_OF
+static struct matrix_keypad_platform_data *
+matrix_keypad_parse_dt(struct device *dev)
+{
+       struct matrix_keypad_platform_data *pdata;
+       struct device_node *np = dev->of_node;
+       unsigned int *gpios;
+       int i;
+
+       if (!np) {
+               dev_err(dev, "device lacks DT data\n");
+               return ERR_PTR(-ENODEV);
+       }
+
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata) {
+               dev_err(dev, "could not allocate memory for platform data\n");
+               return ERR_PTR(-ENOMEM);
+       }
+
+       pdata->num_row_gpios = of_gpio_named_count(np, "row-gpios");
+       pdata->num_col_gpios = of_gpio_named_count(np, "col-gpios");
+       if (!pdata->num_row_gpios || !pdata->num_col_gpios) {
+               dev_err(dev, "number of keypad rows/columns not specified\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (of_get_property(np, "linux,no-autorepeat", NULL))
+               pdata->no_autorepeat = true;
+       if (of_get_property(np, "linux,wakeup", NULL))
+               pdata->wakeup = true;
+       if (of_get_property(np, "gpio-activelow", NULL))
+               pdata->active_low = true;
+
+       of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms);
+       of_property_read_u32(np, "col-scan-delay-us",
+                                               &pdata->col_scan_delay_us);
+
+       gpios = devm_kzalloc(dev,
+                            sizeof(unsigned int) *
+                               (pdata->num_row_gpios + pdata->num_col_gpios),
+                            GFP_KERNEL);
+       if (!gpios) {
+               dev_err(dev, "could not allocate memory for gpios\n");
+               return ERR_PTR(-ENOMEM);
+       }
+
+       for (i = 0; i < pdata->num_row_gpios; i++)
+               gpios[i] = of_get_named_gpio(np, "row-gpios", i);
+
+       for (i = 0; i < pdata->num_col_gpios; i++)
+               gpios[pdata->num_row_gpios + i] =
+                       of_get_named_gpio(np, "col-gpios", i);
+
+       pdata->row_gpios = gpios;
+       pdata->col_gpios = &gpios[pdata->num_row_gpios];
+
+       return pdata;
+}
+#else
+static inline struct matrix_keypad_platform_data *
+matrix_keypad_parse_dt(struct device *dev)
+{
+       dev_err(dev, "no platform data defined\n");
+
+       return ERR_PTR(-EINVAL);
+}
+#endif
+
+static int matrix_keypad_probe(struct platform_device *pdev)
 {
        const struct matrix_keypad_platform_data *pdata;
-       const struct matrix_keymap_data *keymap_data;
        struct matrix_keypad *keypad;
        struct input_dev *input_dev;
-       unsigned int row_shift;
-       size_t keymap_size;
        int err;
 
-       pdata = pdev->dev.platform_data;
+       pdata = dev_get_platdata(&pdev->dev);
        if (!pdata) {
-               dev_err(&pdev->dev, "no platform data defined\n");
-               return -EINVAL;
-       }
-
-       keymap_data = pdata->keymap_data;
-       if (!keymap_data) {
+               pdata = matrix_keypad_parse_dt(&pdev->dev);
+               if (IS_ERR(pdata)) {
+                       dev_err(&pdev->dev, "no platform data defined\n");
+                       return PTR_ERR(pdata);
+               }
+       } else if (!pdata->keymap_data) {
                dev_err(&pdev->dev, "no keymap data defined\n");
                return -EINVAL;
        }
 
-       row_shift = get_count_order(pdata->num_col_gpios);
-       keymap_size = (pdata->num_row_gpios << row_shift) *
-                       sizeof(keypad->keycodes[0]);
-       keypad = kzalloc(sizeof(struct matrix_keypad) + keymap_size,
-                        GFP_KERNEL);
+       keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
        input_dev = input_allocate_device();
        if (!keypad || !input_dev) {
                err = -ENOMEM;
@@ -429,7 +493,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
 
        keypad->input_dev = input_dev;
        keypad->pdata = pdata;
-       keypad->row_shift = row_shift;
+       keypad->row_shift = get_count_order(pdata->num_col_gpios);
        keypad->stopped = true;
        INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
        spin_lock_init(&keypad->lock);
@@ -440,12 +504,14 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
        input_dev->open         = matrix_keypad_start;
        input_dev->close        = matrix_keypad_stop;
 
-       err = matrix_keypad_build_keymap(keymap_data, NULL,
+       err = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
                                         pdata->num_row_gpios,
                                         pdata->num_col_gpios,
-                                        keypad->keycodes, input_dev);
-       if (err)
+                                        NULL, input_dev);
+       if (err) {
+               dev_err(&pdev->dev, "failed to build keymap\n");
                goto err_free_mem;
+       }
 
        if (!pdata->no_autorepeat)
                __set_bit(EV_REP, input_dev->evbit);
@@ -473,7 +539,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit matrix_keypad_remove(struct platform_device *pdev)
+static int matrix_keypad_remove(struct platform_device *pdev)
 {
        struct matrix_keypad *keypad = platform_get_drvdata(pdev);
 
@@ -488,13 +554,22 @@ static int __devexit matrix_keypad_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_OF
+static const struct of_device_id matrix_keypad_dt_match[] = {
+       { .compatible = "gpio-matrix-keypad" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match);
+#endif
+
 static struct platform_driver matrix_keypad_driver = {
        .probe          = matrix_keypad_probe,
-       .remove         = __devexit_p(matrix_keypad_remove),
+       .remove         = matrix_keypad_remove,
        .driver         = {
                .name   = "matrix-keypad",
                .owner  = THIS_MODULE,
                .pm     = &matrix_keypad_pm_ops,
+               .of_match_table = of_match_ptr(matrix_keypad_dt_match),
        },
 };
 module_platform_driver(matrix_keypad_driver);
index 8edada8..7c7af2b 100644 (file)
@@ -179,7 +179,7 @@ static void max7359_initialize(struct i2c_client *client)
        max7359_fall_deepsleep(client);
 }
 
-static int __devinit max7359_probe(struct i2c_client *client,
+static int max7359_probe(struct i2c_client *client,
                                        const struct i2c_device_id *id)
 {
        const struct matrix_keymap_data *keymap_data = client->dev.platform_data;
@@ -260,7 +260,7 @@ failed_free_mem:
        return error;
 }
 
-static int __devexit max7359_remove(struct i2c_client *client)
+static int max7359_remove(struct i2c_client *client)
 {
        struct max7359_keypad *keypad = i2c_get_clientdata(client);
 
@@ -312,7 +312,7 @@ static struct i2c_driver max7359_i2c_driver = {
                .pm   = &max7359_pm,
        },
        .probe          = max7359_probe,
-       .remove         = __devexit_p(max7359_remove),
+       .remove         = max7359_remove,
        .id_table       = max7359_ids,
 };
 
index 0d77f6c..7c236f9 100644 (file)
@@ -97,7 +97,7 @@ static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit mcs_touchkey_probe(struct i2c_client *client,
+static int mcs_touchkey_probe(struct i2c_client *client,
                const struct i2c_device_id *id)
 {
        const struct mcs_platform_data *pdata;
@@ -200,7 +200,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit mcs_touchkey_remove(struct i2c_client *client)
+static int mcs_touchkey_remove(struct i2c_client *client)
 {
        struct mcs_touchkey_data *data = i2c_get_clientdata(client);
 
@@ -270,7 +270,7 @@ static struct i2c_driver mcs_touchkey_driver = {
                .pm     = &mcs_touchkey_pm_ops,
        },
        .probe          = mcs_touchkey_probe,
-       .remove         = __devexit_p(mcs_touchkey_remove),
+       .remove         = mcs_touchkey_remove,
        .shutdown       = mcs_touchkey_shutdown,
        .id_table       = mcs_touchkey_id,
 };
index 7613f1c..f7f3e9a 100644 (file)
@@ -71,7 +71,7 @@ struct mpr121_init_register {
        u8 val;
 };
 
-static const struct mpr121_init_register init_reg_table[] __devinitconst = {
+static const struct mpr121_init_register init_reg_table[] = {
        { MHD_RISING_ADDR,      0x1 },
        { NHD_RISING_ADDR,      0x1 },
        { MHD_FALLING_ADDR,     0x1 },
@@ -123,7 +123,7 @@ out:
        return IRQ_HANDLED;
 }
 
-static int __devinit mpr121_phys_init(const struct mpr121_platform_data *pdata,
+static int mpr121_phys_init(const struct mpr121_platform_data *pdata,
                                      struct mpr121_touchkey *mpr121,
                                      struct i2c_client *client)
 {
@@ -185,8 +185,8 @@ err_i2c_write:
        return ret;
 }
 
-static int __devinit mpr_touchkey_probe(struct i2c_client *client,
-                                       const struct i2c_device_id *id)
+static int mpr_touchkey_probe(struct i2c_client *client,
+                             const struct i2c_device_id *id)
 {
        const struct mpr121_platform_data *pdata = client->dev.platform_data;
        struct mpr121_touchkey *mpr121;
@@ -272,7 +272,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit mpr_touchkey_remove(struct i2c_client *client)
+static int mpr_touchkey_remove(struct i2c_client *client)
 {
        struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client);
 
@@ -327,7 +327,7 @@ static struct i2c_driver mpr_touchkey_driver = {
        },
        .id_table       = mpr121_id,
        .probe          = mpr_touchkey_probe,
-       .remove         = __devexit_p(mpr_touchkey_remove),
+       .remove         = mpr_touchkey_remove,
 };
 
 module_i2c_driver(mpr_touchkey_driver);
index 49f5fa6..0e6a815 100644 (file)
@@ -67,6 +67,7 @@ struct ske_keypad {
        const struct ske_keypad_platform_data *board;
        unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS];
        struct clk *clk;
+       struct clk *pclk;
        spinlock_t ske_keypad_lock;
 };
 
@@ -271,11 +272,18 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
                goto err_free_mem_region;
        }
 
+       keypad->pclk = clk_get(&pdev->dev, "apb_pclk");
+       if (IS_ERR(keypad->pclk)) {
+               dev_err(&pdev->dev, "failed to get pclk\n");
+               error = PTR_ERR(keypad->pclk);
+               goto err_iounmap;
+       }
+
        keypad->clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(keypad->clk)) {
                dev_err(&pdev->dev, "failed to get clk\n");
                error = PTR_ERR(keypad->clk);
-               goto err_iounmap;
+               goto err_pclk;
        }
 
        input->id.bustype = BUS_HOST;
@@ -287,14 +295,25 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
                                           keypad->keymap, input);
        if (error) {
                dev_err(&pdev->dev, "Failed to build keymap\n");
-               goto err_iounmap;
+               goto err_clk;
        }
 
        input_set_capability(input, EV_MSC, MSC_SCAN);
        if (!plat->no_autorepeat)
                __set_bit(EV_REP, input->evbit);
 
-       clk_enable(keypad->clk);
+       error = clk_prepare_enable(keypad->pclk);
+       if (error) {
+               dev_err(&pdev->dev, "Failed to prepare/enable pclk\n");
+               goto err_clk;
+       }
+
+       error = clk_prepare_enable(keypad->clk);
+       if (error) {
+               dev_err(&pdev->dev, "Failed to prepare/enable clk\n");
+               goto err_pclk_disable;
+       }
+
 
        /* go through board initialization helpers */
        if (keypad->board->init)
@@ -330,8 +349,13 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
 err_free_irq:
        free_irq(keypad->irq, keypad);
 err_clk_disable:
-       clk_disable(keypad->clk);
+       clk_disable_unprepare(keypad->clk);
+err_pclk_disable:
+       clk_disable_unprepare(keypad->pclk);
+err_clk:
        clk_put(keypad->clk);
+err_pclk:
+       clk_put(keypad->pclk);
 err_iounmap:
        iounmap(keypad->reg_base);
 err_free_mem_region:
@@ -342,7 +366,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit ske_keypad_remove(struct platform_device *pdev)
+static int ske_keypad_remove(struct platform_device *pdev)
 {
        struct ske_keypad *keypad = platform_get_drvdata(pdev);
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -351,7 +375,7 @@ static int __devexit ske_keypad_remove(struct platform_device *pdev)
 
        input_unregister_device(keypad->input);
 
-       clk_disable(keypad->clk);
+       clk_disable_unprepare(keypad->clk);
        clk_put(keypad->clk);
 
        if (keypad->board->exit)
@@ -403,7 +427,7 @@ static struct platform_driver ske_keypad_driver = {
                .owner  = THIS_MODULE,
                .pm = &ske_keypad_dev_pm_ops,
        },
-       .remove = __devexit_p(ske_keypad_remove),
+       .remove = ske_keypad_remove,
 };
 
 static int __init ske_keypad_init(void)
index 4a5fcc8..d0d5226 100644 (file)
@@ -244,7 +244,7 @@ static int omap_kp_resume(struct platform_device *dev)
 #define omap_kp_resume NULL
 #endif
 
-static int __devinit omap_kp_probe(struct platform_device *pdev)
+static int omap_kp_probe(struct platform_device *pdev)
 {
        struct omap_kp *omap_kp;
        struct input_dev *input_dev;
@@ -357,7 +357,7 @@ err2:
        return -EINVAL;
 }
 
-static int __devexit omap_kp_remove(struct platform_device *pdev)
+static int omap_kp_remove(struct platform_device *pdev)
 {
        struct omap_kp *omap_kp = platform_get_drvdata(pdev);
 
@@ -379,7 +379,7 @@ static int __devexit omap_kp_remove(struct platform_device *pdev)
 
 static struct platform_driver omap_kp_driver = {
        .probe          = omap_kp_probe,
-       .remove         = __devexit_p(omap_kp_remove),
+       .remove         = omap_kp_remove,
        .suspend        = omap_kp_suspend,
        .resume         = omap_kp_resume,
        .driver         = {
index c05f98c..e25b022 100644 (file)
@@ -211,8 +211,8 @@ static void omap4_keypad_close(struct input_dev *input)
 }
 
 #ifdef CONFIG_OF
-static int __devinit omap4_keypad_parse_dt(struct device *dev,
-                                          struct omap4_keypad *keypad_data)
+static int omap4_keypad_parse_dt(struct device *dev,
+                                struct omap4_keypad *keypad_data)
 {
        struct device_node *np = dev->of_node;
 
@@ -241,7 +241,7 @@ static inline int omap4_keypad_parse_dt(struct device *dev,
 }
 #endif
 
-static int __devinit omap4_keypad_probe(struct platform_device *pdev)
+static int omap4_keypad_probe(struct platform_device *pdev)
 {
        const struct omap4_keypad_platform_data *pdata =
                                dev_get_platdata(&pdev->dev);
@@ -406,7 +406,7 @@ err_free_keypad:
        return error;
 }
 
-static int __devexit omap4_keypad_remove(struct platform_device *pdev)
+static int omap4_keypad_remove(struct platform_device *pdev)
 {
        struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);
        struct resource *res;
@@ -440,7 +440,7 @@ MODULE_DEVICE_TABLE(of, omap_keypad_dt_match);
 
 static struct platform_driver omap4_keypad_driver = {
        .probe          = omap4_keypad_probe,
-       .remove         = __devexit_p(omap4_keypad_remove),
+       .remove         = omap4_keypad_remove,
        .driver         = {
                .name   = "omap4-keypad",
                .owner  = THIS_MODULE,
index abe728c..7ac5f17 100644 (file)
@@ -37,7 +37,7 @@ static irqreturn_t opencores_kbd_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit opencores_kbd_probe(struct platform_device *pdev)
+static int opencores_kbd_probe(struct platform_device *pdev)
 {
        struct input_dev *input;
        struct opencores_kbd *opencores_kbd;
@@ -139,7 +139,7 @@ static int __devinit opencores_kbd_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit opencores_kbd_remove(struct platform_device *pdev)
+static int opencores_kbd_remove(struct platform_device *pdev)
 {
        struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev);
 
@@ -158,7 +158,7 @@ static int __devexit opencores_kbd_remove(struct platform_device *pdev)
 
 static struct platform_driver opencores_kbd_device_driver = {
        .probe    = opencores_kbd_probe,
-       .remove   = __devexit_p(opencores_kbd_remove),
+       .remove   = opencores_kbd_remove,
        .driver   = {
                .name = "opencores-kbd",
        },
index 52c3465..74339e1 100644 (file)
@@ -397,7 +397,7 @@ static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
+static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
 {
        int bits, rc, cycles;
        u8 scan_val = 0, ctrl_val = 0;
@@ -447,7 +447,7 @@ static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
 
 }
 
-static int  __devinit pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios,
+static int  pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios,
                        struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config)
 {
        int     rc, i;
@@ -518,7 +518,7 @@ static void pmic8xxx_kp_close(struct input_dev *dev)
  * - set irq edge type.
  * - enable the keypad controller.
  */
-static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev)
+static int pmic8xxx_kp_probe(struct platform_device *pdev)
 {
        const struct pm8xxx_keypad_platform_data *pdata =
                                        dev_get_platdata(&pdev->dev);
@@ -712,7 +712,7 @@ err_alloc_device:
        return rc;
 }
 
-static int __devexit pmic8xxx_kp_remove(struct platform_device *pdev)
+static int pmic8xxx_kp_remove(struct platform_device *pdev)
 {
        struct pmic8xxx_kp *kp = platform_get_drvdata(pdev);
 
@@ -773,7 +773,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops,
 
 static struct platform_driver pmic8xxx_kp_driver = {
        .probe          = pmic8xxx_kp_probe,
-       .remove         = __devexit_p(pmic8xxx_kp_remove),
+       .remove         = pmic8xxx_kp_remove,
        .driver         = {
                .name = PM8XXX_KEYPAD_DEV_NAME,
                .owner = THIS_MODULE,
index cad9d5d..5330d8f 100644 (file)
@@ -482,7 +482,7 @@ static const struct dev_pm_ops pxa27x_keypad_pm_ops = {
 };
 #endif
 
-static int __devinit pxa27x_keypad_probe(struct platform_device *pdev)
+static int pxa27x_keypad_probe(struct platform_device *pdev)
 {
        struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data;
        struct pxa27x_keypad *keypad;
@@ -595,7 +595,7 @@ failed_free:
        return error;
 }
 
-static int __devexit pxa27x_keypad_remove(struct platform_device *pdev)
+static int pxa27x_keypad_remove(struct platform_device *pdev)
 {
        struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
        struct resource *res;
@@ -620,7 +620,7 @@ MODULE_ALIAS("platform:pxa27x-keypad");
 
 static struct platform_driver pxa27x_keypad_driver = {
        .probe          = pxa27x_keypad_probe,
-       .remove         = __devexit_p(pxa27x_keypad_remove),
+       .remove         = pxa27x_keypad_remove,
        .driver         = {
                .name   = "pxa27x-keypad",
                .owner  = THIS_MODULE,
index 41488f9..bcad95b 100644 (file)
@@ -82,7 +82,7 @@ static void pxa930_rotary_close(struct input_dev *dev)
        clear_sbcr(r);
 }
 
-static int __devinit pxa930_rotary_probe(struct platform_device *pdev)
+static int pxa930_rotary_probe(struct platform_device *pdev)
 {
        struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data;
        struct pxa930_rotary *r;
@@ -174,7 +174,7 @@ failed_free:
        return err;
 }
 
-static int __devexit pxa930_rotary_remove(struct platform_device *pdev)
+static int pxa930_rotary_remove(struct platform_device *pdev)
 {
        struct pxa930_rotary *r = platform_get_drvdata(pdev);
 
@@ -193,7 +193,7 @@ static struct platform_driver pxa930_rotary_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = pxa930_rotary_probe,
-       .remove         = __devexit_p(pxa930_rotary_remove),
+       .remove         = pxa930_rotary_remove,
 };
 module_platform_driver(pxa930_rotary_driver);
 
index ca68f29..42b773b 100644 (file)
@@ -91,7 +91,7 @@ static int qt1070_write(struct i2c_client *client, u8 reg, u8 data)
        return ret;
 }
 
-static bool __devinit qt1070_identify(struct i2c_client *client)
+static bool qt1070_identify(struct i2c_client *client)
 {
        int id, ver;
 
@@ -140,7 +140,7 @@ static irqreturn_t qt1070_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit qt1070_probe(struct i2c_client *client,
+static int qt1070_probe(struct i2c_client *client,
                                const struct i2c_device_id *id)
 {
        struct qt1070_data *data;
@@ -230,7 +230,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit qt1070_remove(struct i2c_client *client)
+static int qt1070_remove(struct i2c_client *client)
 {
        struct qt1070_data *data = i2c_get_clientdata(client);
 
@@ -256,7 +256,7 @@ static struct i2c_driver qt1070_driver = {
        },
        .id_table       = qt1070_id,
        .probe          = qt1070_probe,
-       .remove         = __devexit_p(qt1070_remove),
+       .remove         = qt1070_remove,
 };
 
 module_i2c_driver(qt1070_driver);
index 76b7d43..3dc2b0f 100644 (file)
@@ -183,7 +183,7 @@ static void qt2160_worker(struct work_struct *work)
        qt2160_schedule_read(qt2160);
 }
 
-static int __devinit qt2160_read(struct i2c_client *client, u8 reg)
+static int qt2160_read(struct i2c_client *client, u8 reg)
 {
        int ret;
 
@@ -204,29 +204,20 @@ static int __devinit qt2160_read(struct i2c_client *client, u8 reg)
        return ret;
 }
 
-static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data)
+static int qt2160_write(struct i2c_client *client, u8 reg, u8 data)
 {
-       int error;
-
-       error = i2c_smbus_write_byte(client, reg);
-       if (error) {
-               dev_err(&client->dev,
-                       "couldn't send request. Returned %d\n", error);
-               return error;
-       }
+       int ret;
 
-       error = i2c_smbus_write_byte(client, data);
-       if (error) {
+       ret = i2c_smbus_write_byte_data(client, reg, data);
+       if (ret < 0)
                dev_err(&client->dev,
-                       "couldn't write data. Returned %d\n", error);
-               return error;
-       }
+                       "couldn't write data. Returned %d\n", ret);
 
-       return error;
+       return ret;
 }
 
 
-static bool __devinit qt2160_identify(struct i2c_client *client)
+static bool qt2160_identify(struct i2c_client *client)
 {
        int id, ver, rev;
 
@@ -257,7 +248,7 @@ static bool __devinit qt2160_identify(struct i2c_client *client)
        return true;
 }
 
-static int __devinit qt2160_probe(struct i2c_client *client,
+static int qt2160_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
        struct qt2160_data *qt2160;
@@ -344,7 +335,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit qt2160_remove(struct i2c_client *client)
+static int qt2160_remove(struct i2c_client *client)
 {
        struct qt2160_data *qt2160 = i2c_get_clientdata(client);
 
@@ -375,7 +366,7 @@ static struct i2c_driver qt2160_driver = {
 
        .id_table       = qt2160_idtable,
        .probe          = qt2160_probe,
-       .remove         = __devexit_p(qt2160_remove),
+       .remove         = qt2160_remove,
 };
 
 module_i2c_driver(qt2160_driver);
index 9d7a111..22e357b 100644 (file)
@@ -309,7 +309,7 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
                                struct samsung_keypad *keypad)
 {
        struct device_node *np = dev->of_node;
-       int gpio, ret, row, col;
+       int gpio, error, row, col;
 
        for (row = 0; row < keypad->rows; row++) {
                gpio = of_get_named_gpio(np, "row-gpios", row);
@@ -320,10 +320,11 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
                        continue;
                }
 
-               ret = gpio_request(gpio, "keypad-row");
-               if (ret)
-                       dev_err(dev, "keypad row[%d] gpio request failed\n",
-                                       row);
+               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++) {
@@ -335,38 +336,22 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
                        continue;
                }
 
-               ret = gpio_request(gpio, "keypad-col");
-               if (ret)
-                       dev_err(dev, "keypad column[%d] gpio request failed\n",
-                                       col);
+               error = devm_gpio_request(dev, gpio, "keypad-col");
+               if (error)
+                       dev_err(dev,
+                               "keypad column[%d] gpio request failed: %d\n",
+                               col, error);
        }
 }
-
-static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad)
-{
-       int cnt;
-
-       for (cnt = 0; cnt < keypad->rows; cnt++)
-               if (gpio_is_valid(keypad->row_gpios[cnt]))
-                       gpio_free(keypad->row_gpios[cnt]);
-
-       for (cnt = 0; cnt < keypad->cols; cnt++)
-               if (gpio_is_valid(keypad->col_gpios[cnt]))
-                       gpio_free(keypad->col_gpios[cnt]);
-}
 #else
 static
 struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev)
 {
        return NULL;
 }
-
-static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad)
-{
-}
 #endif
 
-static int __devinit samsung_keypad_probe(struct platform_device *pdev)
+static int samsung_keypad_probe(struct platform_device *pdev)
 {
        const struct samsung_keypad_platdata *pdata;
        const struct matrix_keymap_data *keymap_data;
@@ -405,36 +390,30 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
        row_shift = get_count_order(pdata->cols);
        keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]);
 
-       keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL);
-       input_dev = input_allocate_device();
-       if (!keypad || !input_dev) {
-               error = -ENOMEM;
-               goto err_free_mem;
-       }
+       keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size,
+                             GFP_KERNEL);
+       input_dev = devm_input_allocate_device(&pdev->dev);
+       if (!keypad || !input_dev)
+               return -ENOMEM;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               error = -ENODEV;
-               goto err_free_mem;
-       }
+       if (!res)
+               return -ENODEV;
 
-       keypad->base = ioremap(res->start, resource_size(res));
-       if (!keypad->base) {
-               error = -EBUSY;
-               goto err_free_mem;
-       }
+       keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+       if (!keypad->base)
+               return -EBUSY;
 
-       keypad->clk = clk_get(&pdev->dev, "keypad");
+       keypad->clk = devm_clk_get(&pdev->dev, "keypad");
        if (IS_ERR(keypad->clk)) {
                dev_err(&pdev->dev, "failed to get keypad clk\n");
-               error = PTR_ERR(keypad->clk);
-               goto err_unmap_base;
+               return PTR_ERR(keypad->clk);
        }
 
        error = clk_prepare(keypad->clk);
        if (error) {
                dev_err(&pdev->dev, "keypad clock prepare failed\n");
-               goto err_put_clk;
+               return error;
        }
 
        keypad->input_dev = input_dev;
@@ -479,14 +458,15 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
        keypad->irq = platform_get_irq(pdev, 0);
        if (keypad->irq < 0) {
                error = keypad->irq;
-               goto err_put_clk;
+               goto err_unprepare_clk;
        }
 
-       error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq,
-                       IRQF_ONESHOT, dev_name(&pdev->dev), keypad);
+       error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL,
+                                         samsung_keypad_irq, IRQF_ONESHOT,
+                                         dev_name(&pdev->dev), keypad);
        if (error) {
                dev_err(&pdev->dev, "failed to register keypad interrupt\n");
-               goto err_put_clk;
+               goto err_unprepare_clk;
        }
 
        device_init_wakeup(&pdev->dev, pdata->wakeup);
@@ -495,7 +475,7 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
 
        error = input_register_device(keypad->input_dev);
        if (error)
-               goto err_free_irq;
+               goto err_disable_runtime_pm;
 
        if (pdev->dev.of_node) {
                devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap);
@@ -504,26 +484,16 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
        }
        return 0;
 
-err_free_irq:
-       free_irq(keypad->irq, keypad);
+err_disable_runtime_pm:
        pm_runtime_disable(&pdev->dev);
        device_init_wakeup(&pdev->dev, 0);
        platform_set_drvdata(pdev, NULL);
 err_unprepare_clk:
        clk_unprepare(keypad->clk);
-err_put_clk:
-       clk_put(keypad->clk);
-       samsung_keypad_dt_gpio_free(keypad);
-err_unmap_base:
-       iounmap(keypad->base);
-err_free_mem:
-       input_free_device(input_dev);
-       kfree(keypad);
-
        return error;
 }
 
-static int __devexit samsung_keypad_remove(struct platform_device *pdev)
+static int samsung_keypad_remove(struct platform_device *pdev)
 {
        struct samsung_keypad *keypad = platform_get_drvdata(pdev);
 
@@ -533,18 +503,7 @@ static int __devexit samsung_keypad_remove(struct platform_device *pdev)
 
        input_unregister_device(keypad->input_dev);
 
-       /*
-        * It is safe to free IRQ after unregistering device because
-        * samsung_keypad_close will shut off interrupts.
-        */
-       free_irq(keypad->irq, keypad);
-
        clk_unprepare(keypad->clk);
-       clk_put(keypad->clk);
-       samsung_keypad_dt_gpio_free(keypad);
-
-       iounmap(keypad->base);
-       kfree(keypad);
 
        return 0;
 }
@@ -685,7 +644,7 @@ MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids);
 
 static struct platform_driver samsung_keypad_driver = {
        .probe          = samsung_keypad_probe,
-       .remove         = __devexit_p(samsung_keypad_remove),
+       .remove         = samsung_keypad_remove,
        .driver         = {
                .name   = "samsung-keypad",
                .owner  = THIS_MODULE,
index da54ad5..fdb9eb2 100644 (file)
@@ -162,7 +162,7 @@ static irqreturn_t sh_keysc_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit sh_keysc_probe(struct platform_device *pdev)
+static int sh_keysc_probe(struct platform_device *pdev)
 {
        struct sh_keysc_priv *priv;
        struct sh_keysc_info *pdata;
@@ -272,7 +272,7 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit sh_keysc_remove(struct platform_device *pdev)
+static int sh_keysc_remove(struct platform_device *pdev)
 {
        struct sh_keysc_priv *priv = platform_get_drvdata(pdev);
 
@@ -331,7 +331,7 @@ static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops,
 
 static struct platform_driver sh_keysc_device_driver = {
        .probe          = sh_keysc_probe,
-       .remove         = __devexit_p(sh_keysc_remove),
+       .remove         = sh_keysc_remove,
        .driver         = {
                .name   = "sh_keysc",
                .pm     = &sh_keysc_dev_pm_ops,
index c7ca97f..695d237 100644 (file)
 
 struct spear_kbd {
        struct input_dev *input;
-       struct resource *res;
        void __iomem *io_base;
        struct clk *clk;
        unsigned int irq;
        unsigned int mode;
+       unsigned int suspended_rate;
        unsigned short last_key;
        unsigned short keycodes[NUM_ROWS * NUM_COLS];
        bool rep;
-       unsigned int suspended_rate;
+       bool irq_wake_enabled;
        u32 mode_ctl_reg;
 };
 
@@ -146,7 +146,7 @@ static void spear_kbd_close(struct input_dev *dev)
 }
 
 #ifdef CONFIG_OF
-static int __devinit spear_kbd_parse_dt(struct platform_device *pdev,
+static int spear_kbd_parse_dt(struct platform_device *pdev,
                                         struct spear_kbd *kbd)
 {
        struct device_node *np = pdev->dev.of_node;
@@ -181,7 +181,7 @@ static inline int spear_kbd_parse_dt(struct platform_device *pdev,
 }
 #endif
 
-static int __devinit spear_kbd_probe(struct platform_device *pdev)
+static int spear_kbd_probe(struct platform_device *pdev)
 {
        struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev);
        const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL;
@@ -203,12 +203,16 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
                return irq;
        }
 
-       kbd = kzalloc(sizeof(*kbd), GFP_KERNEL);
-       input_dev = input_allocate_device();
-       if (!kbd || !input_dev) {
-               dev_err(&pdev->dev, "out of memory\n");
-               error = -ENOMEM;
-               goto err_free_mem;
+       kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL);
+       if (!kbd) {
+               dev_err(&pdev->dev, "not enough memory for driver data\n");
+               return -ENOMEM;
+       }
+
+       input_dev = devm_input_allocate_device(&pdev->dev);
+       if (!input_dev) {
+               dev_err(&pdev->dev, "unable to allocate input device\n");
+               return -ENOMEM;
        }
 
        kbd->input = input_dev;
@@ -217,37 +221,25 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
        if (!pdata) {
                error = spear_kbd_parse_dt(pdev, kbd);
                if (error)
-                       goto err_free_mem;
+                       return error;
        } else {
                kbd->mode = pdata->mode;
                kbd->rep = pdata->rep;
                kbd->suspended_rate = pdata->suspended_rate;
        }
 
-       kbd->res = request_mem_region(res->start, resource_size(res),
-                                     pdev->name);
-       if (!kbd->res) {
-               dev_err(&pdev->dev, "keyboard region already claimed\n");
-               error = -EBUSY;
-               goto err_free_mem;
-       }
-
-       kbd->io_base = ioremap(res->start, resource_size(res));
+       kbd->io_base = devm_request_and_ioremap(&pdev->dev, res);
        if (!kbd->io_base) {
-               dev_err(&pdev->dev, "ioremap failed for kbd_region\n");
-               error = -ENOMEM;
-               goto err_release_mem_region;
+               dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n");
+               return -ENOMEM;
        }
 
-       kbd->clk = clk_get(&pdev->dev, NULL);
-       if (IS_ERR(kbd->clk)) {
-               error = PTR_ERR(kbd->clk);
-               goto err_iounmap;
-       }
+       kbd->clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(kbd->clk))
+               return PTR_ERR(kbd->clk);
 
        input_dev->name = "Spear Keyboard";
        input_dev->phys = "keyboard/input0";
-       input_dev->dev.parent = &pdev->dev;
        input_dev->id.bustype = BUS_HOST;
        input_dev->id.vendor = 0x0001;
        input_dev->id.product = 0x0001;
@@ -259,7 +251,7 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
                                           kbd->keycodes, input_dev);
        if (error) {
                dev_err(&pdev->dev, "Failed to build keymap\n");
-               goto err_put_clk;
+               return error;
        }
 
        if (kbd->rep)
@@ -268,48 +260,36 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
 
        input_set_drvdata(input_dev, kbd);
 
-       error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd);
+       error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0,
+                       "keyboard", kbd);
        if (error) {
-               dev_err(&pdev->dev, "request_irq fail\n");
-               goto err_put_clk;
+               dev_err(&pdev->dev, "request_irq failed\n");
+               return error;
        }
 
+       error = clk_prepare(kbd->clk);
+       if (error)
+               return error;
+
        error = input_register_device(input_dev);
        if (error) {
                dev_err(&pdev->dev, "Unable to register keyboard device\n");
-               goto err_free_irq;
+               clk_unprepare(kbd->clk);
+               return error;
        }
 
        device_init_wakeup(&pdev->dev, 1);
        platform_set_drvdata(pdev, kbd);
 
        return 0;
-
-err_free_irq:
-       free_irq(kbd->irq, kbd);
-err_put_clk:
-       clk_put(kbd->clk);
-err_iounmap:
-       iounmap(kbd->io_base);
-err_release_mem_region:
-       release_mem_region(res->start, resource_size(res));
-err_free_mem:
-       input_free_device(input_dev);
-       kfree(kbd);
-
-       return error;
 }
 
-static int __devexit spear_kbd_remove(struct platform_device *pdev)
+static int spear_kbd_remove(struct platform_device *pdev)
 {
        struct spear_kbd *kbd = platform_get_drvdata(pdev);
 
-       free_irq(kbd->irq, kbd);
        input_unregister_device(kbd->input);
-       clk_put(kbd->clk);
-       iounmap(kbd->io_base);
-       release_mem_region(kbd->res->start, resource_size(kbd->res));
-       kfree(kbd);
+       clk_unprepare(kbd->clk);
 
        device_init_wakeup(&pdev->dev, 0);
        platform_set_drvdata(pdev, NULL);
@@ -333,7 +313,8 @@ static int spear_kbd_suspend(struct device *dev)
        mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG);
 
        if (device_may_wakeup(&pdev->dev)) {
-               enable_irq_wake(kbd->irq);
+               if (!enable_irq_wake(kbd->irq))
+                       kbd->irq_wake_enabled = true;
 
                /*
                 * reprogram the keyboard operating frequency as on some
@@ -379,7 +360,10 @@ static int spear_kbd_resume(struct device *dev)
        mutex_lock(&input_dev->mutex);
 
        if (device_may_wakeup(&pdev->dev)) {
-               disable_irq_wake(kbd->irq);
+               if (kbd->irq_wake_enabled) {
+                       kbd->irq_wake_enabled = false;
+                       disable_irq_wake(kbd->irq);
+               }
        } else {
                if (input_dev->users)
                        clk_enable(kbd->clk);
@@ -407,7 +391,7 @@ MODULE_DEVICE_TABLE(of, spear_kbd_id_table);
 
 static struct platform_driver spear_kbd_driver = {
        .probe          = spear_kbd_probe,
-       .remove         = __devexit_p(spear_kbd_remove),
+       .remove         = spear_kbd_remove,
        .driver         = {
                .name   = "keyboard",
                .owner  = THIS_MODULE,
index 470a877..5cbec56 100644 (file)
@@ -166,7 +166,7 @@ static irqreturn_t stmpe_keypad_irq(int irq, void *dev)
        return IRQ_HANDLED;
 }
 
-static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
+static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
 {
        const struct stmpe_keypad_variant *variant = keypad->variant;
        unsigned int col_gpios = variant->col_gpios;
@@ -207,7 +207,7 @@ static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
        return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD);
 }
 
-static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
+static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
 {
        const struct stmpe_keypad_platform_data *plat = keypad->plat;
        const struct stmpe_keypad_variant *variant = keypad->variant;
@@ -257,105 +257,131 @@ static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
                              (plat->debounce_ms << 1));
 }
 
-static int __devinit stmpe_keypad_probe(struct platform_device *pdev)
+static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad)
 {
-       struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent);
+       int row, col;
+
+       for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) {
+               for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) {
+                       int code = MATRIX_SCAN_CODE(row, col,
+                                               STMPE_KEYPAD_ROW_SHIFT);
+                       if (keypad->keymap[code] != KEY_RESERVED) {
+                               keypad->rows |= 1 << row;
+                               keypad->cols |= 1 << col;
+                       }
+               }
+       }
+}
+
+#ifdef CONFIG_OF
+static const struct stmpe_keypad_platform_data *
+stmpe_keypad_of_probe(struct device *dev)
+{
+       struct device_node *np = dev->of_node;
        struct stmpe_keypad_platform_data *plat;
+
+       if (!np)
+               return ERR_PTR(-ENODEV);
+
+       plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL);
+       if (!plat)
+               return ERR_PTR(-ENOMEM);
+
+       of_property_read_u32(np, "debounce-interval", &plat->debounce_ms);
+       of_property_read_u32(np, "st,scan-count", &plat->scan_count);
+
+       plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat");
+
+       return plat;
+}
+#else
+static inline const struct stmpe_keypad_platform_data *
+stmpe_keypad_of_probe(struct device *dev)
+{
+       return ERR_PTR(-EINVAL);
+}
+#endif
+
+static int stmpe_keypad_probe(struct platform_device *pdev)
+{
+       struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent);
+       const struct stmpe_keypad_platform_data *plat;
        struct stmpe_keypad *keypad;
        struct input_dev *input;
-       int ret;
+       int error;
        int irq;
-       int i;
 
        plat = stmpe->pdata->keypad;
-       if (!plat)
-               return -ENODEV;
+       if (!plat) {
+               plat = stmpe_keypad_of_probe(&pdev->dev);
+               if (IS_ERR(plat))
+                       return PTR_ERR(plat);
+       }
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
                return irq;
 
-       keypad = kzalloc(sizeof(struct stmpe_keypad), GFP_KERNEL);
+       keypad = devm_kzalloc(&pdev->dev, sizeof(struct stmpe_keypad),
+                             GFP_KERNEL);
        if (!keypad)
                return -ENOMEM;
 
-       input = input_allocate_device();
-       if (!input) {
-               ret = -ENOMEM;
-               goto out_freekeypad;
-       }
+       input = devm_input_allocate_device(&pdev->dev);
+       if (!input)
+               return -ENOMEM;
 
        input->name = "STMPE keypad";
        input->id.bustype = BUS_I2C;
        input->dev.parent = &pdev->dev;
 
-       ret = matrix_keypad_build_keymap(plat->keymap_data, NULL,
-                                        STMPE_KEYPAD_MAX_ROWS,
-                                        STMPE_KEYPAD_MAX_COLS,
-                                        keypad->keymap, input);
-       if (ret)
-               goto out_freeinput;
+       error = matrix_keypad_build_keymap(plat->keymap_data, NULL,
+                                          STMPE_KEYPAD_MAX_ROWS,
+                                          STMPE_KEYPAD_MAX_COLS,
+                                          keypad->keymap, input);
+       if (error)
+               return error;
 
        input_set_capability(input, EV_MSC, MSC_SCAN);
        if (!plat->no_autorepeat)
                __set_bit(EV_REP, input->evbit);
 
-       for (i = 0; i < plat->keymap_data->keymap_size; i++) {
-               unsigned int key = plat->keymap_data->keymap[i];
-
-               keypad->cols |= 1 << KEY_COL(key);
-               keypad->rows |= 1 << KEY_ROW(key);
-       }
+       stmpe_keypad_fill_used_pins(keypad);
 
        keypad->stmpe = stmpe;
        keypad->plat = plat;
        keypad->input = input;
        keypad->variant = &stmpe_keypad_variants[stmpe->partnum];
 
-       ret = stmpe_keypad_chip_init(keypad);
-       if (ret < 0)
-               goto out_freeinput;
+       error = stmpe_keypad_chip_init(keypad);
+       if (error < 0)
+               return error;
 
-       ret = input_register_device(input);
-       if (ret) {
-               dev_err(&pdev->dev,
-                       "unable to register input device: %d\n", ret);
-               goto out_freeinput;
+       error = devm_request_threaded_irq(&pdev->dev, irq,
+                                         NULL, stmpe_keypad_irq,
+                                         IRQF_ONESHOT, "stmpe-keypad", keypad);
+       if (error) {
+               dev_err(&pdev->dev, "unable to get irq: %d\n", error);
+               return error;
        }
 
-       ret = request_threaded_irq(irq, NULL, stmpe_keypad_irq, IRQF_ONESHOT,
-                                  "stmpe-keypad", keypad);
-       if (ret) {
-               dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
-               goto out_unregisterinput;
+       error = input_register_device(input);
+       if (error) {
+               dev_err(&pdev->dev,
+                       "unable to register input device: %d\n", error);
+               return error;
        }
 
        platform_set_drvdata(pdev, keypad);
 
        return 0;
-
-out_unregisterinput:
-       input_unregister_device(input);
-       input = NULL;
-out_freeinput:
-       input_free_device(input);
-out_freekeypad:
-       kfree(keypad);
-       return ret;
 }
 
-static int __devexit stmpe_keypad_remove(struct platform_device *pdev)
+static int stmpe_keypad_remove(struct platform_device *pdev)
 {
        struct stmpe_keypad *keypad = platform_get_drvdata(pdev);
-       struct stmpe *stmpe = keypad->stmpe;
-       int irq = platform_get_irq(pdev, 0);
-
-       stmpe_disable(stmpe, STMPE_BLOCK_KEYPAD);
 
-       free_irq(irq, keypad);
-       input_unregister_device(keypad->input);
-       platform_set_drvdata(pdev, NULL);
-       kfree(keypad);
+       stmpe_disable(keypad->stmpe, STMPE_BLOCK_KEYPAD);
 
        return 0;
 }
@@ -364,7 +390,7 @@ static struct platform_driver stmpe_keypad_driver = {
        .driver.name    = "stmpe-keypad",
        .driver.owner   = THIS_MODULE,
        .probe          = stmpe_keypad_probe,
-       .remove         = __devexit_p(stmpe_keypad_remove),
+       .remove         = stmpe_keypad_remove,
 };
 module_platform_driver(stmpe_keypad_driver);
 
index 7d498e6..2fb0d76 100644 (file)
@@ -299,7 +299,7 @@ static void tc3589x_keypad_close(struct input_dev *input)
        tc3589x_keypad_disable(keypad);
 }
 
-static int __devinit tc3589x_keypad_probe(struct platform_device *pdev)
+static int tc3589x_keypad_probe(struct platform_device *pdev)
 {
        struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
        struct tc_keypad *keypad;
@@ -382,7 +382,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit tc3589x_keypad_remove(struct platform_device *pdev)
+static int tc3589x_keypad_remove(struct platform_device *pdev)
 {
        struct tc_keypad *keypad = platform_get_drvdata(pdev);
        int irq = platform_get_irq(pdev, 0);
@@ -448,7 +448,7 @@ static struct platform_driver tc3589x_keypad_driver = {
                .pm     = &tc3589x_keypad_dev_pm_ops,
        },
        .probe  = tc3589x_keypad_probe,
-       .remove = __devexit_p(tc3589x_keypad_remove),
+       .remove = tc3589x_keypad_remove,
 };
 module_platform_driver(tc3589x_keypad_driver);
 
index c355cdd..bfc832c 100644 (file)
@@ -166,7 +166,7 @@ static void tca6416_keys_close(struct input_dev *dev)
                disable_irq(chip->irqnum);
 }
 
-static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip)
+static int tca6416_setup_registers(struct tca6416_keypad_chip *chip)
 {
        int error;
 
@@ -197,7 +197,7 @@ static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip)
        return 0;
 }
 
-static int __devinit tca6416_keypad_probe(struct i2c_client *client,
+static int tca6416_keypad_probe(struct i2c_client *client,
                                   const struct i2c_device_id *id)
 {
        struct tca6416_keys_platform_data *pdata;
@@ -313,7 +313,7 @@ fail1:
        return error;
 }
 
-static int __devexit tca6416_keypad_remove(struct i2c_client *client)
+static int tca6416_keypad_remove(struct i2c_client *client)
 {
        struct tca6416_keypad_chip *chip = i2c_get_clientdata(client);
 
@@ -361,7 +361,7 @@ static struct i2c_driver tca6416_keypad_driver = {
                .pm     = &tca6416_keypad_dev_pm_ops,
        },
        .probe          = tca6416_keypad_probe,
-       .remove         = __devexit_p(tca6416_keypad_remove),
+       .remove         = tca6416_keypad_remove,
        .id_table       = tca6416_id,
 };
 
index 893869b..50e9c5e 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/i2c.h>
 #include <linux/input.h>
 #include <linux/input/tca8418_keypad.h>
+#include <linux/of.h>
 
 /* TCA8418 hardware limits */
 #define TCA8418_MAX_ROWS       8
 #define KEY_EVENT_CODE         0x7f
 #define KEY_EVENT_VALUE                0x80
 
-
-static const struct i2c_device_id tca8418_id[] = {
-       { TCA8418_NAME, 8418, },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, tca8418_id);
-
 struct tca8418_keypad {
-       unsigned int rows;
-       unsigned int cols;
-       unsigned int keypad_mask; /* Mask for keypad col/rol regs */
-       unsigned int irq;
-       unsigned int row_shift;
-
        struct i2c_client *client;
        struct input_dev *input;
 
-       /* Flexible array member, must be at end of struct */
-       unsigned short keymap[];
+       unsigned int row_shift;
 };
 
 /*
@@ -172,6 +159,8 @@ static int tca8418_read_byte(struct tca8418_keypad *keypad_data,
 
 static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
 {
+       struct input_dev *input = keypad_data->input;
+       unsigned short *keymap = input->keycode;
        int error, col, row;
        u8 reg, state, code;
 
@@ -190,9 +179,8 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
                col = (col) ? col - 1 : TCA8418_MAX_COLS - 1;
 
                code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift);
-               input_event(keypad_data->input, EV_MSC, MSC_SCAN, code);
-               input_report_key(keypad_data->input,
-                               keypad_data->keymap[code], state);
+               input_event(input, EV_MSC, MSC_SCAN, code);
+               input_report_key(input, keymap[code], state);
 
                /* Read for next loop */
                error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, &reg);
@@ -202,7 +190,7 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
                dev_err(&keypad_data->client->dev,
                        "unable to read REG_KEY_EVENT_A\n");
 
-       input_sync(keypad_data->input);
+       input_sync(input);
 }
 
 /*
@@ -218,16 +206,18 @@ static irqreturn_t tca8418_irq_handler(int irq, void *dev_id)
        if (error) {
                dev_err(&keypad_data->client->dev,
                        "unable to read REG_INT_STAT\n");
-               goto exit;
+               return IRQ_NONE;
        }
 
+       if (!reg)
+               return IRQ_NONE;
+
        if (reg & INT_STAT_OVR_FLOW_INT)
                dev_warn(&keypad_data->client->dev, "overflow occurred\n");
 
        if (reg & INT_STAT_K_INT)
                tca8418_read_keypad(keypad_data);
 
-exit:
        /* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */
        reg = 0xff;
        error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg);
@@ -241,7 +231,8 @@ exit:
 /*
  * Configure the TCA8418 for keypad operation
  */
-static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
+static int tca8418_configure(struct tca8418_keypad *keypad_data,
+                            u32 rows, u32 cols)
 {
        int reg, error;
 
@@ -253,9 +244,8 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
 
 
        /* Assemble a mask for row and column registers */
-       reg  =  ~(~0 << keypad_data->rows);
-       reg += (~(~0 << keypad_data->cols)) << 8;
-       keypad_data->keypad_mask = reg;
+       reg  =  ~(~0 << rows);
+       reg += (~(~0 << cols)) << 8;
 
        /* Set registers to keypad mode */
        error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg);
@@ -270,145 +260,144 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
        return error;
 }
 
-static int __devinit tca8418_keypad_probe(struct i2c_client *client,
+static int tca8418_keypad_probe(struct i2c_client *client,
                                          const struct i2c_device_id *id)
 {
+       struct device *dev = &client->dev;
        const struct tca8418_keypad_platform_data *pdata =
-                                               client->dev.platform_data;
+                                               dev_get_platdata(dev);
        struct tca8418_keypad *keypad_data;
        struct input_dev *input;
+       const struct matrix_keymap_data *keymap_data = NULL;
+       u32 rows = 0, cols = 0;
+       bool rep = false;
+       bool irq_is_gpio = false;
+       int irq;
        int error, row_shift, max_keys;
 
        /* Copy the platform data */
-       if (!pdata) {
-               dev_dbg(&client->dev, "no platform data\n");
-               return -EINVAL;
-       }
-
-       if (!pdata->keymap_data) {
-               dev_err(&client->dev, "no keymap data defined\n");
-               return -EINVAL;
+       if (pdata) {
+               if (!pdata->keymap_data) {
+                       dev_err(dev, "no keymap data defined\n");
+                       return -EINVAL;
+               }
+               keymap_data = pdata->keymap_data;
+               rows = pdata->rows;
+               cols = pdata->cols;
+               rep  = pdata->rep;
+               irq_is_gpio = pdata->irq_is_gpio;
+       } else {
+               struct device_node *np = dev->of_node;
+               of_property_read_u32(np, "keypad,num-rows", &rows);
+               of_property_read_u32(np, "keypad,num-columns", &cols);
+               rep = of_property_read_bool(np, "keypad,autorepeat");
        }
 
-       if (!pdata->rows || pdata->rows > TCA8418_MAX_ROWS) {
-               dev_err(&client->dev, "invalid rows\n");
+       if (!rows || rows > TCA8418_MAX_ROWS) {
+               dev_err(dev, "invalid rows\n");
                return -EINVAL;
        }
 
-       if (!pdata->cols || pdata->cols > TCA8418_MAX_COLS) {
-               dev_err(&client->dev, "invalid columns\n");
+       if (!cols || cols > TCA8418_MAX_COLS) {
+               dev_err(dev, "invalid columns\n");
                return -EINVAL;
        }
 
        /* Check i2c driver capabilities */
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) {
-               dev_err(&client->dev, "%s adapter not supported\n",
+               dev_err(dev, "%s adapter not supported\n",
                        dev_driver_string(&client->adapter->dev));
                return -ENODEV;
        }
 
-       row_shift = get_count_order(pdata->cols);
-       max_keys = pdata->rows << row_shift;
+       row_shift = get_count_order(cols);
+       max_keys = rows << row_shift;
 
-       /* Allocate memory for keypad_data, keymap and input device */
-       keypad_data = kzalloc(sizeof(*keypad_data) +
-                       max_keys * sizeof(keypad_data->keymap[0]), GFP_KERNEL);
+       /* Allocate memory for keypad_data and input device */
+       keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL);
        if (!keypad_data)
                return -ENOMEM;
 
-       keypad_data->rows = pdata->rows;
-       keypad_data->cols = pdata->cols;
        keypad_data->client = client;
        keypad_data->row_shift = row_shift;
 
        /* Initialize the chip or fail if chip isn't present */
-       error = tca8418_configure(keypad_data);
+       error = tca8418_configure(keypad_data, rows, cols);
        if (error < 0)
-               goto fail1;
+               return error;
 
        /* Configure input device */
-       input = input_allocate_device();
-       if (!input) {
-               error = -ENOMEM;
-               goto fail1;
-       }
+       input = devm_input_allocate_device(dev);
+       if (!input)
+               return -ENOMEM;
+
        keypad_data->input = input;
 
        input->name = client->name;
-       input->dev.parent = &client->dev;
-
        input->id.bustype = BUS_I2C;
        input->id.vendor  = 0x0001;
        input->id.product = 0x001;
        input->id.version = 0x0001;
 
-       error = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
-                                          pdata->rows, pdata->cols,
-                                          keypad_data->keymap, input);
+       error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols,
+                                          NULL, input);
        if (error) {
-               dev_dbg(&client->dev, "Failed to build keymap\n");
-               goto fail2;
+               dev_err(dev, "Failed to build keymap\n");
+               return error;
        }
 
-       if (pdata->rep)
+       if (rep)
                __set_bit(EV_REP, input->evbit);
        input_set_capability(input, EV_MSC, MSC_SCAN);
 
        input_set_drvdata(input, keypad_data);
 
-       if (pdata->irq_is_gpio)
-               client->irq = gpio_to_irq(client->irq);
+       irq = client->irq;
+       if (irq_is_gpio)
+               irq = gpio_to_irq(irq);
 
-       error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler,
-                                    IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                    client->name, keypad_data);
+       error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler,
+                                         IRQF_TRIGGER_FALLING |
+                                               IRQF_SHARED |
+                                               IRQF_ONESHOT,
+                                         client->name, keypad_data);
        if (error) {
-               dev_dbg(&client->dev,
-                       "Unable to claim irq %d; error %d\n",
+               dev_err(dev, "Unable to claim irq %d; error %d\n",
                        client->irq, error);
-               goto fail2;
+               return error;
        }
 
        error = input_register_device(input);
        if (error) {
-               dev_dbg(&client->dev,
-                       "Unable to register input device, error: %d\n", error);
-               goto fail3;
+               dev_err(dev, "Unable to register input device, error: %d\n",
+                       error);
+               return error;
        }
 
-       i2c_set_clientdata(client, keypad_data);
        return 0;
-
-fail3:
-       free_irq(client->irq, keypad_data);
-fail2:
-       input_free_device(input);
-fail1:
-       kfree(keypad_data);
-       return error;
 }
 
-static int __devexit tca8418_keypad_remove(struct i2c_client *client)
-{
-       struct tca8418_keypad *keypad_data = i2c_get_clientdata(client);
-
-       free_irq(keypad_data->client->irq, keypad_data);
-
-       input_unregister_device(keypad_data->input);
-
-       kfree(keypad_data);
-
-       return 0;
-}
+static const struct i2c_device_id tca8418_id[] = {
+       { TCA8418_NAME, 8418, },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, tca8418_id);
 
+#ifdef CONFIG_OF
+static const struct of_device_id tca8418_dt_ids[] __devinitconst = {
+       { .compatible = "ti,tca8418", },
+       { }
+};
+MODULE_DEVICE_TABLE(of, tca8418_dt_ids);
+#endif
 
 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,
-       .remove         = __devexit_p(tca8418_keypad_remove),
        .id_table       = tca8418_id,
 };
 
index 5faaf25..c76f968 100644 (file)
@@ -87,7 +87,7 @@ struct tegra_kbc {
        struct clk *clk;
 };
 
-static const u32 tegra_kbc_default_keymap[] __devinitdata = {
+static const u32 tegra_kbc_default_keymap[] = {
        KEY(0, 2, KEY_W),
        KEY(0, 3, KEY_S),
        KEY(0, 4, KEY_A),
@@ -223,7 +223,7 @@ static const u32 tegra_kbc_default_keymap[] __devinitdata = {
 };
 
 static const
-struct matrix_keymap_data tegra_kbc_default_keymap_data __devinitdata = {
+struct matrix_keymap_data tegra_kbc_default_keymap_data = {
        .keymap         = tegra_kbc_default_keymap,
        .keymap_size    = ARRAY_SIZE(tegra_kbc_default_keymap),
 };
@@ -573,7 +573,7 @@ static void tegra_kbc_close(struct input_dev *dev)
        return tegra_kbc_stop(kbc);
 }
 
-static bool __devinit
+static bool
 tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
                        struct device *dev, unsigned int *num_rows)
 {
@@ -619,7 +619,7 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
 }
 
 #ifdef CONFIG_OF
-static struct tegra_kbc_platform_data * __devinit tegra_kbc_dt_parse_pdata(
+static struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
        struct platform_device *pdev)
 {
        struct tegra_kbc_platform_data *pdata;
@@ -670,7 +670,7 @@ static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
 }
 #endif
 
-static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
+static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
 {
        const struct tegra_kbc_platform_data *pdata = kbc->pdata;
        const struct matrix_keymap_data *keymap_data = pdata->keymap_data;
@@ -697,7 +697,7 @@ static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
        return retval;
 }
 
-static int __devinit tegra_kbc_probe(struct platform_device *pdev)
+static int tegra_kbc_probe(struct platform_device *pdev)
 {
        const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data;
        struct tegra_kbc *kbc;
@@ -838,7 +838,7 @@ err_free_pdata:
        return err;
 }
 
-static int __devexit tegra_kbc_remove(struct platform_device *pdev)
+static int tegra_kbc_remove(struct platform_device *pdev)
 {
        struct tegra_kbc *kbc = platform_get_drvdata(pdev);
        struct resource *res;
@@ -954,7 +954,7 @@ MODULE_DEVICE_TABLE(of, tegra_kbc_of_match);
 
 static struct platform_driver tegra_kbc_driver = {
        .probe          = tegra_kbc_probe,
-       .remove         = __devexit_p(tegra_kbc_remove),
+       .remove         = tegra_kbc_remove,
        .driver = {
                .name   = "tegra-kbc",
                .owner  = THIS_MODULE,
index 4c34f21..ee16350 100644 (file)
@@ -153,7 +153,7 @@ static void keypad_stop(struct input_dev *dev)
        clk_disable(kp->clk);
 }
 
-static int __devinit keypad_probe(struct platform_device *pdev)
+static int keypad_probe(struct platform_device *pdev)
 {
        const struct matrix_keypad_platform_data *pdata;
        const struct matrix_keymap_data *keymap_data;
@@ -301,7 +301,7 @@ error_res:
        return error;
 }
 
-static int __devexit keypad_remove(struct platform_device *pdev)
+static int keypad_remove(struct platform_device *pdev)
 {
        struct keypad_data *kp = platform_get_drvdata(pdev);
 
@@ -319,7 +319,7 @@ static int __devexit keypad_remove(struct platform_device *pdev)
 
 static struct platform_driver keypad_driver = {
        .probe          = keypad_probe,
-       .remove         = __devexit_p(keypad_remove),
+       .remove         = keypad_remove,
        .driver.name    = "tnetv107x-keypad",
        .driver.owner   = THIS_MODULE,
 };
index a2c6f79..04f84fd 100644 (file)
@@ -271,7 +271,7 @@ static irqreturn_t do_kp_irq(int irq, void *_kp)
        return IRQ_HANDLED;
 }
 
-static int __devinit twl4030_kp_program(struct twl4030_keypad *kp)
+static int twl4030_kp_program(struct twl4030_keypad *kp)
 {
        u8 reg;
        int i;
@@ -328,7 +328,7 @@ static int __devinit twl4030_kp_program(struct twl4030_keypad *kp)
  * Registers keypad device with input subsystem
  * and configures TWL4030 keypad registers
  */
-static int __devinit twl4030_kp_probe(struct platform_device *pdev)
+static int twl4030_kp_probe(struct platform_device *pdev)
 {
        struct twl4030_keypad_data *pdata = pdev->dev.platform_data;
        const struct matrix_keymap_data *keymap_data;
@@ -432,7 +432,7 @@ err1:
        return error;
 }
 
-static int __devexit twl4030_kp_remove(struct platform_device *pdev)
+static int twl4030_kp_remove(struct platform_device *pdev)
 {
        struct twl4030_keypad *kp = platform_get_drvdata(pdev);
 
@@ -452,7 +452,7 @@ static int __devexit twl4030_kp_remove(struct platform_device *pdev)
 
 static struct platform_driver twl4030_kp_driver = {
        .probe          = twl4030_kp_probe,
-       .remove         = __devexit_p(twl4030_kp_remove),
+       .remove         = twl4030_kp_remove,
        .driver         = {
                .name   = "twl4030_keypad",
                .owner  = THIS_MODULE,
index e0f6cd1..ee163be 100644 (file)
@@ -118,7 +118,7 @@ static void w90p910_keypad_close(struct input_dev *dev)
        clk_disable(keypad->clk);
 }
 
-static int __devinit w90p910_keypad_probe(struct platform_device *pdev)
+static int w90p910_keypad_probe(struct platform_device *pdev)
 {
        const struct w90p910_keypad_platform_data *pdata =
                                                pdev->dev.platform_data;
@@ -234,7 +234,7 @@ failed_free:
        return error;
 }
 
-static int __devexit w90p910_keypad_remove(struct platform_device *pdev)
+static int w90p910_keypad_remove(struct platform_device *pdev)
 {
        struct w90p910_keypad *keypad = platform_get_drvdata(pdev);
        struct resource *res;
@@ -257,7 +257,7 @@ static int __devexit w90p910_keypad_remove(struct platform_device *pdev)
 
 static struct platform_driver w90p910_keypad_driver = {
        .probe          = w90p910_keypad_probe,
-       .remove         = __devexit_p(w90p910_keypad_remove),
+       .remove         = w90p910_keypad_remove,
        .driver         = {
                .name   = "nuc900-kpi",
                .owner  = THIS_MODULE,
index d88d9be..3ae496e 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include <linux/device.h>
+#include <linux/gfp.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/input.h>
@@ -123,6 +124,11 @@ static int matrix_keypad_parse_of_keymap(const char *propname,
  * it will attempt load the keymap from property specified by @keymap_name
  * argument (or "linux,keymap" if @keymap_name is %NULL).
  *
+ * If @keymap is %NULL the function will automatically allocate managed
+ * block of memory to store the keymap. This memory will be associated with
+ * the parent device and automatically freed when device unbinds from the
+ * driver.
+ *
  * Callers are expected to set up input_dev->dev.parent before calling this
  * function.
  */
@@ -133,12 +139,27 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
                               struct input_dev *input_dev)
 {
        unsigned int row_shift = get_count_order(cols);
+       size_t max_keys = rows << row_shift;
        int i;
        int error;
 
+       if (WARN_ON(!input_dev->dev.parent))
+               return -EINVAL;
+
+       if (!keymap) {
+               keymap = devm_kzalloc(input_dev->dev.parent,
+                                     max_keys * sizeof(*keymap),
+                                     GFP_KERNEL);
+               if (!keymap) {
+                       dev_err(input_dev->dev.parent,
+                               "Unable to allocate memory for keymap");
+                       return -ENOMEM;
+               }
+       }
+
        input_dev->keycode = keymap;
        input_dev->keycodesize = sizeof(*keymap);
-       input_dev->keycodemax = rows << row_shift;
+       input_dev->keycodemax = max_keys;
 
        __set_bit(EV_KEY, input_dev->evbit);
 
index 7f26e7b..ee43e5b 100644 (file)
@@ -62,7 +62,7 @@ static irqreturn_t pm80x_onkey_handler(int irq, void *data)
 static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend,
                         pm80x_dev_resume);
 
-static int __devinit pm80x_onkey_probe(struct platform_device *pdev)
+static int pm80x_onkey_probe(struct platform_device *pdev)
 {
 
        struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
@@ -139,7 +139,7 @@ out:
        return err;
 }
 
-static int __devexit pm80x_onkey_remove(struct platform_device *pdev)
+static int pm80x_onkey_remove(struct platform_device *pdev)
 {
        struct pm80x_onkey_info *info = platform_get_drvdata(pdev);
 
@@ -157,7 +157,7 @@ static struct platform_driver pm80x_onkey_driver = {
                   .pm = &pm80x_onkey_pm_ops,
                   },
        .probe = pm80x_onkey_probe,
-       .remove = __devexit_p(pm80x_onkey_remove),
+       .remove = pm80x_onkey_remove,
 };
 
 module_platform_driver(pm80x_onkey_driver);
index f9ce183..abd8453 100644 (file)
@@ -56,7 +56,7 @@ static irqreturn_t pm860x_onkey_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit pm860x_onkey_probe(struct platform_device *pdev)
+static int pm860x_onkey_probe(struct platform_device *pdev)
 {
        struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
        struct pm860x_onkey_info *info;
@@ -121,7 +121,7 @@ out:
        return ret;
 }
 
-static int __devexit pm860x_onkey_remove(struct platform_device *pdev)
+static int pm860x_onkey_remove(struct platform_device *pdev)
 {
        struct pm860x_onkey_info *info = platform_get_drvdata(pdev);
 
@@ -161,7 +161,7 @@ static struct platform_driver pm860x_onkey_driver = {
                .pm     = &pm860x_onkey_pm_ops,
        },
        .probe          = pm860x_onkey_probe,
-       .remove         = __devexit_p(pm860x_onkey_remove),
+       .remove         = pm860x_onkey_remove,
 };
 module_platform_driver(pm860x_onkey_driver);
 
index 104a7c3..259ef31 100644 (file)
@@ -300,8 +300,7 @@ config INPUT_ATI_REMOTE2
          called ati_remote2.
 
 config INPUT_KEYSPAN_REMOTE
-       tristate "Keyspan DMR USB remote control (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
+       tristate "Keyspan DMR USB remote control"
        depends on USB_ARCH_HAS_HCD
        select USB
        help
@@ -350,7 +349,6 @@ config INPUT_POWERMATE
 
 config INPUT_YEALINK
        tristate "Yealink usb-p1k voip phone"
-       depends on EXPERIMENTAL
        depends on USB_ARCH_HAS_HCD
        select USB
        help
@@ -366,7 +364,6 @@ config INPUT_YEALINK
 
 config INPUT_CM109
        tristate "C-Media CM109 USB I/O Controller"
-       depends on EXPERIMENTAL
        depends on USB_ARCH_HAS_HCD
        select USB
        help
@@ -377,6 +374,16 @@ config INPUT_CM109
          To compile this driver as a module, choose M here: the module will be
          called cm109.
 
+config INPUT_RETU_PWRBUTTON
+       tristate "Retu Power button Driver"
+       depends on MFD_RETU
+       help
+         Say Y here if you want to enable power key reporting via the
+         Retu chips found in Nokia Internet Tablets (770, N800, N810).
+
+         To compile this driver as a module, choose M here. The module will
+         be called retu-pwrbutton.
+
 config INPUT_TWL4030_PWRBUTTON
        tristate "TWL4030 Power button Driver"
        depends on TWL4030_CORE
@@ -444,7 +451,7 @@ config INPUT_PCF50633_PMU
 
 config INPUT_PCF8574
        tristate "PCF8574 Keypad input device"
-       depends on I2C && EXPERIMENTAL
+       depends on I2C
        help
          Say Y here if you want to support a keypad connected via I2C
          with a PCF8574.
@@ -454,7 +461,7 @@ config INPUT_PCF8574
 
 config INPUT_PWM_BEEPER
        tristate "PWM beeper support"
-       depends on HAVE_PWM
+       depends on HAVE_PWM || PWM
        help
          Say Y here to get support for PWM based beeper devices.
 
@@ -496,6 +503,16 @@ config INPUT_DA9052_ONKEY
          To compile this driver as a module, choose M here: the
          module will be called da9052_onkey.
 
+config INPUT_DA9055_ONKEY
+       tristate "Dialog Semiconductor DA9055 ONKEY"
+       depends on MFD_DA9055
+       help
+         Support the ONKEY of DA9055 PMICs as an input device
+         reporting power button status.
+
+         To compile this driver as a module, choose M here: the module
+         will be called da9055_onkey.
+
 config INPUT_DM355EVM
        tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
        depends on MFD_DM355EVM_MSP
index 5ea769e..1f1e1b1 100644 (file)
@@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CMA3000)           += cma3000_d0x.o
 obj-$(CONFIG_INPUT_CMA3000_I2C)                += cma3000_d0x_i2c.o
 obj-$(CONFIG_INPUT_COBALT_BTNS)                += cobalt_btns.o
 obj-$(CONFIG_INPUT_DA9052_ONKEY)       += da9052_onkey.o
+obj-$(CONFIG_INPUT_DA9055_ONKEY)       += da9055_onkey.o
 obj-$(CONFIG_INPUT_DM355EVM)           += dm355evm_keys.o
 obj-$(CONFIG_INPUT_GP2A)               += gp2ap002a00f.o
 obj-$(CONFIG_INPUT_GPIO_TILT_POLLED)   += gpio_tilt_polled.o
@@ -46,6 +47,7 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY)   += pmic8xxx-pwrkey.o
 obj-$(CONFIG_INPUT_POWERMATE)          += powermate.o
 obj-$(CONFIG_INPUT_PWM_BEEPER)         += pwm-beeper.o
 obj-$(CONFIG_INPUT_RB532_BUTTON)       += rb532_button.o
+obj-$(CONFIG_INPUT_RETU_PWRBUTTON)     += retu-pwrbutton.o
 obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER)        += rotary_encoder.o
 obj-$(CONFIG_INPUT_SGI_BTNS)           += sgi_btns.o
 obj-$(CONFIG_INPUT_SPARCSPKR)          += sparcspkr.o
index 84ec691..2f090b4 100644 (file)
@@ -45,7 +45,7 @@ static irqreturn_t ab8500_ponkey_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit ab8500_ponkey_probe(struct platform_device *pdev)
+static int ab8500_ponkey_probe(struct platform_device *pdev)
 {
        struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
        struct ab8500_ponkey *ponkey;
@@ -118,7 +118,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit ab8500_ponkey_remove(struct platform_device *pdev)
+static int ab8500_ponkey_remove(struct platform_device *pdev)
 {
        struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev);
 
@@ -146,7 +146,7 @@ static struct platform_driver ab8500_ponkey_driver = {
                .of_match_table = of_match_ptr(ab8500_ponkey_match),
        },
        .probe          = ab8500_ponkey_probe,
-       .remove         = __devexit_p(ab8500_ponkey_remove),
+       .remove         = ab8500_ponkey_remove,
 };
 module_platform_driver(ab8500_ponkey_driver);
 
index c8a7901..29d2064 100644 (file)
@@ -72,7 +72,7 @@ static int ad714x_i2c_read(struct ad714x_chip *chip,
        return 0;
 }
 
-static int __devinit ad714x_i2c_probe(struct i2c_client *client,
+static int ad714x_i2c_probe(struct i2c_client *client,
                                        const struct i2c_device_id *id)
 {
        struct ad714x_chip *chip;
@@ -87,7 +87,7 @@ static int __devinit ad714x_i2c_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit ad714x_i2c_remove(struct i2c_client *client)
+static int ad714x_i2c_remove(struct i2c_client *client)
 {
        struct ad714x_chip *chip = i2c_get_clientdata(client);
 
@@ -112,7 +112,7 @@ static struct i2c_driver ad714x_i2c_driver = {
                .pm   = &ad714x_i2c_pm,
        },
        .probe    = ad714x_i2c_probe,
-       .remove   = __devexit_p(ad714x_i2c_remove),
+       .remove   = ad714x_i2c_remove,
        .id_table = ad714x_id,
 };
 
index 75f6136..bdccca4 100644 (file)
@@ -83,7 +83,7 @@ static int ad714x_spi_write(struct ad714x_chip *chip,
        return 0;
 }
 
-static int __devinit ad714x_spi_probe(struct spi_device *spi)
+static int ad714x_spi_probe(struct spi_device *spi)
 {
        struct ad714x_chip *chip;
        int err;
@@ -103,7 +103,7 @@ static int __devinit ad714x_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit ad714x_spi_remove(struct spi_device *spi)
+static int ad714x_spi_remove(struct spi_device *spi)
 {
        struct ad714x_chip *chip = spi_get_drvdata(spi);
 
@@ -120,7 +120,7 @@ static struct spi_driver ad714x_spi_driver = {
                .pm     = &ad714x_spi_pm,
        },
        .probe          = ad714x_spi_probe,
-       .remove         = __devexit_p(ad714x_spi_remove),
+       .remove         = ad714x_spi_remove,
 };
 
 module_spi_driver(ad714x_spi_driver);
index dd1d1c1..535dda4 100644 (file)
@@ -73,7 +73,7 @@ static const struct adxl34x_bus_ops adxl34x_i2c_bops = {
        .read_block     = adxl34x_i2c_read_block,
 };
 
-static int __devinit adxl34x_i2c_probe(struct i2c_client *client,
+static int adxl34x_i2c_probe(struct i2c_client *client,
                                       const struct i2c_device_id *id)
 {
        struct adxl34x *ac;
@@ -98,7 +98,7 @@ static int __devinit adxl34x_i2c_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit adxl34x_i2c_remove(struct i2c_client *client)
+static int adxl34x_i2c_remove(struct i2c_client *client)
 {
        struct adxl34x *ac = i2c_get_clientdata(client);
 
@@ -144,7 +144,7 @@ static struct i2c_driver adxl34x_driver = {
                .pm = &adxl34x_i2c_pm,
        },
        .probe    = adxl34x_i2c_probe,
-       .remove   = __devexit_p(adxl34x_i2c_remove),
+       .remove   = adxl34x_i2c_remove,
        .id_table = adxl34x_id,
 };
 
index 820a802..ad5f40d 100644 (file)
@@ -65,7 +65,7 @@ static const struct adxl34x_bus_ops adxl34x_spi_bops = {
        .read_block     = adxl34x_spi_read_block,
 };
 
-static int __devinit adxl34x_spi_probe(struct spi_device *spi)
+static int adxl34x_spi_probe(struct spi_device *spi)
 {
        struct adxl34x *ac;
 
@@ -87,7 +87,7 @@ static int __devinit adxl34x_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit adxl34x_spi_remove(struct spi_device *spi)
+static int adxl34x_spi_remove(struct spi_device *spi)
 {
        struct adxl34x *ac = dev_get_drvdata(&spi->dev);
 
@@ -126,7 +126,7 @@ static struct spi_driver adxl34x_driver = {
                .pm = &adxl34x_spi_pm,
        },
        .probe   = adxl34x_spi_probe,
-       .remove  = __devexit_p(adxl34x_spi_remove),
+       .remove  = adxl34x_spi_remove,
 };
 
 module_spi_driver(adxl34x_driver);
index 1c4146f..a6666e1 100644 (file)
@@ -90,7 +90,7 @@ static irqreturn_t bfin_rotary_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit bfin_rotary_probe(struct platform_device *pdev)
+static int bfin_rotary_probe(struct platform_device *pdev)
 {
        struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data;
        struct bfin_rot *rotary;
@@ -196,7 +196,7 @@ out1:
        return error;
 }
 
-static int __devexit bfin_rotary_remove(struct platform_device *pdev)
+static int bfin_rotary_remove(struct platform_device *pdev)
 {
        struct bfin_rot *rotary = platform_get_drvdata(pdev);
 
@@ -255,7 +255,7 @@ static const struct dev_pm_ops bfin_rotary_pm_ops = {
 
 static struct platform_driver bfin_rotary_device_driver = {
        .probe          = bfin_rotary_probe,
-       .remove         = __devexit_p(bfin_rotary_remove),
+       .remove         = bfin_rotary_remove,
        .driver         = {
                .name   = "bfin-rotary",
                .owner  = THIS_MODULE,
index e2f1e9f..08ffcab 100644 (file)
@@ -158,7 +158,7 @@ struct bma150_data {
  * are stated and verified by Bosch Sensortec where they are configured
  * to provide a generic sensitivity performance.
  */
-static struct bma150_cfg default_cfg __devinitdata = {
+static struct bma150_cfg default_cfg = {
        .any_motion_int = 1,
        .hg_int = 1,
        .lg_int = 1,
@@ -224,7 +224,7 @@ static int bma150_set_mode(struct bma150_data *bma150, u8 mode)
        return 0;
 }
 
-static int __devinit bma150_soft_reset(struct bma150_data *bma150)
+static int bma150_soft_reset(struct bma150_data *bma150)
 {
        int error;
 
@@ -237,19 +237,19 @@ static int __devinit bma150_soft_reset(struct bma150_data *bma150)
        return 0;
 }
 
-static int __devinit bma150_set_range(struct bma150_data *bma150, u8 range)
+static int bma150_set_range(struct bma150_data *bma150, u8 range)
 {
        return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS,
                                BMA150_RANGE_MSK, BMA150_RANGE_REG);
 }
 
-static int __devinit bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)
+static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)
 {
        return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS,
                                BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG);
 }
 
-static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150,
+static int bma150_set_low_g_interrupt(struct bma150_data *bma150,
                                        u8 enable, u8 hyst, u8 dur, u8 thres)
 {
        int error;
@@ -273,7 +273,7 @@ static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150,
                                BMA150_LOW_G_EN_REG);
 }
 
-static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150,
+static int bma150_set_high_g_interrupt(struct bma150_data *bma150,
                                        u8 enable, u8 hyst, u8 dur, u8 thres)
 {
        int error;
@@ -300,7 +300,7 @@ static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150,
 }
 
 
-static int __devinit bma150_set_any_motion_interrupt(struct bma150_data *bma150,
+static int bma150_set_any_motion_interrupt(struct bma150_data *bma150,
                                                u8 enable, u8 dur, u8 thres)
 {
        int error;
@@ -424,7 +424,7 @@ static void bma150_poll_close(struct input_polled_dev *ipoll_dev)
        bma150_close(bma150);
 }
 
-static int __devinit bma150_initialize(struct bma150_data *bma150,
+static int bma150_initialize(struct bma150_data *bma150,
                                       const struct bma150_cfg *cfg)
 {
        int error;
@@ -465,7 +465,7 @@ static int __devinit bma150_initialize(struct bma150_data *bma150,
        return bma150_set_mode(bma150, BMA150_MODE_SLEEP);
 }
 
-static void __devinit bma150_init_input_device(struct bma150_data *bma150,
+static void bma150_init_input_device(struct bma150_data *bma150,
                                                struct input_dev *idev)
 {
        idev->name = BMA150_DRIVER;
@@ -479,7 +479,7 @@ static void __devinit bma150_init_input_device(struct bma150_data *bma150,
        input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);
 }
 
-static int __devinit bma150_register_input_device(struct bma150_data *bma150)
+static int bma150_register_input_device(struct bma150_data *bma150)
 {
        struct input_dev *idev;
        int error;
@@ -504,7 +504,7 @@ static int __devinit bma150_register_input_device(struct bma150_data *bma150)
        return 0;
 }
 
-static int __devinit bma150_register_polled_device(struct bma150_data *bma150)
+static int bma150_register_polled_device(struct bma150_data *bma150)
 {
        struct input_polled_dev *ipoll_dev;
        int error;
@@ -535,7 +535,7 @@ static int __devinit bma150_register_polled_device(struct bma150_data *bma150)
        return 0;
 }
 
-static int __devinit bma150_probe(struct i2c_client *client,
+static int bma150_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
        const struct bma150_platform_data *pdata = client->dev.platform_data;
@@ -613,7 +613,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit bma150_remove(struct i2c_client *client)
+static int bma150_remove(struct i2c_client *client)
 {
        struct bma150_data *bma150 = i2c_get_clientdata(client);
 
@@ -670,7 +670,7 @@ static struct i2c_driver bma150_driver = {
        .class          = I2C_CLASS_HWMON,
        .id_table       = bma150_id,
        .probe          = bma150_probe,
-       .remove         = __devexit_p(bma150_remove),
+       .remove         = bma150_remove,
 };
 
 module_i2c_driver(bma150_driver);
index fe9b85f..4fdef98 100644 (file)
@@ -55,7 +55,7 @@ static const struct cma3000_bus_ops cma3000_i2c_bops = {
        .write          = cma3000_i2c_set,
 };
 
-static int __devinit cma3000_i2c_probe(struct i2c_client *client,
+static int cma3000_i2c_probe(struct i2c_client *client,
                                        const struct i2c_device_id *id)
 {
        struct cma3000_accl_data *data;
@@ -69,7 +69,7 @@ static int __devinit cma3000_i2c_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit cma3000_i2c_remove(struct i2c_client *client)
+static int cma3000_i2c_remove(struct i2c_client *client)
 {
        struct cma3000_accl_data *data = i2c_get_clientdata(client);
 
@@ -114,7 +114,7 @@ MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id);
 
 static struct i2c_driver cma3000_i2c_driver = {
        .probe          = cma3000_i2c_probe,
-       .remove         = __devexit_p(cma3000_i2c_remove),
+       .remove         = cma3000_i2c_remove,
        .id_table       = cma3000_i2c_id,
        .driver = {
                .name   = "cma3000_i2c_accl",
index 53e43d2..4f77f87 100644 (file)
@@ -73,7 +73,7 @@ static void handle_buttons(struct input_polled_dev *dev)
        }
 }
 
-static int __devinit cobalt_buttons_probe(struct platform_device *pdev)
+static int cobalt_buttons_probe(struct platform_device *pdev)
 {
        struct buttons_dev *bdev;
        struct input_polled_dev *poll_dev;
@@ -135,7 +135,7 @@ static int __devinit cobalt_buttons_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit cobalt_buttons_remove(struct platform_device *pdev)
+static int cobalt_buttons_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct buttons_dev *bdev = dev_get_drvdata(dev);
@@ -157,7 +157,7 @@ MODULE_ALIAS("platform:Cobalt buttons");
 
 static struct platform_driver cobalt_buttons_driver = {
        .probe  = cobalt_buttons_probe,
-       .remove = __devexit_p(cobalt_buttons_remove),
+       .remove = cobalt_buttons_remove,
        .driver = {
                .name   = "Cobalt buttons",
                .owner  = THIS_MODULE,
index 3be3acc..020569a 100644 (file)
@@ -70,7 +70,7 @@ static irqreturn_t da9052_onkey_irq(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit da9052_onkey_probe(struct platform_device *pdev)
+static int da9052_onkey_probe(struct platform_device *pdev)
 {
        struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent);
        struct da9052_onkey *onkey;
@@ -129,7 +129,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit da9052_onkey_remove(struct platform_device *pdev)
+static int da9052_onkey_remove(struct platform_device *pdev)
 {
        struct da9052_onkey *onkey = platform_get_drvdata(pdev);
 
@@ -144,7 +144,7 @@ static int __devexit da9052_onkey_remove(struct platform_device *pdev)
 
 static struct platform_driver da9052_onkey_driver = {
        .probe  = da9052_onkey_probe,
-       .remove = __devexit_p(da9052_onkey_remove),
+       .remove = da9052_onkey_remove,
        .driver = {
                .name   = "da9052-onkey",
                .owner  = THIS_MODULE,
diff --git a/drivers/input/misc/da9055_onkey.c b/drivers/input/misc/da9055_onkey.c
new file mode 100644 (file)
index 0000000..ee6ae3a
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * ON pin driver for Dialog DA9055 PMICs
+ *
+ * Copyright(c) 2012 Dialog Semiconductor Ltd.
+ *
+ * Author: David Dajun Chen <dchen@diasemi.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <linux/mfd/da9055/core.h>
+#include <linux/mfd/da9055/reg.h>
+
+struct da9055_onkey {
+       struct da9055 *da9055;
+       struct input_dev *input;
+       struct delayed_work work;
+};
+
+static void da9055_onkey_query(struct da9055_onkey *onkey)
+{
+       int key_stat;
+
+       key_stat = da9055_reg_read(onkey->da9055, DA9055_REG_STATUS_A);
+       if (key_stat < 0) {
+               dev_err(onkey->da9055->dev,
+                       "Failed to read onkey event %d\n", key_stat);
+       } else {
+               key_stat &= DA9055_NOKEY_STS;
+               /*
+                * Onkey status bit is cleared when onkey button is relased.
+                */
+               if (!key_stat) {
+                       input_report_key(onkey->input, KEY_POWER, 0);
+                       input_sync(onkey->input);
+               }
+       }
+
+       /*
+        * Interrupt is generated only when the ONKEY pin is asserted.
+        * Hence the deassertion of the pin is simulated through work queue.
+        */
+       if (key_stat)
+               schedule_delayed_work(&onkey->work, msecs_to_jiffies(10));
+
+}
+
+static void da9055_onkey_work(struct work_struct *work)
+{
+       struct da9055_onkey *onkey = container_of(work, struct da9055_onkey,
+                                                 work.work);
+
+       da9055_onkey_query(onkey);
+}
+
+static irqreturn_t da9055_onkey_irq(int irq, void *data)
+{
+       struct da9055_onkey *onkey = data;
+
+       input_report_key(onkey->input, KEY_POWER, 1);
+       input_sync(onkey->input);
+
+       da9055_onkey_query(onkey);
+
+       return IRQ_HANDLED;
+}
+
+static int da9055_onkey_probe(struct platform_device *pdev)
+{
+       struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent);
+       struct da9055_onkey *onkey;
+       struct input_dev *input_dev;
+       int irq, err;
+
+       irq = platform_get_irq_byname(pdev, "ONKEY");
+       if (irq < 0) {
+               dev_err(&pdev->dev,
+                       "Failed to get an IRQ for input device, %d\n", irq);
+               return -EINVAL;
+       }
+
+       onkey = devm_kzalloc(&pdev->dev, sizeof(*onkey), GFP_KERNEL);
+       if (!onkey) {
+               dev_err(&pdev->dev, "Failed to allocate memory\n");
+               return -ENOMEM;
+       }
+
+       input_dev = input_allocate_device();
+       if (!input_dev) {
+               dev_err(&pdev->dev, "Failed to allocate memory\n");
+               return -ENOMEM;
+       }
+
+       onkey->input = input_dev;
+       onkey->da9055 = da9055;
+       input_dev->name = "da9055-onkey";
+       input_dev->phys = "da9055-onkey/input0";
+       input_dev->dev.parent = &pdev->dev;
+
+       input_dev->evbit[0] = BIT_MASK(EV_KEY);
+       __set_bit(KEY_POWER, input_dev->keybit);
+
+       INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work);
+
+       irq = regmap_irq_get_virq(da9055->irq_data, irq);
+       err = request_threaded_irq(irq, NULL, da9055_onkey_irq,
+                                  IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+                                  "ONKEY", onkey);
+       if (err < 0) {
+               dev_err(&pdev->dev,
+                       "Failed to register ONKEY IRQ %d, error = %d\n",
+                       irq, err);
+               goto err_free_input;
+       }
+
+       err = input_register_device(input_dev);
+       if (err) {
+               dev_err(&pdev->dev, "Unable to register input device, %d\n",
+                       err);
+               goto err_free_irq;
+       }
+
+       platform_set_drvdata(pdev, onkey);
+
+       return 0;
+
+err_free_irq:
+       free_irq(irq, onkey);
+       cancel_delayed_work_sync(&onkey->work);
+err_free_input:
+       input_free_device(input_dev);
+
+       return err;
+}
+
+static int da9055_onkey_remove(struct platform_device *pdev)
+{
+       struct da9055_onkey *onkey = platform_get_drvdata(pdev);
+       int irq = platform_get_irq_byname(pdev, "ONKEY");
+
+       irq = regmap_irq_get_virq(onkey->da9055->irq_data, irq);
+       free_irq(irq, onkey);
+       cancel_delayed_work_sync(&onkey->work);
+       input_unregister_device(onkey->input);
+
+       return 0;
+}
+
+static struct platform_driver da9055_onkey_driver = {
+       .probe  = da9055_onkey_probe,
+       .remove = da9055_onkey_remove,
+       .driver = {
+               .name   = "da9055-onkey",
+               .owner  = THIS_MODULE,
+       },
+};
+
+module_platform_driver(da9055_onkey_driver);
+
+MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
+MODULE_DESCRIPTION("Onkey driver for DA9055");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:da9055-onkey");
index c1313d8..a309a5c 100644 (file)
@@ -173,7 +173,7 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys)
 
 /*----------------------------------------------------------------------*/
 
-static int __devinit dm355evm_keys_probe(struct platform_device *pdev)
+static int dm355evm_keys_probe(struct platform_device *pdev)
 {
        struct dm355evm_keys    *keys;
        struct input_dev        *input;
@@ -239,7 +239,7 @@ fail1:
        return status;
 }
 
-static int __devexit dm355evm_keys_remove(struct platform_device *pdev)
+static int dm355evm_keys_remove(struct platform_device *pdev)
 {
        struct dm355evm_keys    *keys = platform_get_drvdata(pdev);
 
@@ -262,7 +262,7 @@ static int __devexit dm355evm_keys_remove(struct platform_device *pdev)
  */
 static struct platform_driver dm355evm_keys_driver = {
        .probe          = dm355evm_keys_probe,
-       .remove         = __devexit_p(dm355evm_keys_remove),
+       .remove         = dm355evm_keys_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "dm355evm_keys",
index b6664cf..fe30bd0 100644 (file)
@@ -98,7 +98,7 @@ static void gp2a_device_close(struct input_dev *dev)
                        "unable to deactivate, err %d\n", error);
 }
 
-static int __devinit gp2a_initialize(struct gp2a_data *dt)
+static int gp2a_initialize(struct gp2a_data *dt)
 {
        int error;
 
@@ -122,7 +122,7 @@ static int __devinit gp2a_initialize(struct gp2a_data *dt)
        return error;
 }
 
-static int __devinit gp2a_probe(struct i2c_client *client,
+static int gp2a_probe(struct i2c_client *client,
                                const struct i2c_device_id *id)
 {
        const struct gp2a_platform_data *pdata = client->dev.platform_data;
@@ -205,7 +205,7 @@ err_hw_shutdown:
        return error;
 }
 
-static int __devexit gp2a_remove(struct i2c_client *client)
+static int gp2a_remove(struct i2c_client *client)
 {
        struct gp2a_data *dt = i2c_get_clientdata(client);
        const struct gp2a_platform_data *pdata = dt->pdata;
@@ -277,7 +277,7 @@ static struct i2c_driver gp2a_i2c_driver = {
                .pm     = &gp2a_pm,
        },
        .probe          = gp2a_probe,
-       .remove         = __devexit_p(gp2a_remove),
+       .remove         = gp2a_remove,
        .id_table       = gp2a_i2c_id,
 };
 
index 277a057..da05cca 100644 (file)
@@ -96,7 +96,7 @@ static void gpio_tilt_polled_close(struct input_polled_dev *dev)
                pdata->disable(tdev->dev);
 }
 
-static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev)
+static int gpio_tilt_polled_probe(struct platform_device *pdev)
 {
        const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data;
        struct device *dev = &pdev->dev;
@@ -179,7 +179,7 @@ err_free_tdev:
        return error;
 }
 
-static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
+static int gpio_tilt_polled_remove(struct platform_device *pdev)
 {
        struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev);
        const struct gpio_tilt_platform_data *pdata = tdev->pdata;
@@ -198,7 +198,7 @@ static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
 
 static struct platform_driver gpio_tilt_polled_driver = {
        .probe  = gpio_tilt_polled_probe,
-       .remove = __devexit_p(gpio_tilt_polled_remove),
+       .remove = gpio_tilt_polled_remove,
        .driver = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index 50e2830..6ab3dec 100644 (file)
@@ -87,7 +87,7 @@ static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit ixp4xx_spkr_probe(struct platform_device *dev)
+static int ixp4xx_spkr_probe(struct platform_device *dev)
 {
        struct input_dev *input_dev;
        int err;
@@ -132,7 +132,7 @@ static int __devinit ixp4xx_spkr_probe(struct platform_device *dev)
        return err;
 }
 
-static int __devexit ixp4xx_spkr_remove(struct platform_device *dev)
+static int ixp4xx_spkr_remove(struct platform_device *dev)
 {
        struct input_dev *input_dev = platform_get_drvdata(dev);
        unsigned int pin = (unsigned int) input_get_drvdata(input_dev);
@@ -165,7 +165,7 @@ static struct platform_driver ixp4xx_spkr_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ixp4xx_spkr_probe,
-       .remove         = __devexit_p(ixp4xx_spkr_remove),
+       .remove         = ixp4xx_spkr_remove,
        .shutdown       = ixp4xx_spkr_shutdown,
 };
 module_platform_driver(ixp4xx_spkr_platform_driver);
index f46139f..a993b67 100644 (file)
@@ -295,7 +295,7 @@ static void kxtj9_input_close(struct input_dev *dev)
        kxtj9_disable(tj9);
 }
 
-static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9,
+static void kxtj9_init_input_device(struct kxtj9_data *tj9,
                                              struct input_dev *input_dev)
 {
        __set_bit(EV_ABS, input_dev->evbit);
@@ -308,7 +308,7 @@ static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9,
        input_dev->dev.parent = &tj9->client->dev;
 }
 
-static int __devinit kxtj9_setup_input_device(struct kxtj9_data *tj9)
+static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
 {
        struct input_dev *input_dev;
        int err;
@@ -433,7 +433,7 @@ static void kxtj9_polled_input_close(struct input_polled_dev *dev)
        kxtj9_disable(tj9);
 }
 
-static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9)
+static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
 {
        int err;
        struct input_polled_dev *poll_dev;
@@ -466,7 +466,7 @@ static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9)
        return 0;
 }
 
-static void __devexit kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
+static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
 {
        input_unregister_polled_device(tj9->poll_dev);
        input_free_polled_device(tj9->poll_dev);
@@ -485,7 +485,7 @@ static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
 
 #endif
 
-static int __devinit kxtj9_verify(struct kxtj9_data *tj9)
+static int kxtj9_verify(struct kxtj9_data *tj9)
 {
        int retval;
 
@@ -506,7 +506,7 @@ out:
        return retval;
 }
 
-static int __devinit kxtj9_probe(struct i2c_client *client,
+static int kxtj9_probe(struct i2c_client *client,
                                 const struct i2c_device_id *id)
 {
        const struct kxtj9_platform_data *pdata = client->dev.platform_data;
@@ -594,7 +594,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit kxtj9_remove(struct i2c_client *client)
+static int kxtj9_remove(struct i2c_client *client)
 {
        struct kxtj9_data *tj9 = i2c_get_clientdata(client);
 
@@ -663,7 +663,7 @@ static struct i2c_driver kxtj9_driver = {
                .pm     = &kxtj9_pm_ops,
        },
        .probe          = kxtj9_probe,
-       .remove         = __devexit_p(kxtj9_remove),
+       .remove         = kxtj9_remove,
        .id_table       = kxtj9_id,
 };
 
index 0c64d9b..b40ee4b 100644 (file)
@@ -48,7 +48,7 @@ static int m68kspkr_event(struct input_dev *dev, unsigned int type, unsigned int
        return 0;
 }
 
-static int __devinit m68kspkr_probe(struct platform_device *dev)
+static int m68kspkr_probe(struct platform_device *dev)
 {
        struct input_dev *input_dev;
        int err;
@@ -80,7 +80,7 @@ static int __devinit m68kspkr_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit m68kspkr_remove(struct platform_device *dev)
+static int m68kspkr_remove(struct platform_device *dev)
 {
        struct input_dev *input_dev = platform_get_drvdata(dev);
 
@@ -104,7 +104,7 @@ static struct platform_driver m68kspkr_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = m68kspkr_probe,
-       .remove         = __devexit_p(m68kspkr_remove),
+       .remove         = m68kspkr_remove,
        .shutdown       = m68kspkr_shutdown,
 };
 
index 0a12b74..369a39d 100644 (file)
@@ -62,7 +62,7 @@ static irqreturn_t max8925_onkey_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit max8925_onkey_probe(struct platform_device *pdev)
+static int max8925_onkey_probe(struct platform_device *pdev)
 {
        struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
        struct max8925_onkey_info *info;
@@ -141,7 +141,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit max8925_onkey_remove(struct platform_device *pdev)
+static int max8925_onkey_remove(struct platform_device *pdev)
 {
        struct max8925_onkey_info *info = platform_get_drvdata(pdev);
        struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
@@ -195,7 +195,7 @@ static struct platform_driver max8925_onkey_driver = {
                .pm     = &max8925_onkey_pm_ops,
        },
        .probe          = max8925_onkey_probe,
-       .remove         = __devexit_p(max8925_onkey_remove),
+       .remove         = max8925_onkey_remove,
 };
 module_platform_driver(max8925_onkey_driver);
 
index 05b7b8b..e973133 100644 (file)
@@ -241,7 +241,7 @@ static void max8997_haptic_close(struct input_dev *dev)
        max8997_haptic_disable(chip);
 }
 
-static int __devinit max8997_haptic_probe(struct platform_device *pdev)
+static int max8997_haptic_probe(struct platform_device *pdev)
 {
        struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
        const struct max8997_platform_data *pdata =
@@ -354,7 +354,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit max8997_haptic_remove(struct platform_device *pdev)
+static int max8997_haptic_remove(struct platform_device *pdev)
 {
        struct max8997_haptic *chip = platform_get_drvdata(pdev);
 
@@ -396,7 +396,7 @@ static struct platform_driver max8997_haptic_driver = {
                .pm     = &max8997_haptic_pm_ops,
        },
        .probe          = max8997_haptic_probe,
-       .remove         = __devexit_p(max8997_haptic_remove),
+       .remove         = max8997_haptic_remove,
        .id_table       = max8997_haptic_id,
 };
 module_platform_driver(max8997_haptic_driver);
index 8428f1e..0906ca5 100644 (file)
@@ -89,7 +89,7 @@ static irqreturn_t button_irq(int irq, void *_priv)
        return IRQ_HANDLED;
 }
 
-static int __devinit mc13783_pwrbutton_probe(struct platform_device *pdev)
+static int mc13783_pwrbutton_probe(struct platform_device *pdev)
 {
        const struct mc13xxx_buttons_platform_data *pdata;
        struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
@@ -230,7 +230,7 @@ free_input_dev:
        return err;
 }
 
-static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
+static int mc13783_pwrbutton_remove(struct platform_device *pdev)
 {
        struct mc13783_pwrb *priv = platform_get_drvdata(pdev);
        const struct mc13xxx_buttons_platform_data *pdata;
@@ -257,7 +257,7 @@ static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
 
 static struct platform_driver mc13783_pwrbutton_driver = {
        .probe          = mc13783_pwrbutton_probe,
-       .remove         = __devexit_p(mc13783_pwrbutton_remove),
+       .remove         = mc13783_pwrbutton_remove,
        .driver         = {
                .name   = "mc13783-pwrbutton",
                .owner  = THIS_MODULE,
index 873ebce..480557f 100644 (file)
@@ -167,7 +167,7 @@ static void mma8450_close(struct input_polled_dev *dev)
 /*
  * I2C init/probing/exit functions
  */
-static int __devinit mma8450_probe(struct i2c_client *c,
+static int mma8450_probe(struct i2c_client *c,
                                   const struct i2c_device_id *id)
 {
        struct input_polled_dev *idev;
@@ -212,7 +212,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit mma8450_remove(struct i2c_client *c)
+static int mma8450_remove(struct i2c_client *c)
 {
        struct mma8450 *m = i2c_get_clientdata(c);
        struct input_polled_dev *idev = m->idev;
@@ -243,7 +243,7 @@ static struct i2c_driver mma8450_driver = {
                .of_match_table = mma8450_dt_ids,
        },
        .probe          = mma8450_probe,
-       .remove         = __devexit_p(mma8450_remove),
+       .remove         = mma8450_remove,
        .id_table       = mma8450_id,
 };
 
index 306f84c..dce0d95 100644 (file)
@@ -257,7 +257,7 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data)
  *
  *     Called during device probe; configures the sampling method.
  */
-static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
+static int mpu3050_hw_init(struct mpu3050_sensor *sensor)
 {
        struct i2c_client *client = sensor->client;
        int ret;
@@ -306,7 +306,7 @@ static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
  *
  *     If present install the relevant sysfs interfaces and input device.
  */
-static int __devinit mpu3050_probe(struct i2c_client *client,
+static int mpu3050_probe(struct i2c_client *client,
                                   const struct i2c_device_id *id)
 {
        struct mpu3050_sensor *sensor;
@@ -402,7 +402,7 @@ err_free_mem:
  *
  *     Our sensor is going away, clean up the resources.
  */
-static int __devexit mpu3050_remove(struct i2c_client *client)
+static int mpu3050_remove(struct i2c_client *client)
 {
        struct mpu3050_sensor *sensor = i2c_get_clientdata(client);
 
@@ -471,7 +471,7 @@ static struct i2c_driver mpu3050_i2c_driver = {
                .of_match_table = mpu3050_of_match,
        },
        .probe          = mpu3050_probe,
-       .remove         = __devexit_p(mpu3050_remove),
+       .remove         = mpu3050_remove,
        .id_table       = mpu3050_ids,
 };
 
index e09b4fe..40ac9a5 100644 (file)
@@ -48,7 +48,7 @@ static irqreturn_t pcap_keys_handler(int irq, void *_pcap_keys)
        return IRQ_HANDLED;
 }
 
-static int __devinit pcap_keys_probe(struct platform_device *pdev)
+static int pcap_keys_probe(struct platform_device *pdev)
 {
        int err = -ENOMEM;
        struct pcap_keys *pcap_keys;
@@ -104,7 +104,7 @@ fail:
        return err;
 }
 
-static int __devexit pcap_keys_remove(struct platform_device *pdev)
+static int pcap_keys_remove(struct platform_device *pdev)
 {
        struct pcap_keys *pcap_keys = platform_get_drvdata(pdev);
 
@@ -119,7 +119,7 @@ static int __devexit pcap_keys_remove(struct platform_device *pdev)
 
 static struct platform_driver pcap_keys_device_driver = {
        .probe          = pcap_keys_probe,
-       .remove         = __devexit_p(pcap_keys_remove),
+       .remove         = pcap_keys_remove,
        .driver         = {
                .name   = "pcap-keys",
                .owner  = THIS_MODULE,
index 53891de..73b13eb 100644 (file)
@@ -53,7 +53,7 @@ pcf50633_input_irq(int irq, void *data)
        input_sync(input->input_dev);
 }
 
-static int __devinit pcf50633_input_probe(struct platform_device *pdev)
+static int pcf50633_input_probe(struct platform_device *pdev)
 {
        struct pcf50633_input *input;
        struct input_dev *input_dev;
@@ -93,7 +93,7 @@ static int __devinit pcf50633_input_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit pcf50633_input_remove(struct platform_device *pdev)
+static int pcf50633_input_remove(struct platform_device *pdev)
 {
        struct pcf50633_input *input  = platform_get_drvdata(pdev);
 
@@ -111,7 +111,7 @@ static struct platform_driver pcf50633_input_driver = {
                .name = "pcf50633-input",
        },
        .probe = pcf50633_input_probe,
-       .remove = __devexit_p(pcf50633_input_remove),
+       .remove = pcf50633_input_remove,
 };
 module_platform_driver(pcf50633_input_driver);
 
index 544c663..e373929 100644 (file)
@@ -82,7 +82,7 @@ static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id)
+static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
        int i, ret;
        struct input_dev *idev;
@@ -156,7 +156,7 @@ static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2
        return ret;
 }
 
-static int __devexit pcf8574_kp_remove(struct i2c_client *client)
+static int pcf8574_kp_remove(struct i2c_client *client)
 {
        struct kp_data *lp = i2c_get_clientdata(client);
 
@@ -212,7 +212,7 @@ static struct i2c_driver pcf8574_kp_driver = {
 #endif
        },
        .probe    = pcf8574_kp_probe,
-       .remove   = __devexit_p(pcf8574_kp_remove),
+       .remove   = pcf8574_kp_remove,
        .id_table = pcf8574_kp_id,
 };
 
index b2484aa..199db78 100644 (file)
@@ -63,7 +63,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c
        return 0;
 }
 
-static int __devinit pcspkr_probe(struct platform_device *dev)
+static int pcspkr_probe(struct platform_device *dev)
 {
        struct input_dev *pcspkr_dev;
        int err;
@@ -95,7 +95,7 @@ static int __devinit pcspkr_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit pcspkr_remove(struct platform_device *dev)
+static int pcspkr_remove(struct platform_device *dev)
 {
        struct input_dev *pcspkr_dev = platform_get_drvdata(dev);
 
@@ -131,7 +131,7 @@ static struct platform_driver pcspkr_platform_driver = {
                .pm     = &pcspkr_pm_ops,
        },
        .probe          = pcspkr_probe,
-       .remove         = __devexit_p(pcspkr_remove),
+       .remove         = pcspkr_remove,
        .shutdown       = pcspkr_shutdown,
 };
 module_platform_driver(pcspkr_platform_driver);
index dfbfb46..a9da65e 100644 (file)
@@ -178,7 +178,7 @@ static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data,
        return 0;
 }
 
-static int __devinit pm8xxx_vib_probe(struct platform_device *pdev)
+static int pm8xxx_vib_probe(struct platform_device *pdev)
 
 {
        struct pm8xxx_vib *vib;
@@ -242,7 +242,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit pm8xxx_vib_remove(struct platform_device *pdev)
+static int pm8xxx_vib_remove(struct platform_device *pdev)
 {
        struct pm8xxx_vib *vib = platform_get_drvdata(pdev);
 
@@ -270,7 +270,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);
 
 static struct platform_driver pm8xxx_vib_driver = {
        .probe          = pm8xxx_vib_probe,
-       .remove         = __devexit_p(pm8xxx_vib_remove),
+       .remove         = pm8xxx_vib_remove,
        .driver         = {
                .name   = "pm8xxx-vib",
                .owner  = THIS_MODULE,
index 0f83d0f..4b811be 100644 (file)
@@ -81,7 +81,7 @@ static int pmic8xxx_pwrkey_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops,
                pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume);
 
-static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev)
+static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)
 {
        struct input_dev *pwr;
        int key_release_irq = platform_get_irq(pdev, 0);
@@ -187,7 +187,7 @@ free_pwrkey:
        return err;
 }
 
-static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev)
+static int pmic8xxx_pwrkey_remove(struct platform_device *pdev)
 {
        struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev);
        int key_release_irq = platform_get_irq(pdev, 0);
@@ -206,7 +206,7 @@ static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev)
 
 static struct platform_driver pmic8xxx_pwrkey_driver = {
        .probe          = pmic8xxx_pwrkey_probe,
-       .remove         = __devexit_p(pmic8xxx_pwrkey_remove),
+       .remove         = pmic8xxx_pwrkey_remove,
        .driver         = {
                .name   = PM8XXX_PWRKEY_DEV_NAME,
                .owner  = THIS_MODULE,
index fc84c8a..0808868 100644 (file)
@@ -65,7 +65,7 @@ static int pwm_beeper_event(struct input_dev *input,
        return 0;
 }
 
-static int __devinit pwm_beeper_probe(struct platform_device *pdev)
+static int pwm_beeper_probe(struct platform_device *pdev)
 {
        unsigned long pwm_id = (unsigned long)pdev->dev.platform_data;
        struct pwm_beeper *beeper;
@@ -75,7 +75,11 @@ static int __devinit pwm_beeper_probe(struct platform_device *pdev)
        if (!beeper)
                return -ENOMEM;
 
-       beeper->pwm = pwm_request(pwm_id, "pwm beeper");
+       beeper->pwm = pwm_get(&pdev->dev, NULL);
+       if (IS_ERR(beeper->pwm)) {
+               dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n");
+               beeper->pwm = pwm_request(pwm_id, "pwm beeper");
+       }
 
        if (IS_ERR(beeper->pwm)) {
                error = PTR_ERR(beeper->pwm);
@@ -125,7 +129,7 @@ err_free:
        return error;
 }
 
-static int __devexit pwm_beeper_remove(struct platform_device *pdev)
+static int pwm_beeper_remove(struct platform_device *pdev)
 {
        struct pwm_beeper *beeper = platform_get_drvdata(pdev);
 
@@ -171,13 +175,21 @@ static SIMPLE_DEV_PM_OPS(pwm_beeper_pm_ops,
 #define PWM_BEEPER_PM_OPS NULL
 #endif
 
+#ifdef CONFIG_OF
+static const struct of_device_id pwm_beeper_match[] = {
+       { .compatible = "pwm-beeper", },
+       { },
+};
+#endif
+
 static struct platform_driver pwm_beeper_driver = {
        .probe  = pwm_beeper_probe,
-       .remove = __devexit_p(pwm_beeper_remove),
+       .remove = pwm_beeper_remove,
        .driver = {
                .name   = "pwm-beeper",
                .owner  = THIS_MODULE,
                .pm     = PWM_BEEPER_PM_OPS,
+               .of_match_table = of_match_ptr(pwm_beeper_match),
        },
 };
 module_platform_driver(pwm_beeper_driver);
index aeb02bc..fb4f8ac 100644 (file)
@@ -51,7 +51,7 @@ static void rb532_button_poll(struct input_polled_dev *poll_dev)
        input_sync(poll_dev->input);
 }
 
-static int __devinit rb532_button_probe(struct platform_device *pdev)
+static int rb532_button_probe(struct platform_device *pdev)
 {
        struct input_polled_dev *poll_dev;
        int error;
@@ -81,7 +81,7 @@ static int __devinit rb532_button_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit rb532_button_remove(struct platform_device *pdev)
+static int rb532_button_remove(struct platform_device *pdev)
 {
        struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev);
 
@@ -94,7 +94,7 @@ static int __devexit rb532_button_remove(struct platform_device *pdev)
 
 static struct platform_driver rb532_button_driver = {
        .probe = rb532_button_probe,
-       .remove = __devexit_p(rb532_button_remove),
+       .remove = rb532_button_remove,
        .driver = {
                .name = DRV_NAME,
                .owner = THIS_MODULE,
diff --git a/drivers/input/misc/retu-pwrbutton.c b/drivers/input/misc/retu-pwrbutton.c
new file mode 100644 (file)
index 0000000..7ca09ba
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Retu power button driver.
+ *
+ * Copyright (C) 2004-2010 Nokia Corporation
+ *
+ * Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi.
+ * Rewritten by Aaro Koskinen.
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/irq.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
+#include <linux/input.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mfd/retu.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+
+#define RETU_STATUS_PWRONX (1 << 5)
+
+static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr)
+{
+       struct input_dev *idev = _pwr;
+       struct retu_dev *rdev = input_get_drvdata(idev);
+       bool state;
+
+       state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX);
+       input_report_key(idev, KEY_POWER, state);
+       input_sync(idev);
+
+       return IRQ_HANDLED;
+}
+
+static int retu_pwrbutton_probe(struct platform_device *pdev)
+{
+       struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent);
+       struct input_dev *idev;
+       int irq;
+       int error;
+
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               return irq;
+
+       idev = devm_input_allocate_device(&pdev->dev);
+       if (!idev)
+               return -ENOMEM;
+
+       idev->name = "retu-pwrbutton";
+       idev->dev.parent = &pdev->dev;
+
+       input_set_capability(idev, EV_KEY, KEY_POWER);
+       input_set_drvdata(idev, rdev);
+
+       error = devm_request_threaded_irq(&pdev->dev, irq,
+                                         NULL, retu_pwrbutton_irq, 0,
+                                         "retu-pwrbutton", idev);
+       if (error)
+               return error;
+
+       error = input_register_device(idev);
+       if (error)
+               return error;
+
+       return 0;
+}
+
+static int retu_pwrbutton_remove(struct platform_device *pdev)
+{
+       return 0;
+}
+
+static struct platform_driver retu_pwrbutton_driver = {
+       .probe          = retu_pwrbutton_probe,
+       .remove         = retu_pwrbutton_remove,
+       .driver         = {
+               .name   = "retu-pwrbutton",
+               .owner  = THIS_MODULE,
+       },
+};
+module_platform_driver(retu_pwrbutton_driver);
+
+MODULE_ALIAS("platform:retu-pwrbutton");
+MODULE_DESCRIPTION("Retu Power Button");
+MODULE_AUTHOR("Ari Saastamoinen");
+MODULE_AUTHOR("Felipe Balbi");
+MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>");
+MODULE_LICENSE("GPL");
index 99a49e4..aff47b2 100644 (file)
@@ -149,8 +149,7 @@ static struct of_device_id rotary_encoder_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, rotary_encoder_of_match);
 
-static struct rotary_encoder_platform_data * __devinit
-rotary_encoder_parse_dt(struct device *dev)
+static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev)
 {
        const struct of_device_id *of_id =
                                of_match_device(rotary_encoder_of_match, dev);
@@ -192,7 +191,7 @@ rotary_encoder_parse_dt(struct device *dev)
 }
 #endif
 
-static int __devinit rotary_encoder_probe(struct platform_device *pdev)
+static int rotary_encoder_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev);
@@ -302,7 +301,7 @@ exit_free_mem:
        return err;
 }
 
-static int __devexit rotary_encoder_remove(struct platform_device *pdev)
+static int rotary_encoder_remove(struct platform_device *pdev)
 {
        struct rotary_encoder *encoder = platform_get_drvdata(pdev);
        const struct rotary_encoder_platform_data *pdata = encoder->pdata;
@@ -325,7 +324,7 @@ static int __devexit rotary_encoder_remove(struct platform_device *pdev)
 
 static struct platform_driver rotary_encoder_driver = {
        .probe          = rotary_encoder_probe,
-       .remove         = __devexit_p(rotary_encoder_remove),
+       .remove         = rotary_encoder_remove,
        .driver         = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index 5d9fd55..ad6415c 100644 (file)
@@ -91,7 +91,7 @@ static void handle_buttons(struct input_polled_dev *dev)
        }
 }
 
-static int __devinit sgi_buttons_probe(struct platform_device *pdev)
+static int sgi_buttons_probe(struct platform_device *pdev)
 {
        struct buttons_dev *bdev;
        struct input_polled_dev *poll_dev;
@@ -143,7 +143,7 @@ static int __devinit sgi_buttons_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit sgi_buttons_remove(struct platform_device *pdev)
+static int sgi_buttons_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct buttons_dev *bdev = dev_get_drvdata(dev);
@@ -158,7 +158,7 @@ static int __devexit sgi_buttons_remove(struct platform_device *pdev)
 
 static struct platform_driver sgi_buttons_driver = {
        .probe  = sgi_buttons_probe,
-       .remove = __devexit_p(sgi_buttons_remove),
+       .remove = sgi_buttons_remove,
        .driver = {
                .name   = "sgibtns",
                .owner  = THIS_MODULE,
index 0122f53..a53586a 100644 (file)
@@ -139,7 +139,7 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned
        return 0;
 }
 
-static int __devinit sparcspkr_probe(struct device *dev)
+static int sparcspkr_probe(struct device *dev)
 {
        struct sparcspkr_state *state = dev_get_drvdata(dev);
        struct input_dev *input_dev;
@@ -182,7 +182,7 @@ static void sparcspkr_shutdown(struct platform_device *dev)
        state->event(input_dev, EV_SND, SND_BELL, 0);
 }
 
-static int __devinit bbc_beep_probe(struct platform_device *op)
+static int bbc_beep_probe(struct platform_device *op)
 {
        struct sparcspkr_state *state;
        struct bbc_beep_info *info;
@@ -229,7 +229,7 @@ out_err:
        return err;
 }
 
-static int __devexit bbc_remove(struct platform_device *op)
+static int bbc_remove(struct platform_device *op)
 {
        struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
        struct input_dev *input_dev = state->input_dev;
@@ -263,11 +263,11 @@ static struct platform_driver bbc_beep_driver = {
                .of_match_table = bbc_beep_match,
        },
        .probe          = bbc_beep_probe,
-       .remove         = __devexit_p(bbc_remove),
+       .remove         = bbc_remove,
        .shutdown       = sparcspkr_shutdown,
 };
 
-static int __devinit grover_beep_probe(struct platform_device *op)
+static int grover_beep_probe(struct platform_device *op)
 {
        struct sparcspkr_state *state;
        struct grover_beep_info *info;
@@ -310,7 +310,7 @@ out_err:
        return err;
 }
 
-static int __devexit grover_remove(struct platform_device *op)
+static int grover_remove(struct platform_device *op)
 {
        struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
        struct grover_beep_info *info = &state->u.grover;
@@ -345,7 +345,7 @@ static struct platform_driver grover_beep_driver = {
                .of_match_table = grover_beep_match,
        },
        .probe          = grover_beep_probe,
-       .remove         = __devexit_p(grover_remove),
+       .remove         = grover_remove,
        .shutdown       = sparcspkr_shutdown,
 };
 
index b3dd96d..27c2bc8 100644 (file)
@@ -39,8 +39,7 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr)
        int err;
        u8 value;
 
-       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value,
-                               STS_HW_CONDITIONS);
+       err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS);
        if (!err)  {
                pm_wakeup_event(pwr->dev.parent, 0);
                input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ);
index 2194a3c..78eb6b3 100644 (file)
@@ -207,7 +207,7 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata,
        return false;
 }
 
-static int __devinit twl4030_vibra_probe(struct platform_device *pdev)
+static int twl4030_vibra_probe(struct platform_device *pdev)
 {
        struct twl4030_vibra_data *pdata = pdev->dev.platform_data;
        struct device_node *twl4030_core_node = pdev->dev.parent->of_node;
@@ -269,7 +269,7 @@ err_kzalloc:
        return ret;
 }
 
-static int __devexit twl4030_vibra_remove(struct platform_device *pdev)
+static int twl4030_vibra_remove(struct platform_device *pdev)
 {
        struct vibra_info *info = platform_get_drvdata(pdev);
 
@@ -283,7 +283,7 @@ static int __devexit twl4030_vibra_remove(struct platform_device *pdev)
 
 static struct platform_driver twl4030_vibra_driver = {
        .probe          = twl4030_vibra_probe,
-       .remove         = __devexit_p(twl4030_vibra_remove),
+       .remove         = twl4030_vibra_remove,
        .driver         = {
                .name   = "twl4030-vibra",
                .owner  = THIS_MODULE,
index c8a288a..71a28ee 100644 (file)
@@ -255,7 +255,7 @@ static int twl6040_vibra_suspend(struct device *dev)
 
 static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL);
 
-static int __devinit twl6040_vibra_probe(struct platform_device *pdev)
+static int twl6040_vibra_probe(struct platform_device *pdev)
 {
        struct twl6040_vibra_data *pdata = pdev->dev.platform_data;
        struct device *twl6040_core_dev = pdev->dev.parent;
@@ -418,7 +418,7 @@ err_kzalloc:
        return ret;
 }
 
-static int __devexit twl6040_vibra_remove(struct platform_device *pdev)
+static int twl6040_vibra_remove(struct platform_device *pdev)
 {
        struct vibra_info *info = platform_get_drvdata(pdev);
 
@@ -433,7 +433,7 @@ static int __devexit twl6040_vibra_remove(struct platform_device *pdev)
 
 static struct platform_driver twl6040_vibra_driver = {
        .probe          = twl6040_vibra_probe,
-       .remove         = __devexit_p(twl6040_vibra_remove),
+       .remove         = twl6040_vibra_remove,
        .driver         = {
                .name   = "twl6040-vibra",
                .owner  = THIS_MODULE,
index e2bdfd4..56536f4 100644 (file)
@@ -170,7 +170,7 @@ static u16 bios_pop_queue(void)
        return regs.eax;
 }
 
-static void __devinit bios_attach(void)
+static void bios_attach(void)
 {
        struct regs regs;
 
@@ -190,7 +190,7 @@ static void bios_detach(void)
        call_bios(&regs);
 }
 
-static u8 __devinit bios_get_cmos_address(void)
+static u8 bios_get_cmos_address(void)
 {
        struct regs regs;
 
@@ -202,7 +202,7 @@ static u8 __devinit bios_get_cmos_address(void)
        return regs.ecx;
 }
 
-static u16 __devinit bios_get_default_setting(u8 subsys)
+static u16 bios_get_default_setting(u8 subsys)
 {
        struct regs regs;
 
@@ -1052,7 +1052,7 @@ static struct led_classdev wistron_wifi_led = {
        .brightness_set         = wistron_wifi_led_set,
 };
 
-static void __devinit wistron_led_init(struct device *parent)
+static void wistron_led_init(struct device *parent)
 {
        if (leds_present & FE_WIFI_LED) {
                u16 wifi = bios_get_default_setting(WIFI);
@@ -1077,7 +1077,7 @@ static void __devinit wistron_led_init(struct device *parent)
        }
 }
 
-static void __devexit wistron_led_remove(void)
+static void wistron_led_remove(void)
 {
        if (leds_present & FE_MAIL_LED)
                led_classdev_unregister(&wistron_mail_led);
@@ -1168,7 +1168,7 @@ static void wistron_poll(struct input_polled_dev *dev)
                dev->poll_interval = POLL_INTERVAL_DEFAULT;
 }
 
-static int __devinit wistron_setup_keymap(struct input_dev *dev,
+static int wistron_setup_keymap(struct input_dev *dev,
                                          struct key_entry *entry)
 {
        switch (entry->type) {
@@ -1199,7 +1199,7 @@ static int __devinit wistron_setup_keymap(struct input_dev *dev,
        return 0;
 }
 
-static int __devinit setup_input_dev(void)
+static int setup_input_dev(void)
 {
        struct input_dev *input_dev;
        int error;
@@ -1237,7 +1237,7 @@ static int __devinit setup_input_dev(void)
 
 /* Driver core */
 
-static int __devinit wistron_probe(struct platform_device *dev)
+static int wistron_probe(struct platform_device *dev)
 {
        int err;
 
@@ -1277,7 +1277,7 @@ static int __devinit wistron_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit wistron_remove(struct platform_device *dev)
+static int wistron_remove(struct platform_device *dev)
 {
        wistron_led_remove();
        input_unregister_polled_device(wistron_idev);
@@ -1334,7 +1334,7 @@ static struct platform_driver wistron_driver = {
 #endif
        },
        .probe          = wistron_probe,
-       .remove         = __devexit_p(wistron_remove),
+       .remove         = wistron_remove,
 };
 
 static int __init wb_module_init(void)
index 6790a81..558767d 100644 (file)
@@ -69,14 +69,15 @@ static irqreturn_t wm831x_on_irq(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit wm831x_on_probe(struct platform_device *pdev)
+static int wm831x_on_probe(struct platform_device *pdev)
 {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_on *wm831x_on;
        int irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0));
        int ret;
 
-       wm831x_on = kzalloc(sizeof(struct wm831x_on), GFP_KERNEL);
+       wm831x_on = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_on),
+                                GFP_KERNEL);
        if (!wm831x_on) {
                dev_err(&pdev->dev, "Can't allocate data\n");
                return -ENOMEM;
@@ -120,11 +121,10 @@ err_irq:
 err_input_dev:
        input_free_device(wm831x_on->dev);
 err:
-       kfree(wm831x_on);
        return ret;
 }
 
-static int __devexit wm831x_on_remove(struct platform_device *pdev)
+static int wm831x_on_remove(struct platform_device *pdev)
 {
        struct wm831x_on *wm831x_on = platform_get_drvdata(pdev);
        int irq = platform_get_irq(pdev, 0);
@@ -132,14 +132,13 @@ static int __devexit wm831x_on_remove(struct platform_device *pdev)
        free_irq(irq, wm831x_on);
        cancel_delayed_work_sync(&wm831x_on->work);
        input_unregister_device(wm831x_on->dev);
-       kfree(wm831x_on);
 
        return 0;
 }
 
 static struct platform_driver wm831x_on_driver = {
        .probe          = wm831x_on_probe,
-       .remove         = __devexit_p(wm831x_on_remove),
+       .remove         = wm831x_on_remove,
        .driver         = {
                .name   = "wm831x-on",
                .owner  = THIS_MODULE,
index 6f7d990..e21c181 100644 (file)
@@ -104,7 +104,7 @@ static irqreturn_t input_handler(int rq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit xenkbd_probe(struct xenbus_device *dev,
+static int xenkbd_probe(struct xenbus_device *dev,
                                  const struct xenbus_device_id *id)
 {
        int ret, i, abs;
index cf5af1f..e229fa3 100644 (file)
@@ -767,9 +767,8 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
                      psmouse->packet[5]) & 0x80) ||
                    (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {
                        psmouse_dbg(psmouse,
-                                   "refusing packet %x %x %x %x (suspected interleaved ps/2)\n",
-                                   psmouse->packet[3], psmouse->packet[4],
-                                   psmouse->packet[5], psmouse->packet[6]);
+                                   "refusing packet %4ph (suspected interleaved ps/2)\n",
+                                   psmouse->packet + 3);
                        return PSMOUSE_BAD_DATA;
                }
 
@@ -831,9 +830,8 @@ static void alps_flush_packet(unsigned long data)
                     psmouse->packet[4] |
                     psmouse->packet[5]) & 0x80) {
                        psmouse_dbg(psmouse,
-                                   "refusing packet %x %x %x (suspected interleaved ps/2)\n",
-                                   psmouse->packet[3], psmouse->packet[4],
-                                   psmouse->packet[5]);
+                                   "refusing packet %3ph (suspected interleaved ps/2)\n",
+                                   psmouse->packet + 3);
                } else {
                        alps_process_packet(psmouse);
                }
index 39fe9b7..532eaca 100644 (file)
@@ -46,7 +46,7 @@ static void gpio_mouse_scan(struct input_polled_dev *dev)
        input_sync(input);
 }
 
-static int __devinit gpio_mouse_probe(struct platform_device *pdev)
+static int gpio_mouse_probe(struct platform_device *pdev)
 {
        struct gpio_mouse_platform_data *pdata = pdev->dev.platform_data;
        struct input_polled_dev *input_poll;
@@ -150,7 +150,7 @@ static int __devinit gpio_mouse_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit gpio_mouse_remove(struct platform_device *pdev)
+static int gpio_mouse_remove(struct platform_device *pdev)
 {
        struct input_polled_dev *input = platform_get_drvdata(pdev);
        struct gpio_mouse_platform_data *pdata = input->private;
@@ -172,7 +172,7 @@ static int __devexit gpio_mouse_remove(struct platform_device *pdev)
 
 static struct platform_driver gpio_mouse_device_driver = {
        .probe          = gpio_mouse_probe,
-       .remove         = __devexit_p(gpio_mouse_remove),
+       .remove         = gpio_mouse_remove,
        .driver         = {
                .name   = "gpio_mouse",
                .owner  = THIS_MODULE,
index 5f27817..0a60717 100644 (file)
@@ -64,7 +64,7 @@ static void dc_mouse_close(struct input_dev *dev)
 }
 
 /* allow the mouse to be used */
-static int __devinit probe_maple_mouse(struct device *dev)
+static int probe_maple_mouse(struct device *dev)
 {
        struct maple_device *mdev = to_maple_dev(dev);
        struct maple_driver *mdrv = to_maple_driver(dev->driver);
@@ -114,7 +114,7 @@ fail:
        return error;
 }
 
-static int __devexit remove_maple_mouse(struct device *dev)
+static int remove_maple_mouse(struct device *dev)
 {
        struct maple_device *mdev = to_maple_dev(dev);
        struct dc_mouse *mse = maple_get_drvdata(mdev);
@@ -132,7 +132,7 @@ static struct maple_driver dc_mouse_driver = {
        .drv = {
                .name = "Dreamcast_mouse",
                .probe = probe_maple_mouse,
-               .remove = __devexit_p(remove_maple_mouse),
+               .remove = remove_maple_mouse,
        },
 };
 
index c29ae76..8e1b98e 100644 (file)
@@ -206,7 +206,7 @@ static void navpoint_close(struct input_dev *input)
        navpoint_down(navpoint);
 }
 
-static int __devinit navpoint_probe(struct platform_device *pdev)
+static int navpoint_probe(struct platform_device *pdev)
 {
        const struct navpoint_platform_data *pdata =
                                        dev_get_platdata(&pdev->dev);
@@ -299,7 +299,7 @@ err_free_gpio:
        return error;
 }
 
-static int __devexit navpoint_remove(struct platform_device *pdev)
+static int navpoint_remove(struct platform_device *pdev)
 {
        const struct navpoint_platform_data *pdata =
                                        dev_get_platdata(&pdev->dev);
@@ -353,7 +353,7 @@ static SIMPLE_DEV_PM_OPS(navpoint_pm_ops, navpoint_suspend, navpoint_resume);
 
 static struct platform_driver navpoint_driver = {
        .probe          = navpoint_probe,
-       .remove         = __devexit_p(navpoint_remove),
+       .remove         = navpoint_remove,
        .driver = {
                .name   = "navpoint",
                .owner  = THIS_MODULE,
index 4fe055f..0ecb9e7 100644 (file)
@@ -143,7 +143,7 @@ static void pxa930_trkball_close(struct input_dev *dev)
        pxa930_trkball_disable(trkball);
 }
 
-static int __devinit pxa930_trkball_probe(struct platform_device *pdev)
+static int pxa930_trkball_probe(struct platform_device *pdev)
 {
        struct pxa930_trkball *trkball;
        struct input_dev *input;
@@ -230,7 +230,7 @@ failed:
        return error;
 }
 
-static int __devexit pxa930_trkball_remove(struct platform_device *pdev)
+static int pxa930_trkball_remove(struct platform_device *pdev)
 {
        struct pxa930_trkball *trkball = platform_get_drvdata(pdev);
        int irq = platform_get_irq(pdev, 0);
@@ -248,7 +248,7 @@ static struct platform_driver pxa930_trkball_driver = {
                .name   = "pxa930-trkball",
        },
        .probe          = pxa930_trkball_probe,
-       .remove         = __devexit_p(pxa930_trkball_remove),
+       .remove         = pxa930_trkball_remove,
 };
 module_platform_driver(pxa930_trkball_driver);
 
index 063a174..ad82260 100644 (file)
@@ -535,7 +535,7 @@ static struct synaptics_i2c *synaptics_i2c_touch_create(struct i2c_client *clien
        return touch;
 }
 
-static int __devinit synaptics_i2c_probe(struct i2c_client *client,
+static int synaptics_i2c_probe(struct i2c_client *client,
                               const struct i2c_device_id *dev_id)
 {
        int ret;
@@ -601,7 +601,7 @@ err_mem_free:
        return ret;
 }
 
-static int __devexit synaptics_i2c_remove(struct i2c_client *client)
+static int synaptics_i2c_remove(struct i2c_client *client)
 {
        struct synaptics_i2c *touch = i2c_get_clientdata(client);
 
@@ -662,7 +662,7 @@ static struct i2c_driver synaptics_i2c_driver = {
        },
 
        .probe          = synaptics_i2c_probe,
-       .remove         = __devexit_p(synaptics_i2c_remove),
+       .remove         = synaptics_i2c_remove,
 
        .id_table       = synaptics_i2c_id_table,
 };
index 55f2c22..4a4e182 100644 (file)
@@ -234,4 +234,13 @@ config SERIO_PS2MULT
          To compile this driver as a module, choose M here: the
          module will be called ps2mult.
 
+config SERIO_ARC_PS2
+       tristate "ARC PS/2 support"
+       help
+         Say Y here if you have an ARC FPGA platform with a PS/2
+         controller in it.
+
+         To compile this driver as a module, choose M here; the module
+         will be called arc_ps2.
+
 endif
index dbbe376..4b0c8f8 100644 (file)
@@ -25,3 +25,4 @@ obj-$(CONFIG_SERIO_RAW)               += serio_raw.o
 obj-$(CONFIG_SERIO_AMS_DELTA)  += ams_delta_serio.o
 obj-$(CONFIG_SERIO_XILINX_XPS_PS2)     += xilinx_ps2.o
 obj-$(CONFIG_SERIO_ALTERA_PS2) += altera_ps2.o
+obj-$(CONFIG_SERIO_ARC_PS2)    += arc_ps2.o
index cc11f4e..479ce5f 100644 (file)
@@ -81,7 +81,7 @@ static void altera_ps2_close(struct serio *io)
 /*
  * Add one device to this driver.
  */
-static int __devinit altera_ps2_probe(struct platform_device *pdev)
+static int altera_ps2_probe(struct platform_device *pdev)
 {
        struct ps2if *ps2if;
        struct serio *serio;
@@ -159,7 +159,7 @@ static int __devinit altera_ps2_probe(struct platform_device *pdev)
 /*
  * Remove one device from this driver.
  */
-static int __devexit altera_ps2_remove(struct platform_device *pdev)
+static int altera_ps2_remove(struct platform_device *pdev)
 {
        struct ps2if *ps2if = platform_get_drvdata(pdev);
 
@@ -187,7 +187,7 @@ MODULE_DEVICE_TABLE(of, altera_ps2_match);
  */
 static struct platform_driver altera_ps2_driver = {
        .probe          = altera_ps2_probe,
-       .remove         = __devexit_p(altera_ps2_remove),
+       .remove         = altera_ps2_remove,
        .driver = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index 2e77246..4e2fd44 100644 (file)
@@ -107,7 +107,7 @@ static void amba_kmi_close(struct serio *io)
        clk_disable_unprepare(kmi->clk);
 }
 
-static int __devinit amba_kmi_probe(struct amba_device *dev,
+static int amba_kmi_probe(struct amba_device *dev,
        const struct amba_id *id)
 {
        struct amba_kmi_port *kmi;
@@ -163,7 +163,7 @@ static int __devinit amba_kmi_probe(struct amba_device *dev,
        return ret;
 }
 
-static int __devexit amba_kmi_remove(struct amba_device *dev)
+static int amba_kmi_remove(struct amba_device *dev)
 {
        struct amba_kmi_port *kmi = amba_get_drvdata(dev);
 
@@ -204,7 +204,7 @@ static struct amba_driver ambakmi_driver = {
        },
        .id_table       = amba_kmi_idtable,
        .probe          = amba_kmi_probe,
-       .remove         = __devexit_p(amba_kmi_remove),
+       .remove         = amba_kmi_remove,
        .resume         = amba_kmi_resume,
 };
 
diff --git a/drivers/input/serio/arc_ps2.c b/drivers/input/serio/arc_ps2.c
new file mode 100644 (file)
index 0000000..b571eb3
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Driver is originally developed by Pavel Sokolov <psokolov@synopsys.com>
+ */
+
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/input.h>
+#include <linux/serio.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+
+#define ARC_PS2_PORTS                   2
+
+#define ARC_ARC_PS2_ID                  0x0001f609
+
+#define STAT_TIMEOUT                    128
+
+#define PS2_STAT_RX_FRM_ERR             (1)
+#define PS2_STAT_RX_BUF_OVER            (1 << 1)
+#define PS2_STAT_RX_INT_EN              (1 << 2)
+#define PS2_STAT_RX_VAL                 (1 << 3)
+#define PS2_STAT_TX_ISNOT_FUL           (1 << 4)
+#define PS2_STAT_TX_INT_EN              (1 << 5)
+
+struct arc_ps2_port {
+       void __iomem *data_addr;
+       void __iomem *status_addr;
+       struct serio *io;
+};
+
+struct arc_ps2_data {
+       struct arc_ps2_port port[ARC_PS2_PORTS];
+       void __iomem *addr;
+       unsigned int frame_error;
+       unsigned int buf_overflow;
+       unsigned int total_int;
+};
+
+static void arc_ps2_check_rx(struct arc_ps2_data *arc_ps2,
+                            struct arc_ps2_port *port)
+{
+       unsigned int timeout = 1000;
+       unsigned int flag, status;
+       unsigned char data;
+
+       do {
+               status = ioread32(port->status_addr);
+               if (!(status & PS2_STAT_RX_VAL))
+                       return;
+
+               data = ioread32(port->data_addr) & 0xff;
+
+               flag = 0;
+               arc_ps2->total_int++;
+               if (status & PS2_STAT_RX_FRM_ERR) {
+                       arc_ps2->frame_error++;
+                       flag |= SERIO_PARITY;
+               } else if (status & PS2_STAT_RX_BUF_OVER) {
+                       arc_ps2->buf_overflow++;
+                       flag |= SERIO_FRAME;
+               }
+
+               serio_interrupt(port->io, data, flag);
+       } while (--timeout);
+
+       dev_err(&port->io->dev, "PS/2 hardware stuck\n");
+}
+
+static irqreturn_t arc_ps2_interrupt(int irq, void *dev)
+{
+       struct arc_ps2_data *arc_ps2 = dev;
+       int i;
+
+       for (i = 0; i < ARC_PS2_PORTS; i++)
+               arc_ps2_check_rx(arc_ps2, &arc_ps2->port[i]);
+
+       return IRQ_HANDLED;
+}
+
+static int arc_ps2_write(struct serio *io, unsigned char val)
+{
+       unsigned status;
+       struct arc_ps2_port *port = io->port_data;
+       int timeout = STAT_TIMEOUT;
+
+       do {
+               status = ioread32(port->status_addr);
+               cpu_relax();
+
+               if (status & PS2_STAT_TX_ISNOT_FUL) {
+                       iowrite32(val & 0xff, port->data_addr);
+                       return 0;
+               }
+
+       } while (--timeout);
+
+       dev_err(&io->dev, "write timeout\n");
+       return -ETIMEDOUT;
+}
+
+static int arc_ps2_open(struct serio *io)
+{
+       struct arc_ps2_port *port = io->port_data;
+
+       iowrite32(PS2_STAT_RX_INT_EN, port->status_addr);
+
+       return 0;
+}
+
+static void arc_ps2_close(struct serio *io)
+{
+       struct arc_ps2_port *port = io->port_data;
+
+       iowrite32(ioread32(port->status_addr) & ~PS2_STAT_RX_INT_EN,
+                 port->status_addr);
+}
+
+static void __iomem *arc_ps2_calc_addr(struct arc_ps2_data *arc_ps2,
+                                                 int index, bool status)
+{
+       void __iomem *addr;
+
+       addr = arc_ps2->addr + 4 + 4 * index;
+       if (status)
+               addr += ARC_PS2_PORTS * 4;
+
+       return addr;
+}
+
+static void arc_ps2_inhibit_ports(struct arc_ps2_data *arc_ps2)
+{
+       void __iomem *addr;
+       u32 val;
+       int i;
+
+       for (i = 0; i < ARC_PS2_PORTS; i++) {
+               addr = arc_ps2_calc_addr(arc_ps2, i, true);
+               val = ioread32(addr);
+               val &= ~(PS2_STAT_RX_INT_EN | PS2_STAT_TX_INT_EN);
+               iowrite32(val, addr);
+       }
+}
+
+static int arc_ps2_create_port(struct platform_device *pdev,
+                                        struct arc_ps2_data *arc_ps2,
+                                        int index)
+{
+       struct arc_ps2_port *port = &arc_ps2->port[index];
+       struct serio *io;
+
+       io = kzalloc(sizeof(struct serio), GFP_KERNEL);
+       if (!io)
+               return -ENOMEM;
+
+       io->id.type = SERIO_8042;
+       io->write = arc_ps2_write;
+       io->open = arc_ps2_open;
+       io->close = arc_ps2_close;
+       snprintf(io->name, sizeof(io->name), "ARC PS/2 port%d", index);
+       snprintf(io->phys, sizeof(io->phys), "arc/serio%d", index);
+       io->port_data = port;
+
+       port->io = io;
+
+       port->data_addr = arc_ps2_calc_addr(arc_ps2, index, false);
+       port->status_addr = arc_ps2_calc_addr(arc_ps2, index, true);
+
+       dev_dbg(&pdev->dev, "port%d is allocated (data = 0x%p, status = 0x%p)\n",
+               index, port->data_addr, port->status_addr);
+
+       serio_register_port(port->io);
+       return 0;
+}
+
+static int arc_ps2_probe(struct platform_device *pdev)
+{
+       struct arc_ps2_data *arc_ps2;
+       struct resource *res;
+       int irq;
+       int error, id, i;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "no IO memory defined\n");
+               return -EINVAL;
+       }
+
+       irq = platform_get_irq_byname(pdev, "arc_ps2_irq");
+       if (irq < 0) {
+               dev_err(&pdev->dev, "no IRQ defined\n");
+               return -EINVAL;
+       }
+
+       arc_ps2 = devm_kzalloc(&pdev->dev, sizeof(struct arc_ps2_data),
+                               GFP_KERNEL);
+       if (!arc_ps2) {
+               dev_err(&pdev->dev, "out of memory\n");
+               return -ENOMEM;
+       }
+
+       arc_ps2->addr = devm_request_and_ioremap(&pdev->dev, res);
+       if (!arc_ps2->addr)
+               return -EBUSY;
+
+       dev_info(&pdev->dev, "irq = %d, address = 0x%p, ports = %i\n",
+                irq, arc_ps2->addr, ARC_PS2_PORTS);
+
+       id = ioread32(arc_ps2->addr);
+       if (id != ARC_ARC_PS2_ID) {
+               dev_err(&pdev->dev, "device id does not match\n");
+               return -ENXIO;
+       }
+
+       arc_ps2_inhibit_ports(arc_ps2);
+
+       error = devm_request_irq(&pdev->dev, irq, arc_ps2_interrupt,
+                                0, "arc_ps2", arc_ps2);
+       if (error) {
+               dev_err(&pdev->dev, "Could not allocate IRQ\n");
+               return error;
+       }
+
+       for (i = 0; i < ARC_PS2_PORTS; i++) {
+               error = arc_ps2_create_port(pdev, arc_ps2, i);
+               if (error) {
+                       while (--i >= 0)
+                               serio_unregister_port(arc_ps2->port[i].io);
+                       return error;
+               }
+       }
+
+       platform_set_drvdata(pdev, arc_ps2);
+
+       return 0;
+}
+
+static int arc_ps2_remove(struct platform_device *pdev)
+{
+       struct arc_ps2_data *arc_ps2 = platform_get_drvdata(pdev);
+       int i;
+
+       for (i = 0; i < ARC_PS2_PORTS; i++)
+               serio_unregister_port(arc_ps2->port[i].io);
+
+       dev_dbg(&pdev->dev, "interrupt count = %i\n", arc_ps2->total_int);
+       dev_dbg(&pdev->dev, "frame error count = %i\n", arc_ps2->frame_error);
+       dev_dbg(&pdev->dev, "buffer overflow count = %i\n",
+               arc_ps2->buf_overflow);
+
+       return 0;
+}
+
+static struct platform_driver arc_ps2_driver = {
+       .driver = {
+               .name   = "arc_ps2",
+               .owner  = THIS_MODULE,
+       },
+       .probe  = arc_ps2_probe,
+       .remove = arc_ps2_remove,
+};
+
+module_platform_driver(arc_ps2_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Pavel Sokolov <psokolov@synopsys.com>");
+MODULE_DESCRIPTION("ARC PS/2 Driver");
index 8528165..cfe549d 100644 (file)
@@ -175,7 +175,7 @@ static int __init ct82c710_detect(void)
        return 0;
 }
 
-static int __devinit ct82c710_probe(struct platform_device *dev)
+static int ct82c710_probe(struct platform_device *dev)
 {
        ct82c710_port = kzalloc(sizeof(struct serio), GFP_KERNEL);
        if (!ct82c710_port)
@@ -199,7 +199,7 @@ static int __devinit ct82c710_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit ct82c710_remove(struct platform_device *dev)
+static int ct82c710_remove(struct platform_device *dev)
 {
        serio_unregister_port(ct82c710_port);
 
@@ -212,7 +212,7 @@ static struct platform_driver ct82c710_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ct82c710_probe,
-       .remove         = __devexit_p(ct82c710_remove),
+       .remove         = ct82c710_remove,
 };
 
 
index 4225f5d..8d9ba0c 100644 (file)
@@ -327,7 +327,7 @@ static void gscps2_close(struct serio *port)
  * @return: success/error report
  */
 
-static int __devinit gscps2_probe(struct parisc_device *dev)
+static int gscps2_probe(struct parisc_device *dev)
 {
        struct gscps2port *ps2port;
        struct serio *serio;
@@ -414,7 +414,7 @@ fail_nomem:
  * @return: success/error report
  */
 
-static int __devexit gscps2_remove(struct parisc_device *dev)
+static int gscps2_remove(struct parisc_device *dev)
 {
        struct gscps2port *ps2port = dev_get_drvdata(&dev->dev);
 
@@ -444,7 +444,7 @@ static struct parisc_driver parisc_ps2_driver = {
        .name           = "gsc_ps2",
        .id_table       = gscps2_device_tbl,
        .probe          = gscps2_probe,
-       .remove         = __devexit_p(gscps2_remove),
+       .remove         = gscps2_remove,
 };
 
 static int __init gscps2_init(void)
index bfd3865..65605e4 100644 (file)
@@ -686,13 +686,12 @@ static int hilse_donode(hil_mlc *mlc)
                write_lock_irqsave(&mlc->lock, flags);
                pack = node->object.packet;
        out:
-               if (mlc->istarted)
-                       goto out2;
-               /* Prepare to receive input */
-               if ((node + 1)->act & HILSE_IN)
-                       hilse_setup_input(mlc, node + 1);
+               if (!mlc->istarted) {
+                       /* Prepare to receive input */
+                       if ((node + 1)->act & HILSE_IN)
+                               hilse_setup_input(mlc, node + 1);
+               }
 
-       out2:
                write_unlock_irqrestore(&mlc->lock, flags);
 
                if (down_trylock(&mlc->osem)) {
@@ -1010,8 +1009,6 @@ static int __init hil_mlc_init(void)
 static void __exit hil_mlc_exit(void)
 {
        del_timer_sync(&hil_mlcs_kicker);
-
-       tasklet_disable(&hil_mlcs_tasklet);
        tasklet_kill(&hil_mlcs_tasklet);
 }
 
index 5d48bb6..a5eed2a 100644 (file)
@@ -76,7 +76,7 @@ static inline int i8042_platform_init(void)
        if (check_legacy_ioport(I8042_DATA_REG))
                return -ENODEV;
 #endif
-#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__)
+#if !defined(__sh__) && !defined(__alpha__)
        if (!request_region(I8042_DATA_REG, 16, "i8042"))
                return -EBUSY;
 #endif
index 395a9af..d6aa4c6 100644 (file)
@@ -49,7 +49,7 @@ static inline void i8042_write_command(int val)
 #define OBP_PS2MS_NAME1                "kdmouse"
 #define OBP_PS2MS_NAME2                "mouse"
 
-static int __devinit sparc_i8042_probe(struct platform_device *op)
+static int sparc_i8042_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
 
@@ -80,7 +80,7 @@ static int __devinit sparc_i8042_probe(struct platform_device *op)
        return 0;
 }
 
-static int __devexit sparc_i8042_remove(struct platform_device *op)
+static int sparc_i8042_remove(struct platform_device *op)
 {
        of_iounmap(kbd_res, kbd_iobase, 8);
 
@@ -102,7 +102,7 @@ static struct platform_driver sparc_i8042_driver = {
                .of_match_table = sparc_i8042_match,
        },
        .probe          = sparc_i8042_probe,
-       .remove         = __devexit_p(sparc_i8042_remove),
+       .remove         = sparc_i8042_remove,
 };
 
 static int __init i8042_platform_init(void)
index 8656441..78e4de4 100644 (file)
@@ -1284,7 +1284,7 @@ static void __init i8042_register_ports(void)
        }
 }
 
-static void __devexit i8042_unregister_ports(void)
+static void i8042_unregister_ports(void)
 {
        int i;
 
@@ -1437,7 +1437,7 @@ static int __init i8042_probe(struct platform_device *dev)
        return error;
 }
 
-static int __devexit i8042_remove(struct platform_device *dev)
+static int i8042_remove(struct platform_device *dev)
 {
        i8042_unregister_ports();
        i8042_free_irqs();
@@ -1455,7 +1455,7 @@ static struct platform_driver i8042_driver = {
                .pm     = &i8042_pm_ops,
 #endif
        },
-       .remove         = __devexit_p(i8042_remove),
+       .remove         = i8042_remove,
        .shutdown       = i8042_shutdown,
 };
 
index 61da763..bc85e1c 100644 (file)
@@ -116,7 +116,7 @@ static void maceps2_close(struct serio *dev)
 }
 
 
-static struct serio * __devinit maceps2_allocate_port(int idx)
+static struct serio *maceps2_allocate_port(int idx)
 {
        struct serio *serio;
 
@@ -135,7 +135,7 @@ static struct serio * __devinit maceps2_allocate_port(int idx)
        return serio;
 }
 
-static int __devinit maceps2_probe(struct platform_device *dev)
+static int maceps2_probe(struct platform_device *dev)
 {
        maceps2_port[0] = maceps2_allocate_port(0);
        maceps2_port[1] = maceps2_allocate_port(1);
@@ -151,7 +151,7 @@ static int __devinit maceps2_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit maceps2_remove(struct platform_device *dev)
+static int maceps2_remove(struct platform_device *dev)
 {
        serio_unregister_port(maceps2_port[0]);
        serio_unregister_port(maceps2_port[1]);
@@ -165,7 +165,7 @@ static struct platform_driver maceps2_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = maceps2_probe,
-       .remove         = __devexit_p(maceps2_remove),
+       .remove         = maceps2_remove,
 };
 
 static int __init maceps2_init(void)
index 0c42497..76f8383 100644 (file)
@@ -127,7 +127,7 @@ static void pcips2_close(struct serio *io)
        free_irq(ps2if->dev->irq, ps2if);
 }
 
-static int __devinit pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct pcips2_data *ps2if;
        struct serio *serio;
@@ -176,7 +176,7 @@ static int __devinit pcips2_probe(struct pci_dev *dev, const struct pci_device_i
        return ret;
 }
 
-static void __devexit pcips2_remove(struct pci_dev *dev)
+static void pcips2_remove(struct pci_dev *dev)
 {
        struct pcips2_data *ps2if = pci_get_drvdata(dev);
 
@@ -212,7 +212,7 @@ static struct pci_driver pcips2_driver = {
        .name                   = "pcips2",
        .id_table               = pcips2_ids,
        .probe                  = pcips2_probe,
-       .remove                 = __devexit_p(pcips2_remove),
+       .remove                 = pcips2_remove,
 };
 
 module_pci_driver(pcips2_driver);
index 0c0df7f..70fe542 100644 (file)
@@ -122,7 +122,7 @@ static void q40kbd_close(struct serio *port)
        q40kbd_flush(q40kbd);
 }
 
-static int __devinit q40kbd_probe(struct platform_device *pdev)
+static int q40kbd_probe(struct platform_device *pdev)
 {
        struct q40kbd *q40kbd;
        struct serio *port;
@@ -168,7 +168,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit q40kbd_remove(struct platform_device *pdev)
+static int q40kbd_remove(struct platform_device *pdev)
 {
        struct q40kbd *q40kbd = platform_get_drvdata(pdev);
 
@@ -190,7 +190,7 @@ static struct platform_driver q40kbd_driver = {
                .name   = "q40kbd",
                .owner  = THIS_MODULE,
        },
-       .remove         = __devexit_p(q40kbd_remove),
+       .remove         = q40kbd_remove,
 };
 
 static int __init q40kbd_init(void)
index 2af5df6..567566a 100644 (file)
@@ -114,7 +114,7 @@ static void rpckbd_close(struct serio *port)
  * Allocate and initialize serio structure for subsequent registration
  * with serio core.
  */
-static int __devinit rpckbd_probe(struct platform_device *dev)
+static int rpckbd_probe(struct platform_device *dev)
 {
        struct rpckbd_data *rpckbd;
        struct serio *serio;
@@ -153,7 +153,7 @@ static int __devinit rpckbd_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit rpckbd_remove(struct platform_device *dev)
+static int rpckbd_remove(struct platform_device *dev)
 {
        struct serio *serio = platform_get_drvdata(dev);
        struct rpckbd_data *rpckbd = serio->port_data;
@@ -166,7 +166,7 @@ static int __devexit rpckbd_remove(struct platform_device *dev)
 
 static struct platform_driver rpckbd_driver = {
        .probe          = rpckbd_probe,
-       .remove         = __devexit_p(rpckbd_remove),
+       .remove         = rpckbd_remove,
        .driver         = {
                .name   = "kart",
                .owner  = THIS_MODULE,
index 3897667..b3e6889 100644 (file)
@@ -193,7 +193,7 @@ static void ps2_close(struct serio *io)
 /*
  * Clear the input buffer.
  */
-static void __devinit ps2_clear_input(struct ps2if *ps2if)
+static void ps2_clear_input(struct ps2if *ps2if)
 {
        int maxread = 100;
 
@@ -203,7 +203,7 @@ static void __devinit ps2_clear_input(struct ps2if *ps2if)
        }
 }
 
-static unsigned int __devinit ps2_test_one(struct ps2if *ps2if,
+static unsigned int ps2_test_one(struct ps2if *ps2if,
                                           unsigned int mask)
 {
        unsigned int val;
@@ -220,7 +220,7 @@ static unsigned int __devinit ps2_test_one(struct ps2if *ps2if,
  * Test the keyboard interface.  We basically check to make sure that
  * we can drive each line to the keyboard independently of each other.
  */
-static int __devinit ps2_test(struct ps2if *ps2if)
+static int ps2_test(struct ps2if *ps2if)
 {
        unsigned int stat;
        int ret = 0;
@@ -251,7 +251,7 @@ static int __devinit ps2_test(struct ps2if *ps2if)
 /*
  * Add one device to this driver.
  */
-static int __devinit ps2_probe(struct sa1111_dev *dev)
+static int ps2_probe(struct sa1111_dev *dev)
 {
        struct ps2if *ps2if;
        struct serio *serio;
@@ -334,7 +334,7 @@ static int __devinit ps2_probe(struct sa1111_dev *dev)
 /*
  * Remove one device from this driver.
  */
-static int __devexit ps2_remove(struct sa1111_dev *dev)
+static int ps2_remove(struct sa1111_dev *dev)
 {
        struct ps2if *ps2if = sa1111_get_drvdata(dev);
 
@@ -357,7 +357,7 @@ static struct sa1111_driver ps2_driver = {
        },
        .devid          = SA1111_DEVID_PS2,
        .probe          = ps2_probe,
-       .remove         = __devexit_p(ps2_remove),
+       .remove         = ps2_remove,
 };
 
 static int __init ps2_init(void)
index d0f7533..25fc597 100644 (file)
@@ -891,8 +891,6 @@ static int serio_bus_match(struct device *dev, struct device_driver *drv)
        return serio_match_port(serio_drv->id_table, serio);
 }
 
-#ifdef CONFIG_HOTPLUG
-
 #define SERIO_ADD_UEVENT_VAR(fmt, val...)                              \
        do {                                                            \
                int err = add_uevent_var(env, fmt, val);                \
@@ -920,15 +918,6 @@ static int serio_uevent(struct device *dev, struct kobj_uevent_env *env)
 }
 #undef SERIO_ADD_UEVENT_VAR
 
-#else
-
-static int serio_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
-       return -ENODEV;
-}
-
-#endif /* CONFIG_HOTPLUG */
-
 #ifdef CONFIG_PM
 static int serio_suspend(struct device *dev)
 {
index 1e983be..17be859 100644 (file)
@@ -233,7 +233,7 @@ static void sxps2_close(struct serio *pserio)
  * It returns 0, if the driver is bound to the PS/2 device, or a negative
  * value if there is an error.
  */
-static int __devinit xps2_of_probe(struct platform_device *ofdev)
+static int xps2_of_probe(struct platform_device *ofdev)
 {
        struct resource r_irq; /* Interrupt resources */
        struct resource r_mem; /* IO mem resources */
@@ -333,7 +333,7 @@ failed1:
  * if the driver module is being unloaded. It frees any resources allocated to
  * the device.
  */
-static int __devexit xps2_of_remove(struct platform_device *of_dev)
+static int xps2_of_remove(struct platform_device *of_dev)
 {
        struct xps2data *drvdata = platform_get_drvdata(of_dev);
        struct resource r_mem; /* IO mem resources */
@@ -355,7 +355,7 @@ static int __devexit xps2_of_remove(struct platform_device *of_dev)
 }
 
 /* Match table for of_platform binding */
-static const struct of_device_id xps2_of_match[] __devinitconst = {
+static const struct of_device_id xps2_of_match[] = {
        { .compatible = "xlnx,xps-ps2-1.00.a", },
        { /* end of list */ },
 };
@@ -368,7 +368,7 @@ static struct platform_driver xps2_of_driver = {
                .of_match_table = xps2_of_match,
        },
        .probe          = xps2_of_probe,
-       .remove         = __devexit_p(xps2_of_remove),
+       .remove         = xps2_of_remove,
 };
 module_platform_driver(xps2_of_driver);
 
index 858ad44..f92d34f 100644 (file)
@@ -386,23 +386,40 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                if (usage == WCM_DESKTOP) {
                                        if (finger) {
                                                features->device_type = BTN_TOOL_FINGER;
-                                               if (features->type == TABLETPC2FG) {
-                                                       /* need to reset back */
+
+                                               switch (features->type) {
+                                               case TABLETPC2FG:
                                                        features->pktlen = WACOM_PKGLEN_TPC2FG;
-                                               }
+                                                       break;
 
-                                               if (features->type == MTSCREEN || features->type == WACOM_24HDT)
+                                               case MTSCREEN:
+                                               case WACOM_24HDT:
                                                        features->pktlen = WACOM_PKGLEN_MTOUCH;
+                                                       break;
 
-                                               if (features->type == BAMBOO_PT) {
-                                                       /* need to reset back */
+                                               case MTTPC:
+                                                       features->pktlen = WACOM_PKGLEN_MTTPC;
+                                                       break;
+
+                                               case BAMBOO_PT:
                                                        features->pktlen = WACOM_PKGLEN_BBTOUCH;
+                                                       break;
+
+                                               default:
+                                                       features->pktlen = WACOM_PKGLEN_GRAPHIRE;
+                                                       break;
+                                               }
+
+                                               switch (features->type) {
+                                               case BAMBOO_PT:
                                                        features->x_phy =
                                                                get_unaligned_le16(&report[i + 5]);
                                                        features->x_max =
                                                                get_unaligned_le16(&report[i + 8]);
                                                        i += 15;
-                                               } else if (features->type == WACOM_24HDT) {
+                                                       break;
+
+                                               case WACOM_24HDT:
                                                        features->x_max =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        features->x_phy =
@@ -410,7 +427,9 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        features->unit = report[i - 1];
                                                        features->unitExpo = report[i - 3];
                                                        i += 12;
-                                               } else {
+                                                       break;
+
+                                               default:
                                                        features->x_max =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        features->x_phy =
@@ -418,10 +437,11 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        features->unit = report[i + 9];
                                                        features->unitExpo = report[i + 11];
                                                        i += 12;
+                                                       break;
                                                }
                                        } else if (pen) {
                                                /* penabled only accepts exact bytes of data */
-                                               if (features->type == TABLETPC2FG)
+                                               if (features->type >= TABLETPC)
                                                        features->pktlen = WACOM_PKGLEN_GRAPHIRE;
                                                features->device_type = BTN_TOOL_PEN;
                                                features->x_max =
@@ -434,32 +454,40 @@ static int wacom_parse_hid(struct usb_interface *intf,
                        case HID_USAGE_Y:
                                if (usage == WCM_DESKTOP) {
                                        if (finger) {
-                                               int type = features->type;
-
-                                               if (type == TABLETPC2FG || type == MTSCREEN) {
+                                               switch (features->type) {
+                                               case TABLETPC2FG:
+                                               case MTSCREEN:
+                                               case MTTPC:
                                                        features->y_max =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        features->y_phy =
                                                                get_unaligned_le16(&report[i + 6]);
                                                        i += 7;
-                                               } else if (type == WACOM_24HDT) {
+                                                       break;
+
+                                               case WACOM_24HDT:
                                                        features->y_max =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        features->y_phy =
                                                                get_unaligned_le16(&report[i - 2]);
                                                        i += 7;
-                                               } else if (type == BAMBOO_PT) {
+                                                       break;
+
+                                               case BAMBOO_PT:
                                                        features->y_phy =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        features->y_max =
                                                                get_unaligned_le16(&report[i + 6]);
                                                        i += 12;
-                                               } else {
+                                                       break;
+
+                                               default:
                                                        features->y_max =
                                                                features->x_max;
                                                        features->y_phy =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        i += 4;
+                                                       break;
                                                }
                                        } else if (pen) {
                                                features->y_max =
index 0a67031..264138f 100644 (file)
@@ -467,9 +467,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
        /* general pen packet */
        if ((data[1] & 0xb8) == 0xa0) {
                t = (data[6] << 2) | ((data[7] >> 6) & 3);
-               if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
-                    (features->type >= INTUOS5S && features->type <= INTUOS5L) ||
-                   (features->type >= WACOM_21UX2 && features->type <= WACOM_24HD)) {
+               if (features->type >= INTUOS4S && features->type <= WACOM_24HD) {
                        t = (t << 1) | (data[1] & 1);
                }
                input_report_abs(input, ABS_PRESSURE, t);
@@ -877,6 +875,11 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        int i;
        int current_num_contacts = data[2];
        int contacts_to_send = 0;
+       int x_offset = 0;
+
+       /* MTTPC does not support Height and Width */
+       if (wacom->features.type == MTTPC)
+               x_offset = -4;
 
        /*
         * First packet resets the counter since only the first
@@ -889,7 +892,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        contacts_to_send = min(5, wacom->num_contacts_left);
 
        for (i = 0; i < contacts_to_send; i++) {
-               int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3;
+               int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
                bool touch = data[offset] & 0x1;
                int id = le16_to_cpup((__le16 *)&data[offset + 1]);
                int slot = find_slot_from_contactid(wacom, id);
@@ -900,8 +903,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
                input_mt_slot(input, slot);
                input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
                if (touch) {
-                       int x = le16_to_cpup((__le16 *)&data[offset + 7]);
-                       int y = le16_to_cpup((__le16 *)&data[offset + 9]);
+                       int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]);
+                       int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]);
                        input_report_abs(input, ABS_MT_POSITION_X, x);
                        input_report_abs(input, ABS_MT_POSITION_Y, y);
                }
@@ -1336,6 +1339,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
        case TABLETPCE:
        case TABLETPC2FG:
        case MTSCREEN:
+       case MTTPC:
                sync = wacom_tpc_irq(wacom_wac, len);
                break;
 
@@ -1657,6 +1661,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
                /* fall through */
 
        case MTSCREEN:
+       case MTTPC:
                if (features->device_type == BTN_TOOL_FINGER) {
                        wacom_wac->slots = kmalloc(features->touch_max *
                                                        sizeof(int),
@@ -2018,6 +2023,15 @@ static const struct wacom_features wacom_features_0xED =
 static const struct wacom_features wacom_features_0xEF =
        { "Wacom ISDv4 EF",       WACOM_PKGLEN_GRAPHIRE,  26202, 16325,  255,
          0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x100 =
+       { "Wacom ISDv4 100",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255,
+         0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x101 =
+       { "Wacom ISDv4 101",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255,
+         0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x4001 =
+       { "Wacom ISDv4 4001",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255,
+         0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x47 =
        { "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023,
          31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2034,7 +2048,8 @@ static const struct wacom_features wacom_features_0xD1 =
          .touch_max = 2 };
 static const struct wacom_features wacom_features_0xD2 =
        { "Wacom Bamboo Craft",   WACOM_PKGLEN_BBFUN,     14720,  9200, 1023,
-         31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+         31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+         .touch_max = 2 };
 static const struct wacom_features wacom_features_0xD3 =
        { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN,     21648, 13700, 1023,
          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
@@ -2194,6 +2209,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0xEC) },
        { USB_DEVICE_WACOM(0xED) },
        { USB_DEVICE_WACOM(0xEF) },
+       { USB_DEVICE_WACOM(0x100) },
+       { USB_DEVICE_WACOM(0x101) },
+       { USB_DEVICE_WACOM(0x4001) },
        { USB_DEVICE_WACOM(0x47) },
        { USB_DEVICE_WACOM(0xF4) },
        { USB_DEVICE_WACOM(0xF8) },
index 345f1e7..9396d77 100644 (file)
@@ -26,6 +26,7 @@
 #define WACOM_PKGLEN_BBPEN     10
 #define WACOM_PKGLEN_WIRELESS  32
 #define WACOM_PKGLEN_MTOUCH    62
+#define WACOM_PKGLEN_MTTPC     40
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
@@ -88,6 +89,7 @@ enum {
        TABLETPCE,
        TABLETPC2FG,
        MTSCREEN,
+       MTTPC,
        MAX_TYPE
 };
 
index 326218d..c706894 100644 (file)
@@ -115,7 +115,7 @@ static void pm860x_touch_close(struct input_dev *dev)
 }
 
 #ifdef CONFIG_OF
-static int __devinit pm860x_touch_dt_init(struct platform_device *pdev,
+static int pm860x_touch_dt_init(struct platform_device *pdev,
                                          struct pm860x_chip *chip,
                                          int *res_x)
 {
@@ -169,7 +169,7 @@ static int __devinit pm860x_touch_dt_init(struct platform_device *pdev,
 #define pm860x_touch_dt_init(x, y, z)  (-1)
 #endif
 
-static int __devinit pm860x_touch_probe(struct platform_device *pdev)
+static int pm860x_touch_probe(struct platform_device *pdev)
 {
        struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
        struct pm860x_touch_pdata *pdata = pdev->dev.platform_data;
@@ -293,7 +293,7 @@ out:
        return ret;
 }
 
-static int __devexit pm860x_touch_remove(struct platform_device *pdev)
+static int pm860x_touch_remove(struct platform_device *pdev)
 {
        struct pm860x_touch *touch = platform_get_drvdata(pdev);
 
@@ -310,7 +310,7 @@ static struct platform_driver pm860x_touch_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = pm860x_touch_probe,
-       .remove = __devexit_p(pm860x_touch_remove),
+       .remove = pm860x_touch_remove,
 };
 module_platform_driver(pm860x_touch_driver);
 
index 0c45cad..515cfe7 100644 (file)
@@ -111,18 +111,6 @@ config TOUCHSCREEN_AUO_PIXCIR
          To compile this driver as a module, choose M here: the
          module will be called auo-pixcir-ts.
 
-config TOUCHSCREEN_BITSY
-       tristate "Compaq iPAQ H3600 (Bitsy) touchscreen"
-       depends on SA1100_BITSY
-       select SERIO
-       help
-         Say Y here if you have the h3600 (Bitsy) touchscreen.
-
-         If unsure, say N.
-
-         To compile this driver as a module, choose M here: the
-         module will be called h3600_ts_input.
-
 config TOUCHSCREEN_BU21013
        tristate "BU21013 based touch panel controllers"
        depends on I2C
index 7c4c78e..6bfbeab 100644 (file)
@@ -15,7 +15,6 @@ obj-$(CONFIG_TOUCHSCREEN_ADS7846)     += ads7846.o
 obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT)    += atmel_mxt_ts.o
 obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o
 obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR)   += auo-pixcir-ts.o
-obj-$(CONFIG_TOUCHSCREEN_BITSY)                += h3600_ts_input.o
 obj-$(CONFIG_TOUCHSCREEN_BU21013)      += bu21013_ts.o
 obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110)   += cy8ctmg110_ts.o
 obj-$(CONFIG_TOUCHSCREEN_CYTTSP_CORE)  += cyttsp_core.o
index 2c76921..23fa829 100644 (file)
@@ -682,7 +682,7 @@ static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)
        }
 }
 
-static int __devinit ad7877_probe(struct spi_device *spi)
+static int ad7877_probe(struct spi_device *spi)
 {
        struct ad7877                   *ts;
        struct input_dev                *input_dev;
@@ -810,7 +810,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit ad7877_remove(struct spi_device *spi)
+static int ad7877_remove(struct spi_device *spi)
 {
        struct ad7877 *ts = dev_get_drvdata(&spi->dev);
 
@@ -857,7 +857,7 @@ static struct spi_driver ad7877_driver = {
                .pm     = &ad7877_pm,
        },
        .probe          = ad7877_probe,
-       .remove         = __devexit_p(ad7877_remove),
+       .remove         = ad7877_remove,
 };
 
 module_spi_driver(ad7877_driver);
index 3054354..dcf3907 100644 (file)
@@ -54,7 +54,7 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = {
        .write          = ad7879_i2c_write,
 };
 
-static int __devinit ad7879_i2c_probe(struct i2c_client *client,
+static int ad7879_i2c_probe(struct i2c_client *client,
                                      const struct i2c_device_id *id)
 {
        struct ad7879 *ts;
@@ -75,7 +75,7 @@ static int __devinit ad7879_i2c_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit ad7879_i2c_remove(struct i2c_client *client)
+static int ad7879_i2c_remove(struct i2c_client *client)
 {
        struct ad7879 *ts = i2c_get_clientdata(client);
 
@@ -98,7 +98,7 @@ static struct i2c_driver ad7879_i2c_driver = {
                .pm     = &ad7879_pm_ops,
        },
        .probe          = ad7879_i2c_probe,
-       .remove         = __devexit_p(ad7879_i2c_remove),
+       .remove         = ad7879_i2c_remove,
        .id_table       = ad7879_id,
 };
 
index db49abf..606da5b 100644 (file)
@@ -110,7 +110,7 @@ static const struct ad7879_bus_ops ad7879_spi_bus_ops = {
        .write          = ad7879_spi_write,
 };
 
-static int __devinit ad7879_spi_probe(struct spi_device *spi)
+static int ad7879_spi_probe(struct spi_device *spi)
 {
        struct ad7879 *ts;
        int err;
@@ -137,7 +137,7 @@ static int __devinit ad7879_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit ad7879_spi_remove(struct spi_device *spi)
+static int ad7879_spi_remove(struct spi_device *spi)
 {
        struct ad7879 *ts = spi_get_drvdata(spi);
 
@@ -154,7 +154,7 @@ static struct spi_driver ad7879_spi_driver = {
                .pm     = &ad7879_pm_ops,
        },
        .probe          = ad7879_spi_probe,
-       .remove         = __devexit_p(ad7879_spi_remove),
+       .remove         = ad7879_spi_remove,
 };
 
 module_spi_driver(ad7879_spi_driver);
index 78e5d9a..4f702b3 100644 (file)
@@ -955,7 +955,7 @@ static int ads7846_resume(struct device *dev)
 
 static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume);
 
-static int __devinit ads7846_setup_pendown(struct spi_device *spi,
+static int ads7846_setup_pendown(struct spi_device *spi,
                                           struct ads7846 *ts)
 {
        struct ads7846_platform_data *pdata = spi->dev.platform_data;
@@ -997,7 +997,7 @@ static int __devinit ads7846_setup_pendown(struct spi_device *spi,
  * Set up the transfers to read touchscreen state; this assumes we
  * use formula #2 for pressure, not #3.
  */
-static void __devinit ads7846_setup_spi_msg(struct ads7846 *ts,
+static void ads7846_setup_spi_msg(struct ads7846 *ts,
                                const struct ads7846_platform_data *pdata)
 {
        struct spi_message *m = &ts->msg[0];
@@ -1196,7 +1196,7 @@ static void __devinit ads7846_setup_spi_msg(struct ads7846 *ts,
        spi_message_add_tail(x, m);
 }
 
-static int __devinit ads7846_probe(struct spi_device *spi)
+static int ads7846_probe(struct spi_device *spi)
 {
        struct ads7846 *ts;
        struct ads7846_packet *packet;
@@ -1390,7 +1390,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        return err;
 }
 
-static int __devexit ads7846_remove(struct spi_device *spi)
+static int ads7846_remove(struct spi_device *spi)
 {
        struct ads7846 *ts = dev_get_drvdata(&spi->dev);
 
@@ -1434,7 +1434,7 @@ static struct spi_driver ads7846_driver = {
                .pm     = &ads7846_pm,
        },
        .probe          = ads7846_probe,
-       .remove         = __devexit_p(ads7846_remove),
+       .remove         = ads7846_remove,
 };
 
 module_spi_driver(ads7846_driver);
index 1df2396..d04f810 100644 (file)
@@ -1095,7 +1095,7 @@ static void mxt_input_close(struct input_dev *dev)
        mxt_stop(data);
 }
 
-static int __devinit mxt_probe(struct i2c_client *client,
+static int mxt_probe(struct i2c_client *client,
                const struct i2c_device_id *id)
 {
        const struct mxt_platform_data *pdata = client->dev.platform_data;
@@ -1200,7 +1200,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit mxt_remove(struct i2c_client *client)
+static int mxt_remove(struct i2c_client *client)
 {
        struct mxt_data *data = i2c_get_clientdata(client);
 
@@ -1270,7 +1270,7 @@ static struct i2c_driver mxt_driver = {
                .pm     = &mxt_pm_ops,
        },
        .probe          = mxt_probe,
-       .remove         = __devexit_p(mxt_remove),
+       .remove         = mxt_remove,
        .id_table       = mxt_id,
 };
 
index ea392ee..95f6785 100644 (file)
@@ -177,7 +177,7 @@ static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev)
  * The functions for inserting/removing us as a module.
  */
 
-static int __devinit atmel_tsadcc_probe(struct platform_device *pdev)
+static int atmel_tsadcc_probe(struct platform_device *pdev)
 {
        struct atmel_tsadcc     *ts_dev;
        struct input_dev        *input_dev;
@@ -323,7 +323,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit atmel_tsadcc_remove(struct platform_device *pdev)
+static int atmel_tsadcc_remove(struct platform_device *pdev)
 {
        struct atmel_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev);
        struct resource *res;
@@ -346,7 +346,7 @@ static int __devexit atmel_tsadcc_remove(struct platform_device *pdev)
 
 static struct platform_driver atmel_tsadcc_driver = {
        .probe          = atmel_tsadcc_probe,
-       .remove         = __devexit_p(atmel_tsadcc_remove),
+       .remove         = atmel_tsadcc_remove,
        .driver         = {
                .name   = "atmel_tsadcc",
        },
index c7047b6..c6e19a9 100644 (file)
@@ -286,7 +286,7 @@ static int auo_pixcir_power_mode(struct auo_pixcir_ts *ts, int mode)
        return 0;
 }
 
-static __devinit int auo_pixcir_int_config(struct auo_pixcir_ts *ts,
+static int auo_pixcir_int_config(struct auo_pixcir_ts *ts,
                                           int int_setting)
 {
        struct i2c_client *client = ts->client;
@@ -482,7 +482,7 @@ unlock:
 static SIMPLE_DEV_PM_OPS(auo_pixcir_pm_ops, auo_pixcir_suspend,
                         auo_pixcir_resume);
 
-static int __devinit auo_pixcir_probe(struct i2c_client *client,
+static int auo_pixcir_probe(struct i2c_client *client,
                                      const struct i2c_device_id *id)
 {
        const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
@@ -599,7 +599,7 @@ err_gpio_int:
        return ret;
 }
 
-static int __devexit auo_pixcir_remove(struct i2c_client *client)
+static int auo_pixcir_remove(struct i2c_client *client)
 {
        struct auo_pixcir_ts *ts = i2c_get_clientdata(client);
        const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
@@ -631,7 +631,7 @@ static struct i2c_driver auo_pixcir_driver = {
                .pm     = &auo_pixcir_pm_ops,
        },
        .probe          = auo_pixcir_probe,
-       .remove         = __devexit_p(auo_pixcir_remove),
+       .remove         = auo_pixcir_remove,
        .id_table       = auo_pixcir_idtable,
 };
 
index 5c487d2..b9b5dda 100644 (file)
@@ -14,6 +14,9 @@
 #include <linux/slab.h>
 #include <linux/regulator/consumer.h>
 #include <linux/module.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
 
 #define PEN_DOWN_INTR  0
 #define MAX_FINGERS    2
 struct bu21013_ts_data {
        struct i2c_client *client;
        wait_queue_head_t wait;
-       bool touch_stopped;
        const struct bu21013_platform_device *chip;
        struct input_dev *in_dev;
-       unsigned int intr_pin;
        struct regulator *regulator;
+       unsigned int irq;
+       unsigned int intr_pin;
+       bool touch_stopped;
 };
 
 /**
@@ -262,7 +266,7 @@ static irqreturn_t bu21013_gpio_irq(int irq, void *device_data)
                        return IRQ_NONE;
                }
 
-               data->intr_pin = data->chip->irq_read_val();
+               data->intr_pin = gpio_get_value(data->chip->touch_pin);
                if (data->intr_pin == PEN_DOWN_INTR)
                        wait_event_timeout(data->wait, data->touch_stopped,
                                           msecs_to_jiffies(2));
@@ -418,8 +422,70 @@ static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data)
 {
        bu21013_data->touch_stopped = true;
        wake_up(&bu21013_data->wait);
-       free_irq(bu21013_data->chip->irq, bu21013_data);
+       free_irq(bu21013_data->irq, bu21013_data);
+}
+
+/**
+ * bu21013_cs_disable() - deconfigures the touch panel controller
+ * @bu21013_data: device structure pointer
+ *
+ * This function is used to deconfigure the chip selection
+ * for touch panel controller.
+ */
+static void bu21013_cs_disable(struct bu21013_ts_data *bu21013_data)
+{
+       int error;
+
+       error = gpio_direction_output(bu21013_data->chip->cs_pin, 0);
+       if (error < 0)
+               dev_warn(&bu21013_data->client->dev,
+                        "%s: gpio direction failed, error: %d\n",
+                        __func__, error);
+       else
+               gpio_set_value(bu21013_data->chip->cs_pin, 0);
+
+       gpio_free(bu21013_data->chip->cs_pin);
+}
+
+#ifdef CONFIG_OF
+static const struct bu21013_platform_device *
+bu21013_parse_dt(struct device *dev)
+{
+       struct device_node *np = dev->of_node;
+       struct bu21013_platform_device *pdata;
+
+       if (!np) {
+               dev_err(dev, "no device tree or platform data\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return ERR_PTR(-ENOMEM);
+
+       pdata->y_flip = pdata->x_flip = false;
+
+       pdata->x_flip = of_property_read_bool(np, "rohm,flip-x");
+       pdata->y_flip = of_property_read_bool(np, "rohm,flip-y");
+
+       of_property_read_u32(np, "rohm,touch-max-x", &pdata->touch_x_max);
+       of_property_read_u32(np, "rohm,touch-max-y", &pdata->touch_y_max);
+
+       pdata->touch_pin = of_get_named_gpio(np, "touch-gpio", 0);
+       pdata->cs_pin = of_get_named_gpio(np, "reset-gpio", 0);
+
+       pdata->ext_clk = false;
+
+       return pdata;
 }
+#else
+static inline const struct bu21013_platform_device *
+bu21013_parse_dt(struct device *dev)
+{
+       dev_err(dev, "no platform data available\n");
+       return ERR_PTR(-EINVAL);
+}
+#endif
 
 /**
  * bu21013_probe() - initializes the i2c-client touchscreen driver
@@ -429,13 +495,13 @@ static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data)
  * This function used to initializes the i2c-client touchscreen
  * driver and returns integer.
  */
-static int __devinit bu21013_probe(struct i2c_client *client,
-                                       const struct i2c_device_id *id)
+static int bu21013_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
+       const struct bu21013_platform_device *pdata =
+                                       dev_get_platdata(&client->dev);
        struct bu21013_ts_data *bu21013_data;
        struct input_dev *in_dev;
-       const struct bu21013_platform_device *pdata =
-                                       client->dev.platform_data;
        int error;
 
        if (!i2c_check_functionality(client->adapter,
@@ -445,7 +511,13 @@ static int __devinit bu21013_probe(struct i2c_client *client,
        }
 
        if (!pdata) {
-               dev_err(&client->dev, "platform data not defined\n");
+               pdata = bu21013_parse_dt(&client->dev);
+               if (IS_ERR(pdata))
+                       return PTR_ERR(pdata);
+       }
+
+       if (!gpio_is_valid(pdata->touch_pin)) {
+               dev_err(&client->dev, "invalid touch_pin supplied\n");
                return -EINVAL;
        }
 
@@ -460,8 +532,9 @@ static int __devinit bu21013_probe(struct i2c_client *client,
        bu21013_data->in_dev = in_dev;
        bu21013_data->chip = pdata;
        bu21013_data->client = client;
+       bu21013_data->irq = gpio_to_irq(pdata->touch_pin);
 
-       bu21013_data->regulator = regulator_get(&client->dev, "V-TOUCH");
+       bu21013_data->regulator = regulator_get(&client->dev, "avdd");
        if (IS_ERR(bu21013_data->regulator)) {
                dev_err(&client->dev, "regulator_get failed\n");
                error = PTR_ERR(bu21013_data->regulator);
@@ -478,12 +551,11 @@ static int __devinit bu21013_probe(struct i2c_client *client,
        init_waitqueue_head(&bu21013_data->wait);
 
        /* configure the gpio pins */
-       if (pdata->cs_en) {
-               error = pdata->cs_en(pdata->cs_pin);
-               if (error < 0) {
-                       dev_err(&client->dev, "chip init failed\n");
-                       goto err_disable_regulator;
-               }
+       error = gpio_request_one(pdata->cs_pin, GPIOF_OUT_INIT_HIGH,
+                                "touchp_reset");
+       if (error < 0) {
+               dev_err(&client->dev, "Unable to request gpio reset_pin\n");
+               goto err_disable_regulator;
        }
 
        /* configure the touch panel controller */
@@ -508,12 +580,13 @@ static int __devinit bu21013_probe(struct i2c_client *client,
                                                pdata->touch_y_max, 0, 0);
        input_set_drvdata(in_dev, bu21013_data);
 
-       error = request_threaded_irq(pdata->irq, NULL, bu21013_gpio_irq,
+       error = request_threaded_irq(bu21013_data->irq, NULL, bu21013_gpio_irq,
                                     IRQF_TRIGGER_FALLING | IRQF_SHARED |
                                        IRQF_ONESHOT,
                                     DRIVER_TP, bu21013_data);
        if (error) {
-               dev_err(&client->dev, "request irq %d failed\n", pdata->irq);
+               dev_err(&client->dev, "request irq %d failed\n",
+                       bu21013_data->irq);
                goto err_cs_disable;
        }
 
@@ -531,7 +604,7 @@ static int __devinit bu21013_probe(struct i2c_client *client,
 err_free_irq:
        bu21013_free_irq(bu21013_data);
 err_cs_disable:
-       pdata->cs_dis(pdata->cs_pin);
+       bu21013_cs_disable(bu21013_data);
 err_disable_regulator:
        regulator_disable(bu21013_data->regulator);
 err_put_regulator:
@@ -549,13 +622,13 @@ err_free_mem:
  * This function uses to remove the i2c-client
  * touchscreen driver and returns integer.
  */
-static int __devexit bu21013_remove(struct i2c_client *client)
+static int bu21013_remove(struct i2c_client *client)
 {
        struct bu21013_ts_data *bu21013_data = i2c_get_clientdata(client);
 
        bu21013_free_irq(bu21013_data);
 
-       bu21013_data->chip->cs_dis(bu21013_data->chip->cs_pin);
+       bu21013_cs_disable(bu21013_data);
 
        input_unregister_device(bu21013_data->in_dev);
 
@@ -584,9 +657,9 @@ static int bu21013_suspend(struct device *dev)
 
        bu21013_data->touch_stopped = true;
        if (device_may_wakeup(&client->dev))
-               enable_irq_wake(bu21013_data->chip->irq);
+               enable_irq_wake(bu21013_data->irq);
        else
-               disable_irq(bu21013_data->chip->irq);
+               disable_irq(bu21013_data->irq);
 
        regulator_disable(bu21013_data->regulator);
 
@@ -621,9 +694,9 @@ static int bu21013_resume(struct device *dev)
        bu21013_data->touch_stopped = false;
 
        if (device_may_wakeup(&client->dev))
-               disable_irq_wake(bu21013_data->chip->irq);
+               disable_irq_wake(bu21013_data->irq);
        else
-               enable_irq(bu21013_data->chip->irq);
+               enable_irq(bu21013_data->irq);
 
        return 0;
 }
@@ -649,7 +722,7 @@ static struct i2c_driver bu21013_driver = {
 #endif
        },
        .probe          =       bu21013_probe,
-       .remove         =       __devexit_p(bu21013_remove),
+       .remove         =       bu21013_remove,
        .id_table       =       bu21013_id,
 };
 
index 464f1bf..96e0eed 100644 (file)
@@ -99,9 +99,18 @@ static int cy8ctmg110_read_regs(struct cy8ctmg110 *tsc,
        int ret;
        struct i2c_msg msg[2] = {
                /* first write slave position to i2c devices */
-               { client->addr, 0, 1, &cmd },
+               {
+                       .addr = client->addr,
+                       .len = 1,
+                       .buf = &cmd
+               },
                /* Second read data from position */
-               { client->addr, I2C_M_RD, len, data }
+               {
+                       .addr = client->addr,
+                       .flags = I2C_M_RD,
+                       .len = len,
+                       .buf = data
+               }
        };
 
        ret = i2c_transfer(client->adapter, msg, 2);
@@ -166,7 +175,7 @@ static irqreturn_t cy8ctmg110_irq_thread(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit cy8ctmg110_probe(struct i2c_client *client,
+static int cy8ctmg110_probe(struct i2c_client *client,
                                        const struct i2c_device_id *id)
 {
        const struct cy8ctmg110_pdata *pdata = client->dev.platform_data;
@@ -314,7 +323,7 @@ static int cy8ctmg110_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(cy8ctmg110_pm, cy8ctmg110_suspend, cy8ctmg110_resume);
 #endif
 
-static int __devexit cy8ctmg110_remove(struct i2c_client *client)
+static int cy8ctmg110_remove(struct i2c_client *client)
 {
        struct cy8ctmg110 *ts = i2c_get_clientdata(client);
 
@@ -348,7 +357,7 @@ static struct i2c_driver cy8ctmg110_driver = {
        },
        .id_table       = cy8ctmg110_idtable,
        .probe          = cy8ctmg110_probe,
-       .remove         = __devexit_p(cy8ctmg110_remove),
+       .remove         = cy8ctmg110_remove,
 };
 
 module_i2c_driver(cy8ctmg110_driver);
index 2af1d0c..4dbdf44 100644 (file)
@@ -81,7 +81,7 @@ static const struct cyttsp_bus_ops cyttsp_i2c_bus_ops = {
        .read           = cyttsp_i2c_read_block_data,
 };
 
-static int __devinit cyttsp_i2c_probe(struct i2c_client *client,
+static int cyttsp_i2c_probe(struct i2c_client *client,
                                      const struct i2c_device_id *id)
 {
        struct cyttsp *ts;
@@ -102,7 +102,7 @@ static int __devinit cyttsp_i2c_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit cyttsp_i2c_remove(struct i2c_client *client)
+static int cyttsp_i2c_remove(struct i2c_client *client)
 {
        struct cyttsp *ts = i2c_get_clientdata(client);
 
@@ -124,7 +124,7 @@ static struct i2c_driver cyttsp_i2c_driver = {
                .pm     = &cyttsp_pm_ops,
        },
        .probe          = cyttsp_i2c_probe,
-       .remove         = __devexit_p(cyttsp_i2c_remove),
+       .remove         = cyttsp_i2c_remove,
        .id_table       = cyttsp_i2c_id,
 };
 
index 9f26341..638e203 100644 (file)
@@ -147,7 +147,7 @@ static const struct cyttsp_bus_ops cyttsp_spi_bus_ops = {
        .read           = cyttsp_spi_read_block_data,
 };
 
-static int __devinit cyttsp_spi_probe(struct spi_device *spi)
+static int cyttsp_spi_probe(struct spi_device *spi)
 {
        struct cyttsp *ts;
        int error;
@@ -172,7 +172,7 @@ static int __devinit cyttsp_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit cyttsp_spi_remove(struct spi_device *spi)
+static int cyttsp_spi_remove(struct spi_device *spi)
 {
        struct cyttsp *ts = spi_get_drvdata(spi);
 
@@ -188,7 +188,7 @@ static struct spi_driver cyttsp_spi_driver = {
                .pm     = &cyttsp_pm_ops,
        },
        .probe  = cyttsp_spi_probe,
-       .remove = __devexit_p(cyttsp_spi_remove),
+       .remove = cyttsp_spi_remove,
 };
 
 module_spi_driver(cyttsp_spi_driver);
index 36b65cf..34ad841 100644 (file)
@@ -297,7 +297,7 @@ static void da9034_touch_close(struct input_dev *dev)
 }
 
 
-static int __devinit da9034_touch_probe(struct platform_device *pdev)
+static int da9034_touch_probe(struct platform_device *pdev)
 {
        struct da9034_touch_pdata *pdata = pdev->dev.platform_data;
        struct da9034_touch *touch;
@@ -361,7 +361,7 @@ err_free_touch:
        return ret;
 }
 
-static int __devexit da9034_touch_remove(struct platform_device *pdev)
+static int da9034_touch_remove(struct platform_device *pdev)
 {
        struct da9034_touch *touch = platform_get_drvdata(pdev);
 
@@ -377,7 +377,7 @@ static struct platform_driver da9034_touch_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = da9034_touch_probe,
-       .remove         = __devexit_p(da9034_touch_remove),
+       .remove         = da9034_touch_remove,
 };
 module_platform_driver(da9034_touch_driver);
 
index 53133ef..8f561e2 100644 (file)
@@ -141,7 +141,7 @@ static void da9052_ts_pen_work(struct work_struct *work)
        }
 }
 
-static int __devinit da9052_ts_configure_gpio(struct da9052 *da9052)
+static int da9052_ts_configure_gpio(struct da9052 *da9052)
 {
        int error;
 
@@ -160,7 +160,7 @@ static int __devinit da9052_ts_configure_gpio(struct da9052 *da9052)
        return 0;
 }
 
-static int __devinit da9052_configure_tsi(struct da9052_tsi *tsi)
+static int da9052_configure_tsi(struct da9052_tsi *tsi)
 {
        int error;
 
@@ -227,7 +227,7 @@ static void da9052_ts_input_close(struct input_dev *input_dev)
        da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 1 << 1, 0);
 }
 
-static int __devinit da9052_ts_probe(struct platform_device *pdev)
+static int da9052_ts_probe(struct platform_device *pdev)
 {
        struct da9052 *da9052;
        struct da9052_tsi *tsi;
@@ -317,7 +317,7 @@ err_free_mem:
        return error;
 }
 
-static int  __devexit da9052_ts_remove(struct platform_device *pdev)
+static int  da9052_ts_remove(struct platform_device *pdev)
 {
        struct da9052_tsi *tsi = platform_get_drvdata(pdev);
 
@@ -336,7 +336,7 @@ static int  __devexit da9052_ts_remove(struct platform_device *pdev)
 
 static struct platform_driver da9052_tsi_driver = {
        .probe  = da9052_ts_probe,
-       .remove = __devexit_p(da9052_ts_remove),
+       .remove = da9052_ts_remove,
        .driver = {
                .name   = "da9052-tsi",
                .owner  = THIS_MODULE,
index 099d144..a917015 100644 (file)
@@ -491,14 +491,6 @@ static int edt_ft5x06_debugfs_mode_set(void *data, u64 mode)
 DEFINE_SIMPLE_ATTRIBUTE(debugfs_mode_fops, edt_ft5x06_debugfs_mode_get,
                        edt_ft5x06_debugfs_mode_set, "%llu\n");
 
-static int edt_ft5x06_debugfs_raw_data_open(struct inode *inode,
-                                           struct file *file)
-{
-       file->private_data = inode->i_private;
-
-       return 0;
-}
-
 static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file,
                                char __user *buf, size_t count, loff_t *off)
 {
@@ -579,11 +571,11 @@ out:
 
 
 static const struct file_operations debugfs_raw_data_fops = {
-       .open = edt_ft5x06_debugfs_raw_data_open,
+       .open = simple_open,
        .read = edt_ft5x06_debugfs_raw_data_read,
 };
 
-static void __devinit
+static void
 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,
                              const char *debugfs_name)
 {
@@ -600,7 +592,7 @@ edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,
                            tsdata->debug_dir, tsdata, &debugfs_raw_data_fops);
 }
 
-static void __devexit
+static void
 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
 {
        if (tsdata->debug_dir)
@@ -625,7 +617,7 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
 
 
 
-static int __devinit edt_ft5x06_ts_reset(struct i2c_client *client,
+static int edt_ft5x06_ts_reset(struct i2c_client *client,
                                         int reset_pin)
 {
        int error;
@@ -649,7 +641,7 @@ static int __devinit edt_ft5x06_ts_reset(struct i2c_client *client,
        return 0;
 }
 
-static int __devinit edt_ft5x06_ts_identify(struct i2c_client *client,
+static int edt_ft5x06_ts_identify(struct i2c_client *client,
                                            char *model_name,
                                            char *fw_version)
 {
@@ -683,7 +675,7 @@ static int __devinit edt_ft5x06_ts_identify(struct i2c_client *client,
            pdata->name <= edt_ft5x06_attr_##name.limit_high)           \
                edt_ft5x06_register_write(tsdata, reg, pdata->name)
 
-static void __devinit
+static void
 edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,
                           const struct edt_ft5x06_platform_data *pdata)
 {
@@ -697,7 +689,7 @@ edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,
        EDT_ATTR_CHECKSET(report_rate, WORK_REGISTER_REPORT_RATE);
 }
 
-static void __devinit
+static void
 edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata)
 {
        tsdata->threshold = edt_ft5x06_register_read(tsdata,
@@ -710,7 +702,7 @@ edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata)
        tsdata->num_y = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_Y);
 }
 
-static int __devinit edt_ft5x06_ts_probe(struct i2c_client *client,
+static int edt_ft5x06_ts_probe(struct i2c_client *client,
                                         const struct i2c_device_id *id)
 {
        const struct edt_ft5x06_platform_data *pdata =
@@ -830,7 +822,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit edt_ft5x06_ts_remove(struct i2c_client *client)
+static int edt_ft5x06_ts_remove(struct i2c_client *client)
 {
        const struct edt_ft5x06_platform_data *pdata =
                                                dev_get_platdata(&client->dev);
@@ -891,7 +883,7 @@ static struct i2c_driver edt_ft5x06_ts_driver = {
        },
        .id_table = edt_ft5x06_ts_id,
        .probe    = edt_ft5x06_ts_probe,
-       .remove   = __devexit_p(edt_ft5x06_ts_remove),
+       .remove   = edt_ft5x06_ts_remove,
 };
 
 module_i2c_driver(edt_ft5x06_ts_driver);
index 908407e..55255a9 100644 (file)
@@ -154,7 +154,7 @@ static void eeti_ts_close(struct input_dev *dev)
        eeti_ts_stop(priv);
 }
 
-static int __devinit eeti_ts_probe(struct i2c_client *client,
+static int eeti_ts_probe(struct i2c_client *client,
                                   const struct i2c_device_id *idp)
 {
        struct eeti_ts_platform_data *pdata = client->dev.platform_data;
@@ -248,7 +248,7 @@ err0:
        return err;
 }
 
-static int __devexit eeti_ts_remove(struct i2c_client *client)
+static int eeti_ts_remove(struct i2c_client *client)
 {
        struct eeti_ts_priv *priv = i2c_get_clientdata(client);
 
@@ -321,7 +321,7 @@ static struct i2c_driver eeti_ts_driver = {
 #endif
        },
        .probe = eeti_ts_probe,
-       .remove = __devexit_p(eeti_ts_remove),
+       .remove = eeti_ts_remove,
        .id_table = eeti_ts_id,
 };
 
index 13fa62f..17c9097 100644 (file)
@@ -153,7 +153,7 @@ static int egalax_wake_up_device(struct i2c_client *client)
        return 0;
 }
 
-static int __devinit egalax_firmware_version(struct i2c_client *client)
+static int egalax_firmware_version(struct i2c_client *client)
 {
        static const u8 cmd[MAX_I2C_DATA_LEN] = { 0x03, 0x03, 0xa, 0x01, 0x41 };
        int ret;
@@ -165,7 +165,7 @@ static int __devinit egalax_firmware_version(struct i2c_client *client)
        return 0;
 }
 
-static int __devinit egalax_ts_probe(struct i2c_client *client,
+static int egalax_ts_probe(struct i2c_client *client,
                                       const struct i2c_device_id *id)
 {
        struct egalax_ts *ts;
@@ -246,7 +246,7 @@ err_free_ts:
        return error;
 }
 
-static __devexit int egalax_ts_remove(struct i2c_client *client)
+static int egalax_ts_remove(struct i2c_client *client)
 {
        struct egalax_ts *ts = i2c_get_clientdata(client);
 
@@ -301,7 +301,7 @@ static struct i2c_driver egalax_ts_driver = {
        },
        .id_table       = egalax_ts_id,
        .probe          = egalax_ts_probe,
-       .remove         = __devexit_p(egalax_ts_remove),
+       .remove         = egalax_ts_remove,
 };
 
 module_i2c_driver(egalax_ts_driver);
diff --git a/drivers/input/touchscreen/h3600_ts_input.c b/drivers/input/touchscreen/h3600_ts_input.c
deleted file mode 100644 (file)
index b9e8686..0000000
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- *  Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com
- *
- *  Sponsored by Transvirtual Technology.
- *
- *  Derived from the code in h3600_ts.[ch] by Charles Flynn
- */
-
-/*
- * Driver for the h3600 Touch Screen and other Atmel controlled devices.
- */
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Should you need to contact me, the author, you can do so by
- * e-mail - mail your message to <jsimmons@transvirtual.com>.
- */
-
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/input.h>
-#include <linux/serio.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-
-/* SA1100 serial defines */
-#include <mach/hardware.h>
-#include <mach/irqs.h>
-
-#define DRIVER_DESC    "H3600 touchscreen driver"
-
-MODULE_AUTHOR("James Simmons <jsimmons@transvirtual.com>");
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL");
-
-/*
- * Definitions & global arrays.
- */
-
-/* The start and end of frame characters SOF and EOF */
-#define CHAR_SOF                0x02
-#define CHAR_EOF                0x03
-#define FRAME_OVERHEAD          3       /* CHAR_SOF,CHAR_EOF,LENGTH = 3 */
-
-/*
-        Atmel events and response IDs contained in frame.
-        Programmer has no control over these numbers.
-        TODO there are holes - specifically  1,7,0x0a
-*/
-#define VERSION_ID              0       /* Get Version (request/response) */
-#define KEYBD_ID                2       /* Keyboard (event) */
-#define TOUCHS_ID               3       /* Touch Screen (event)*/
-#define EEPROM_READ_ID          4       /* (request/response) */
-#define EEPROM_WRITE_ID         5       /* (request/response) */
-#define THERMAL_ID              6       /* (request/response) */
-#define NOTIFY_LED_ID           8       /* (request/response) */
-#define BATTERY_ID              9       /* (request/response) */
-#define SPI_READ_ID             0x0b    /* ( request/response) */
-#define SPI_WRITE_ID            0x0c    /* ( request/response) */
-#define FLITE_ID                0x0d    /* backlight ( request/response) */
-#define STX_ID                  0xa1    /* extension pack status (req/resp) */
-
-#define MAX_ID                  14
-
-#define H3600_MAX_LENGTH 16
-#define H3600_KEY 0xf
-
-#define H3600_SCANCODE_RECORD  1        /* 1 -> record button */
-#define H3600_SCANCODE_CALENDAR 2       /* 2 -> calendar */
-#define H3600_SCANCODE_CONTACTS 3       /* 3 -> contact */
-#define H3600_SCANCODE_Q       4        /* 4 -> Q button */
-#define        H3600_SCANCODE_START    5        /* 5 -> start menu */
-#define        H3600_SCANCODE_UP       6        /* 6 -> up */
-#define H3600_SCANCODE_RIGHT   7        /* 7 -> right */
-#define H3600_SCANCODE_LEFT    8        /* 8 -> left */
-#define H3600_SCANCODE_DOWN    9        /* 9 -> down */
-
-/*
- * Per-touchscreen data.
- */
-struct h3600_dev {
-       struct input_dev *dev;
-       struct serio *serio;
-       unsigned char event;    /* event ID from packet */
-       unsigned char chksum;
-       unsigned char len;
-       unsigned char idx;
-       unsigned char buf[H3600_MAX_LENGTH];
-       char phys[32];
-};
-
-static irqreturn_t action_button_handler(int irq, void *dev_id)
-{
-       int down = (GPLR & GPIO_BITSY_ACTION_BUTTON) ? 0 : 1;
-       struct input_dev *dev = dev_id;
-
-       input_report_key(dev, KEY_ENTER, down);
-       input_sync(dev);
-
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t npower_button_handler(int irq, void *dev_id)
-{
-       int down = (GPLR & GPIO_BITSY_NPOWER_BUTTON) ? 0 : 1;
-       struct input_dev *dev = dev_id;
-
-       /*
-        * This interrupt is only called when we release the key. So we have
-        * to fake a key press.
-        */
-       input_report_key(dev, KEY_SUSPEND, 1);
-       input_report_key(dev, KEY_SUSPEND, down);
-       input_sync(dev);
-
-       return IRQ_HANDLED;
-}
-
-#ifdef CONFIG_PM
-
-static int flite_brightness = 25;
-
-enum flite_pwr {
-       FLITE_PWR_OFF = 0,
-       FLITE_PWR_ON = 1
-};
-
-/*
- * h3600_flite_power: enables or disables power to frontlight, using last bright */
-unsigned int h3600_flite_power(struct input_dev *dev, enum flite_pwr pwr)
-{
-       unsigned char brightness = (pwr == FLITE_PWR_OFF) ? 0 : flite_brightness;
-       struct h3600_dev *ts = input_get_drvdata(dev);
-
-       /* Must be in this order */
-       serio_write(ts->serio, 1);
-       serio_write(ts->serio, pwr);
-       serio_write(ts->serio, brightness);
-
-       return 0;
-}
-
-#endif
-
-/*
- * This function translates the native event packets to linux input event
- * packets. Some packets coming from serial are not touchscreen related. In
- * this case we send them off to be processed elsewhere.
- */
-static void h3600ts_process_packet(struct h3600_dev *ts)
-{
-       struct input_dev *dev = ts->dev;
-       static int touched = 0;
-       int key, down = 0;
-
-       switch (ts->event) {
-               /*
-                  Buttons - returned as a single byte
-                       7 6 5 4 3 2 1 0
-                       S x x x N N N N
-
-                  S       switch state ( 0=pressed 1=released)
-                  x       Unused.
-                  NNNN    switch number 0-15
-
-                  Note: This is true for non interrupt generated key events.
-               */
-               case KEYBD_ID:
-                       down = (ts->buf[0] & 0x80) ? 0 : 1;
-
-                       switch (ts->buf[0] & 0x7f) {
-                               case H3600_SCANCODE_RECORD:
-                                       key = KEY_RECORD;
-                                       break;
-                               case H3600_SCANCODE_CALENDAR:
-                                       key = KEY_PROG1;
-                                        break;
-                               case H3600_SCANCODE_CONTACTS:
-                                       key = KEY_PROG2;
-                                       break;
-                               case H3600_SCANCODE_Q:
-                                       key = KEY_Q;
-                                       break;
-                               case H3600_SCANCODE_START:
-                                       key = KEY_PROG3;
-                                       break;
-                               case H3600_SCANCODE_UP:
-                                       key = KEY_UP;
-                                       break;
-                               case H3600_SCANCODE_RIGHT:
-                                       key = KEY_RIGHT;
-                                       break;
-                               case H3600_SCANCODE_LEFT:
-                                       key = KEY_LEFT;
-                                       break;
-                               case H3600_SCANCODE_DOWN:
-                                       key = KEY_DOWN;
-                                       break;
-                               default:
-                                       key = 0;
-                       }
-                       if (key)
-                               input_report_key(dev, key, down);
-                       break;
-               /*
-                * Native touchscreen event data is formatted as shown below:-
-                *
-                *      +-------+-------+-------+-------+
-                *      | Xmsb  | Xlsb  | Ymsb  | Ylsb  |
-                *      +-------+-------+-------+-------+
-                *       byte 0    1       2       3
-                */
-               case TOUCHS_ID:
-                       if (!touched) {
-                               input_report_key(dev, BTN_TOUCH, 1);
-                               touched = 1;
-                       }
-
-                       if (ts->len) {
-                               unsigned short x, y;
-
-                               x = ts->buf[0]; x <<= 8; x += ts->buf[1];
-                               y = ts->buf[2]; y <<= 8; y += ts->buf[3];
-
-                               input_report_abs(dev, ABS_X, x);
-                               input_report_abs(dev, ABS_Y, y);
-                       } else {
-                               input_report_key(dev, BTN_TOUCH, 0);
-                               touched = 0;
-                       }
-                       break;
-               default:
-                       /* Send a non input event elsewhere */
-                       break;
-       }
-
-       input_sync(dev);
-}
-
-/*
- * h3600ts_event() handles events from the input module.
- */
-static int h3600ts_event(struct input_dev *dev, unsigned int type,
-                        unsigned int code, int value)
-{
-#if 0
-       struct h3600_dev *ts = input_get_drvdata(dev);
-
-       switch (type) {
-               case EV_LED: {
-               //      serio_write(ts->serio, SOME_CMD);
-                       return 0;
-               }
-       }
-       return -1;
-#endif
-       return 0;
-}
-
-/*
-        Frame format
-  byte    1       2               3              len + 4
-        +-------+---------------+---------------+--=------------+
-        |SOF    |id     |len    | len bytes     | Chksum        |
-        +-------+---------------+---------------+--=------------+
-  bit   0     7  8    11 12   15 16
-
-        +-------+---------------+-------+
-        |SOF    |id     |0      |Chksum | - Note Chksum does not include SOF
-        +-------+---------------+-------+
-  bit   0     7  8    11 12   15 16
-
-*/
-
-static int state;
-
-/* decode States  */
-#define STATE_SOF       0       /* start of FRAME */
-#define STATE_ID        1       /* state where we decode the ID & len */
-#define STATE_DATA      2       /* state where we decode data */
-#define STATE_EOF       3       /* state where we decode checksum or EOF */
-
-static irqreturn_t h3600ts_interrupt(struct serio *serio, unsigned char data,
-                                     unsigned int flags)
-{
-       struct h3600_dev *ts = serio_get_drvdata(serio);
-
-       /*
-        * We have a new frame coming in.
-        */
-       switch (state) {
-               case STATE_SOF:
-                       if (data == CHAR_SOF)
-                               state = STATE_ID;
-                       break;
-               case STATE_ID:
-                       ts->event = (data & 0xf0) >> 4;
-                       ts->len = (data & 0xf);
-                       ts->idx = 0;
-                       if (ts->event >= MAX_ID) {
-                               state = STATE_SOF;
-                               break;
-                       }
-                       ts->chksum = data;
-                       state = (ts->len > 0) ? STATE_DATA : STATE_EOF;
-                       break;
-               case STATE_DATA:
-                       ts->chksum += data;
-                       ts->buf[ts->idx]= data;
-                       if (++ts->idx == ts->len)
-                               state = STATE_EOF;
-                       break;
-               case STATE_EOF:
-                       state = STATE_SOF;
-                       if (data == CHAR_EOF || data == ts->chksum)
-                               h3600ts_process_packet(ts);
-                       break;
-               default:
-                       printk("Error3\n");
-                       break;
-       }
-
-       return IRQ_HANDLED;
-}
-
-/*
- * h3600ts_connect() is the routine that is called when someone adds a
- * new serio device that supports H3600 protocol and registers it as
- * an input device.
- */
-static int h3600ts_connect(struct serio *serio, struct serio_driver *drv)
-{
-       struct h3600_dev *ts;
-       struct input_dev *input_dev;
-       int err;
-
-       ts = kzalloc(sizeof(struct h3600_dev), GFP_KERNEL);
-       input_dev = input_allocate_device();
-       if (!ts || !input_dev) {
-               err = -ENOMEM;
-               goto fail1;
-       }
-
-       ts->serio = serio;
-       ts->dev = input_dev;
-       snprintf(ts->phys, sizeof(ts->phys), "%s/input0", serio->phys);
-
-       input_dev->name = "H3600 TouchScreen";
-       input_dev->phys = ts->phys;
-       input_dev->id.bustype = BUS_RS232;
-       input_dev->id.vendor = SERIO_H3600;
-       input_dev->id.product = 0x0666;  /* FIXME !!! We can ask the hardware */
-       input_dev->id.version = 0x0100;
-       input_dev->dev.parent = &serio->dev;
-
-       input_set_drvdata(input_dev, ts);
-
-       input_dev->event = h3600ts_event;
-
-       input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
-               BIT_MASK(EV_LED) | BIT_MASK(EV_PWR);
-       input_dev->ledbit[0] = BIT_MASK(LED_SLEEP);
-       input_set_abs_params(input_dev, ABS_X, 60, 985, 0, 0);
-       input_set_abs_params(input_dev, ABS_Y, 35, 1024, 0, 0);
-
-       set_bit(KEY_RECORD, input_dev->keybit);
-       set_bit(KEY_Q, input_dev->keybit);
-       set_bit(KEY_PROG1, input_dev->keybit);
-       set_bit(KEY_PROG2, input_dev->keybit);
-       set_bit(KEY_PROG3, input_dev->keybit);
-       set_bit(KEY_UP, input_dev->keybit);
-       set_bit(KEY_RIGHT, input_dev->keybit);
-       set_bit(KEY_LEFT, input_dev->keybit);
-       set_bit(KEY_DOWN, input_dev->keybit);
-       set_bit(KEY_ENTER, input_dev->keybit);
-       set_bit(KEY_SUSPEND, input_dev->keybit);
-       set_bit(BTN_TOUCH, input_dev->keybit);
-
-       /* Device specific stuff */
-       set_GPIO_IRQ_edge(GPIO_BITSY_ACTION_BUTTON, GPIO_BOTH_EDGES);
-       set_GPIO_IRQ_edge(GPIO_BITSY_NPOWER_BUTTON, GPIO_RISING_EDGE);
-
-       if (request_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, action_button_handler,
-                       IRQF_SHARED, "h3600_action", ts->dev)) {
-               printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n");
-               err = -EBUSY;
-               goto fail1;
-       }
-
-       if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler,
-                       IRQF_SHARED, "h3600_suspend", ts->dev)) {
-               printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n");
-               err = -EBUSY;
-               goto fail2;
-       }
-
-       serio_set_drvdata(serio, ts);
-
-       err = serio_open(serio, drv);
-       if (err)
-               goto fail3;
-
-       //h3600_flite_control(1, 25);     /* default brightness */
-       err = input_register_device(ts->dev);
-       if (err)
-               goto fail4;
-
-       return 0;
-
-fail4: serio_close(serio);
-fail3: serio_set_drvdata(serio, NULL);
-       free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev);
-fail2: free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev);
-fail1: input_free_device(input_dev);
-       kfree(ts);
-       return err;
-}
-
-/*
- * h3600ts_disconnect() is the opposite of h3600ts_connect()
- */
-
-static void h3600ts_disconnect(struct serio *serio)
-{
-       struct h3600_dev *ts = serio_get_drvdata(serio);
-
-       free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev);
-       free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev);
-       input_get_device(ts->dev);
-       input_unregister_device(ts->dev);
-       serio_close(serio);
-       serio_set_drvdata(serio, NULL);
-       input_put_device(ts->dev);
-       kfree(ts);
-}
-
-/*
- * The serio driver structure.
- */
-
-static struct serio_device_id h3600ts_serio_ids[] = {
-       {
-               .type   = SERIO_RS232,
-               .proto  = SERIO_H3600,
-               .id     = SERIO_ANY,
-               .extra  = SERIO_ANY,
-       },
-       { 0 }
-};
-
-MODULE_DEVICE_TABLE(serio, h3600ts_serio_ids);
-
-static struct serio_driver h3600ts_drv = {
-       .driver         = {
-               .name   = "h3600ts",
-       },
-       .description    = DRIVER_DESC,
-       .id_table       = h3600ts_serio_ids,
-       .interrupt      = h3600ts_interrupt,
-       .connect        = h3600ts_connect,
-       .disconnect     = h3600ts_disconnect,
-};
-
-module_serio_driver(h3600ts_drv);
index d13143b..6c4fb84 100644 (file)
@@ -102,7 +102,7 @@ static void htcpen_close(struct input_dev *dev)
        synchronize_irq(HTCPEN_IRQ);
 }
 
-static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id)
+static int htcpen_isa_probe(struct device *dev, unsigned int id)
 {
        struct input_dev *htcpen_dev;
        int err = -EBUSY;
@@ -174,7 +174,7 @@ static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id)
        return err;
 }
 
-static int __devexit htcpen_isa_remove(struct device *dev, unsigned int id)
+static int htcpen_isa_remove(struct device *dev, unsigned int id)
 {
        struct input_dev *htcpen_dev = dev_get_drvdata(dev);
 
@@ -210,7 +210,7 @@ static int htcpen_isa_resume(struct device *dev, unsigned int n)
 
 static struct isa_driver htcpen_isa_driver = {
        .probe          = htcpen_isa_probe,
-       .remove         = __devexit_p(htcpen_isa_remove),
+       .remove         = htcpen_isa_remove,
 #ifdef CONFIG_PM
        .suspend        = htcpen_isa_suspend,
        .resume         = htcpen_isa_resume,
index 4ac6976..1418bdd 100644 (file)
@@ -180,7 +180,7 @@ static const struct attribute_group ili210x_attr_group = {
        .attrs = ili210x_attributes,
 };
 
-static int __devinit ili210x_i2c_probe(struct i2c_client *client,
+static int ili210x_i2c_probe(struct i2c_client *client,
                                       const struct i2c_device_id *id)
 {
        struct device *dev = &client->dev;
@@ -298,7 +298,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit ili210x_i2c_remove(struct i2c_client *client)
+static int ili210x_i2c_remove(struct i2c_client *client)
 {
        struct ili210x *priv = i2c_get_clientdata(client);
 
@@ -350,7 +350,7 @@ static struct i2c_driver ili210x_ts_driver = {
        },
        .id_table = ili210x_i2c_id,
        .probe = ili210x_i2c_probe,
-       .remove = __devexit_p(ili210x_i2c_remove),
+       .remove = ili210x_i2c_remove,
 };
 
 module_i2c_driver(ili210x_ts_driver);
index cf29937..465db5d 100644 (file)
@@ -427,7 +427,7 @@ out:
 }
 
 /* Utility to read PMIC ID */
-static int __devinit mrstouch_read_pmic_id(uint *vendor, uint *rev)
+static int mrstouch_read_pmic_id(uint *vendor, uint *rev)
 {
        int err;
        u8 r;
@@ -446,7 +446,7 @@ static int __devinit mrstouch_read_pmic_id(uint *vendor, uint *rev)
  * Parse ADC channels to find end of the channel configured by other ADC user
  * NEC and MAXIM requires 4 channels and FreeScale needs 18 channels
  */
-static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev)
+static int mrstouch_chan_parse(struct mrstouch_dev *tsdev)
 {
        int found = 0;
        int err, i;
@@ -478,7 +478,7 @@ static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev)
 /*
  * Writes touch screen channels to ADC address selection registers
  */
-static int __devinit mrstouch_ts_chan_set(uint offset)
+static int mrstouch_ts_chan_set(uint offset)
 {
        u16 chan;
 
@@ -494,7 +494,7 @@ static int __devinit mrstouch_ts_chan_set(uint offset)
 }
 
 /* Initialize ADC */
-static int __devinit mrstouch_adc_init(struct mrstouch_dev *tsdev)
+static int mrstouch_adc_init(struct mrstouch_dev *tsdev)
 {
        int err, start;
        u8 ra, rm;
@@ -568,7 +568,7 @@ static int __devinit mrstouch_adc_init(struct mrstouch_dev *tsdev)
 
 
 /* Probe function for touch screen driver */
-static int __devinit mrstouch_probe(struct platform_device *pdev)
+static int mrstouch_probe(struct platform_device *pdev)
 {
        struct mrstouch_dev *tsdev;
        struct input_dev *input;
@@ -643,7 +643,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit mrstouch_remove(struct platform_device *pdev)
+static int mrstouch_remove(struct platform_device *pdev)
 {
        struct mrstouch_dev *tsdev = platform_get_drvdata(pdev);
 
@@ -662,7 +662,7 @@ static struct platform_driver mrstouch_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = mrstouch_probe,
-       .remove         = __devexit_p(mrstouch_remove),
+       .remove         = mrstouch_remove,
 };
 module_platform_driver(mrstouch_driver);
 
index 7f03d1b..282d7c7 100644 (file)
@@ -99,7 +99,7 @@ static irqreturn_t jornada720_ts_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit jornada720_ts_probe(struct platform_device *pdev)
+static int jornada720_ts_probe(struct platform_device *pdev)
 {
        struct jornada_ts *jornada_ts;
        struct input_dev *input_dev;
@@ -151,7 +151,7 @@ static int __devinit jornada720_ts_probe(struct platform_device *pdev)
        return error;
 }
 
-static int __devexit jornada720_ts_remove(struct platform_device *pdev)
+static int jornada720_ts_remove(struct platform_device *pdev)
 {
        struct jornada_ts *jornada_ts = platform_get_drvdata(pdev);
 
@@ -168,7 +168,7 @@ MODULE_ALIAS("platform:jornada_ts");
 
 static struct platform_driver jornada720_ts_driver = {
        .probe          = jornada720_ts_probe,
-       .remove         = __devexit_p(jornada720_ts_remove),
+       .remove         = jornada720_ts_remove,
        .driver         = {
                .name   = "jornada_ts",
                .owner  = THIS_MODULE,
index 4c2b8ed..9101ee5 100644 (file)
@@ -203,7 +203,7 @@ static void lpc32xx_ts_close(struct input_dev *dev)
        lpc32xx_stop_tsc(tsc);
 }
 
-static int __devinit lpc32xx_ts_probe(struct platform_device *pdev)
+static int lpc32xx_ts_probe(struct platform_device *pdev)
 {
        struct lpc32xx_tsc *tsc;
        struct input_dev *input;
@@ -309,7 +309,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit lpc32xx_ts_remove(struct platform_device *pdev)
+static int lpc32xx_ts_remove(struct platform_device *pdev)
 {
        struct lpc32xx_tsc *tsc = platform_get_drvdata(pdev);
        struct resource *res;
@@ -394,7 +394,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_tsc_of_match);
 
 static struct platform_driver lpc32xx_ts_driver = {
        .probe          = lpc32xx_ts_probe,
-       .remove         = __devexit_p(lpc32xx_ts_remove),
+       .remove         = lpc32xx_ts_remove,
        .driver         = {
                .name   = MOD_NAME,
                .owner  = THIS_MODULE,
index 4eab50b..00bc6ca 100644 (file)
@@ -156,7 +156,7 @@ out:
        return IRQ_HANDLED;
 }
 
-static void __devinit max11801_ts_phy_init(struct max11801_data *data)
+static void max11801_ts_phy_init(struct max11801_data *data)
 {
        struct i2c_client *client = data->client;
 
@@ -174,7 +174,7 @@ static void __devinit max11801_ts_phy_init(struct max11801_data *data)
        max11801_write_reg(client, OP_MODE_CONF_REG, 0x36);
 }
 
-static int __devinit max11801_ts_probe(struct i2c_client *client,
+static int max11801_ts_probe(struct i2c_client *client,
                                       const struct i2c_device_id *id)
 {
        struct max11801_data *data;
@@ -228,7 +228,7 @@ err_free_mem:
        return error;
 }
 
-static __devexit int max11801_ts_remove(struct i2c_client *client)
+static int max11801_ts_remove(struct i2c_client *client)
 {
        struct max11801_data *data = i2c_get_clientdata(client);
 
@@ -252,7 +252,7 @@ static struct i2c_driver max11801_ts_driver = {
        },
        .id_table       = max11801_ts_id,
        .probe          = max11801_ts_probe,
-       .remove         = __devexit_p(max11801_ts_remove),
+       .remove         = max11801_ts_remove,
 };
 
 module_i2c_driver(max11801_ts_driver);
index 48dc5b0..02103b6 100644 (file)
@@ -229,7 +229,7 @@ err_free_mem:
        return ret;
 }
 
-static int __devexit mc13783_ts_remove(struct platform_device *pdev)
+static int mc13783_ts_remove(struct platform_device *pdev)
 {
        struct mc13783_ts_priv *priv = platform_get_drvdata(pdev);
 
@@ -243,7 +243,7 @@ static int __devexit mc13783_ts_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver mc13783_ts_driver = {
-       .remove         = __devexit_p(mc13783_ts_remove),
+       .remove         = mc13783_ts_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = MC13783_TS_NAME,
index b528511..f9f4e0c 100644 (file)
@@ -187,7 +187,7 @@ static void mcs5000_ts_phys_init(struct mcs5000_ts_data *data)
                        OP_MODE_ACTIVE | REPORT_RATE_80);
 }
 
-static int __devinit mcs5000_ts_probe(struct i2c_client *client,
+static int mcs5000_ts_probe(struct i2c_client *client,
                const struct i2c_device_id *id)
 {
        struct mcs5000_ts_data *data;
@@ -249,7 +249,7 @@ err_free_mem:
        return ret;
 }
 
-static int __devexit mcs5000_ts_remove(struct i2c_client *client)
+static int mcs5000_ts_remove(struct i2c_client *client)
 {
        struct mcs5000_ts_data *data = i2c_get_clientdata(client);
 
@@ -292,7 +292,7 @@ MODULE_DEVICE_TABLE(i2c, mcs5000_ts_id);
 
 static struct i2c_driver mcs5000_ts_driver = {
        .probe          = mcs5000_ts_probe,
-       .remove         = __devexit_p(mcs5000_ts_remove),
+       .remove         = mcs5000_ts_remove,
        .driver = {
                .name = "mcs5000_ts",
 #ifdef CONFIG_PM
index 560cf09..98841d8 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/of.h>
 #include <linux/i2c.h>
 #include <linux/i2c/mms114.h>
 #include <linux/input/mt.h>
@@ -360,14 +361,63 @@ static void mms114_input_close(struct input_dev *dev)
        mms114_stop(data);
 }
 
-static int __devinit mms114_probe(struct i2c_client *client,
+#ifdef CONFIG_OF
+static struct mms114_platform_data *mms114_parse_dt(struct device *dev)
+{
+       struct mms114_platform_data *pdata;
+       struct device_node *np = dev->of_node;
+
+       if (!np)
+               return NULL;
+
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata) {
+               dev_err(dev, "failed to allocate platform data\n");
+               return NULL;
+       }
+
+       if (of_property_read_u32(np, "x-size", &pdata->x_size)) {
+               dev_err(dev, "failed to get x-size property\n");
+               return NULL;
+       };
+
+       if (of_property_read_u32(np, "y-size", &pdata->y_size)) {
+               dev_err(dev, "failed to get y-size property\n");
+               return NULL;
+       };
+
+       of_property_read_u32(np, "contact-threshold",
+                               &pdata->contact_threshold);
+       of_property_read_u32(np, "moving-threshold",
+                               &pdata->moving_threshold);
+
+       if (of_find_property(np, "x-invert", NULL))
+               pdata->x_invert = true;
+       if (of_find_property(np, "y-invert", NULL))
+               pdata->y_invert = true;
+
+       return pdata;
+}
+#else
+static inline struct mms114_platform_data *mms114_parse_dt(struct device *dev)
+{
+       return NULL;
+}
+#endif
+
+static int mms114_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
+       const struct mms114_platform_data *pdata;
        struct mms114_data *data;
        struct input_dev *input_dev;
        int error;
 
-       if (!client->dev.platform_data) {
+       pdata = dev_get_platdata(&client->dev);
+       if (!pdata)
+               pdata = mms114_parse_dt(&client->dev);
+
+       if (!pdata) {
                dev_err(&client->dev, "Need platform data\n");
                return -EINVAL;
        }
@@ -389,7 +439,7 @@ static int __devinit mms114_probe(struct i2c_client *client,
 
        data->client = client;
        data->input_dev = input_dev;
-       data->pdata = client->dev.platform_data;
+       data->pdata = pdata;
 
        input_dev->name = "MELPAS MMS114 Touchscreen";
        input_dev->id.bustype = BUS_I2C;
@@ -458,7 +508,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit mms114_remove(struct i2c_client *client)
+static int mms114_remove(struct i2c_client *client)
 {
        struct mms114_data *data = i2c_get_clientdata(client);
 
@@ -525,14 +575,22 @@ static const struct i2c_device_id mms114_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, mms114_id);
 
+#ifdef CONFIG_OF
+static struct of_device_id mms114_dt_match[] = {
+       { .compatible = "melfas,mms114" },
+       { }
+};
+#endif
+
 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),
        },
        .probe          = mms114_probe,
-       .remove         = __devexit_p(mms114_remove),
+       .remove         = mms114_remove,
        .id_table       = mms114_id,
 };
 
index f57aeb8..f22e04d 100644 (file)
@@ -137,7 +137,7 @@ static void pcap_ts_close(struct input_dev *dev)
                                pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT);
 }
 
-static int __devinit pcap_ts_probe(struct platform_device *pdev)
+static int pcap_ts_probe(struct platform_device *pdev)
 {
        struct input_dev *input_dev;
        struct pcap_ts *pcap_ts;
@@ -202,7 +202,7 @@ fail:
        return err;
 }
 
-static int __devexit pcap_ts_remove(struct platform_device *pdev)
+static int pcap_ts_remove(struct platform_device *pdev)
 {
        struct pcap_ts *pcap_ts = platform_get_drvdata(pdev);
 
@@ -245,7 +245,7 @@ static const struct dev_pm_ops pcap_ts_pm_ops = {
 
 static struct platform_driver pcap_ts_driver = {
        .probe          = pcap_ts_probe,
-       .remove         = __devexit_p(pcap_ts_remove),
+       .remove         = pcap_ts_remove,
        .driver         = {
                .name   = "pcap-ts",
                .owner  = THIS_MODULE,
index 953b4c1..6cc6b36 100644 (file)
@@ -125,7 +125,7 @@ static int pixcir_i2c_ts_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,
                         pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume);
 
-static int __devinit pixcir_i2c_ts_probe(struct i2c_client *client,
+static int pixcir_i2c_ts_probe(struct i2c_client *client,
                                         const struct i2c_device_id *id)
 {
        const struct pixcir_ts_platform_data *pdata = client->dev.platform_data;
@@ -189,7 +189,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit pixcir_i2c_ts_remove(struct i2c_client *client)
+static int pixcir_i2c_ts_remove(struct i2c_client *client)
 {
        struct pixcir_i2c_ts_data *tsdata = i2c_get_clientdata(client);
 
@@ -218,7 +218,7 @@ static struct i2c_driver pixcir_i2c_ts_driver = {
                .pm     = &pixcir_dev_pm_ops,
        },
        .probe          = pixcir_i2c_ts_probe,
-       .remove         = __devexit_p(pixcir_i2c_ts_remove),
+       .remove         = pixcir_i2c_ts_remove,
        .id_table       = pixcir_i2c_ts_id,
 };
 
index 549fa29..b061af2 100644 (file)
@@ -238,7 +238,7 @@ static void s3c24xx_ts_select(struct s3c_adc_client *client, unsigned select)
  * Initialise, find and allocate any resources we need to run and then
  * register with the ADC and input systems.
  */
-static int __devinit s3c2410ts_probe(struct platform_device *pdev)
+static int s3c2410ts_probe(struct platform_device *pdev)
 {
        struct s3c2410_ts_mach_info *info;
        struct device *dev = &pdev->dev;
@@ -365,7 +365,7 @@ static int __devinit s3c2410ts_probe(struct platform_device *pdev)
  *
  * Free up our state ready to be removed.
  */
-static int __devexit s3c2410ts_remove(struct platform_device *pdev)
+static int s3c2410ts_remove(struct platform_device *pdev)
 {
        free_irq(ts.irq_tc, ts.input);
        del_timer_sync(&touch_timer);
@@ -430,7 +430,7 @@ static struct platform_driver s3c_ts_driver = {
        },
        .id_table       = s3cts_driver_ids,
        .probe          = s3c2410ts_probe,
-       .remove         = __devexit_p(s3c2410ts_remove),
+       .remove         = s3c2410ts_remove,
 };
 module_platform_driver(s3c_ts_driver);
 
index 6cb68a1..d9d05e2 100644 (file)
@@ -139,7 +139,7 @@ end:
        return IRQ_HANDLED;
 }
 
-static int __devinit st1232_ts_probe(struct i2c_client *client,
+static int st1232_ts_probe(struct i2c_client *client,
                                        const struct i2c_device_id *id)
 {
        struct st1232_ts_data *ts;
@@ -206,7 +206,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit st1232_ts_remove(struct i2c_client *client)
+static int st1232_ts_remove(struct i2c_client *client)
 {
        struct st1232_ts_data *ts = i2c_get_clientdata(client);
 
@@ -255,7 +255,7 @@ static const struct i2c_device_id st1232_ts_id[] = {
 MODULE_DEVICE_TABLE(i2c, st1232_ts_id);
 
 #ifdef CONFIG_OF
-static const struct of_device_id st1232_ts_dt_ids[] __devinitconst = {
+static const struct of_device_id st1232_ts_dt_ids[] = {
        { .compatible = "sitronix,st1232", },
        { }
 };
@@ -264,7 +264,7 @@ MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids);
 
 static struct i2c_driver st1232_ts_driver = {
        .probe          = st1232_ts_probe,
-       .remove         = __devexit_p(st1232_ts_remove),
+       .remove         = st1232_ts_remove,
        .id_table       = st1232_ts_id,
        .driver = {
                .name   = ST1232_TS_NAME,
index 692b685..84d884b 100644 (file)
@@ -1,4 +1,5 @@
-/* STMicroelectronics STMPE811 Touchscreen Driver
+/*
+ * STMicroelectronics STMPE811 Touchscreen Driver
  *
  * (C) 2010 Luotao Fu <l.fu@pengutronix.de>
  * All rights reserved.
@@ -16,6 +17,7 @@
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/device.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/input.h>
 #include <linux/slab.h>
@@ -166,7 +168,7 @@ static irqreturn_t stmpe_ts_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit stmpe_init_hw(struct stmpe_touch *ts)
+static int stmpe_init_hw(struct stmpe_touch *ts)
 {
        int ret;
        u8 adc_ctrl1, adc_ctrl1_mask, tsc_cfg, tsc_cfg_mask;
@@ -261,41 +263,18 @@ static void stmpe_ts_close(struct input_dev *dev)
                        STMPE_TSC_CTRL_TSC_EN, 0);
 }
 
-static int __devinit stmpe_input_probe(struct platform_device *pdev)
+static void stmpe_ts_get_platform_info(struct platform_device *pdev,
+                                       struct stmpe_touch *ts)
 {
        struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent);
-       struct stmpe_platform_data *pdata = stmpe->pdata;
-       struct stmpe_touch *ts;
-       struct input_dev *idev;
+       struct device_node *np = pdev->dev.of_node;
        struct stmpe_ts_platform_data *ts_pdata = NULL;
-       int ret;
-       int ts_irq;
-
-       ts_irq = platform_get_irq_byname(pdev, "FIFO_TH");
-       if (ts_irq < 0)
-               return ts_irq;
-
-       ts = kzalloc(sizeof(*ts), GFP_KERNEL);
-       if (!ts) {
-               ret = -ENOMEM;
-               goto err_out;
-       }
 
-       idev = input_allocate_device();
-       if (!idev) {
-               ret = -ENOMEM;
-               goto err_free_ts;
-       }
-
-       platform_set_drvdata(pdev, ts);
        ts->stmpe = stmpe;
-       ts->idev = idev;
-       ts->dev = &pdev->dev;
 
-       if (pdata)
-               ts_pdata = pdata->ts;
+       if (stmpe->pdata && stmpe->pdata->ts) {
+               ts_pdata = stmpe->pdata->ts;
 
-       if (ts_pdata) {
                ts->sample_time = ts_pdata->sample_time;
                ts->mod_12b = ts_pdata->mod_12b;
                ts->ref_sel = ts_pdata->ref_sel;
@@ -305,22 +284,71 @@ static int __devinit stmpe_input_probe(struct platform_device *pdev)
                ts->settling = ts_pdata->settling;
                ts->fraction_z = ts_pdata->fraction_z;
                ts->i_drive = ts_pdata->i_drive;
+       } else if (np) {
+               u32 val;
+
+               if (!of_property_read_u32(np, "st,sample-time", &val))
+                       ts->sample_time = val;
+               if (!of_property_read_u32(np, "st,mod-12b", &val))
+                       ts->mod_12b = val;
+               if (!of_property_read_u32(np, "st,ref-sel", &val))
+                       ts->ref_sel = val;
+               if (!of_property_read_u32(np, "st,adc-freq", &val))
+                       ts->adc_freq = val;
+               if (!of_property_read_u32(np, "st,ave-ctrl", &val))
+                       ts->ave_ctrl = val;
+               if (!of_property_read_u32(np, "st,touch-det-delay", &val))
+                       ts->touch_det_delay = val;
+               if (!of_property_read_u32(np, "st,settling", &val))
+                       ts->settling = val;
+               if (!of_property_read_u32(np, "st,fraction-z", &val))
+                       ts->fraction_z = val;
+               if (!of_property_read_u32(np, "st,i-drive", &val))
+                       ts->i_drive = val;
        }
+}
+
+static int stmpe_input_probe(struct platform_device *pdev)
+{
+       struct stmpe_touch *ts;
+       struct input_dev *idev;
+       int error;
+       int ts_irq;
+
+       ts_irq = platform_get_irq_byname(pdev, "FIFO_TH");
+       if (ts_irq < 0)
+               return ts_irq;
+
+       ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL);
+       if (!ts)
+               return -ENOMEM;
+
+       idev = devm_input_allocate_device(&pdev->dev);
+       if (!idev)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, ts);
+       ts->idev = idev;
+       ts->dev = &pdev->dev;
+
+       stmpe_ts_get_platform_info(pdev, ts);
 
        INIT_DELAYED_WORK(&ts->work, stmpe_work);
 
-       ret = request_threaded_irq(ts_irq, NULL, stmpe_ts_handler,
-                       IRQF_ONESHOT, STMPE_TS_NAME, ts);
-       if (ret) {
+       error = devm_request_threaded_irq(&pdev->dev, ts_irq,
+                                         NULL, stmpe_ts_handler,
+                                         IRQF_ONESHOT, STMPE_TS_NAME, ts);
+       if (error) {
                dev_err(&pdev->dev, "Failed to request IRQ %d\n", ts_irq);
-               goto err_free_input;
+               return error;
        }
 
-       ret = stmpe_init_hw(ts);
-       if (ret)
-               goto err_free_irq;
+       error = stmpe_init_hw(ts);
+       if (error)
+               return error;
 
        idev->name = STMPE_TS_NAME;
+       idev->phys = STMPE_TS_NAME"/input0";
        idev->id.bustype = BUS_I2C;
        idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
        idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
@@ -334,40 +362,21 @@ static int __devinit stmpe_input_probe(struct platform_device *pdev)
        input_set_abs_params(idev, ABS_Y, 0, XY_MASK, 0, 0);
        input_set_abs_params(idev, ABS_PRESSURE, 0x0, 0xff, 0, 0);
 
-       ret = input_register_device(idev);
-       if (ret) {
+       error = input_register_device(idev);
+       if (error) {
                dev_err(&pdev->dev, "Could not register input device\n");
-               goto err_free_irq;
+               return error;
        }
 
-       return ret;
-
-err_free_irq:
-       free_irq(ts_irq, ts);
-err_free_input:
-       input_free_device(idev);
-       platform_set_drvdata(pdev, NULL);
-err_free_ts:
-       kfree(ts);
-err_out:
-       return ret;
+       return 0;
 }
 
-static int __devexit stmpe_ts_remove(struct platform_device *pdev)
+static int stmpe_ts_remove(struct platform_device *pdev)
 {
        struct stmpe_touch *ts = platform_get_drvdata(pdev);
-       unsigned int ts_irq = platform_get_irq_byname(pdev, "FIFO_TH");
 
        stmpe_disable(ts->stmpe, STMPE_BLOCK_TOUCHSCREEN);
 
-       free_irq(ts_irq, ts);
-
-       platform_set_drvdata(pdev, NULL);
-
-       input_unregister_device(ts->idev);
-
-       kfree(ts);
-
        return 0;
 }
 
@@ -377,7 +386,7 @@ static struct platform_driver stmpe_ts_driver = {
                   .owner = THIS_MODULE,
                   },
        .probe = stmpe_input_probe,
-       .remove = __devexit_p(stmpe_ts_remove),
+       .remove = stmpe_ts_remove,
 };
 module_platform_driver(stmpe_ts_driver);
 
index 7a18a8a..51e7b87 100644 (file)
@@ -258,7 +258,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
  * The functions for inserting/removing driver as a module.
  */
 
-static int __devinit titsc_probe(struct platform_device *pdev)
+static int titsc_probe(struct platform_device *pdev)
 {
        struct titsc *ts_dev;
        struct input_dev *input_dev;
@@ -327,7 +327,7 @@ err_free_mem:
        return err;
 }
 
-static int __devexit titsc_remove(struct platform_device *pdev)
+static int titsc_remove(struct platform_device *pdev)
 {
        struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
        struct titsc *ts_dev = tscadc_dev->tsc;
@@ -384,7 +384,7 @@ static const struct dev_pm_ops titsc_pm_ops = {
 
 static struct platform_driver ti_tsc_driver = {
        .probe  = titsc_probe,
-       .remove = __devexit_p(titsc_remove),
+       .remove = titsc_remove,
        .driver = {
                .name   = "tsc",
                .owner  = THIS_MODULE,
index 368d2c6..acfb876 100644 (file)
@@ -243,7 +243,7 @@ static void tsc_stop(struct input_dev *dev)
        clk_disable(ts->clk);
 }
 
-static int __devinit tsc_probe(struct platform_device *pdev)
+static int tsc_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct tsc_data *ts;
@@ -357,7 +357,7 @@ error_res:
        return error;
 }
 
-static int __devexit tsc_remove(struct platform_device *pdev)
+static int tsc_remove(struct platform_device *pdev)
 {
        struct tsc_data *ts = platform_get_drvdata(pdev);
 
@@ -374,7 +374,7 @@ static int __devexit tsc_remove(struct platform_device *pdev)
 
 static struct platform_driver tsc_driver = {
        .probe          = tsc_probe,
-       .remove         = __devexit_p(tsc_remove),
+       .remove         = tsc_remove,
        .driver.name    = "tnetv107x-ts",
        .driver.owner   = THIS_MODULE,
 };
index f7eda3d..820a066 100644 (file)
@@ -345,7 +345,7 @@ err0:
        return error;
 }
 
-static int __devexit tps6507x_ts_remove(struct platform_device *pdev)
+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;
@@ -367,7 +367,7 @@ static struct platform_driver tps6507x_ts_driver = {
                .owner = THIS_MODULE,
        },
        .probe = tps6507x_ts_probe,
-       .remove = __devexit_p(tps6507x_ts_remove),
+       .remove = tps6507x_ts_remove,
 };
 module_platform_driver(tps6507x_ts_driver);
 
index 5ce3fa8..9c0cdc7 100644 (file)
@@ -555,7 +555,7 @@ static void tsc2005_close(struct input_dev *input)
        mutex_unlock(&ts->mutex);
 }
 
-static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts)
+static void tsc2005_setup_spi_xfer(struct tsc2005 *ts)
 {
        tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, false);
        tsc2005_setup_read(&ts->spi_y, TSC2005_REG_Y, false);
@@ -569,7 +569,7 @@ static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts)
        spi_message_add_tail(&ts->spi_z2.spi_xfer, &ts->spi_read_msg);
 }
 
-static int __devinit tsc2005_probe(struct spi_device *spi)
+static int tsc2005_probe(struct spi_device *spi)
 {
        const struct tsc2005_platform_data *pdata = spi->dev.platform_data;
        struct tsc2005 *ts;
@@ -686,7 +686,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit tsc2005_remove(struct spi_device *spi)
+static int tsc2005_remove(struct spi_device *spi)
 {
        struct tsc2005 *ts = spi_get_drvdata(spi);
 
@@ -745,7 +745,7 @@ static struct spi_driver tsc2005_driver = {
                .pm     = &tsc2005_pm_ops,
        },
        .probe  = tsc2005_probe,
-       .remove = __devexit_p(tsc2005_remove),
+       .remove = tsc2005_remove,
 };
 
 module_spi_driver(tsc2005_driver);
index 1473d23..0b67ba4 100644 (file)
@@ -273,7 +273,7 @@ static void tsc2007_close(struct input_dev *input_dev)
        tsc2007_stop(ts);
 }
 
-static int __devinit tsc2007_probe(struct i2c_client *client,
+static int tsc2007_probe(struct i2c_client *client,
                                   const struct i2c_device_id *id)
 {
        struct tsc2007 *ts;
@@ -366,7 +366,7 @@ static int __devinit tsc2007_probe(struct i2c_client *client,
        return err;
 }
 
-static int __devexit tsc2007_remove(struct i2c_client *client)
+static int tsc2007_remove(struct i2c_client *client)
 {
        struct tsc2007  *ts = i2c_get_clientdata(client);
        struct tsc2007_platform_data *pdata = client->dev.platform_data;
@@ -396,7 +396,7 @@ static struct i2c_driver tsc2007_driver = {
        },
        .id_table       = tsc2007_idtable,
        .probe          = tsc2007_probe,
-       .remove         = __devexit_p(tsc2007_remove),
+       .remove         = tsc2007_remove,
 };
 
 module_i2c_driver(tsc2007_driver);
index 46e83ad..1271f97 100644 (file)
@@ -274,7 +274,7 @@ static void ucb1400_ts_close(struct input_dev *idev)
  * Try to probe our interrupt, rather than relying on lots of
  * hard-coded machine dependencies.
  */
-static int __devinit ucb1400_ts_detect_irq(struct ucb1400_ts *ucb,
+static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb,
                                           struct platform_device *pdev)
 {
        unsigned long mask, timeout;
@@ -318,7 +318,7 @@ static int __devinit ucb1400_ts_detect_irq(struct ucb1400_ts *ucb,
        return 0;
 }
 
-static int __devinit ucb1400_ts_probe(struct platform_device *pdev)
+static int ucb1400_ts_probe(struct platform_device *pdev)
 {
        struct ucb1400_ts *ucb = pdev->dev.platform_data;
        int error, x_res, y_res;
@@ -397,7 +397,7 @@ err:
        return error;
 }
 
-static int __devexit ucb1400_ts_remove(struct platform_device *pdev)
+static int ucb1400_ts_remove(struct platform_device *pdev)
 {
        struct ucb1400_ts *ucb = pdev->dev.platform_data;
 
@@ -442,7 +442,7 @@ static SIMPLE_DEV_PM_OPS(ucb1400_ts_pm_ops,
 
 static struct platform_driver ucb1400_ts_driver = {
        .probe  = ucb1400_ts_probe,
-       .remove = __devexit_p(ucb1400_ts_remove),
+       .remove = ucb1400_ts_remove,
        .driver = {
                .name   = "ucb1400_ts",
                .owner  = THIS_MODULE,
index 9396b21..d2ef8f0 100644 (file)
@@ -215,7 +215,7 @@ static void w90p910_close(struct input_dev *dev)
        clk_disable(w90p910_ts->clk);
 }
 
-static int __devinit w90x900ts_probe(struct platform_device *pdev)
+static int w90x900ts_probe(struct platform_device *pdev)
 {
        struct w90p910_ts *w90p910_ts;
        struct input_dev *input_dev;
@@ -301,7 +301,7 @@ fail1:      input_free_device(input_dev);
        return err;
 }
 
-static int __devexit w90x900ts_remove(struct platform_device *pdev)
+static int w90x900ts_remove(struct platform_device *pdev)
 {
        struct w90p910_ts *w90p910_ts = platform_get_drvdata(pdev);
        struct resource *res;
@@ -325,7 +325,7 @@ static int __devexit w90x900ts_remove(struct platform_device *pdev)
 
 static struct platform_driver w90x900ts_driver = {
        .probe          = w90x900ts_probe,
-       .remove         = __devexit_p(w90x900ts_remove),
+       .remove         = w90x900ts_remove,
        .driver         = {
                .name   = "nuc900-ts",
                .owner  = THIS_MODULE,
index 0c01657..bf0d076 100644 (file)
@@ -144,7 +144,7 @@ static void wacom_i2c_close(struct input_dev *dev)
        disable_irq(client->irq);
 }
 
-static int __devinit wacom_i2c_probe(struct i2c_client *client,
+static int wacom_i2c_probe(struct i2c_client *client,
                                     const struct i2c_device_id *id)
 {
        struct wacom_i2c *wac_i2c;
@@ -225,7 +225,7 @@ err_free_mem:
        return error;
 }
 
-static int __devexit wacom_i2c_remove(struct i2c_client *client)
+static int wacom_i2c_remove(struct i2c_client *client)
 {
        struct wacom_i2c *wac_i2c = i2c_get_clientdata(client);
 
@@ -272,7 +272,7 @@ static struct i2c_driver wacom_i2c_driver = {
        },
 
        .probe          = wacom_i2c_probe,
-       .remove         = __devexit_p(wacom_i2c_remove),
+       .remove         = wacom_i2c_remove,
        .id_table       = wacom_i2c_id,
 };
 module_i2c_driver(wacom_i2c_driver);
index 52abb98..f88fab5 100644 (file)
@@ -233,7 +233,7 @@ static void wm831x_ts_input_close(struct input_dev *idev)
        }
 }
 
-static __devinit int wm831x_ts_probe(struct platform_device *pdev)
+static int wm831x_ts_probe(struct platform_device *pdev)
 {
        struct wm831x_ts *wm831x_ts;
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
@@ -245,7 +245,8 @@ static __devinit int wm831x_ts_probe(struct platform_device *pdev)
        if (core_pdata)
                pdata = core_pdata->touch;
 
-       wm831x_ts = kzalloc(sizeof(struct wm831x_ts), GFP_KERNEL);
+       wm831x_ts = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ts),
+                                GFP_KERNEL);
        input_dev = input_allocate_device();
        if (!wm831x_ts || !input_dev) {
                error = -ENOMEM;
@@ -376,21 +377,18 @@ err_data_irq:
        free_irq(wm831x_ts->data_irq, wm831x_ts);
 err_alloc:
        input_free_device(input_dev);
-       kfree(wm831x_ts);
 
        return error;
 }
 
-static __devexit int wm831x_ts_remove(struct platform_device *pdev)
+static int wm831x_ts_remove(struct platform_device *pdev)
 {
        struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev);
 
        free_irq(wm831x_ts->pd_irq, wm831x_ts);
        free_irq(wm831x_ts->data_irq, wm831x_ts);
        input_unregister_device(wm831x_ts->input_dev);
-       kfree(wm831x_ts);
 
-       platform_set_drvdata(pdev, NULL);
        return 0;
 }
 
@@ -400,7 +398,7 @@ static struct platform_driver wm831x_ts_driver = {
                .owner = THIS_MODULE,
        },
        .probe = wm831x_ts_probe,
-       .remove = __devexit_p(wm831x_ts_remove),
+       .remove = wm831x_ts_remove,
 };
 module_platform_driver(wm831x_ts_driver);
 
index 1963619..5e8e692 100644 (file)
@@ -326,6 +326,7 @@ static struct resource stmpe_keypad_resources[] = {
 
 static struct mfd_cell stmpe_keypad_cell = {
        .name           = "stmpe-keypad",
+       .of_compatible  = "st,stmpe-keypad",
        .resources      = stmpe_keypad_resources,
        .num_resources  = ARRAY_SIZE(stmpe_keypad_resources),
 };
@@ -409,6 +410,7 @@ static struct resource stmpe_ts_resources[] = {
 
 static struct mfd_cell stmpe_ts_cell = {
        .name           = "stmpe-ts",
+       .of_compatible  = "st,stmpe-ts",
        .resources      = stmpe_ts_resources,
        .num_resources  = ARRAY_SIZE(stmpe_ts_resources),
 };
index cab994b..82ce323 100644 (file)
@@ -112,6 +112,11 @@ struct input_value {
  * @h_list: list of input handles associated with the device. When
  *     accessing the list dev->mutex must be held
  * @node: used to place the device onto input_dev_list
+ * @num_vals: number of values queued in the current frame
+ * @max_vals: maximum number of values queued in a frame
+ * @vals: array of values queued in the current frame
+ * @devres_managed: indicates that devices is managed with devres framework
+ *     and needs not be explicitly unregistered or freed.
  */
 struct input_dev {
        const char *name;
@@ -180,6 +185,8 @@ struct input_dev {
        unsigned int num_vals;
        unsigned int max_vals;
        struct input_value *vals;
+
+       bool devres_managed;
 };
 #define to_input_dev(d) container_of(d, struct input_dev, dev)
 
@@ -323,7 +330,8 @@ struct input_handle {
        struct list_head        h_node;
 };
 
-struct input_dev *input_allocate_device(void);
+struct input_dev __must_check *input_allocate_device(void);
+struct input_dev __must_check *devm_input_allocate_device(struct device *);
 void input_free_device(struct input_dev *dev);
 
 static inline struct input_dev *input_get_device(struct input_dev *dev)
index 05e0328..6230d76 100644 (file)
@@ -9,13 +9,10 @@
 
 /**
  * struct bu21013_platform_device - Handle the platform data
- * @cs_en:     pointer to the cs enable function
- * @cs_dis:    pointer to the cs disable function
- * @irq_read_val:    pointer to read the pen irq value function
  * @touch_x_max: touch x max
  * @touch_y_max: touch y max
  * @cs_pin: chip select pin
- * @irq: irq pin
+ * @touch_pin: touch gpio pin
  * @ext_clk: external clock flag
  * @x_flip: x flip flag
  * @y_flip: y flip flag
  * This is used to handle the platform data
  */
 struct bu21013_platform_device {
-       int (*cs_en)(int reset_pin);
-       int (*cs_dis)(int reset_pin);
-       int (*irq_read_val)(void);
        int touch_x_max;
        int touch_y_max;
        unsigned int cs_pin;
-       unsigned int irq;
+       unsigned int touch_pin;
        bool ext_clk;
        bool x_flip;
        bool y_flip;