aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/misc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-10 13:55:52 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-10 13:55:52 -0500
commitdbe950f201a8edd353b0bd9079e8d536ee4ce37c (patch)
treedffbada6b3d33cc67383758570de22b4f45693b6 /drivers/input/misc
parentf62f61917d72c1fb0101ad405664f6fc868d676b (diff)
parentda733563be5a9da26fe81d9f007262d00b846e22 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (64 commits) Input: tc3589x-keypad - add missing kerneldoc Input: ucb1400-ts - switch to using dev_xxx() for diagnostic messages Input: ucb1400_ts - convert to threaded IRQ Input: ucb1400_ts - drop inline annotations Input: usb1400_ts - add __devinit/__devexit section annotations Input: ucb1400_ts - set driver owner Input: ucb1400_ts - convert to use dev_pm_ops Input: psmouse - make sure we do not use stale methods Input: evdev - do not block waiting for an event if fd is nonblock Input: evdev - if no events and non-block, return EAGAIN not 0 Input: evdev - only allow reading events if a full packet is present Input: add driver for pixcir i2c touchscreens Input: samsung-keypad - implement runtime power management support Input: tegra-kbc - report wakeup key for some platforms Input: tegra-kbc - add device tree bindings Input: add driver for AUO In-Cell touchscreens using pixcir ICs Input: mpu3050 - configure the sampling method Input: mpu3050 - ensure we enable interrupts Input: mpu3050 - add of_match table for device-tree probing Input: sentelic - document the latest hardware ... Fix up fairly trivial conflicts (device tree matching conflicting with some independent cleanups) in drivers/input/keyboard/samsung-keypad.c
Diffstat (limited to 'drivers/input/misc')
-rw-r--r--drivers/input/misc/88pm860x_onkey.c13
-rw-r--r--drivers/input/misc/Kconfig25
-rw-r--r--drivers/input/misc/Makefile2
-rw-r--r--drivers/input/misc/ab8500-ponkey.c13
-rw-r--r--drivers/input/misc/adxl34x-spi.c1
-rw-r--r--drivers/input/misc/adxl34x.c16
-rw-r--r--drivers/input/misc/ati_remote2.c19
-rw-r--r--drivers/input/misc/bfin_rotary.c13
-rw-r--r--drivers/input/misc/cobalt_btns.c14
-rw-r--r--drivers/input/misc/dm355evm_keys.c13
-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.c14
-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.c14
-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.c13
-rw-r--r--drivers/input/misc/wm831x-on.c13
29 files changed, 703 insertions, 282 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 22d875fde53a..7b46781c30c9 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -179,6 +179,31 @@ config INPUT_APANEL
179 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
180 be called apanel. 180 be called apanel.
181 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
182config INPUT_IXP4XX_BEEPER 207config INPUT_IXP4XX_BEEPER
183 tristate "IXP4XX Beeper support" 208 tristate "IXP4XX Beeper support"
184 depends on ARCH_IXP4XX 209 depends on ARCH_IXP4XX
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index a244fc6a781c..46671a875b91 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -22,6 +22,8 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o
22obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o 22obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o
23obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o 23obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o
24obj-$(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
25obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o 27obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
26obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o 28obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o
27obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o 29obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.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/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 09244804fb97..1cf72fe513e6 100644
--- a/drivers/input/misc/adxl34x.c
+++ b/drivers/input/misc/adxl34x.c
@@ -452,10 +452,10 @@ static ssize_t adxl34x_disable_store(struct device *dev,
452 const char *buf, size_t count) 452 const char *buf, size_t count)
453{ 453{
454 struct adxl34x *ac = dev_get_drvdata(dev); 454 struct adxl34x *ac = dev_get_drvdata(dev);
455 unsigned long val; 455 unsigned int val;
456 int error; 456 int error;
457 457
458 error = strict_strtoul(buf, 10, &val); 458 error = kstrtouint(buf, 10, &val);
459 if (error) 459 if (error)
460 return error; 460 return error;
461 461
@@ -541,10 +541,10 @@ static ssize_t adxl34x_rate_store(struct device *dev,
541 const char *buf, size_t count) 541 const char *buf, size_t count)
542{ 542{
543 struct adxl34x *ac = dev_get_drvdata(dev); 543 struct adxl34x *ac = dev_get_drvdata(dev);
544 unsigned long val; 544 unsigned char val;
545 int error; 545 int error;
546 546
547 error = strict_strtoul(buf, 10, &val); 547 error = kstrtou8(buf, 10, &val);
548 if (error) 548 if (error)
549 return error; 549 return error;
550 550
@@ -576,10 +576,10 @@ static ssize_t adxl34x_autosleep_store(struct device *dev,
576 const char *buf, size_t count) 576 const char *buf, size_t count)
577{ 577{
578 struct adxl34x *ac = dev_get_drvdata(dev); 578 struct adxl34x *ac = dev_get_drvdata(dev);
579 unsigned long val; 579 unsigned int val;
580 int error; 580 int error;
581 581
582 error = strict_strtoul(buf, 10, &val); 582 error = kstrtouint(buf, 10, &val);
583 if (error) 583 if (error)
584 return error; 584 return error;
585 585
@@ -623,13 +623,13 @@ static ssize_t adxl34x_write_store(struct device *dev,
623 const char *buf, size_t count) 623 const char *buf, size_t count)
624{ 624{
625 struct adxl34x *ac = dev_get_drvdata(dev); 625 struct adxl34x *ac = dev_get_drvdata(dev);
626 unsigned long val; 626 unsigned int val;
627 int error; 627 int error;
628 628
629 /* 629 /*
630 * This allows basic ADXL register write access for debug purposes. 630 * This allows basic ADXL register write access for debug purposes.
631 */ 631 */
632 error = strict_strtoul(buf, 16, &val); 632 error = kstrtouint(buf, 16, &val);
633 if (error) 633 if (error)
634 return error; 634 return error;
635 635
diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c
index 874a51c2fbb2..f63341f20b91 100644
--- a/drivers/input/misc/ati_remote2.c
+++ b/drivers/input/misc/ati_remote2.c
@@ -42,13 +42,13 @@ static int ati_remote2_set_mask(const char *val,
42 const struct kernel_param *kp, 42 const struct kernel_param *kp,
43 unsigned int max) 43 unsigned int max)
44{ 44{
45 unsigned long mask; 45 unsigned int mask;
46 int ret; 46 int ret;
47 47
48 if (!val) 48 if (!val)
49 return -EINVAL; 49 return -EINVAL;
50 50
51 ret = strict_strtoul(val, 0, &mask); 51 ret = kstrtouint(val, 0, &mask);
52 if (ret) 52 if (ret)
53 return ret; 53 return ret;
54 54
@@ -720,11 +720,12 @@ static ssize_t ati_remote2_store_channel_mask(struct device *dev,
720 struct usb_device *udev = to_usb_device(dev); 720 struct usb_device *udev = to_usb_device(dev);
721 struct usb_interface *intf = usb_ifnum_to_if(udev, 0); 721 struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
722 struct ati_remote2 *ar2 = usb_get_intfdata(intf); 722 struct ati_remote2 *ar2 = usb_get_intfdata(intf);
723 unsigned long mask; 723 unsigned int mask;
724 int r; 724 int r;
725 725
726 if (strict_strtoul(buf, 0, &mask)) 726 r = kstrtouint(buf, 0, &mask);
727 return -EINVAL; 727 if (r)
728 return r;
728 729
729 if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK) 730 if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK)
730 return -EINVAL; 731 return -EINVAL;
@@ -769,10 +770,12 @@ static ssize_t ati_remote2_store_mode_mask(struct device *dev,
769 struct usb_device *udev = to_usb_device(dev); 770 struct usb_device *udev = to_usb_device(dev);
770 struct usb_interface *intf = usb_ifnum_to_if(udev, 0); 771 struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
771 struct ati_remote2 *ar2 = usb_get_intfdata(intf); 772 struct ati_remote2 *ar2 = usb_get_intfdata(intf);
772 unsigned long mask; 773 unsigned int mask;
774 int err;
773 775
774 if (strict_strtoul(buf, 0, &mask)) 776 err = kstrtouint(buf, 0, &mask);
775 return -EINVAL; 777 if (err)
778 return err;
776 779
777 if (mask & ~ATI_REMOTE2_MAX_MODE_MASK) 780 if (mask & ~ATI_REMOTE2_MAX_MODE_MASK)
778 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/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 7283dd2a1ad3..35083c6836c3 100644
--- a/drivers/input/misc/dm355evm_keys.c
+++ b/drivers/input/misc/dm355evm_keys.c
@@ -267,17 +267,6 @@ static struct platform_driver dm355evm_keys_driver = {
267 .name = "dm355evm_keys", 267 .name = "dm355evm_keys",
268 }, 268 },
269}; 269};
270 270module_platform_driver(dm355evm_keys_driver);
271static int __init dm355evm_keys_init(void)
272{
273 return platform_driver_register(&dm355evm_keys_driver);
274}
275module_init(dm355evm_keys_init);
276
277static void __exit dm355evm_keys_exit(void)
278{
279 platform_driver_unregister(&dm355evm_keys_driver);
280}
281module_exit(dm355evm_keys_exit);
282 271
283MODULE_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
index 09b052288657..8428f1e8e83e 100644
--- a/drivers/input/misc/mc13783-pwrbutton.c
+++ b/drivers/input/misc/mc13783-pwrbutton.c
@@ -255,7 +255,7 @@ static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
255 return 0; 255 return 0;
256} 256}
257 257
258struct platform_driver mc13783_pwrbutton_driver = { 258static struct platform_driver mc13783_pwrbutton_driver = {
259 .probe = mc13783_pwrbutton_probe, 259 .probe = mc13783_pwrbutton_probe,
260 .remove = __devexit_p(mc13783_pwrbutton_remove), 260 .remove = __devexit_p(mc13783_pwrbutton_remove),
261 .driver = { 261 .driver = {
@@ -264,17 +264,7 @@ struct platform_driver mc13783_pwrbutton_driver = {
264 }, 264 },
265}; 265};
266 266
267static int __init mc13783_pwrbutton_init(void) 267module_platform_driver(mc13783_pwrbutton_driver);
268{
269 return platform_driver_register(&mc13783_pwrbutton_driver);
270}
271module_init(mc13783_pwrbutton_init);
272
273static void __exit mc13783_pwrbutton_exit(void)
274{
275 platform_driver_unregister(&mc13783_pwrbutton_driver);
276}
277module_exit(mc13783_pwrbutton_exit);
278 268
279MODULE_ALIAS("platform:mc13783-pwrbutton"); 269MODULE_ALIAS("platform:mc13783-pwrbutton");
280MODULE_DESCRIPTION("MC13783 Power Button"); 270MODULE_DESCRIPTION("MC13783 Power Button");
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 2be21694fac1..f07f784198b9 100644
--- a/drivers/input/misc/rotary_encoder.c
+++ b/drivers/input/misc/rotary_encoder.c
@@ -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 ad153a417eed..45874fed523a 100644
--- a/drivers/input/misc/twl6040-vibra.c
+++ b/drivers/input/misc/twl6040-vibra.c
@@ -410,18 +410,7 @@ static struct platform_driver twl6040_vibra_driver = {
410 .pm = &twl6040_vibra_pm_ops, 410 .pm = &twl6040_vibra_pm_ops,
411 }, 411 },
412}; 412};
413 413module_platform_driver(twl6040_vibra_driver);
414static int __init twl6040_vibra_init(void)
415{
416 return platform_driver_register(&twl6040_vibra_driver);
417}
418module_init(twl6040_vibra_init);
419
420static void __exit twl6040_vibra_exit(void)
421{
422 platform_driver_unregister(&twl6040_vibra_driver);
423}
424module_exit(twl6040_vibra_exit);
425 414
426MODULE_ALIAS("platform:twl6040-vibra"); 415MODULE_ALIAS("platform:twl6040-vibra");
427MODULE_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");