aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/misc
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2012-01-09 02:38:23 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2012-01-09 02:38:23 -0500
commitda733563be5a9da26fe81d9f007262d00b846e22 (patch)
treedb28291df94a2043af2123911984c5c173da4e6f /drivers/input/misc
parent6ccbcf2cb41131f8d56ef0723bf3f7c1f8486076 (diff)
parentdab78d7924598ea4031663dd10db814e2e324928 (diff)
Merge branch 'next' into for-linus
Diffstat (limited to 'drivers/input/misc')
-rw-r--r--drivers/input/misc/88pm860x_onkey.c13
-rw-r--r--drivers/input/misc/Kconfig51
-rw-r--r--drivers/input/misc/Makefile4
-rw-r--r--drivers/input/misc/ab8500-ponkey.c13
-rw-r--r--drivers/input/misc/ad714x.c1
-rw-r--r--drivers/input/misc/adxl34x-spi.c1
-rw-r--r--drivers/input/misc/adxl34x.c17
-rw-r--r--drivers/input/misc/ati_remote.c867
-rw-r--r--drivers/input/misc/ati_remote2.c20
-rw-r--r--drivers/input/misc/bfin_rotary.c13
-rw-r--r--drivers/input/misc/cma3000_d0x.c1
-rw-r--r--drivers/input/misc/cobalt_btns.c14
-rw-r--r--drivers/input/misc/dm355evm_keys.c14
-rw-r--r--drivers/input/misc/gp2ap002a00f.c299
-rw-r--r--drivers/input/misc/gpio_tilt_polled.c213
-rw-r--r--drivers/input/misc/ixp4xx-beeper.c13
-rw-r--r--drivers/input/misc/max8925_onkey.c13
-rw-r--r--drivers/input/misc/mc13783-pwrbutton.c272
-rw-r--r--drivers/input/misc/mpu3050.c128
-rw-r--r--drivers/input/misc/pcap_keys.c14
-rw-r--r--drivers/input/misc/pcf50633-input.c13
-rw-r--r--drivers/input/misc/pcspkr.c14
-rw-r--r--drivers/input/misc/pm8xxx-vibrator.c13
-rw-r--r--drivers/input/misc/pmic8xxx-pwrkey.c13
-rw-r--r--drivers/input/misc/pwm-beeper.c13
-rw-r--r--drivers/input/misc/rb532_button.c14
-rw-r--r--drivers/input/misc/rotary_encoder.c16
-rw-r--r--drivers/input/misc/sgi_btns.c13
-rw-r--r--drivers/input/misc/twl4030-pwrbutton.c15
-rw-r--r--drivers/input/misc/twl4030-vibra.c14
-rw-r--r--drivers/input/misc/twl6040-vibra.c34
-rw-r--r--drivers/input/misc/wm831x-on.c13
32 files changed, 1004 insertions, 1162 deletions
diff --git a/drivers/input/misc/88pm860x_onkey.c b/drivers/input/misc/88pm860x_onkey.c
index 3dca3c14510e..f2e0cbc5ab64 100644
--- a/drivers/input/misc/88pm860x_onkey.c
+++ b/drivers/input/misc/88pm860x_onkey.c
@@ -137,18 +137,7 @@ static struct platform_driver pm860x_onkey_driver = {
137 .probe = pm860x_onkey_probe, 137 .probe = pm860x_onkey_probe,
138 .remove = __devexit_p(pm860x_onkey_remove), 138 .remove = __devexit_p(pm860x_onkey_remove),
139}; 139};
140 140module_platform_driver(pm860x_onkey_driver);
141static int __init pm860x_onkey_init(void)
142{
143 return platform_driver_register(&pm860x_onkey_driver);
144}
145module_init(pm860x_onkey_init);
146
147static void __exit pm860x_onkey_exit(void)
148{
149 platform_driver_unregister(&pm860x_onkey_driver);
150}
151module_exit(pm860x_onkey_exit);
152 141
153MODULE_DESCRIPTION("Marvell 88PM860x ONKEY driver"); 142MODULE_DESCRIPTION("Marvell 88PM860x ONKEY driver");
154MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>"); 143MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index a1aa35a053b7..7b46781c30c9 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -134,6 +134,16 @@ config INPUT_MAX8925_ONKEY
134 To compile this driver as a module, choose M here: the module 134 To compile this driver as a module, choose M here: the module
135 will be called max8925_onkey. 135 will be called max8925_onkey.
136 136
137config INPUT_MC13783_PWRBUTTON
138 tristate "MC13783 ON buttons"
139 depends on MFD_MC13783
140 help
141 Support the ON buttons of MC13783 PMIC as an input device
142 reporting power button status.
143
144 To compile this driver as a module, choose M here: the module
145 will be called mc13783-pwrbutton.
146
137config INPUT_MMA8450 147config INPUT_MMA8450
138 tristate "MMA8450 - Freescale's 3-Axis, 8/12-bit Digital Accelerometer" 148 tristate "MMA8450 - Freescale's 3-Axis, 8/12-bit Digital Accelerometer"
139 depends on I2C 149 depends on I2C
@@ -169,6 +179,31 @@ config INPUT_APANEL
169 To compile this driver as a module, choose M here: the module will 179 To compile this driver as a module, choose M here: the module will
170 be called apanel. 180 be called apanel.
171 181
182config INPUT_GP2A
183 tristate "Sharp GP2AP002A00F I2C Proximity/Opto sensor driver"
184 depends on I2C
185 depends on GENERIC_GPIO
186 help
187 Say Y here if you have a Sharp GP2AP002A00F proximity/als combo-chip
188 hooked to an I2C bus.
189
190 To compile this driver as a module, choose M here: the
191 module will be called gp2ap002a00f.
192
193config INPUT_GPIO_TILT_POLLED
194 tristate "Polled GPIO tilt switch"
195 depends on GENERIC_GPIO
196 select INPUT_POLLDEV
197 help
198 This driver implements support for tilt switches connected
199 to GPIO pins that are not capable of generating interrupts.
200
201 The list of gpios to use and the mapping of their states
202 to specific angles is done via platform data.
203
204 To compile this driver as a module, choose M here: the
205 module will be called gpio_tilt_polled.
206
172config INPUT_IXP4XX_BEEPER 207config INPUT_IXP4XX_BEEPER
173 tristate "IXP4XX Beeper support" 208 tristate "IXP4XX Beeper support"
174 depends on ARCH_IXP4XX 209 depends on ARCH_IXP4XX
@@ -217,22 +252,6 @@ config INPUT_ATLAS_BTNS
217 To compile this driver as a module, choose M here: the module will 252 To compile this driver as a module, choose M here: the module will
218 be called atlas_btns. 253 be called atlas_btns.
219 254
220config INPUT_ATI_REMOTE
221 tristate "ATI / X10 USB RF remote control"
222 depends on USB_ARCH_HAS_HCD
223 select USB
224 help
225 Say Y here if you want to use an ATI or X10 "Lola" USB remote control.
226 These are RF remotes with USB receivers.
227 The ATI remote comes with many of ATI's All-In-Wonder video cards.
228 The X10 "Lola" remote is available at:
229 <http://www.x10.com/products/lola_sg1.htm>
230 This driver provides mouse pointer, left and right mouse buttons,
231 and maps all the other remote buttons to keypress events.
232
233 To compile this driver as a module, choose M here: the module will be
234 called ati_remote.
235
236config INPUT_ATI_REMOTE2 255config INPUT_ATI_REMOTE2
237 tristate "ATI / Philips USB RF remote control" 256 tristate "ATI / Philips USB RF remote control"
238 depends on USB_ARCH_HAS_HCD 257 depends on USB_ARCH_HAS_HCD
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 53a8d0faad52..46671a875b91 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -13,7 +13,6 @@ obj-$(CONFIG_INPUT_ADXL34X) += adxl34x.o
13obj-$(CONFIG_INPUT_ADXL34X_I2C) += adxl34x-i2c.o 13obj-$(CONFIG_INPUT_ADXL34X_I2C) += adxl34x-i2c.o
14obj-$(CONFIG_INPUT_ADXL34X_SPI) += adxl34x-spi.o 14obj-$(CONFIG_INPUT_ADXL34X_SPI) += adxl34x-spi.o
15obj-$(CONFIG_INPUT_APANEL) += apanel.o 15obj-$(CONFIG_INPUT_APANEL) += apanel.o
16obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o
17obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o 16obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
18obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o 17obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o
19obj-$(CONFIG_INPUT_BFIN_ROTARY) += bfin_rotary.o 18obj-$(CONFIG_INPUT_BFIN_ROTARY) += bfin_rotary.o
@@ -23,12 +22,15 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o
23obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o 22obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o
24obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o 23obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o
25obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o 24obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o
25obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o
26obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o
26obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o 27obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
27obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o 28obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o
28obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o 29obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
29obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o 30obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o
30obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o 31obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
31obj-$(CONFIG_INPUT_MAX8925_ONKEY) += max8925_onkey.o 32obj-$(CONFIG_INPUT_MAX8925_ONKEY) += max8925_onkey.o
33obj-$(CONFIG_INPUT_MC13783_PWRBUTTON) += mc13783-pwrbutton.o
32obj-$(CONFIG_INPUT_MMA8450) += mma8450.o 34obj-$(CONFIG_INPUT_MMA8450) += mma8450.o
33obj-$(CONFIG_INPUT_MPU3050) += mpu3050.o 35obj-$(CONFIG_INPUT_MPU3050) += mpu3050.o
34obj-$(CONFIG_INPUT_PCAP) += pcap_keys.o 36obj-$(CONFIG_INPUT_PCAP) += pcap_keys.o
diff --git a/drivers/input/misc/ab8500-ponkey.c b/drivers/input/misc/ab8500-ponkey.c
index 3d3288a78fdc..79d901633635 100644
--- a/drivers/input/misc/ab8500-ponkey.c
+++ b/drivers/input/misc/ab8500-ponkey.c
@@ -139,18 +139,7 @@ static struct platform_driver ab8500_ponkey_driver = {
139 .probe = ab8500_ponkey_probe, 139 .probe = ab8500_ponkey_probe,
140 .remove = __devexit_p(ab8500_ponkey_remove), 140 .remove = __devexit_p(ab8500_ponkey_remove),
141}; 141};
142 142module_platform_driver(ab8500_ponkey_driver);
143static int __init ab8500_ponkey_init(void)
144{
145 return platform_driver_register(&ab8500_ponkey_driver);
146}
147module_init(ab8500_ponkey_init);
148
149static void __exit ab8500_ponkey_exit(void)
150{
151 platform_driver_unregister(&ab8500_ponkey_driver);
152}
153module_exit(ab8500_ponkey_exit);
154 143
155MODULE_LICENSE("GPL v2"); 144MODULE_LICENSE("GPL v2");
156MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>"); 145MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c
index ca42c7d2a3c7..0ac75bbad4d6 100644
--- a/drivers/input/misc/ad714x.c
+++ b/drivers/input/misc/ad714x.c
@@ -12,6 +12,7 @@
12#include <linux/interrupt.h> 12#include <linux/interrupt.h>
13#include <linux/slab.h> 13#include <linux/slab.h>
14#include <linux/input/ad714x.h> 14#include <linux/input/ad714x.h>
15#include <linux/module.h>
15#include "ad714x.h" 16#include "ad714x.h"
16 17
17#define AD714X_PWR_CTRL 0x0 18#define AD714X_PWR_CTRL 0x0
diff --git a/drivers/input/misc/adxl34x-spi.c b/drivers/input/misc/adxl34x-spi.c
index f29de22fdda0..34d401efd4a1 100644
--- a/drivers/input/misc/adxl34x-spi.c
+++ b/drivers/input/misc/adxl34x-spi.c
@@ -122,7 +122,6 @@ static SIMPLE_DEV_PM_OPS(adxl34x_spi_pm, adxl34x_spi_suspend,
122static struct spi_driver adxl34x_driver = { 122static struct spi_driver adxl34x_driver = {
123 .driver = { 123 .driver = {
124 .name = "adxl34x", 124 .name = "adxl34x",
125 .bus = &spi_bus_type,
126 .owner = THIS_MODULE, 125 .owner = THIS_MODULE,
127 .pm = &adxl34x_spi_pm, 126 .pm = &adxl34x_spi_pm,
128 }, 127 },
diff --git a/drivers/input/misc/adxl34x.c b/drivers/input/misc/adxl34x.c
index 144ddbdeb9b3..1cf72fe513e6 100644
--- a/drivers/input/misc/adxl34x.c
+++ b/drivers/input/misc/adxl34x.c
@@ -16,6 +16,7 @@
16#include <linux/slab.h> 16#include <linux/slab.h>
17#include <linux/workqueue.h> 17#include <linux/workqueue.h>
18#include <linux/input/adxl34x.h> 18#include <linux/input/adxl34x.h>
19#include <linux/module.h>
19 20
20#include "adxl34x.h" 21#include "adxl34x.h"
21 22
@@ -451,10 +452,10 @@ static ssize_t adxl34x_disable_store(struct device *dev,
451 const char *buf, size_t count) 452 const char *buf, size_t count)
452{ 453{
453 struct adxl34x *ac = dev_get_drvdata(dev); 454 struct adxl34x *ac = dev_get_drvdata(dev);
454 unsigned long val; 455 unsigned int val;
455 int error; 456 int error;
456 457
457 error = strict_strtoul(buf, 10, &val); 458 error = kstrtouint(buf, 10, &val);
458 if (error) 459 if (error)
459 return error; 460 return error;
460 461
@@ -540,10 +541,10 @@ static ssize_t adxl34x_rate_store(struct device *dev,
540 const char *buf, size_t count) 541 const char *buf, size_t count)
541{ 542{
542 struct adxl34x *ac = dev_get_drvdata(dev); 543 struct adxl34x *ac = dev_get_drvdata(dev);
543 unsigned long val; 544 unsigned char val;
544 int error; 545 int error;
545 546
546 error = strict_strtoul(buf, 10, &val); 547 error = kstrtou8(buf, 10, &val);
547 if (error) 548 if (error)
548 return error; 549 return error;
549 550
@@ -575,10 +576,10 @@ static ssize_t adxl34x_autosleep_store(struct device *dev,
575 const char *buf, size_t count) 576 const char *buf, size_t count)
576{ 577{
577 struct adxl34x *ac = dev_get_drvdata(dev); 578 struct adxl34x *ac = dev_get_drvdata(dev);
578 unsigned long val; 579 unsigned int val;
579 int error; 580 int error;
580 581
581 error = strict_strtoul(buf, 10, &val); 582 error = kstrtouint(buf, 10, &val);
582 if (error) 583 if (error)
583 return error; 584 return error;
584 585
@@ -622,13 +623,13 @@ static ssize_t adxl34x_write_store(struct device *dev,
622 const char *buf, size_t count) 623 const char *buf, size_t count)
623{ 624{
624 struct adxl34x *ac = dev_get_drvdata(dev); 625 struct adxl34x *ac = dev_get_drvdata(dev);
625 unsigned long val; 626 unsigned int val;
626 int error; 627 int error;
627 628
628 /* 629 /*
629 * This allows basic ADXL register write access for debug purposes. 630 * This allows basic ADXL register write access for debug purposes.
630 */ 631 */
631 error = strict_strtoul(buf, 16, &val); 632 error = kstrtouint(buf, 16, &val);
632 if (error) 633 if (error)
633 return error; 634 return error;
634 635
diff --git a/drivers/input/misc/ati_remote.c b/drivers/input/misc/ati_remote.c
deleted file mode 100644
index bce57129afba..000000000000
--- a/drivers/input/misc/ati_remote.c
+++ /dev/null
@@ -1,867 +0,0 @@
1/*
2 * USB ATI Remote support
3 *
4 * Version 2.2.0 Copyright (c) 2004 Torrey Hoffman <thoffman@arnor.net>
5 * Version 2.1.1 Copyright (c) 2002 Vladimir Dergachev
6 *
7 * This 2.2.0 version is a rewrite / cleanup of the 2.1.1 driver, including
8 * porting to the 2.6 kernel interfaces, along with other modification
9 * to better match the style of the existing usb/input drivers. However, the
10 * protocol and hardware handling is essentially unchanged from 2.1.1.
11 *
12 * The 2.1.1 driver was derived from the usbati_remote and usbkbd drivers by
13 * Vojtech Pavlik.
14 *
15 * Changes:
16 *
17 * Feb 2004: Torrey Hoffman <thoffman@arnor.net>
18 * Version 2.2.0
19 * Jun 2004: Torrey Hoffman <thoffman@arnor.net>
20 * Version 2.2.1
21 * Added key repeat support contributed by:
22 * Vincent Vanackere <vanackere@lif.univ-mrs.fr>
23 * Added support for the "Lola" remote contributed by:
24 * Seth Cohn <sethcohn@yahoo.com>
25 *
26 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
27 *
28 * This program is free software; you can redistribute it and/or modify
29 * it under the terms of the GNU General Public License as published by
30 * the Free Software Foundation; either version 2 of the License, or
31 * (at your option) any later version.
32 *
33 * This program is distributed in the hope that it will be useful,
34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36 * GNU General Public License for more details.
37 *
38 * You should have received a copy of the GNU General Public License
39 * along with this program; if not, write to the Free Software
40 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
41 *
42 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
43 *
44 * Hardware & software notes
45 *
46 * These remote controls are distributed by ATI as part of their
47 * "All-In-Wonder" video card packages. The receiver self-identifies as a
48 * "USB Receiver" with manufacturer "X10 Wireless Technology Inc".
49 *
50 * The "Lola" remote is available from X10. See:
51 * http://www.x10.com/products/lola_sg1.htm
52 * The Lola is similar to the ATI remote but has no mouse support, and slightly
53 * different keys.
54 *
55 * It is possible to use multiple receivers and remotes on multiple computers
56 * simultaneously by configuring them to use specific channels.
57 *
58 * The RF protocol used by the remote supports 16 distinct channels, 1 to 16.
59 * Actually, it may even support more, at least in some revisions of the
60 * hardware.
61 *
62 * Each remote can be configured to transmit on one channel as follows:
63 * - Press and hold the "hand icon" button.
64 * - When the red LED starts to blink, let go of the "hand icon" button.
65 * - When it stops blinking, input the channel code as two digits, from 01
66 * to 16, and press the hand icon again.
67 *
68 * The timing can be a little tricky. Try loading the module with debug=1
69 * to have the kernel print out messages about the remote control number
70 * and mask. Note: debugging prints remote numbers as zero-based hexadecimal.
71 *
72 * The driver has a "channel_mask" parameter. This bitmask specifies which
73 * channels will be ignored by the module. To mask out channels, just add
74 * all the 2^channel_number values together.
75 *
76 * For instance, set channel_mask = 2^4 = 16 (binary 10000) to make ati_remote
77 * ignore signals coming from remote controls transmitting on channel 4, but
78 * accept all other channels.
79 *
80 * Or, set channel_mask = 65533, (0xFFFD), and all channels except 1 will be
81 * ignored.
82 *
83 * The default is 0 (respond to all channels). Bit 0 and bits 17-32 of this
84 * parameter are unused.
85 *
86 */
87
88#include <linux/kernel.h>
89#include <linux/errno.h>
90#include <linux/init.h>
91#include <linux/slab.h>
92#include <linux/module.h>
93#include <linux/usb/input.h>
94#include <linux/wait.h>
95#include <linux/jiffies.h>
96
97/*
98 * Module and Version Information, Module Parameters
99 */
100
101#define ATI_REMOTE_VENDOR_ID 0x0bc7
102#define LOLA_REMOTE_PRODUCT_ID 0x0002
103#define LOLA2_REMOTE_PRODUCT_ID 0x0003
104#define ATI_REMOTE_PRODUCT_ID 0x0004
105#define NVIDIA_REMOTE_PRODUCT_ID 0x0005
106#define MEDION_REMOTE_PRODUCT_ID 0x0006
107
108#define DRIVER_VERSION "2.2.1"
109#define DRIVER_AUTHOR "Torrey Hoffman <thoffman@arnor.net>"
110#define DRIVER_DESC "ATI/X10 RF USB Remote Control"
111
112#define NAME_BUFSIZE 80 /* size of product name, path buffers */
113#define DATA_BUFSIZE 63 /* size of URB data buffers */
114
115/*
116 * Duplicate event filtering time.
117 * Sequential, identical KIND_FILTERED inputs with less than
118 * FILTER_TIME milliseconds between them are considered as repeat
119 * events. The hardware generates 5 events for the first keypress
120 * and we have to take this into account for an accurate repeat
121 * behaviour.
122 */
123#define FILTER_TIME 60 /* msec */
124#define REPEAT_DELAY 500 /* msec */
125
126static unsigned long channel_mask;
127module_param(channel_mask, ulong, 0644);
128MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore");
129
130static int debug;
131module_param(debug, int, 0644);
132MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
133
134static int repeat_filter = FILTER_TIME;
135module_param(repeat_filter, int, 0644);
136MODULE_PARM_DESC(repeat_filter, "Repeat filter time, default = 60 msec");
137
138static int repeat_delay = REPEAT_DELAY;
139module_param(repeat_delay, int, 0644);
140MODULE_PARM_DESC(repeat_delay, "Delay before sending repeats, default = 500 msec");
141
142#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0)
143#undef err
144#define err(format, arg...) printk(KERN_ERR format , ## arg)
145
146static struct usb_device_id ati_remote_table[] = {
147 { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID) },
148 { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID) },
149 { USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID) },
150 { USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID) },
151 { USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID) },
152 {} /* Terminating entry */
153};
154
155MODULE_DEVICE_TABLE(usb, ati_remote_table);
156
157/* Get hi and low bytes of a 16-bits int */
158#define HI(a) ((unsigned char)((a) >> 8))
159#define LO(a) ((unsigned char)((a) & 0xff))
160
161#define SEND_FLAG_IN_PROGRESS 1
162#define SEND_FLAG_COMPLETE 2
163
164/* Device initialization strings */
165static char init1[] = { 0x01, 0x00, 0x20, 0x14 };
166static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 };
167
168struct ati_remote {
169 struct input_dev *idev;
170 struct usb_device *udev;
171 struct usb_interface *interface;
172
173 struct urb *irq_urb;
174 struct urb *out_urb;
175 struct usb_endpoint_descriptor *endpoint_in;
176 struct usb_endpoint_descriptor *endpoint_out;
177 unsigned char *inbuf;
178 unsigned char *outbuf;
179 dma_addr_t inbuf_dma;
180 dma_addr_t outbuf_dma;
181
182 unsigned char old_data[2]; /* Detect duplicate events */
183 unsigned long old_jiffies;
184 unsigned long acc_jiffies; /* handle acceleration */
185 unsigned long first_jiffies;
186
187 unsigned int repeat_count;
188
189 char name[NAME_BUFSIZE];
190 char phys[NAME_BUFSIZE];
191
192 wait_queue_head_t wait;
193 int send_flags;
194};
195
196/* "Kinds" of messages sent from the hardware to the driver. */
197#define KIND_END 0
198#define KIND_LITERAL 1 /* Simply pass to input system */
199#define KIND_FILTERED 2 /* Add artificial key-up events, drop keyrepeats */
200#define KIND_LU 3 /* Directional keypad diagonals - left up, */
201#define KIND_RU 4 /* right up, */
202#define KIND_LD 5 /* left down, */
203#define KIND_RD 6 /* right down */
204#define KIND_ACCEL 7 /* Directional keypad - left, right, up, down.*/
205
206/* Translation table from hardware messages to input events. */
207static const struct {
208 short kind;
209 unsigned char data1, data2;
210 int type;
211 unsigned int code;
212 int value;
213} ati_remote_tbl[] = {
214 /* Directional control pad axes */
215 {KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */
216 {KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */
217 {KIND_ACCEL, 0x37, 0x72, EV_REL, REL_Y, -1}, /* up */
218 {KIND_ACCEL, 0x38, 0x73, EV_REL, REL_Y, 1}, /* down */
219 /* Directional control pad diagonals */
220 {KIND_LU, 0x39, 0x74, EV_REL, 0, 0}, /* left up */
221 {KIND_RU, 0x3a, 0x75, EV_REL, 0, 0}, /* right up */
222 {KIND_LD, 0x3c, 0x77, EV_REL, 0, 0}, /* left down */
223 {KIND_RD, 0x3b, 0x76, EV_REL, 0, 0}, /* right down */
224
225 /* "Mouse button" buttons */
226 {KIND_LITERAL, 0x3d, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */
227 {KIND_LITERAL, 0x3e, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */
228 {KIND_LITERAL, 0x41, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */
229 {KIND_LITERAL, 0x42, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */
230
231 /* Artificial "doubleclick" events are generated by the hardware.
232 * They are mapped to the "side" and "extra" mouse buttons here. */
233 {KIND_FILTERED, 0x3f, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */
234 {KIND_FILTERED, 0x43, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */
235
236 /* keyboard. */
237 {KIND_FILTERED, 0xd2, 0x0d, EV_KEY, KEY_1, 1},
238 {KIND_FILTERED, 0xd3, 0x0e, EV_KEY, KEY_2, 1},
239 {KIND_FILTERED, 0xd4, 0x0f, EV_KEY, KEY_3, 1},
240 {KIND_FILTERED, 0xd5, 0x10, EV_KEY, KEY_4, 1},
241 {KIND_FILTERED, 0xd6, 0x11, EV_KEY, KEY_5, 1},
242 {KIND_FILTERED, 0xd7, 0x12, EV_KEY, KEY_6, 1},
243 {KIND_FILTERED, 0xd8, 0x13, EV_KEY, KEY_7, 1},
244 {KIND_FILTERED, 0xd9, 0x14, EV_KEY, KEY_8, 1},
245 {KIND_FILTERED, 0xda, 0x15, EV_KEY, KEY_9, 1},
246 {KIND_FILTERED, 0xdc, 0x17, EV_KEY, KEY_0, 1},
247 {KIND_FILTERED, 0xc5, 0x00, EV_KEY, KEY_A, 1},
248 {KIND_FILTERED, 0xc6, 0x01, EV_KEY, KEY_B, 1},
249 {KIND_FILTERED, 0xde, 0x19, EV_KEY, KEY_C, 1},
250 {KIND_FILTERED, 0xe0, 0x1b, EV_KEY, KEY_D, 1},
251 {KIND_FILTERED, 0xe6, 0x21, EV_KEY, KEY_E, 1},
252 {KIND_FILTERED, 0xe8, 0x23, EV_KEY, KEY_F, 1},
253
254 /* "special" keys */
255 {KIND_FILTERED, 0xdd, 0x18, EV_KEY, KEY_KPENTER, 1}, /* "check" */
256 {KIND_FILTERED, 0xdb, 0x16, EV_KEY, KEY_MENU, 1}, /* "menu" */
257 {KIND_FILTERED, 0xc7, 0x02, EV_KEY, KEY_POWER, 1}, /* Power */
258 {KIND_FILTERED, 0xc8, 0x03, EV_KEY, KEY_TV, 1}, /* TV */
259 {KIND_FILTERED, 0xc9, 0x04, EV_KEY, KEY_DVD, 1}, /* DVD */
260 {KIND_FILTERED, 0xca, 0x05, EV_KEY, KEY_WWW, 1}, /* WEB */
261 {KIND_FILTERED, 0xcb, 0x06, EV_KEY, KEY_BOOKMARKS, 1}, /* "book" */
262 {KIND_FILTERED, 0xcc, 0x07, EV_KEY, KEY_EDIT, 1}, /* "hand" */
263 {KIND_FILTERED, 0xe1, 0x1c, EV_KEY, KEY_COFFEE, 1}, /* "timer" */
264 {KIND_FILTERED, 0xe5, 0x20, EV_KEY, KEY_FRONT, 1}, /* "max" */
265 {KIND_FILTERED, 0xe2, 0x1d, EV_KEY, KEY_LEFT, 1}, /* left */
266 {KIND_FILTERED, 0xe4, 0x1f, EV_KEY, KEY_RIGHT, 1}, /* right */
267 {KIND_FILTERED, 0xe7, 0x22, EV_KEY, KEY_DOWN, 1}, /* down */
268 {KIND_FILTERED, 0xdf, 0x1a, EV_KEY, KEY_UP, 1}, /* up */
269 {KIND_FILTERED, 0xe3, 0x1e, EV_KEY, KEY_OK, 1}, /* "OK" */
270 {KIND_FILTERED, 0xce, 0x09, EV_KEY, KEY_VOLUMEDOWN, 1}, /* VOL + */
271 {KIND_FILTERED, 0xcd, 0x08, EV_KEY, KEY_VOLUMEUP, 1}, /* VOL - */
272 {KIND_FILTERED, 0xcf, 0x0a, EV_KEY, KEY_MUTE, 1}, /* MUTE */
273 {KIND_FILTERED, 0xd0, 0x0b, EV_KEY, KEY_CHANNELUP, 1}, /* CH + */
274 {KIND_FILTERED, 0xd1, 0x0c, EV_KEY, KEY_CHANNELDOWN, 1},/* CH - */
275 {KIND_FILTERED, 0xec, 0x27, EV_KEY, KEY_RECORD, 1}, /* ( o) red */
276 {KIND_FILTERED, 0xea, 0x25, EV_KEY, KEY_PLAY, 1}, /* ( >) */
277 {KIND_FILTERED, 0xe9, 0x24, EV_KEY, KEY_REWIND, 1}, /* (<<) */
278 {KIND_FILTERED, 0xeb, 0x26, EV_KEY, KEY_FORWARD, 1}, /* (>>) */
279 {KIND_FILTERED, 0xed, 0x28, EV_KEY, KEY_STOP, 1}, /* ([]) */
280 {KIND_FILTERED, 0xee, 0x29, EV_KEY, KEY_PAUSE, 1}, /* ('') */
281 {KIND_FILTERED, 0xf0, 0x2b, EV_KEY, KEY_PREVIOUS, 1}, /* (<-) */
282 {KIND_FILTERED, 0xef, 0x2a, EV_KEY, KEY_NEXT, 1}, /* (>+) */
283 {KIND_FILTERED, 0xf2, 0x2D, EV_KEY, KEY_INFO, 1}, /* PLAYING */
284 {KIND_FILTERED, 0xf3, 0x2E, EV_KEY, KEY_HOME, 1}, /* TOP */
285 {KIND_FILTERED, 0xf4, 0x2F, EV_KEY, KEY_END, 1}, /* END */
286 {KIND_FILTERED, 0xf5, 0x30, EV_KEY, KEY_SELECT, 1}, /* SELECT */
287
288 {KIND_END, 0x00, 0x00, EV_MAX + 1, 0, 0}
289};
290
291/* Local function prototypes */
292static int ati_remote_open (struct input_dev *inputdev);
293static void ati_remote_close (struct input_dev *inputdev);
294static int ati_remote_sendpacket (struct ati_remote *ati_remote, u16 cmd, unsigned char *data);
295static void ati_remote_irq_out (struct urb *urb);
296static void ati_remote_irq_in (struct urb *urb);
297static void ati_remote_input_report (struct urb *urb);
298static int ati_remote_initialize (struct ati_remote *ati_remote);
299static int ati_remote_probe (struct usb_interface *interface, const struct usb_device_id *id);
300static void ati_remote_disconnect (struct usb_interface *interface);
301
302/* usb specific object to register with the usb subsystem */
303static struct usb_driver ati_remote_driver = {
304 .name = "ati_remote",
305 .probe = ati_remote_probe,
306 .disconnect = ati_remote_disconnect,
307 .id_table = ati_remote_table,
308};
309
310/*
311 * ati_remote_dump_input
312 */
313static void ati_remote_dump(struct device *dev, unsigned char *data,
314 unsigned int len)
315{
316 if ((len == 1) && (data[0] != (unsigned char)0xff) && (data[0] != 0x00))
317 dev_warn(dev, "Weird byte 0x%02x\n", data[0]);
318 else if (len == 4)
319 dev_warn(dev, "Weird key %02x %02x %02x %02x\n",
320 data[0], data[1], data[2], data[3]);
321 else
322 dev_warn(dev, "Weird data, len=%d %02x %02x %02x %02x %02x %02x ...\n",
323 len, data[0], data[1], data[2], data[3], data[4], data[5]);
324}
325
326/*
327 * ati_remote_open
328 */
329static int ati_remote_open(struct input_dev *inputdev)
330{
331 struct ati_remote *ati_remote = input_get_drvdata(inputdev);
332
333 /* On first open, submit the read urb which was set up previously. */
334 ati_remote->irq_urb->dev = ati_remote->udev;
335 if (usb_submit_urb(ati_remote->irq_urb, GFP_KERNEL)) {
336 dev_err(&ati_remote->interface->dev,
337 "%s: usb_submit_urb failed!\n", __func__);
338 return -EIO;
339 }
340
341 return 0;
342}
343
344/*
345 * ati_remote_close
346 */
347static void ati_remote_close(struct input_dev *inputdev)
348{
349 struct ati_remote *ati_remote = input_get_drvdata(inputdev);
350
351 usb_kill_urb(ati_remote->irq_urb);
352}
353
354/*
355 * ati_remote_irq_out
356 */
357static void ati_remote_irq_out(struct urb *urb)
358{
359 struct ati_remote *ati_remote = urb->context;
360
361 if (urb->status) {
362 dev_dbg(&ati_remote->interface->dev, "%s: status %d\n",
363 __func__, urb->status);
364 return;
365 }
366
367 ati_remote->send_flags |= SEND_FLAG_COMPLETE;
368 wmb();
369 wake_up(&ati_remote->wait);
370}
371
372/*
373 * ati_remote_sendpacket
374 *
375 * Used to send device initialization strings
376 */
377static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd, unsigned char *data)
378{
379 int retval = 0;
380
381 /* Set up out_urb */
382 memcpy(ati_remote->out_urb->transfer_buffer + 1, data, LO(cmd));
383 ((char *) ati_remote->out_urb->transfer_buffer)[0] = HI(cmd);
384
385 ati_remote->out_urb->transfer_buffer_length = LO(cmd) + 1;
386 ati_remote->out_urb->dev = ati_remote->udev;
387 ati_remote->send_flags = SEND_FLAG_IN_PROGRESS;
388
389 retval = usb_submit_urb(ati_remote->out_urb, GFP_ATOMIC);
390 if (retval) {
391 dev_dbg(&ati_remote->interface->dev,
392 "sendpacket: usb_submit_urb failed: %d\n", retval);
393 return retval;
394 }
395
396 wait_event_timeout(ati_remote->wait,
397 ((ati_remote->out_urb->status != -EINPROGRESS) ||
398 (ati_remote->send_flags & SEND_FLAG_COMPLETE)),
399 HZ);
400 usb_kill_urb(ati_remote->out_urb);
401
402 return retval;
403}
404
405/*
406 * ati_remote_event_lookup
407 */
408static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2)
409{
410 int i;
411
412 for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) {
413 /*
414 * Decide if the table entry matches the remote input.
415 */
416 if ((((ati_remote_tbl[i].data1 & 0x0f) == (d1 & 0x0f))) &&
417 ((((ati_remote_tbl[i].data1 >> 4) -
418 (d1 >> 4) + rem) & 0x0f) == 0x0f) &&
419 (ati_remote_tbl[i].data2 == d2))
420 return i;
421
422 }
423 return -1;
424}
425
426/*
427 * ati_remote_compute_accel
428 *
429 * Implements acceleration curve for directional control pad
430 * If elapsed time since last event is > 1/4 second, user "stopped",
431 * so reset acceleration. Otherwise, user is probably holding the control
432 * pad down, so we increase acceleration, ramping up over two seconds to
433 * a maximum speed.
434 */
435static int ati_remote_compute_accel(struct ati_remote *ati_remote)
436{
437 static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
438 unsigned long now = jiffies;
439 int acc;
440
441 if (time_after(now, ati_remote->old_jiffies + msecs_to_jiffies(250))) {
442 acc = 1;
443 ati_remote->acc_jiffies = now;
444 }
445 else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(125)))
446 acc = accel[0];
447 else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(250)))
448 acc = accel[1];
449 else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(500)))
450 acc = accel[2];
451 else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1000)))
452 acc = accel[3];
453 else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1500)))
454 acc = accel[4];
455 else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(2000)))
456 acc = accel[5];
457 else
458 acc = accel[6];
459
460 return acc;
461}
462
463/*
464 * ati_remote_report_input
465 */
466static void ati_remote_input_report(struct urb *urb)
467{
468 struct ati_remote *ati_remote = urb->context;
469 unsigned char *data= ati_remote->inbuf;
470 struct input_dev *dev = ati_remote->idev;
471 int index, acc;
472 int remote_num;
473
474 /* Deal with strange looking inputs */
475 if ( (urb->actual_length != 4) || (data[0] != 0x14) ||
476 ((data[3] & 0x0f) != 0x00) ) {
477 ati_remote_dump(&urb->dev->dev, data, urb->actual_length);
478 return;
479 }
480
481 /* Mask unwanted remote channels. */
482 /* note: remote_num is 0-based, channel 1 on remote == 0 here */
483 remote_num = (data[3] >> 4) & 0x0f;
484 if (channel_mask & (1 << (remote_num + 1))) {
485 dbginfo(&ati_remote->interface->dev,
486 "Masked input from channel 0x%02x: data %02x,%02x, mask= 0x%02lx\n",
487 remote_num, data[1], data[2], channel_mask);
488 return;
489 }
490
491 /* Look up event code index in translation table */
492 index = ati_remote_event_lookup(remote_num, data[1], data[2]);
493 if (index < 0) {
494 dev_warn(&ati_remote->interface->dev,
495 "Unknown input from channel 0x%02x: data %02x,%02x\n",
496 remote_num, data[1], data[2]);
497 return;
498 }
499 dbginfo(&ati_remote->interface->dev,
500 "channel 0x%02x; data %02x,%02x; index %d; keycode %d\n",
501 remote_num, data[1], data[2], index, ati_remote_tbl[index].code);
502
503 if (ati_remote_tbl[index].kind == KIND_LITERAL) {
504 input_event(dev, ati_remote_tbl[index].type,
505 ati_remote_tbl[index].code,
506 ati_remote_tbl[index].value);
507 input_sync(dev);
508
509 ati_remote->old_jiffies = jiffies;
510 return;
511 }
512
513 if (ati_remote_tbl[index].kind == KIND_FILTERED) {
514 unsigned long now = jiffies;
515
516 /* Filter duplicate events which happen "too close" together. */
517 if (ati_remote->old_data[0] == data[1] &&
518 ati_remote->old_data[1] == data[2] &&
519 time_before(now, ati_remote->old_jiffies +
520 msecs_to_jiffies(repeat_filter))) {
521 ati_remote->repeat_count++;
522 } else {
523 ati_remote->repeat_count = 0;
524 ati_remote->first_jiffies = now;
525 }
526
527 ati_remote->old_data[0] = data[1];
528 ati_remote->old_data[1] = data[2];
529 ati_remote->old_jiffies = now;
530
531 /* Ensure we skip at least the 4 first duplicate events (generated
532 * by a single keypress), and continue skipping until repeat_delay
533 * msecs have passed
534 */
535 if (ati_remote->repeat_count > 0 &&
536 (ati_remote->repeat_count < 5 ||
537 time_before(now, ati_remote->first_jiffies +
538 msecs_to_jiffies(repeat_delay))))
539 return;
540
541
542 input_event(dev, ati_remote_tbl[index].type,
543 ati_remote_tbl[index].code, 1);
544 input_sync(dev);
545 input_event(dev, ati_remote_tbl[index].type,
546 ati_remote_tbl[index].code, 0);
547 input_sync(dev);
548
549 } else {
550
551 /*
552 * Other event kinds are from the directional control pad, and have an
553 * acceleration factor applied to them. Without this acceleration, the
554 * control pad is mostly unusable.
555 */
556 acc = ati_remote_compute_accel(ati_remote);
557
558 switch (ati_remote_tbl[index].kind) {
559 case KIND_ACCEL:
560 input_event(dev, ati_remote_tbl[index].type,
561 ati_remote_tbl[index].code,
562 ati_remote_tbl[index].value * acc);
563 break;
564 case KIND_LU:
565 input_report_rel(dev, REL_X, -acc);
566 input_report_rel(dev, REL_Y, -acc);
567 break;
568 case KIND_RU:
569 input_report_rel(dev, REL_X, acc);
570 input_report_rel(dev, REL_Y, -acc);
571 break;
572 case KIND_LD:
573 input_report_rel(dev, REL_X, -acc);
574 input_report_rel(dev, REL_Y, acc);
575 break;
576 case KIND_RD:
577 input_report_rel(dev, REL_X, acc);
578 input_report_rel(dev, REL_Y, acc);
579 break;
580 default:
581 dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n",
582 ati_remote_tbl[index].kind);
583 }
584 input_sync(dev);
585
586 ati_remote->old_jiffies = jiffies;
587 ati_remote->old_data[0] = data[1];
588 ati_remote->old_data[1] = data[2];
589 }
590}
591
592/*
593 * ati_remote_irq_in
594 */
595static void ati_remote_irq_in(struct urb *urb)
596{
597 struct ati_remote *ati_remote = urb->context;
598 int retval;
599
600 switch (urb->status) {
601 case 0: /* success */
602 ati_remote_input_report(urb);
603 break;
604 case -ECONNRESET: /* unlink */
605 case -ENOENT:
606 case -ESHUTDOWN:
607 dev_dbg(&ati_remote->interface->dev, "%s: urb error status, unlink? \n",
608 __func__);
609 return;
610 default: /* error */
611 dev_dbg(&ati_remote->interface->dev, "%s: Nonzero urb status %d\n",
612 __func__, urb->status);
613 }
614
615 retval = usb_submit_urb(urb, GFP_ATOMIC);
616 if (retval)
617 dev_err(&ati_remote->interface->dev, "%s: usb_submit_urb()=%d\n",
618 __func__, retval);
619}
620
621/*
622 * ati_remote_alloc_buffers
623 */
624static int ati_remote_alloc_buffers(struct usb_device *udev,
625 struct ati_remote *ati_remote)
626{
627 ati_remote->inbuf = usb_alloc_coherent(udev, DATA_BUFSIZE, GFP_ATOMIC,
628 &ati_remote->inbuf_dma);
629 if (!ati_remote->inbuf)
630 return -1;
631
632 ati_remote->outbuf = usb_alloc_coherent(udev, DATA_BUFSIZE, GFP_ATOMIC,
633 &ati_remote->outbuf_dma);
634 if (!ati_remote->outbuf)
635 return -1;
636
637 ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
638 if (!ati_remote->irq_urb)
639 return -1;
640
641 ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL);
642 if (!ati_remote->out_urb)
643 return -1;
644
645 return 0;
646}
647
648/*
649 * ati_remote_free_buffers
650 */
651static void ati_remote_free_buffers(struct ati_remote *ati_remote)
652{
653 usb_free_urb(ati_remote->irq_urb);
654 usb_free_urb(ati_remote->out_urb);
655
656 usb_free_coherent(ati_remote->udev, DATA_BUFSIZE,
657 ati_remote->inbuf, ati_remote->inbuf_dma);
658
659 usb_free_coherent(ati_remote->udev, DATA_BUFSIZE,
660 ati_remote->outbuf, ati_remote->outbuf_dma);
661}
662
663static void ati_remote_input_init(struct ati_remote *ati_remote)
664{
665 struct input_dev *idev = ati_remote->idev;
666 int i;
667
668 idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
669 idev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
670 BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA);
671 idev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
672 for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++)
673 if (ati_remote_tbl[i].type == EV_KEY)
674 set_bit(ati_remote_tbl[i].code, idev->keybit);
675
676 input_set_drvdata(idev, ati_remote);
677
678 idev->open = ati_remote_open;
679 idev->close = ati_remote_close;
680
681 idev->name = ati_remote->name;
682 idev->phys = ati_remote->phys;
683
684 usb_to_input_id(ati_remote->udev, &idev->id);
685 idev->dev.parent = &ati_remote->udev->dev;
686}
687
688static int ati_remote_initialize(struct ati_remote *ati_remote)
689{
690 struct usb_device *udev = ati_remote->udev;
691 int pipe, maxp;
692
693 init_waitqueue_head(&ati_remote->wait);
694
695 /* Set up irq_urb */
696 pipe = usb_rcvintpipe(udev, ati_remote->endpoint_in->bEndpointAddress);
697 maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
698 maxp = (maxp > DATA_BUFSIZE) ? DATA_BUFSIZE : maxp;
699
700 usb_fill_int_urb(ati_remote->irq_urb, udev, pipe, ati_remote->inbuf,
701 maxp, ati_remote_irq_in, ati_remote,
702 ati_remote->endpoint_in->bInterval);
703 ati_remote->irq_urb->transfer_dma = ati_remote->inbuf_dma;
704 ati_remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
705
706 /* Set up out_urb */
707 pipe = usb_sndintpipe(udev, ati_remote->endpoint_out->bEndpointAddress);
708 maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
709 maxp = (maxp > DATA_BUFSIZE) ? DATA_BUFSIZE : maxp;
710
711 usb_fill_int_urb(ati_remote->out_urb, udev, pipe, ati_remote->outbuf,
712 maxp, ati_remote_irq_out, ati_remote,
713 ati_remote->endpoint_out->bInterval);
714 ati_remote->out_urb->transfer_dma = ati_remote->outbuf_dma;
715 ati_remote->out_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
716
717 /* send initialization strings */
718 if ((ati_remote_sendpacket(ati_remote, 0x8004, init1)) ||
719 (ati_remote_sendpacket(ati_remote, 0x8007, init2))) {
720 dev_err(&ati_remote->interface->dev,
721 "Initializing ati_remote hardware failed.\n");
722 return -EIO;
723 }
724
725 return 0;
726}
727
728/*
729 * ati_remote_probe
730 */
731static int ati_remote_probe(struct usb_interface *interface, const struct usb_device_id *id)
732{
733 struct usb_device *udev = interface_to_usbdev(interface);
734 struct usb_host_interface *iface_host = interface->cur_altsetting;
735 struct usb_endpoint_descriptor *endpoint_in, *endpoint_out;
736 struct ati_remote *ati_remote;
737 struct input_dev *input_dev;
738 int err = -ENOMEM;
739
740 if (iface_host->desc.bNumEndpoints != 2) {
741 err("%s: Unexpected desc.bNumEndpoints\n", __func__);
742 return -ENODEV;
743 }
744
745 endpoint_in = &iface_host->endpoint[0].desc;
746 endpoint_out = &iface_host->endpoint[1].desc;
747
748 if (!usb_endpoint_is_int_in(endpoint_in)) {
749 err("%s: Unexpected endpoint_in\n", __func__);
750 return -ENODEV;
751 }
752 if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) {
753 err("%s: endpoint_in message size==0? \n", __func__);
754 return -ENODEV;
755 }
756
757 ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL);
758 input_dev = input_allocate_device();
759 if (!ati_remote || !input_dev)
760 goto fail1;
761
762 /* Allocate URB buffers, URBs */
763 if (ati_remote_alloc_buffers(udev, ati_remote))
764 goto fail2;
765
766 ati_remote->endpoint_in = endpoint_in;
767 ati_remote->endpoint_out = endpoint_out;
768 ati_remote->udev = udev;
769 ati_remote->idev = input_dev;
770 ati_remote->interface = interface;
771
772 usb_make_path(udev, ati_remote->phys, sizeof(ati_remote->phys));
773 strlcat(ati_remote->phys, "/input0", sizeof(ati_remote->phys));
774
775 if (udev->manufacturer)
776 strlcpy(ati_remote->name, udev->manufacturer, sizeof(ati_remote->name));
777
778 if (udev->product)
779 snprintf(ati_remote->name, sizeof(ati_remote->name),
780 "%s %s", ati_remote->name, udev->product);
781
782 if (!strlen(ati_remote->name))
783 snprintf(ati_remote->name, sizeof(ati_remote->name),
784 DRIVER_DESC "(%04x,%04x)",
785 le16_to_cpu(ati_remote->udev->descriptor.idVendor),
786 le16_to_cpu(ati_remote->udev->descriptor.idProduct));
787
788 ati_remote_input_init(ati_remote);
789
790 /* Device Hardware Initialization - fills in ati_remote->idev from udev. */
791 err = ati_remote_initialize(ati_remote);
792 if (err)
793 goto fail3;
794
795 /* Set up and register input device */
796 err = input_register_device(ati_remote->idev);
797 if (err)
798 goto fail3;
799
800 usb_set_intfdata(interface, ati_remote);
801 return 0;
802
803 fail3: usb_kill_urb(ati_remote->irq_urb);
804 usb_kill_urb(ati_remote->out_urb);
805 fail2: ati_remote_free_buffers(ati_remote);
806 fail1: input_free_device(input_dev);
807 kfree(ati_remote);
808 return err;
809}
810
811/*
812 * ati_remote_disconnect
813 */
814static void ati_remote_disconnect(struct usb_interface *interface)
815{
816 struct ati_remote *ati_remote;
817
818 ati_remote = usb_get_intfdata(interface);
819 usb_set_intfdata(interface, NULL);
820 if (!ati_remote) {
821 dev_warn(&interface->dev, "%s - null device?\n", __func__);
822 return;
823 }
824
825 usb_kill_urb(ati_remote->irq_urb);
826 usb_kill_urb(ati_remote->out_urb);
827 input_unregister_device(ati_remote->idev);
828 ati_remote_free_buffers(ati_remote);
829 kfree(ati_remote);
830}
831
832/*
833 * ati_remote_init
834 */
835static int __init ati_remote_init(void)
836{
837 int result;
838
839 result = usb_register(&ati_remote_driver);
840 if (result)
841 printk(KERN_ERR KBUILD_MODNAME
842 ": usb_register error #%d\n", result);
843 else
844 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
845 DRIVER_DESC "\n");
846
847 return result;
848}
849
850/*
851 * ati_remote_exit
852 */
853static void __exit ati_remote_exit(void)
854{
855 usb_deregister(&ati_remote_driver);
856}
857
858/*
859 * module specification
860 */
861
862module_init(ati_remote_init);
863module_exit(ati_remote_exit);
864
865MODULE_AUTHOR(DRIVER_AUTHOR);
866MODULE_DESCRIPTION(DRIVER_DESC);
867MODULE_LICENSE("GPL");
diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c
index 1de58e8a1b71..a34896ed7ed3 100644
--- a/drivers/input/misc/ati_remote2.c
+++ b/drivers/input/misc/ati_remote2.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/usb/input.h> 12#include <linux/usb/input.h>
13#include <linux/slab.h> 13#include <linux/slab.h>
14#include <linux/module.h>
14 15
15#define DRIVER_DESC "ATI/Philips USB RF remote driver" 16#define DRIVER_DESC "ATI/Philips USB RF remote driver"
16#define DRIVER_VERSION "0.3" 17#define DRIVER_VERSION "0.3"
@@ -41,13 +42,13 @@ static int ati_remote2_set_mask(const char *val,
41 const struct kernel_param *kp, 42 const struct kernel_param *kp,
42 unsigned int max) 43 unsigned int max)
43{ 44{
44 unsigned long mask; 45 unsigned int mask;
45 int ret; 46 int ret;
46 47
47 if (!val) 48 if (!val)
48 return -EINVAL; 49 return -EINVAL;
49 50
50 ret = strict_strtoul(val, 0, &mask); 51 ret = kstrtouint(val, 0, &mask);
51 if (ret) 52 if (ret)
52 return ret; 53 return ret;
53 54
@@ -719,11 +720,12 @@ static ssize_t ati_remote2_store_channel_mask(struct device *dev,
719 struct usb_device *udev = to_usb_device(dev); 720 struct usb_device *udev = to_usb_device(dev);
720 struct usb_interface *intf = usb_ifnum_to_if(udev, 0); 721 struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
721 struct ati_remote2 *ar2 = usb_get_intfdata(intf); 722 struct ati_remote2 *ar2 = usb_get_intfdata(intf);
722 unsigned long mask; 723 unsigned int mask;
723 int r; 724 int r;
724 725
725 if (strict_strtoul(buf, 0, &mask)) 726 r = kstrtouint(buf, 0, &mask);
726 return -EINVAL; 727 if (r)
728 return r;
727 729
728 if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK) 730 if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK)
729 return -EINVAL; 731 return -EINVAL;
@@ -768,10 +770,12 @@ static ssize_t ati_remote2_store_mode_mask(struct device *dev,
768 struct usb_device *udev = to_usb_device(dev); 770 struct usb_device *udev = to_usb_device(dev);
769 struct usb_interface *intf = usb_ifnum_to_if(udev, 0); 771 struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
770 struct ati_remote2 *ar2 = usb_get_intfdata(intf); 772 struct ati_remote2 *ar2 = usb_get_intfdata(intf);
771 unsigned long mask; 773 unsigned int mask;
774 int err;
772 775
773 if (strict_strtoul(buf, 0, &mask)) 776 err = kstrtouint(buf, 0, &mask);
774 return -EINVAL; 777 if (err)
778 return err;
775 779
776 if (mask & ~ATI_REMOTE2_MAX_MODE_MASK) 780 if (mask & ~ATI_REMOTE2_MAX_MODE_MASK)
777 return -EINVAL; 781 return -EINVAL;
diff --git a/drivers/input/misc/bfin_rotary.c b/drivers/input/misc/bfin_rotary.c
index d00edc9f39d1..1c4146fccfdf 100644
--- a/drivers/input/misc/bfin_rotary.c
+++ b/drivers/input/misc/bfin_rotary.c
@@ -264,18 +264,7 @@ static struct platform_driver bfin_rotary_device_driver = {
264#endif 264#endif
265 }, 265 },
266}; 266};
267 267module_platform_driver(bfin_rotary_device_driver);
268static int __init bfin_rotary_init(void)
269{
270 return platform_driver_register(&bfin_rotary_device_driver);
271}
272module_init(bfin_rotary_init);
273
274static void __exit bfin_rotary_exit(void)
275{
276 platform_driver_unregister(&bfin_rotary_device_driver);
277}
278module_exit(bfin_rotary_exit);
279 268
280MODULE_LICENSE("GPL"); 269MODULE_LICENSE("GPL");
281MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); 270MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
diff --git a/drivers/input/misc/cma3000_d0x.c b/drivers/input/misc/cma3000_d0x.c
index 09f8f2025580..06517e60e50c 100644
--- a/drivers/input/misc/cma3000_d0x.c
+++ b/drivers/input/misc/cma3000_d0x.c
@@ -23,6 +23,7 @@
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/input.h> 24#include <linux/input.h>
25#include <linux/input/cma3000.h> 25#include <linux/input/cma3000.h>
26#include <linux/module.h>
26 27
27#include "cma3000_d0x.h" 28#include "cma3000_d0x.h"
28 29
diff --git a/drivers/input/misc/cobalt_btns.c b/drivers/input/misc/cobalt_btns.c
index fd8407a29631..53e43d295148 100644
--- a/drivers/input/misc/cobalt_btns.c
+++ b/drivers/input/misc/cobalt_btns.c
@@ -163,16 +163,4 @@ static struct platform_driver cobalt_buttons_driver = {
163 .owner = THIS_MODULE, 163 .owner = THIS_MODULE,
164 }, 164 },
165}; 165};
166 166module_platform_driver(cobalt_buttons_driver);
167static int __init cobalt_buttons_init(void)
168{
169 return platform_driver_register(&cobalt_buttons_driver);
170}
171
172static void __exit cobalt_buttons_exit(void)
173{
174 platform_driver_unregister(&cobalt_buttons_driver);
175}
176
177module_init(cobalt_buttons_init);
178module_exit(cobalt_buttons_exit);
diff --git a/drivers/input/misc/dm355evm_keys.c b/drivers/input/misc/dm355evm_keys.c
index 19af682c24fb..35083c6836c3 100644
--- a/drivers/input/misc/dm355evm_keys.c
+++ b/drivers/input/misc/dm355evm_keys.c
@@ -17,6 +17,7 @@
17#include <linux/interrupt.h> 17#include <linux/interrupt.h>
18 18
19#include <linux/i2c/dm355evm_msp.h> 19#include <linux/i2c/dm355evm_msp.h>
20#include <linux/module.h>
20 21
21 22
22/* 23/*
@@ -266,17 +267,6 @@ static struct platform_driver dm355evm_keys_driver = {
266 .name = "dm355evm_keys", 267 .name = "dm355evm_keys",
267 }, 268 },
268}; 269};
269 270module_platform_driver(dm355evm_keys_driver);
270static int __init dm355evm_keys_init(void)
271{
272 return platform_driver_register(&dm355evm_keys_driver);
273}
274module_init(dm355evm_keys_init);
275
276static void __exit dm355evm_keys_exit(void)
277{
278 platform_driver_unregister(&dm355evm_keys_driver);
279}
280module_exit(dm355evm_keys_exit);
281 271
282MODULE_LICENSE("GPL"); 272MODULE_LICENSE("GPL");
diff --git a/drivers/input/misc/gp2ap002a00f.c b/drivers/input/misc/gp2ap002a00f.c
new file mode 100644
index 000000000000..71fba8c2fc66
--- /dev/null
+++ b/drivers/input/misc/gp2ap002a00f.c
@@ -0,0 +1,299 @@
1/*
2 * Copyright (C) 2011 Sony Ericsson Mobile Communications Inc.
3 *
4 * Author: Courtney Cavin <courtney.cavin@sonyericsson.com>
5 * Prepared for up-stream by: Oskar Andero <oskar.andero@sonyericsson.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2, as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/i2c.h>
13#include <linux/irq.h>
14#include <linux/slab.h>
15#include <linux/input.h>
16#include <linux/module.h>
17#include <linux/interrupt.h>
18#include <linux/gpio.h>
19#include <linux/delay.h>
20#include <linux/input/gp2ap002a00f.h>
21
22struct gp2a_data {
23 struct input_dev *input;
24 const struct gp2a_platform_data *pdata;
25 struct i2c_client *i2c_client;
26};
27
28enum gp2a_addr {
29 GP2A_ADDR_PROX = 0x0,
30 GP2A_ADDR_GAIN = 0x1,
31 GP2A_ADDR_HYS = 0x2,
32 GP2A_ADDR_CYCLE = 0x3,
33 GP2A_ADDR_OPMOD = 0x4,
34 GP2A_ADDR_CON = 0x6
35};
36
37enum gp2a_controls {
38 /* Software Shutdown control: 0 = shutdown, 1 = normal operation */
39 GP2A_CTRL_SSD = 0x01
40};
41
42static int gp2a_report(struct gp2a_data *dt)
43{
44 int vo = gpio_get_value(dt->pdata->vout_gpio);
45
46 input_report_switch(dt->input, SW_FRONT_PROXIMITY, !vo);
47 input_sync(dt->input);
48
49 return 0;
50}
51
52static irqreturn_t gp2a_irq(int irq, void *handle)
53{
54 struct gp2a_data *dt = handle;
55
56 gp2a_report(dt);
57
58 return IRQ_HANDLED;
59}
60
61static int gp2a_enable(struct gp2a_data *dt)
62{
63 return i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_OPMOD,
64 GP2A_CTRL_SSD);
65}
66
67static int gp2a_disable(struct gp2a_data *dt)
68{
69 return i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_OPMOD,
70 0x00);
71}
72
73static int gp2a_device_open(struct input_dev *dev)
74{
75 struct gp2a_data *dt = input_get_drvdata(dev);
76 int error;
77
78 error = gp2a_enable(dt);
79 if (error < 0) {
80 dev_err(&dt->i2c_client->dev,
81 "unable to activate, err %d\n", error);
82 return error;
83 }
84
85 gp2a_report(dt);
86
87 return 0;
88}
89
90static void gp2a_device_close(struct input_dev *dev)
91{
92 struct gp2a_data *dt = input_get_drvdata(dev);
93 int error;
94
95 error = gp2a_disable(dt);
96 if (error < 0)
97 dev_err(&dt->i2c_client->dev,
98 "unable to deactivate, err %d\n", error);
99}
100
101static int __devinit gp2a_initialize(struct gp2a_data *dt)
102{
103 int error;
104
105 error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_GAIN,
106 0x08);
107 if (error < 0)
108 return error;
109
110 error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_HYS,
111 0xc2);
112 if (error < 0)
113 return error;
114
115 error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_CYCLE,
116 0x04);
117 if (error < 0)
118 return error;
119
120 error = gp2a_disable(dt);
121
122 return error;
123}
124
125static int __devinit gp2a_probe(struct i2c_client *client,
126 const struct i2c_device_id *id)
127{
128 const struct gp2a_platform_data *pdata = client->dev.platform_data;
129 struct gp2a_data *dt;
130 int error;
131
132 if (!pdata)
133 return -EINVAL;
134
135 if (pdata->hw_setup) {
136 error = pdata->hw_setup(client);
137 if (error < 0)
138 return error;
139 }
140
141 error = gpio_request_one(pdata->vout_gpio, GPIOF_IN, GP2A_I2C_NAME);
142 if (error)
143 goto err_hw_shutdown;
144
145 dt = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL);
146 if (!dt) {
147 error = -ENOMEM;
148 goto err_free_gpio;
149 }
150
151 dt->pdata = pdata;
152 dt->i2c_client = client;
153
154 error = gp2a_initialize(dt);
155 if (error < 0)
156 goto err_free_mem;
157
158 dt->input = input_allocate_device();
159 if (!dt->input) {
160 error = -ENOMEM;
161 goto err_free_mem;
162 }
163
164 input_set_drvdata(dt->input, dt);
165
166 dt->input->open = gp2a_device_open;
167 dt->input->close = gp2a_device_close;
168 dt->input->name = GP2A_I2C_NAME;
169 dt->input->id.bustype = BUS_I2C;
170 dt->input->dev.parent = &client->dev;
171
172 input_set_capability(dt->input, EV_SW, SW_FRONT_PROXIMITY);
173
174 error = request_threaded_irq(client->irq, NULL, gp2a_irq,
175 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
176 IRQF_ONESHOT,
177 GP2A_I2C_NAME, dt);
178 if (error) {
179 dev_err(&client->dev, "irq request failed\n");
180 goto err_free_input_dev;
181 }
182
183 error = input_register_device(dt->input);
184 if (error) {
185 dev_err(&client->dev, "device registration failed\n");
186 goto err_free_irq;
187 }
188
189 device_init_wakeup(&client->dev, pdata->wakeup);
190 i2c_set_clientdata(client, dt);
191
192 return 0;
193
194err_free_irq:
195 free_irq(client->irq, dt);
196err_free_input_dev:
197 input_free_device(dt->input);
198err_free_mem:
199 kfree(dt);
200err_free_gpio:
201 gpio_free(pdata->vout_gpio);
202err_hw_shutdown:
203 if (pdata->hw_shutdown)
204 pdata->hw_shutdown(client);
205 return error;
206}
207
208static int __devexit gp2a_remove(struct i2c_client *client)
209{
210 struct gp2a_data *dt = i2c_get_clientdata(client);
211 const struct gp2a_platform_data *pdata = dt->pdata;
212
213 device_init_wakeup(&client->dev, false);
214
215 free_irq(client->irq, dt);
216
217 input_unregister_device(dt->input);
218 kfree(dt);
219
220 gpio_free(pdata->vout_gpio);
221
222 if (pdata->hw_shutdown)
223 pdata->hw_shutdown(client);
224
225 return 0;
226}
227
228#ifdef CONFIG_PM_SLEEP
229static int gp2a_suspend(struct device *dev)
230{
231 struct i2c_client *client = to_i2c_client(dev);
232 struct gp2a_data *dt = i2c_get_clientdata(client);
233 int retval = 0;
234
235 if (device_may_wakeup(&client->dev)) {
236 enable_irq_wake(client->irq);
237 } else {
238 mutex_lock(&dt->input->mutex);
239 if (dt->input->users)
240 retval = gp2a_disable(dt);
241 mutex_unlock(&dt->input->mutex);
242 }
243
244 return retval;
245}
246
247static int gp2a_resume(struct device *dev)
248{
249 struct i2c_client *client = to_i2c_client(dev);
250 struct gp2a_data *dt = i2c_get_clientdata(client);
251 int retval = 0;
252
253 if (device_may_wakeup(&client->dev)) {
254 disable_irq_wake(client->irq);
255 } else {
256 mutex_lock(&dt->input->mutex);
257 if (dt->input->users)
258 retval = gp2a_enable(dt);
259 mutex_unlock(&dt->input->mutex);
260 }
261
262 return retval;
263}
264#endif
265
266static SIMPLE_DEV_PM_OPS(gp2a_pm, gp2a_suspend, gp2a_resume);
267
268static const struct i2c_device_id gp2a_i2c_id[] = {
269 { GP2A_I2C_NAME, 0 },
270 { }
271};
272
273static struct i2c_driver gp2a_i2c_driver = {
274 .driver = {
275 .name = GP2A_I2C_NAME,
276 .owner = THIS_MODULE,
277 .pm = &gp2a_pm,
278 },
279 .probe = gp2a_probe,
280 .remove = __devexit_p(gp2a_remove),
281 .id_table = gp2a_i2c_id,
282};
283
284static int __init gp2a_init(void)
285{
286 return i2c_add_driver(&gp2a_i2c_driver);
287}
288
289static void __exit gp2a_exit(void)
290{
291 i2c_del_driver(&gp2a_i2c_driver);
292}
293
294module_init(gp2a_init);
295module_exit(gp2a_exit);
296
297MODULE_AUTHOR("Courtney Cavin <courtney.cavin@sonyericsson.com>");
298MODULE_DESCRIPTION("Sharp GP2AP002A00F I2C Proximity/Opto sensor driver");
299MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/misc/gpio_tilt_polled.c b/drivers/input/misc/gpio_tilt_polled.c
new file mode 100644
index 000000000000..277a0574c199
--- /dev/null
+++ b/drivers/input/misc/gpio_tilt_polled.c
@@ -0,0 +1,213 @@
1/*
2 * Driver for tilt switches connected via GPIO lines
3 * not capable of generating interrupts
4 *
5 * Copyright (C) 2011 Heiko Stuebner <heiko@sntech.de>
6 *
7 * based on: drivers/input/keyboard/gpio_keys_polled.c
8 *
9 * Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org>
10 * Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 */
16
17#include <linux/kernel.h>
18#include <linux/module.h>
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/input.h>
22#include <linux/input-polldev.h>
23#include <linux/ioport.h>
24#include <linux/platform_device.h>
25#include <linux/gpio.h>
26#include <linux/input/gpio_tilt.h>
27
28#define DRV_NAME "gpio-tilt-polled"
29
30struct gpio_tilt_polled_dev {
31 struct input_polled_dev *poll_dev;
32 struct device *dev;
33 const struct gpio_tilt_platform_data *pdata;
34
35 int last_state;
36
37 int threshold;
38 int count;
39};
40
41static void gpio_tilt_polled_poll(struct input_polled_dev *dev)
42{
43 struct gpio_tilt_polled_dev *tdev = dev->private;
44 const struct gpio_tilt_platform_data *pdata = tdev->pdata;
45 struct input_dev *input = dev->input;
46 struct gpio_tilt_state *tilt_state = NULL;
47 int state, i;
48
49 if (tdev->count < tdev->threshold) {
50 tdev->count++;
51 } else {
52 state = 0;
53 for (i = 0; i < pdata->nr_gpios; i++)
54 state |= (!!gpio_get_value(pdata->gpios[i].gpio) << i);
55
56 if (state != tdev->last_state) {
57 for (i = 0; i < pdata->nr_states; i++)
58 if (pdata->states[i].gpios == state)
59 tilt_state = &pdata->states[i];
60
61 if (tilt_state) {
62 for (i = 0; i < pdata->nr_axes; i++)
63 input_report_abs(input,
64 pdata->axes[i].axis,
65 tilt_state->axes[i]);
66
67 input_sync(input);
68 }
69
70 tdev->count = 0;
71 tdev->last_state = state;
72 }
73 }
74}
75
76static void gpio_tilt_polled_open(struct input_polled_dev *dev)
77{
78 struct gpio_tilt_polled_dev *tdev = dev->private;
79 const struct gpio_tilt_platform_data *pdata = tdev->pdata;
80
81 if (pdata->enable)
82 pdata->enable(tdev->dev);
83
84 /* report initial state of the axes */
85 tdev->last_state = -1;
86 tdev->count = tdev->threshold;
87 gpio_tilt_polled_poll(tdev->poll_dev);
88}
89
90static void gpio_tilt_polled_close(struct input_polled_dev *dev)
91{
92 struct gpio_tilt_polled_dev *tdev = dev->private;
93 const struct gpio_tilt_platform_data *pdata = tdev->pdata;
94
95 if (pdata->disable)
96 pdata->disable(tdev->dev);
97}
98
99static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev)
100{
101 const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data;
102 struct device *dev = &pdev->dev;
103 struct gpio_tilt_polled_dev *tdev;
104 struct input_polled_dev *poll_dev;
105 struct input_dev *input;
106 int error, i;
107
108 if (!pdata || !pdata->poll_interval)
109 return -EINVAL;
110
111 tdev = kzalloc(sizeof(struct gpio_tilt_polled_dev), GFP_KERNEL);
112 if (!tdev) {
113 dev_err(dev, "no memory for private data\n");
114 return -ENOMEM;
115 }
116
117 error = gpio_request_array(pdata->gpios, pdata->nr_gpios);
118 if (error) {
119 dev_err(dev,
120 "Could not request tilt GPIOs: %d\n", error);
121 goto err_free_tdev;
122 }
123
124 poll_dev = input_allocate_polled_device();
125 if (!poll_dev) {
126 dev_err(dev, "no memory for polled device\n");
127 error = -ENOMEM;
128 goto err_free_gpios;
129 }
130
131 poll_dev->private = tdev;
132 poll_dev->poll = gpio_tilt_polled_poll;
133 poll_dev->poll_interval = pdata->poll_interval;
134 poll_dev->open = gpio_tilt_polled_open;
135 poll_dev->close = gpio_tilt_polled_close;
136
137 input = poll_dev->input;
138
139 input->name = pdev->name;
140 input->phys = DRV_NAME"/input0";
141 input->dev.parent = &pdev->dev;
142
143 input->id.bustype = BUS_HOST;
144 input->id.vendor = 0x0001;
145 input->id.product = 0x0001;
146 input->id.version = 0x0100;
147
148 __set_bit(EV_ABS, input->evbit);
149 for (i = 0; i < pdata->nr_axes; i++)
150 input_set_abs_params(input, pdata->axes[i].axis,
151 pdata->axes[i].min, pdata->axes[i].max,
152 pdata->axes[i].fuzz, pdata->axes[i].flat);
153
154 tdev->threshold = DIV_ROUND_UP(pdata->debounce_interval,
155 pdata->poll_interval);
156
157 tdev->poll_dev = poll_dev;
158 tdev->dev = dev;
159 tdev->pdata = pdata;
160
161 error = input_register_polled_device(poll_dev);
162 if (error) {
163 dev_err(dev, "unable to register polled device, err=%d\n",
164 error);
165 goto err_free_polldev;
166 }
167
168 platform_set_drvdata(pdev, tdev);
169
170 return 0;
171
172err_free_polldev:
173 input_free_polled_device(poll_dev);
174err_free_gpios:
175 gpio_free_array(pdata->gpios, pdata->nr_gpios);
176err_free_tdev:
177 kfree(tdev);
178
179 return error;
180}
181
182static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
183{
184 struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev);
185 const struct gpio_tilt_platform_data *pdata = tdev->pdata;
186
187 platform_set_drvdata(pdev, NULL);
188
189 input_unregister_polled_device(tdev->poll_dev);
190 input_free_polled_device(tdev->poll_dev);
191
192 gpio_free_array(pdata->gpios, pdata->nr_gpios);
193
194 kfree(tdev);
195
196 return 0;
197}
198
199static struct platform_driver gpio_tilt_polled_driver = {
200 .probe = gpio_tilt_polled_probe,
201 .remove = __devexit_p(gpio_tilt_polled_remove),
202 .driver = {
203 .name = DRV_NAME,
204 .owner = THIS_MODULE,
205 },
206};
207
208module_platform_driver(gpio_tilt_polled_driver);
209
210MODULE_LICENSE("GPL v2");
211MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
212MODULE_DESCRIPTION("Polled GPIO tilt driver");
213MODULE_ALIAS("platform:" DRV_NAME);
diff --git a/drivers/input/misc/ixp4xx-beeper.c b/drivers/input/misc/ixp4xx-beeper.c
index 302ab46ce752..50e283068301 100644
--- a/drivers/input/misc/ixp4xx-beeper.c
+++ b/drivers/input/misc/ixp4xx-beeper.c
@@ -168,16 +168,5 @@ static struct platform_driver ixp4xx_spkr_platform_driver = {
168 .remove = __devexit_p(ixp4xx_spkr_remove), 168 .remove = __devexit_p(ixp4xx_spkr_remove),
169 .shutdown = ixp4xx_spkr_shutdown, 169 .shutdown = ixp4xx_spkr_shutdown,
170}; 170};
171module_platform_driver(ixp4xx_spkr_platform_driver);
171 172
172static int __init ixp4xx_spkr_init(void)
173{
174 return platform_driver_register(&ixp4xx_spkr_platform_driver);
175}
176
177static void __exit ixp4xx_spkr_exit(void)
178{
179 platform_driver_unregister(&ixp4xx_spkr_platform_driver);
180}
181
182module_init(ixp4xx_spkr_init);
183module_exit(ixp4xx_spkr_exit);
diff --git a/drivers/input/misc/max8925_onkey.c b/drivers/input/misc/max8925_onkey.c
index 7de0ded4ccc3..23cf08271049 100644
--- a/drivers/input/misc/max8925_onkey.c
+++ b/drivers/input/misc/max8925_onkey.c
@@ -166,18 +166,7 @@ static struct platform_driver max8925_onkey_driver = {
166 .probe = max8925_onkey_probe, 166 .probe = max8925_onkey_probe,
167 .remove = __devexit_p(max8925_onkey_remove), 167 .remove = __devexit_p(max8925_onkey_remove),
168}; 168};
169 169module_platform_driver(max8925_onkey_driver);
170static int __init max8925_onkey_init(void)
171{
172 return platform_driver_register(&max8925_onkey_driver);
173}
174module_init(max8925_onkey_init);
175
176static void __exit max8925_onkey_exit(void)
177{
178 platform_driver_unregister(&max8925_onkey_driver);
179}
180module_exit(max8925_onkey_exit);
181 170
182MODULE_DESCRIPTION("Maxim MAX8925 ONKEY driver"); 171MODULE_DESCRIPTION("Maxim MAX8925 ONKEY driver");
183MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>"); 172MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c
new file mode 100644
index 000000000000..8428f1e8e83e
--- /dev/null
+++ b/drivers/input/misc/mc13783-pwrbutton.c
@@ -0,0 +1,272 @@
1/**
2 * Copyright (C) 2011 Philippe Rétornaz
3 *
4 * Based on twl4030-pwrbutton driver by:
5 * Peter De Schrijver <peter.de-schrijver@nokia.com>
6 * Felipe Balbi <felipe.balbi@nokia.com>
7 *
8 * This file is subject to the terms and conditions of the GNU General
9 * Public License. See the file "COPYING" in the main directory of this
10 * archive for more details.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
20 */
21
22#include <linux/module.h>
23#include <linux/init.h>
24#include <linux/kernel.h>
25#include <linux/errno.h>
26#include <linux/input.h>
27#include <linux/interrupt.h>
28#include <linux/platform_device.h>
29#include <linux/mfd/mc13783.h>
30#include <linux/sched.h>
31#include <linux/slab.h>
32
33struct mc13783_pwrb {
34 struct input_dev *pwr;
35 struct mc13xxx *mc13783;
36#define MC13783_PWRB_B1_POL_INVERT (1 << 0)
37#define MC13783_PWRB_B2_POL_INVERT (1 << 1)
38#define MC13783_PWRB_B3_POL_INVERT (1 << 2)
39 int flags;
40 unsigned short keymap[3];
41};
42
43#define MC13783_REG_INTERRUPT_SENSE_1 5
44#define MC13783_IRQSENSE1_ONOFD1S (1 << 3)
45#define MC13783_IRQSENSE1_ONOFD2S (1 << 4)
46#define MC13783_IRQSENSE1_ONOFD3S (1 << 5)
47
48#define MC13783_REG_POWER_CONTROL_2 15
49#define MC13783_POWER_CONTROL_2_ON1BDBNC 4
50#define MC13783_POWER_CONTROL_2_ON2BDBNC 6
51#define MC13783_POWER_CONTROL_2_ON3BDBNC 8
52#define MC13783_POWER_CONTROL_2_ON1BRSTEN (1 << 1)
53#define MC13783_POWER_CONTROL_2_ON2BRSTEN (1 << 2)
54#define MC13783_POWER_CONTROL_2_ON3BRSTEN (1 << 3)
55
56static irqreturn_t button_irq(int irq, void *_priv)
57{
58 struct mc13783_pwrb *priv = _priv;
59 int val;
60
61 mc13xxx_irq_ack(priv->mc13783, irq);
62 mc13xxx_reg_read(priv->mc13783, MC13783_REG_INTERRUPT_SENSE_1, &val);
63
64 switch (irq) {
65 case MC13783_IRQ_ONOFD1:
66 val = val & MC13783_IRQSENSE1_ONOFD1S ? 1 : 0;
67 if (priv->flags & MC13783_PWRB_B1_POL_INVERT)
68 val ^= 1;
69 input_report_key(priv->pwr, priv->keymap[0], val);
70 break;
71
72 case MC13783_IRQ_ONOFD2:
73 val = val & MC13783_IRQSENSE1_ONOFD2S ? 1 : 0;
74 if (priv->flags & MC13783_PWRB_B2_POL_INVERT)
75 val ^= 1;
76 input_report_key(priv->pwr, priv->keymap[1], val);
77 break;
78
79 case MC13783_IRQ_ONOFD3:
80 val = val & MC13783_IRQSENSE1_ONOFD3S ? 1 : 0;
81 if (priv->flags & MC13783_PWRB_B3_POL_INVERT)
82 val ^= 1;
83 input_report_key(priv->pwr, priv->keymap[2], val);
84 break;
85 }
86
87 input_sync(priv->pwr);
88
89 return IRQ_HANDLED;
90}
91
92static int __devinit mc13783_pwrbutton_probe(struct platform_device *pdev)
93{
94 const struct mc13xxx_buttons_platform_data *pdata;
95 struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
96 struct input_dev *pwr;
97 struct mc13783_pwrb *priv;
98 int err = 0;
99 int reg = 0;
100
101 pdata = dev_get_platdata(&pdev->dev);
102 if (!pdata) {
103 dev_err(&pdev->dev, "missing platform data\n");
104 return -ENODEV;
105 }
106
107 pwr = input_allocate_device();
108 if (!pwr) {
109 dev_dbg(&pdev->dev, "Can't allocate power button\n");
110 return -ENOMEM;
111 }
112
113 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
114 if (!priv) {
115 err = -ENOMEM;
116 dev_dbg(&pdev->dev, "Can't allocate power button\n");
117 goto free_input_dev;
118 }
119
120 reg |= (pdata->b1on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC;
121 reg |= (pdata->b2on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC;
122 reg |= (pdata->b3on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC;
123
124 priv->pwr = pwr;
125 priv->mc13783 = mc13783;
126
127 mc13xxx_lock(mc13783);
128
129 if (pdata->b1on_flags & MC13783_BUTTON_ENABLE) {
130 priv->keymap[0] = pdata->b1on_key;
131 if (pdata->b1on_key != KEY_RESERVED)
132 __set_bit(pdata->b1on_key, pwr->keybit);
133
134 if (pdata->b1on_flags & MC13783_BUTTON_POL_INVERT)
135 priv->flags |= MC13783_PWRB_B1_POL_INVERT;
136
137 if (pdata->b1on_flags & MC13783_BUTTON_RESET_EN)
138 reg |= MC13783_POWER_CONTROL_2_ON1BRSTEN;
139
140 err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD1,
141 button_irq, "b1on", priv);
142 if (err) {
143 dev_dbg(&pdev->dev, "Can't request irq\n");
144 goto free_priv;
145 }
146 }
147
148 if (pdata->b2on_flags & MC13783_BUTTON_ENABLE) {
149 priv->keymap[1] = pdata->b2on_key;
150 if (pdata->b2on_key != KEY_RESERVED)
151 __set_bit(pdata->b2on_key, pwr->keybit);
152
153 if (pdata->b2on_flags & MC13783_BUTTON_POL_INVERT)
154 priv->flags |= MC13783_PWRB_B2_POL_INVERT;
155
156 if (pdata->b2on_flags & MC13783_BUTTON_RESET_EN)
157 reg |= MC13783_POWER_CONTROL_2_ON2BRSTEN;
158
159 err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD2,
160 button_irq, "b2on", priv);
161 if (err) {
162 dev_dbg(&pdev->dev, "Can't request irq\n");
163 goto free_irq_b1;
164 }
165 }
166
167 if (pdata->b3on_flags & MC13783_BUTTON_ENABLE) {
168 priv->keymap[2] = pdata->b3on_key;
169 if (pdata->b3on_key != KEY_RESERVED)
170 __set_bit(pdata->b3on_key, pwr->keybit);
171
172 if (pdata->b3on_flags & MC13783_BUTTON_POL_INVERT)
173 priv->flags |= MC13783_PWRB_B3_POL_INVERT;
174
175 if (pdata->b3on_flags & MC13783_BUTTON_RESET_EN)
176 reg |= MC13783_POWER_CONTROL_2_ON3BRSTEN;
177
178 err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD3,
179 button_irq, "b3on", priv);
180 if (err) {
181 dev_dbg(&pdev->dev, "Can't request irq: %d\n", err);
182 goto free_irq_b2;
183 }
184 }
185
186 mc13xxx_reg_rmw(mc13783, MC13783_REG_POWER_CONTROL_2, 0x3FE, reg);
187
188 mc13xxx_unlock(mc13783);
189
190 pwr->name = "mc13783_pwrbutton";
191 pwr->phys = "mc13783_pwrbutton/input0";
192 pwr->dev.parent = &pdev->dev;
193
194 pwr->keycode = priv->keymap;
195 pwr->keycodemax = ARRAY_SIZE(priv->keymap);
196 pwr->keycodesize = sizeof(priv->keymap[0]);
197 __set_bit(EV_KEY, pwr->evbit);
198
199 err = input_register_device(pwr);
200 if (err) {
201 dev_dbg(&pdev->dev, "Can't register power button: %d\n", err);
202 goto free_irq;
203 }
204
205 platform_set_drvdata(pdev, priv);
206
207 return 0;
208
209free_irq:
210 mc13xxx_lock(mc13783);
211
212 if (pdata->b3on_flags & MC13783_BUTTON_ENABLE)
213 mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD3, priv);
214
215free_irq_b2:
216 if (pdata->b2on_flags & MC13783_BUTTON_ENABLE)
217 mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD2, priv);
218
219free_irq_b1:
220 if (pdata->b1on_flags & MC13783_BUTTON_ENABLE)
221 mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD1, priv);
222
223free_priv:
224 mc13xxx_unlock(mc13783);
225 kfree(priv);
226
227free_input_dev:
228 input_free_device(pwr);
229
230 return err;
231}
232
233static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
234{
235 struct mc13783_pwrb *priv = platform_get_drvdata(pdev);
236 const struct mc13xxx_buttons_platform_data *pdata;
237
238 pdata = dev_get_platdata(&pdev->dev);
239
240 mc13xxx_lock(priv->mc13783);
241
242 if (pdata->b3on_flags & MC13783_BUTTON_ENABLE)
243 mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD3, priv);
244 if (pdata->b2on_flags & MC13783_BUTTON_ENABLE)
245 mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD2, priv);
246 if (pdata->b1on_flags & MC13783_BUTTON_ENABLE)
247 mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD1, priv);
248
249 mc13xxx_unlock(priv->mc13783);
250
251 input_unregister_device(priv->pwr);
252 kfree(priv);
253 platform_set_drvdata(pdev, NULL);
254
255 return 0;
256}
257
258static struct platform_driver mc13783_pwrbutton_driver = {
259 .probe = mc13783_pwrbutton_probe,
260 .remove = __devexit_p(mc13783_pwrbutton_remove),
261 .driver = {
262 .name = "mc13783-pwrbutton",
263 .owner = THIS_MODULE,
264 },
265};
266
267module_platform_driver(mc13783_pwrbutton_driver);
268
269MODULE_ALIAS("platform:mc13783-pwrbutton");
270MODULE_DESCRIPTION("MC13783 Power Button");
271MODULE_LICENSE("GPL v2");
272MODULE_AUTHOR("Philippe Retornaz");
diff --git a/drivers/input/misc/mpu3050.c b/drivers/input/misc/mpu3050.c
index f71dc728da58..208d1a1cc7f3 100644
--- a/drivers/input/misc/mpu3050.c
+++ b/drivers/input/misc/mpu3050.c
@@ -41,18 +41,67 @@
41#include <linux/slab.h> 41#include <linux/slab.h>
42#include <linux/pm_runtime.h> 42#include <linux/pm_runtime.h>
43 43
44#define MPU3050_CHIP_ID_REG 0x00
45#define MPU3050_CHIP_ID 0x69 44#define MPU3050_CHIP_ID 0x69
46#define MPU3050_XOUT_H 0x1D
47#define MPU3050_PWR_MGM 0x3E
48#define MPU3050_PWR_MGM_POS 6
49#define MPU3050_PWR_MGM_MASK 0x40
50 45
51#define MPU3050_AUTO_DELAY 1000 46#define MPU3050_AUTO_DELAY 1000
52 47
53#define MPU3050_MIN_VALUE -32768 48#define MPU3050_MIN_VALUE -32768
54#define MPU3050_MAX_VALUE 32767 49#define MPU3050_MAX_VALUE 32767
55 50
51#define MPU3050_DEFAULT_POLL_INTERVAL 200
52#define MPU3050_DEFAULT_FS_RANGE 3
53
54/* Register map */
55#define MPU3050_CHIP_ID_REG 0x00
56#define MPU3050_SMPLRT_DIV 0x15
57#define MPU3050_DLPF_FS_SYNC 0x16
58#define MPU3050_INT_CFG 0x17
59#define MPU3050_XOUT_H 0x1D
60#define MPU3050_PWR_MGM 0x3E
61#define MPU3050_PWR_MGM_POS 6
62
63/* Register bits */
64
65/* DLPF_FS_SYNC */
66#define MPU3050_EXT_SYNC_NONE 0x00
67#define MPU3050_EXT_SYNC_TEMP 0x20
68#define MPU3050_EXT_SYNC_GYROX 0x40
69#define MPU3050_EXT_SYNC_GYROY 0x60
70#define MPU3050_EXT_SYNC_GYROZ 0x80
71#define MPU3050_EXT_SYNC_ACCELX 0xA0
72#define MPU3050_EXT_SYNC_ACCELY 0xC0
73#define MPU3050_EXT_SYNC_ACCELZ 0xE0
74#define MPU3050_EXT_SYNC_MASK 0xE0
75#define MPU3050_FS_250DPS 0x00
76#define MPU3050_FS_500DPS 0x08
77#define MPU3050_FS_1000DPS 0x10
78#define MPU3050_FS_2000DPS 0x18
79#define MPU3050_FS_MASK 0x18
80#define MPU3050_DLPF_CFG_256HZ_NOLPF2 0x00
81#define MPU3050_DLPF_CFG_188HZ 0x01
82#define MPU3050_DLPF_CFG_98HZ 0x02
83#define MPU3050_DLPF_CFG_42HZ 0x03
84#define MPU3050_DLPF_CFG_20HZ 0x04
85#define MPU3050_DLPF_CFG_10HZ 0x05
86#define MPU3050_DLPF_CFG_5HZ 0x06
87#define MPU3050_DLPF_CFG_2100HZ_NOLPF 0x07
88#define MPU3050_DLPF_CFG_MASK 0x07
89/* INT_CFG */
90#define MPU3050_RAW_RDY_EN 0x01
91#define MPU3050_MPU_RDY_EN 0x02
92#define MPU3050_LATCH_INT_EN 0x04
93/* PWR_MGM */
94#define MPU3050_PWR_MGM_PLL_X 0x01
95#define MPU3050_PWR_MGM_PLL_Y 0x02
96#define MPU3050_PWR_MGM_PLL_Z 0x03
97#define MPU3050_PWR_MGM_CLKSEL 0x07
98#define MPU3050_PWR_MGM_STBY_ZG 0x08
99#define MPU3050_PWR_MGM_STBY_YG 0x10
100#define MPU3050_PWR_MGM_STBY_XG 0x20
101#define MPU3050_PWR_MGM_SLEEP 0x40
102#define MPU3050_PWR_MGM_RESET 0x80
103#define MPU3050_PWR_MGM_MASK 0x40
104
56struct axis_data { 105struct axis_data {
57 s16 x; 106 s16 x;
58 s16 y; 107 s16 y;
@@ -148,9 +197,20 @@ static void mpu3050_set_power_mode(struct i2c_client *client, u8 val)
148static int mpu3050_input_open(struct input_dev *input) 197static int mpu3050_input_open(struct input_dev *input)
149{ 198{
150 struct mpu3050_sensor *sensor = input_get_drvdata(input); 199 struct mpu3050_sensor *sensor = input_get_drvdata(input);
200 int error;
151 201
152 pm_runtime_get(sensor->dev); 202 pm_runtime_get(sensor->dev);
153 203
204 /* Enable interrupts */
205 error = i2c_smbus_write_byte_data(sensor->client, MPU3050_INT_CFG,
206 MPU3050_LATCH_INT_EN |
207 MPU3050_RAW_RDY_EN |
208 MPU3050_MPU_RDY_EN);
209 if (error < 0) {
210 pm_runtime_put(sensor->dev);
211 return error;
212 }
213
154 return 0; 214 return 0;
155} 215}
156 216
@@ -192,6 +252,51 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data)
192} 252}
193 253
194/** 254/**
255 * mpu3050_hw_init - initialize hardware
256 * @sensor: the sensor
257 *
258 * Called during device probe; configures the sampling method.
259 */
260static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
261{
262 struct i2c_client *client = sensor->client;
263 int ret;
264 u8 reg;
265
266 /* Reset */
267 ret = i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM,
268 MPU3050_PWR_MGM_RESET);
269 if (ret < 0)
270 return ret;
271
272 ret = i2c_smbus_read_byte_data(client, MPU3050_PWR_MGM);
273 if (ret < 0)
274 return ret;
275
276 ret &= ~MPU3050_PWR_MGM_CLKSEL;
277 ret |= MPU3050_PWR_MGM_PLL_Z;
278 ret = i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM, ret);
279 if (ret < 0)
280 return ret;
281
282 /* Output frequency divider. The poll interval */
283 ret = i2c_smbus_write_byte_data(client, MPU3050_SMPLRT_DIV,
284 MPU3050_DEFAULT_POLL_INTERVAL - 1);
285 if (ret < 0)
286 return ret;
287
288 /* Set low pass filter and full scale */
289 reg = MPU3050_DEFAULT_FS_RANGE;
290 reg |= MPU3050_DLPF_CFG_42HZ << 3;
291 reg |= MPU3050_EXT_SYNC_NONE << 5;
292 ret = i2c_smbus_write_byte_data(client, MPU3050_DLPF_FS_SYNC, reg);
293 if (ret < 0)
294 return ret;
295
296 return 0;
297}
298
299/**
195 * mpu3050_probe - device detection callback 300 * mpu3050_probe - device detection callback
196 * @client: i2c client of found device 301 * @client: i2c client of found device
197 * @id: id match information 302 * @id: id match information
@@ -256,10 +361,14 @@ static int __devinit mpu3050_probe(struct i2c_client *client,
256 361
257 pm_runtime_set_active(&client->dev); 362 pm_runtime_set_active(&client->dev);
258 363
364 error = mpu3050_hw_init(sensor);
365 if (error)
366 goto err_pm_set_suspended;
367
259 error = request_threaded_irq(client->irq, 368 error = request_threaded_irq(client->irq,
260 NULL, mpu3050_interrupt_thread, 369 NULL, mpu3050_interrupt_thread,
261 IRQF_TRIGGER_RISING, 370 IRQF_TRIGGER_RISING,
262 "mpu_int", sensor); 371 "mpu3050", sensor);
263 if (error) { 372 if (error) {
264 dev_err(&client->dev, 373 dev_err(&client->dev,
265 "can't get IRQ %d, error %d\n", client->irq, error); 374 "can't get IRQ %d, error %d\n", client->irq, error);
@@ -348,11 +457,18 @@ static const struct i2c_device_id mpu3050_ids[] = {
348}; 457};
349MODULE_DEVICE_TABLE(i2c, mpu3050_ids); 458MODULE_DEVICE_TABLE(i2c, mpu3050_ids);
350 459
460static const struct of_device_id mpu3050_of_match[] = {
461 { .compatible = "invn,mpu3050", },
462 { },
463};
464MODULE_DEVICE_TABLE(of, mpu3050_of_match);
465
351static struct i2c_driver mpu3050_i2c_driver = { 466static struct i2c_driver mpu3050_i2c_driver = {
352 .driver = { 467 .driver = {
353 .name = "mpu3050", 468 .name = "mpu3050",
354 .owner = THIS_MODULE, 469 .owner = THIS_MODULE,
355 .pm = &mpu3050_pm, 470 .pm = &mpu3050_pm,
471 .of_match_table = mpu3050_of_match,
356 }, 472 },
357 .probe = mpu3050_probe, 473 .probe = mpu3050_probe,
358 .remove = __devexit_p(mpu3050_remove), 474 .remove = __devexit_p(mpu3050_remove),
diff --git a/drivers/input/misc/pcap_keys.c b/drivers/input/misc/pcap_keys.c
index 99335c286250..e09b4fe81913 100644
--- a/drivers/input/misc/pcap_keys.c
+++ b/drivers/input/misc/pcap_keys.c
@@ -125,19 +125,7 @@ static struct platform_driver pcap_keys_device_driver = {
125 .owner = THIS_MODULE, 125 .owner = THIS_MODULE,
126 } 126 }
127}; 127};
128 128module_platform_driver(pcap_keys_device_driver);
129static int __init pcap_keys_init(void)
130{
131 return platform_driver_register(&pcap_keys_device_driver);
132};
133
134static void __exit pcap_keys_exit(void)
135{
136 platform_driver_unregister(&pcap_keys_device_driver);
137};
138
139module_init(pcap_keys_init);
140module_exit(pcap_keys_exit);
141 129
142MODULE_DESCRIPTION("Motorola PCAP2 input events driver"); 130MODULE_DESCRIPTION("Motorola PCAP2 input events driver");
143MODULE_AUTHOR("Ilya Petrov <ilya.muromec@gmail.com>"); 131MODULE_AUTHOR("Ilya Petrov <ilya.muromec@gmail.com>");
diff --git a/drivers/input/misc/pcf50633-input.c b/drivers/input/misc/pcf50633-input.c
index 95562735728d..53891de80b0e 100644
--- a/drivers/input/misc/pcf50633-input.c
+++ b/drivers/input/misc/pcf50633-input.c
@@ -113,18 +113,7 @@ static struct platform_driver pcf50633_input_driver = {
113 .probe = pcf50633_input_probe, 113 .probe = pcf50633_input_probe,
114 .remove = __devexit_p(pcf50633_input_remove), 114 .remove = __devexit_p(pcf50633_input_remove),
115}; 115};
116 116module_platform_driver(pcf50633_input_driver);
117static int __init pcf50633_input_init(void)
118{
119 return platform_driver_register(&pcf50633_input_driver);
120}
121module_init(pcf50633_input_init);
122
123static void __exit pcf50633_input_exit(void)
124{
125 platform_driver_unregister(&pcf50633_input_driver);
126}
127module_exit(pcf50633_input_exit);
128 117
129MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>"); 118MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
130MODULE_DESCRIPTION("PCF50633 input driver"); 119MODULE_DESCRIPTION("PCF50633 input driver");
diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c
index 34f4d2e0f50f..b2484aa07f32 100644
--- a/drivers/input/misc/pcspkr.c
+++ b/drivers/input/misc/pcspkr.c
@@ -134,17 +134,5 @@ static struct platform_driver pcspkr_platform_driver = {
134 .remove = __devexit_p(pcspkr_remove), 134 .remove = __devexit_p(pcspkr_remove),
135 .shutdown = pcspkr_shutdown, 135 .shutdown = pcspkr_shutdown,
136}; 136};
137module_platform_driver(pcspkr_platform_driver);
137 138
138
139static int __init pcspkr_init(void)
140{
141 return platform_driver_register(&pcspkr_platform_driver);
142}
143
144static void __exit pcspkr_exit(void)
145{
146 platform_driver_unregister(&pcspkr_platform_driver);
147}
148
149module_init(pcspkr_init);
150module_exit(pcspkr_exit);
diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c
index 43192930824b..dfbfb463ea5d 100644
--- a/drivers/input/misc/pm8xxx-vibrator.c
+++ b/drivers/input/misc/pm8xxx-vibrator.c
@@ -277,18 +277,7 @@ static struct platform_driver pm8xxx_vib_driver = {
277 .pm = &pm8xxx_vib_pm_ops, 277 .pm = &pm8xxx_vib_pm_ops,
278 }, 278 },
279}; 279};
280 280module_platform_driver(pm8xxx_vib_driver);
281static int __init pm8xxx_vib_init(void)
282{
283 return platform_driver_register(&pm8xxx_vib_driver);
284}
285module_init(pm8xxx_vib_init);
286
287static void __exit pm8xxx_vib_exit(void)
288{
289 platform_driver_unregister(&pm8xxx_vib_driver);
290}
291module_exit(pm8xxx_vib_exit);
292 281
293MODULE_ALIAS("platform:pm8xxx_vib"); 282MODULE_ALIAS("platform:pm8xxx_vib");
294MODULE_DESCRIPTION("PMIC8xxx vibrator driver based on ff-memless framework"); 283MODULE_DESCRIPTION("PMIC8xxx vibrator driver based on ff-memless framework");
diff --git a/drivers/input/misc/pmic8xxx-pwrkey.c b/drivers/input/misc/pmic8xxx-pwrkey.c
index b3cfb9c71e66..0f83d0f1d015 100644
--- a/drivers/input/misc/pmic8xxx-pwrkey.c
+++ b/drivers/input/misc/pmic8xxx-pwrkey.c
@@ -213,18 +213,7 @@ static struct platform_driver pmic8xxx_pwrkey_driver = {
213 .pm = &pm8xxx_pwr_key_pm_ops, 213 .pm = &pm8xxx_pwr_key_pm_ops,
214 }, 214 },
215}; 215};
216 216module_platform_driver(pmic8xxx_pwrkey_driver);
217static int __init pmic8xxx_pwrkey_init(void)
218{
219 return platform_driver_register(&pmic8xxx_pwrkey_driver);
220}
221module_init(pmic8xxx_pwrkey_init);
222
223static void __exit pmic8xxx_pwrkey_exit(void)
224{
225 platform_driver_unregister(&pmic8xxx_pwrkey_driver);
226}
227module_exit(pmic8xxx_pwrkey_exit);
228 217
229MODULE_ALIAS("platform:pmic8xxx_pwrkey"); 218MODULE_ALIAS("platform:pmic8xxx_pwrkey");
230MODULE_DESCRIPTION("PMIC8XXX Power Key driver"); 219MODULE_DESCRIPTION("PMIC8XXX Power Key driver");
diff --git a/drivers/input/misc/pwm-beeper.c b/drivers/input/misc/pwm-beeper.c
index 57c294f07198..fc84c8a51147 100644
--- a/drivers/input/misc/pwm-beeper.c
+++ b/drivers/input/misc/pwm-beeper.c
@@ -180,18 +180,7 @@ static struct platform_driver pwm_beeper_driver = {
180 .pm = PWM_BEEPER_PM_OPS, 180 .pm = PWM_BEEPER_PM_OPS,
181 }, 181 },
182}; 182};
183 183module_platform_driver(pwm_beeper_driver);
184static int __init pwm_beeper_init(void)
185{
186 return platform_driver_register(&pwm_beeper_driver);
187}
188module_init(pwm_beeper_init);
189
190static void __exit pwm_beeper_exit(void)
191{
192 platform_driver_unregister(&pwm_beeper_driver);
193}
194module_exit(pwm_beeper_exit);
195 184
196MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 185MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
197MODULE_DESCRIPTION("PWM beeper driver"); 186MODULE_DESCRIPTION("PWM beeper driver");
diff --git a/drivers/input/misc/rb532_button.c b/drivers/input/misc/rb532_button.c
index e2c7f622a0b5..aeb02bcf7233 100644
--- a/drivers/input/misc/rb532_button.c
+++ b/drivers/input/misc/rb532_button.c
@@ -100,19 +100,7 @@ static struct platform_driver rb532_button_driver = {
100 .owner = THIS_MODULE, 100 .owner = THIS_MODULE,
101 }, 101 },
102}; 102};
103 103module_platform_driver(rb532_button_driver);
104static int __init rb532_button_init(void)
105{
106 return platform_driver_register(&rb532_button_driver);
107}
108
109static void __exit rb532_button_exit(void)
110{
111 platform_driver_unregister(&rb532_button_driver);
112}
113
114module_init(rb532_button_init);
115module_exit(rb532_button_exit);
116 104
117MODULE_AUTHOR("Phil Sutter <n0-1@freewrt.org>"); 105MODULE_AUTHOR("Phil Sutter <n0-1@freewrt.org>");
118MODULE_LICENSE("GPL"); 106MODULE_LICENSE("GPL");
diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c
index 2c8b84dd9dac..f07f784198b9 100644
--- a/drivers/input/misc/rotary_encoder.c
+++ b/drivers/input/misc/rotary_encoder.c
@@ -7,7 +7,7 @@
7 * state machine code inspired by code from Tim Ruetz 7 * state machine code inspired by code from Tim Ruetz
8 * 8 *
9 * A generic driver for rotary encoders connected to GPIO lines. 9 * A generic driver for rotary encoders connected to GPIO lines.
10 * See file:Documentation/input/rotary_encoder.txt for more information 10 * See file:Documentation/input/rotary-encoder.txt for more information
11 * 11 *
12 * This program is free software; you can redistribute it and/or modify 12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as 13 * it under the terms of the GNU General Public License version 2 as
@@ -284,19 +284,7 @@ static struct platform_driver rotary_encoder_driver = {
284 .owner = THIS_MODULE, 284 .owner = THIS_MODULE,
285 } 285 }
286}; 286};
287 287module_platform_driver(rotary_encoder_driver);
288static int __init rotary_encoder_init(void)
289{
290 return platform_driver_register(&rotary_encoder_driver);
291}
292
293static void __exit rotary_encoder_exit(void)
294{
295 platform_driver_unregister(&rotary_encoder_driver);
296}
297
298module_init(rotary_encoder_init);
299module_exit(rotary_encoder_exit);
300 288
301MODULE_ALIAS("platform:" DRV_NAME); 289MODULE_ALIAS("platform:" DRV_NAME);
302MODULE_DESCRIPTION("GPIO rotary encoder driver"); 290MODULE_DESCRIPTION("GPIO rotary encoder driver");
diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c
index 1a80c0dab83b..5d9fd5571199 100644
--- a/drivers/input/misc/sgi_btns.c
+++ b/drivers/input/misc/sgi_btns.c
@@ -164,17 +164,6 @@ static struct platform_driver sgi_buttons_driver = {
164 .owner = THIS_MODULE, 164 .owner = THIS_MODULE,
165 }, 165 },
166}; 166};
167 167module_platform_driver(sgi_buttons_driver);
168static int __init sgi_buttons_init(void)
169{
170 return platform_driver_register(&sgi_buttons_driver);
171}
172
173static void __exit sgi_buttons_exit(void)
174{
175 platform_driver_unregister(&sgi_buttons_driver);
176}
177 168
178MODULE_LICENSE("GPL"); 169MODULE_LICENSE("GPL");
179module_init(sgi_buttons_init);
180module_exit(sgi_buttons_exit);
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c
index 38e4b507b94c..19a68828cd86 100644
--- a/drivers/input/misc/twl4030-pwrbutton.c
+++ b/drivers/input/misc/twl4030-pwrbutton.c
@@ -107,25 +107,14 @@ static int __exit twl4030_pwrbutton_remove(struct platform_device *pdev)
107} 107}
108 108
109static struct platform_driver twl4030_pwrbutton_driver = { 109static struct platform_driver twl4030_pwrbutton_driver = {
110 .probe = twl4030_pwrbutton_probe,
110 .remove = __exit_p(twl4030_pwrbutton_remove), 111 .remove = __exit_p(twl4030_pwrbutton_remove),
111 .driver = { 112 .driver = {
112 .name = "twl4030_pwrbutton", 113 .name = "twl4030_pwrbutton",
113 .owner = THIS_MODULE, 114 .owner = THIS_MODULE,
114 }, 115 },
115}; 116};
116 117module_platform_driver(twl4030_pwrbutton_driver);
117static int __init twl4030_pwrbutton_init(void)
118{
119 return platform_driver_probe(&twl4030_pwrbutton_driver,
120 twl4030_pwrbutton_probe);
121}
122module_init(twl4030_pwrbutton_init);
123
124static void __exit twl4030_pwrbutton_exit(void)
125{
126 platform_driver_unregister(&twl4030_pwrbutton_driver);
127}
128module_exit(twl4030_pwrbutton_exit);
129 118
130MODULE_ALIAS("platform:twl4030_pwrbutton"); 119MODULE_ALIAS("platform:twl4030_pwrbutton");
131MODULE_DESCRIPTION("Triton2 Power Button"); 120MODULE_DESCRIPTION("Triton2 Power Button");
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c
index 3c1a432c14dc..37651373a95b 100644
--- a/drivers/input/misc/twl4030-vibra.c
+++ b/drivers/input/misc/twl4030-vibra.c
@@ -278,21 +278,9 @@ static struct platform_driver twl4030_vibra_driver = {
278#endif 278#endif
279 }, 279 },
280}; 280};
281 281module_platform_driver(twl4030_vibra_driver);
282static int __init twl4030_vibra_init(void)
283{
284 return platform_driver_register(&twl4030_vibra_driver);
285}
286module_init(twl4030_vibra_init);
287
288static void __exit twl4030_vibra_exit(void)
289{
290 platform_driver_unregister(&twl4030_vibra_driver);
291}
292module_exit(twl4030_vibra_exit);
293 282
294MODULE_ALIAS("platform:twl4030-vibra"); 283MODULE_ALIAS("platform:twl4030-vibra");
295
296MODULE_DESCRIPTION("TWL4030 Vibra driver"); 284MODULE_DESCRIPTION("TWL4030 Vibra driver");
297MODULE_LICENSE("GPL"); 285MODULE_LICENSE("GPL");
298MODULE_AUTHOR("Nokia Corporation"); 286MODULE_AUTHOR("Nokia Corporation");
diff --git a/drivers/input/misc/twl6040-vibra.c b/drivers/input/misc/twl6040-vibra.c
index 23855e12a30b..45874fed523a 100644
--- a/drivers/input/misc/twl6040-vibra.c
+++ b/drivers/input/misc/twl6040-vibra.c
@@ -74,12 +74,12 @@ static irqreturn_t twl6040_vib_irq_handler(int irq, void *data)
74 if (status & TWL6040_VIBLOCDET) { 74 if (status & TWL6040_VIBLOCDET) {
75 dev_warn(info->dev, "Left Vibrator overcurrent detected\n"); 75 dev_warn(info->dev, "Left Vibrator overcurrent detected\n");
76 twl6040_clear_bits(twl6040, TWL6040_REG_VIBCTLL, 76 twl6040_clear_bits(twl6040, TWL6040_REG_VIBCTLL,
77 TWL6040_VIBENAL); 77 TWL6040_VIBENA);
78 } 78 }
79 if (status & TWL6040_VIBROCDET) { 79 if (status & TWL6040_VIBROCDET) {
80 dev_warn(info->dev, "Right Vibrator overcurrent detected\n"); 80 dev_warn(info->dev, "Right Vibrator overcurrent detected\n");
81 twl6040_clear_bits(twl6040, TWL6040_REG_VIBCTLR, 81 twl6040_clear_bits(twl6040, TWL6040_REG_VIBCTLR,
82 TWL6040_VIBENAR); 82 TWL6040_VIBENA);
83 } 83 }
84 84
85 return IRQ_HANDLED; 85 return IRQ_HANDLED;
@@ -97,23 +97,23 @@ static void twl6040_vibra_enable(struct vibra_info *info)
97 } 97 }
98 98
99 twl6040_power(info->twl6040, 1); 99 twl6040_power(info->twl6040, 1);
100 if (twl6040->rev <= TWL6040_REV_ES1_1) { 100 if (twl6040_get_revid(twl6040) <= TWL6040_REV_ES1_1) {
101 /* 101 /*
102 * ERRATA: Disable overcurrent protection for at least 102 * ERRATA: Disable overcurrent protection for at least
103 * 3ms when enabling vibrator drivers to avoid false 103 * 3ms when enabling vibrator drivers to avoid false
104 * overcurrent detection 104 * overcurrent detection
105 */ 105 */
106 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, 106 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL,
107 TWL6040_VIBENAL | TWL6040_VIBCTRLL); 107 TWL6040_VIBENA | TWL6040_VIBCTRL);
108 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, 108 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR,
109 TWL6040_VIBENAR | TWL6040_VIBCTRLR); 109 TWL6040_VIBENA | TWL6040_VIBCTRL);
110 usleep_range(3000, 3500); 110 usleep_range(3000, 3500);
111 } 111 }
112 112
113 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, 113 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL,
114 TWL6040_VIBENAL); 114 TWL6040_VIBENA);
115 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, 115 twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR,
116 TWL6040_VIBENAR); 116 TWL6040_VIBENA);
117 117
118 info->enabled = true; 118 info->enabled = true;
119} 119}
@@ -201,6 +201,13 @@ static int vibra_play(struct input_dev *input, void *data,
201 struct vibra_info *info = input_get_drvdata(input); 201 struct vibra_info *info = input_get_drvdata(input);
202 int ret; 202 int ret;
203 203
204 /* Do not allow effect, while the routing is set to use audio */
205 ret = twl6040_get_vibralr_status(info->twl6040);
206 if (ret & TWL6040_VIBSEL) {
207 dev_info(&input->dev, "Vibra is configured for audio\n");
208 return -EBUSY;
209 }
210
204 info->weak_speed = effect->u.rumble.weak_magnitude; 211 info->weak_speed = effect->u.rumble.weak_magnitude;
205 info->strong_speed = effect->u.rumble.strong_magnitude; 212 info->strong_speed = effect->u.rumble.strong_magnitude;
206 info->direction = effect->direction < EFFECT_DIR_180_DEG ? 1 : -1; 213 info->direction = effect->direction < EFFECT_DIR_180_DEG ? 1 : -1;
@@ -403,18 +410,7 @@ static struct platform_driver twl6040_vibra_driver = {
403 .pm = &twl6040_vibra_pm_ops, 410 .pm = &twl6040_vibra_pm_ops,
404 }, 411 },
405}; 412};
406 413module_platform_driver(twl6040_vibra_driver);
407static int __init twl6040_vibra_init(void)
408{
409 return platform_driver_register(&twl6040_vibra_driver);
410}
411module_init(twl6040_vibra_init);
412
413static void __exit twl6040_vibra_exit(void)
414{
415 platform_driver_unregister(&twl6040_vibra_driver);
416}
417module_exit(twl6040_vibra_exit);
418 414
419MODULE_ALIAS("platform:twl6040-vibra"); 415MODULE_ALIAS("platform:twl6040-vibra");
420MODULE_DESCRIPTION("TWL6040 Vibra driver"); 416MODULE_DESCRIPTION("TWL6040 Vibra driver");
diff --git a/drivers/input/misc/wm831x-on.c b/drivers/input/misc/wm831x-on.c
index c3d7ba5f5b47..47f18d6bce46 100644
--- a/drivers/input/misc/wm831x-on.c
+++ b/drivers/input/misc/wm831x-on.c
@@ -145,18 +145,7 @@ static struct platform_driver wm831x_on_driver = {
145 .owner = THIS_MODULE, 145 .owner = THIS_MODULE,
146 }, 146 },
147}; 147};
148 148module_platform_driver(wm831x_on_driver);
149static int __init wm831x_on_init(void)
150{
151 return platform_driver_register(&wm831x_on_driver);
152}
153module_init(wm831x_on_init);
154
155static void __exit wm831x_on_exit(void)
156{
157 platform_driver_unregister(&wm831x_on_driver);
158}
159module_exit(wm831x_on_exit);
160 149
161MODULE_ALIAS("platform:wm831x-on"); 150MODULE_ALIAS("platform:wm831x-on");
162MODULE_DESCRIPTION("WM831x ON pin"); 151MODULE_DESCRIPTION("WM831x ON pin");