dect
/
linux-2.6
Archived
13
0
Fork 0

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull second round of input updates from Dmitry Torokhov:
 "As usual, there are a couple of new drivers, input core now supports
  managed input devices (devres), a slew of drivers now have device tree
  support and a bunch of fixes and cleanups."

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

View File

@ -0,0 +1,46 @@
* GPIO driven matrix keypad device tree bindings
GPIO driven matrix keypad is used to interface a SoC with a matrix keypad.
The matrix keypad supports multiple row and column lines, a key can be
placed at each intersection of a unique row and a unique column. The matrix
keypad can sense a key-press and key-release by means of GPIO lines and
report the event using GPIO interrupts to the cpu.
Required Properties:
- compatible: Should be "gpio-matrix-keypad"
- row-gpios: List of gpios used as row lines. The gpio specifier
for this property depends on the gpio controller to
which these row lines are connected.
- col-gpios: List of gpios used as column lines. The gpio specifier
for this property depends on the gpio controller to
which these column lines are connected.
- linux,keymap: The definition can be found at
bindings/input/matrix-keymap.txt
Optional Properties:
- linux,no-autorepeat: do no enable autorepeat feature.
- linux,wakeup: use any event on keypad as wakeup event.
- debounce-delay-ms: debounce interval in milliseconds
- col-scan-delay-us: delay, measured in microseconds, that is needed
before we can scan keypad after activating column gpio
Example:
matrix-keypad {
compatible = "gpio-matrix-keypad";
debounce-delay-ms = <5>;
col-scan-delay-us = <2>;
row-gpios = <&gpio2 25 0
&gpio2 26 0
&gpio2 27 0>;
col-gpios = <&gpio2 21 0
&gpio2 22 0>;
linux,keymap = <0x0000008B
0x0100009E
0x02000069
0x0001006A
0x0101001C
0x0201006C>;
};

View File

@ -0,0 +1,7 @@
* PWM beeper device tree bindings
Registers a PWM device as beeper.
Required properties:
- compatible: should be "pwm-beeper"
- pwms: phandle to the physical PWM device

View File

@ -0,0 +1,39 @@
* STMPE Keypad
Required properties:
- compatible : "st,stmpe-keypad"
- linux,keymap : See ./matrix-keymap.txt
Optional properties:
- debounce-interval : Debouncing interval time in milliseconds
- st,scan-count : Scanning cycles elapsed before key data is updated
- st,no-autorepeat : If specified device will not autorepeat
Example:
stmpe_keypad {
compatible = "st,stmpe-keypad";
debounce-interval = <64>;
st,scan-count = <8>;
st,no-autorepeat;
linux,keymap = <0x205006b
0x4010074
0x3050072
0x1030004
0x502006a
0x500000a
0x5008b
0x706001c
0x405000b
0x6070003
0x3040067
0x303006c
0x60400e7
0x602009e
0x4020073
0x5050002
0x4030069
0x3020008>;
};

View File

@ -0,0 +1,8 @@
Required properties:
- compatible: "ti,tca8418"
- reg: the I2C address
- interrupts: IRQ line number, should trigger on falling edge
- keypad,num-rows: The number of rows
- keypad,num-columns: The number of columns
- linux,keymap: Keys definitions, see keypad-matrix.

View File

@ -0,0 +1,34 @@
* MELFAS MMS114 touchscreen controller
Required properties:
- compatible: must be "melfas,mms114"
- reg: I2C address of the chip
- interrupts: interrupt to which the chip is connected
- x-size: horizontal resolution of touchscreen
- y-size: vertical resolution of touchscreen
Optional properties:
- contact-threshold:
- moving-threshold:
- x-invert: invert X axis
- y-invert: invert Y axis
Example:
i2c@00000000 {
/* ... */
touchscreen@48 {
compatible = "melfas,mms114";
reg = <0x48>;
interrupts = <39 0>;
x-size = <720>;
y-size = <1280>;
contact-threshold = <10>;
moving-threshold = <10>;
x-invert;
y-invert;
};
/* ... */
};

View File

@ -0,0 +1,43 @@
STMPE Touchscreen
----------------
Required properties:
- compatible: "st,stmpe-ts"
Optional properties:
- st,sample-time: ADC converstion time in number of clock. (0 -> 36 clocks, 1 ->
44 clocks, 2 -> 56 clocks, 3 -> 64 clocks, 4 -> 80 clocks, 5 -> 96 clocks, 6
-> 144 clocks), recommended is 4.
- st,mod-12b: ADC Bit mode (0 -> 10bit ADC, 1 -> 12bit ADC)
- st,ref-sel: ADC reference source (0 -> internal reference, 1 -> external
reference)
- st,adc-freq: ADC Clock speed (0 -> 1.625 MHz, 1 -> 3.25 MHz, 2 || 3 -> 6.5 MHz)
- st,ave-ctrl: Sample average control (0 -> 1 sample, 1 -> 2 samples, 2 -> 4
samples, 3 -> 8 samples)
- st,touch-det-delay: Touch detect interrupt delay (0 -> 10 us, 1 -> 50 us, 2 ->
100 us, 3 -> 500 us, 4-> 1 ms, 5 -> 5 ms, 6 -> 10 ms, 7 -> 50 ms) recommended
is 3
- st,settling: Panel driver settling time (0 -> 10 us, 1 -> 100 us, 2 -> 500 us, 3
-> 1 ms, 4 -> 5 ms, 5 -> 10 ms, 6 for 50 ms, 7 -> 100 ms) recommended is 2
- st,fraction-z: Length of the fractional part in z (fraction-z ([0..7]) = Count of
the fractional part) recommended is 7
- st,i-drive: current limit value of the touchscreen drivers (0 -> 20 mA typical 35
mA max, 1 -> 50 mA typical 80 mA max)
Node name must be stmpe_touchscreen and should be child node of stmpe node to
which it belongs.
Example:
stmpe_touchscreen {
compatible = "st,stmpe-ts";
st,sample-time = <4>;
st,mod-12b = <1>;
st,ref-sel = <0>;
st,adc-freq = <1>;
st,ave-ctrl = <1>;
st,touch-det-delay = <2>;
st,settling = <2>;
st,fraction-z = <7>;
st,i-drive = <1>;
};

View File

@ -112,17 +112,6 @@ static void __init mipid_dev_init(void)
omapfb_set_lcd_config(&nokia770_lcd_config); omapfb_set_lcd_config(&nokia770_lcd_config);
} }
static void __init ads7846_dev_init(void)
{
if (gpio_request(ADS7846_PENDOWN_GPIO, "ADS7846 pendown") < 0)
printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(ADS7846_PENDOWN_GPIO);
}
static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = { static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = {
.x_max = 0x0fff, .x_max = 0x0fff,
.y_max = 0x0fff, .y_max = 0x0fff,
@ -131,7 +120,7 @@ static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata =
.debounce_max = 10, .debounce_max = 10,
.debounce_tol = 3, .debounce_tol = 3,
.debounce_rep = 1, .debounce_rep = 1,
.get_pendown_state = ads7846_get_pendown_state, .gpio_pendown = ADS7846_PENDOWN_GPIO,
}; };
static struct spi_board_info nokia770_spi_board_info[] __initdata = { static struct spi_board_info nokia770_spi_board_info[] __initdata = {
@ -241,7 +230,6 @@ static void __init omap_nokia770_init(void)
omap_serial_init(); omap_serial_init();
omap_register_i2c_bus(1, 100, NULL, 0); omap_register_i2c_bus(1, 100, NULL, 0);
hwa742_dev_init(); hwa742_dev_init();
ads7846_dev_init();
mipid_dev_init(); mipid_dev_init();
omap1_usb_init(&nokia770_usb_config); omap1_usb_init(&nokia770_usb_config);
nokia770_mmc_init(); nokia770_mmc_init();

View File

@ -77,9 +77,6 @@ static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
* BU21013 ROHM touchscreen interface on the STUIBs * BU21013 ROHM touchscreen interface on the STUIBs
*/ */
/* tracks number of bu21013 devices being enabled */
static int bu21013_devices;
#define TOUCH_GPIO_PIN 84 #define TOUCH_GPIO_PIN 84
#define TOUCH_XMAX 384 #define TOUCH_XMAX 384
@ -88,73 +85,8 @@ static int bu21013_devices;
#define PRCMU_CLOCK_OCR 0x1CC #define PRCMU_CLOCK_OCR 0x1CC
#define TSC_EXT_CLOCK_9_6MHZ 0x840000 #define TSC_EXT_CLOCK_9_6MHZ 0x840000
/**
* bu21013_gpio_board_init : configures the touch panel.
* @reset_pin: reset pin number
* This function can be used to configures
* the voltage and reset the touch panel controller.
*/
static int bu21013_gpio_board_init(int reset_pin)
{
int retval = 0;
bu21013_devices++;
if (bu21013_devices == 1) {
retval = gpio_request(reset_pin, "touchp_reset");
if (retval) {
printk(KERN_ERR "Unable to request gpio reset_pin");
return retval;
}
retval = gpio_direction_output(reset_pin, 1);
if (retval < 0) {
printk(KERN_ERR "%s: gpio direction failed\n",
__func__);
return retval;
}
}
return retval;
}
/**
* bu21013_gpio_board_exit : deconfigures the touch panel controller
* @reset_pin: reset pin number
* This function can be used to deconfigures the chip selection
* for touch panel controller.
*/
static int bu21013_gpio_board_exit(int reset_pin)
{
int retval = 0;
if (bu21013_devices == 1) {
retval = gpio_direction_output(reset_pin, 0);
if (retval < 0) {
printk(KERN_ERR "%s: gpio direction failed\n",
__func__);
return retval;
}
gpio_set_value(reset_pin, 0);
}
bu21013_devices--;
return retval;
}
/**
* bu21013_read_pin_val : get the interrupt pin value
* This function can be used to get the interrupt pin value for touch panel
* controller.
*/
static int bu21013_read_pin_val(void)
{
return gpio_get_value(TOUCH_GPIO_PIN);
}
static struct bu21013_platform_device tsc_plat_device = { static struct bu21013_platform_device tsc_plat_device = {
.cs_en = bu21013_gpio_board_init, .touch_pin = TOUCH_GPIO_PIN,
.cs_dis = bu21013_gpio_board_exit,
.irq_read_val = bu21013_read_pin_val,
.irq = NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN),
.touch_x_max = TOUCH_XMAX, .touch_x_max = TOUCH_XMAX,
.touch_y_max = TOUCH_YMAX, .touch_y_max = TOUCH_YMAX,
.ext_clk = false, .ext_clk = false,
@ -171,7 +103,6 @@ static struct i2c_board_info __initdata u8500_i2c3_devices_stuib[] = {
I2C_BOARD_INFO("bu21013_tp", 0x5D), I2C_BOARD_INFO("bu21013_tp", 0x5D),
.platform_data = &tsc_plat_device, .platform_data = &tsc_plat_device,
}, },
}; };
void __init mop500_stuib_init(void) void __init mop500_stuib_init(void)

View File

@ -57,7 +57,7 @@ static const struct pci_device_id emu_tbl[] = {
MODULE_DEVICE_TABLE(pci, emu_tbl); MODULE_DEVICE_TABLE(pci, emu_tbl);
static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
struct emu *emu; struct emu *emu;
struct gameport *port; struct gameport *port;
@ -107,7 +107,7 @@ static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id
return error; return error;
} }
static void __devexit emu_remove(struct pci_dev *pdev) static void emu_remove(struct pci_dev *pdev)
{ {
struct emu *emu = pci_get_drvdata(pdev); struct emu *emu = pci_get_drvdata(pdev);
@ -122,7 +122,7 @@ static struct pci_driver emu_driver = {
.name = "Emu10k1_gameport", .name = "Emu10k1_gameport",
.id_table = emu_tbl, .id_table = emu_tbl,
.probe = emu_probe, .probe = emu_probe,
.remove = __devexit_p(emu_remove), .remove = emu_remove,
}; };
module_pci_driver(emu_driver); module_pci_driver(emu_driver);

View File

@ -78,7 +78,7 @@ static int fm801_gp_open(struct gameport *gameport, int mode)
return 0; return 0;
} }
static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id) static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id)
{ {
struct fm801_gp *gp; struct fm801_gp *gp;
struct gameport *port; struct gameport *port;
@ -129,7 +129,7 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device
return error; return error;
} }
static void __devexit fm801_gp_remove(struct pci_dev *pci) static void fm801_gp_remove(struct pci_dev *pci)
{ {
struct fm801_gp *gp = pci_get_drvdata(pci); struct fm801_gp *gp = pci_get_drvdata(pci);
@ -150,7 +150,7 @@ static struct pci_driver fm801_gp_driver = {
.name = "FM801_gameport", .name = "FM801_gameport",
.id_table = fm801_gp_id_table, .id_table = fm801_gp_id_table,
.probe = fm801_gp_probe, .probe = fm801_gp_probe,
.remove = __devexit_p(fm801_gp_remove), .remove = fm801_gp_remove,
}; };
module_pci_driver(fm801_gp_driver); module_pci_driver(fm801_gp_driver);

View File

@ -194,7 +194,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
if (!mt) if (!mt)
return; return;
oldest = 0; oldest = NULL;
oldid = mt->trkid; oldid = mt->trkid;
count = 0; count = 0;

View File

@ -534,8 +534,11 @@ EXPORT_SYMBOL(input_grab_device);
static void __input_release_device(struct input_handle *handle) static void __input_release_device(struct input_handle *handle)
{ {
struct input_dev *dev = handle->dev; struct input_dev *dev = handle->dev;
struct input_handle *grabber;
if (dev->grab == handle) { grabber = rcu_dereference_protected(dev->grab,
lockdep_is_held(&dev->mutex));
if (grabber == handle) {
rcu_assign_pointer(dev->grab, NULL); rcu_assign_pointer(dev->grab, NULL);
/* Make sure input_pass_event() notices that grab is gone */ /* Make sure input_pass_event() notices that grab is gone */
synchronize_rcu(); synchronize_rcu();
@ -1723,7 +1726,7 @@ EXPORT_SYMBOL_GPL(input_class);
/** /**
* input_allocate_device - allocate memory for new input device * input_allocate_device - allocate memory for new input device
* *
* Returns prepared struct input_dev or NULL. * Returns prepared struct input_dev or %NULL.
* *
* NOTE: Use input_free_device() to free devices that have not been * NOTE: Use input_free_device() to free devices that have not been
* registered; input_unregister_device() should be used for already * registered; input_unregister_device() should be used for already
@ -1750,6 +1753,70 @@ struct input_dev *input_allocate_device(void)
} }
EXPORT_SYMBOL(input_allocate_device); EXPORT_SYMBOL(input_allocate_device);
struct input_devres {
struct input_dev *input;
};
static int devm_input_device_match(struct device *dev, void *res, void *data)
{
struct input_devres *devres = res;
return devres->input == data;
}
static void devm_input_device_release(struct device *dev, void *res)
{
struct input_devres *devres = res;
struct input_dev *input = devres->input;
dev_dbg(dev, "%s: dropping reference to %s\n",
__func__, dev_name(&input->dev));
input_put_device(input);
}
/**
* devm_input_allocate_device - allocate managed input device
* @dev: device owning the input device being created
*
* Returns prepared struct input_dev or %NULL.
*
* Managed input devices do not need to be explicitly unregistered or
* freed as it will be done automatically when owner device unbinds from
* its driver (or binding fails). Once managed input device is allocated,
* it is ready to be set up and registered in the same fashion as regular
* input device. There are no special devm_input_device_[un]register()
* variants, regular ones work with both managed and unmanaged devices.
*
* NOTE: the owner device is set up as parent of input device and users
* should not override it.
*/
struct input_dev *devm_input_allocate_device(struct device *dev)
{
struct input_dev *input;
struct input_devres *devres;
devres = devres_alloc(devm_input_device_release,
sizeof(struct input_devres), GFP_KERNEL);
if (!devres)
return NULL;
input = input_allocate_device();
if (!input) {
devres_free(devres);
return NULL;
}
input->dev.parent = dev;
input->devres_managed = true;
devres->input = input;
devres_add(dev, devres);
return input;
}
EXPORT_SYMBOL(devm_input_allocate_device);
/** /**
* input_free_device - free memory occupied by input_dev structure * input_free_device - free memory occupied by input_dev structure
* @dev: input device to free * @dev: input device to free
@ -1766,8 +1833,14 @@ EXPORT_SYMBOL(input_allocate_device);
*/ */
void input_free_device(struct input_dev *dev) void input_free_device(struct input_dev *dev)
{ {
if (dev) if (dev) {
if (dev->devres_managed)
WARN_ON(devres_destroy(dev->dev.parent,
devm_input_device_release,
devm_input_device_match,
dev));
input_put_device(dev); input_put_device(dev);
}
} }
EXPORT_SYMBOL(input_free_device); EXPORT_SYMBOL(input_free_device);
@ -1888,6 +1961,38 @@ static void input_cleanse_bitmasks(struct input_dev *dev)
INPUT_CLEANSE_BITMASK(dev, SW, sw); INPUT_CLEANSE_BITMASK(dev, SW, sw);
} }
static void __input_unregister_device(struct input_dev *dev)
{
struct input_handle *handle, *next;
input_disconnect_device(dev);
mutex_lock(&input_mutex);
list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
handle->handler->disconnect(handle);
WARN_ON(!list_empty(&dev->h_list));
del_timer_sync(&dev->timer);
list_del_init(&dev->node);
input_wakeup_procfs_readers();
mutex_unlock(&input_mutex);
device_del(&dev->dev);
}
static void devm_input_device_unregister(struct device *dev, void *res)
{
struct input_devres *devres = res;
struct input_dev *input = devres->input;
dev_dbg(dev, "%s: unregistering device %s\n",
__func__, dev_name(&input->dev));
__input_unregister_device(input);
}
/** /**
* input_register_device - register device with input core * input_register_device - register device with input core
* @dev: device to be registered * @dev: device to be registered
@ -1903,11 +2008,21 @@ static void input_cleanse_bitmasks(struct input_dev *dev)
int input_register_device(struct input_dev *dev) int input_register_device(struct input_dev *dev)
{ {
static atomic_t input_no = ATOMIC_INIT(0); static atomic_t input_no = ATOMIC_INIT(0);
struct input_devres *devres = NULL;
struct input_handler *handler; struct input_handler *handler;
unsigned int packet_size; unsigned int packet_size;
const char *path; const char *path;
int error; int error;
if (dev->devres_managed) {
devres = devres_alloc(devm_input_device_unregister,
sizeof(struct input_devres), GFP_KERNEL);
if (!devres)
return -ENOMEM;
devres->input = dev;
}
/* Every input device generates EV_SYN/SYN_REPORT events. */ /* Every input device generates EV_SYN/SYN_REPORT events. */
__set_bit(EV_SYN, dev->evbit); __set_bit(EV_SYN, dev->evbit);
@ -1923,8 +2038,10 @@ int input_register_device(struct input_dev *dev)
dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2; dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2;
dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL); dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL);
if (!dev->vals) if (!dev->vals) {
return -ENOMEM; error = -ENOMEM;
goto err_devres_free;
}
/* /*
* If delay and period are pre-set by the driver, then autorepeating * If delay and period are pre-set by the driver, then autorepeating
@ -1949,7 +2066,7 @@ int input_register_device(struct input_dev *dev)
error = device_add(&dev->dev); error = device_add(&dev->dev);
if (error) if (error)
return error; goto err_free_vals;
path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
pr_info("%s as %s\n", pr_info("%s as %s\n",
@ -1958,10 +2075,8 @@ int input_register_device(struct input_dev *dev)
kfree(path); kfree(path);
error = mutex_lock_interruptible(&input_mutex); error = mutex_lock_interruptible(&input_mutex);
if (error) { if (error)
device_del(&dev->dev); goto err_device_del;
return error;
}
list_add_tail(&dev->node, &input_dev_list); list_add_tail(&dev->node, &input_dev_list);
@ -1972,7 +2087,21 @@ int input_register_device(struct input_dev *dev)
mutex_unlock(&input_mutex); mutex_unlock(&input_mutex);
if (dev->devres_managed) {
dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n",
__func__, dev_name(&dev->dev));
devres_add(dev->dev.parent, devres);
}
return 0; return 0;
err_device_del:
device_del(&dev->dev);
err_free_vals:
kfree(dev->vals);
dev->vals = NULL;
err_devres_free:
devres_free(devres);
return error;
} }
EXPORT_SYMBOL(input_register_device); EXPORT_SYMBOL(input_register_device);
@ -1985,24 +2114,20 @@ EXPORT_SYMBOL(input_register_device);
*/ */
void input_unregister_device(struct input_dev *dev) void input_unregister_device(struct input_dev *dev)
{ {
struct input_handle *handle, *next; if (dev->devres_managed) {
WARN_ON(devres_destroy(dev->dev.parent,
input_disconnect_device(dev); devm_input_device_unregister,
devm_input_device_match,
mutex_lock(&input_mutex); dev));
__input_unregister_device(dev);
list_for_each_entry_safe(handle, next, &dev->h_list, d_node) /*
handle->handler->disconnect(handle); * We do not do input_put_device() here because it will be done
WARN_ON(!list_empty(&dev->h_list)); * when 2nd devres fires up.
*/
del_timer_sync(&dev->timer); } else {
list_del_init(&dev->node); __input_unregister_device(dev);
input_put_device(dev);
input_wakeup_procfs_readers(); }
mutex_unlock(&input_mutex);
device_unregister(&dev->dev);
} }
EXPORT_SYMBOL(input_unregister_device); EXPORT_SYMBOL(input_unregister_device);

View File

@ -85,7 +85,10 @@ static int as5011_i2c_write(struct i2c_client *client,
{ {
uint8_t data[2] = { aregaddr, avalue }; uint8_t data[2] = { aregaddr, avalue };
struct i2c_msg msg = { struct i2c_msg msg = {
client->addr, I2C_M_IGNORE_NAK, 2, (uint8_t *)data .addr = client->addr,
.flags = I2C_M_IGNORE_NAK,
.len = 2,
.buf = (uint8_t *)data
}; };
int error; int error;
@ -98,8 +101,18 @@ static int as5011_i2c_read(struct i2c_client *client,
{ {
uint8_t data[2] = { aregaddr }; uint8_t data[2] = { aregaddr };
struct i2c_msg msg_set[2] = { struct i2c_msg msg_set[2] = {
{ client->addr, I2C_M_REV_DIR_ADDR, 1, (uint8_t *)data }, {
{ client->addr, I2C_M_RD | I2C_M_NOSTART, 1, (uint8_t *)data } .addr = client->addr,
.flags = I2C_M_REV_DIR_ADDR,
.len = 1,
.buf = (uint8_t *)data
},
{
.addr = client->addr,
.flags = I2C_M_RD | I2C_M_NOSTART,
.len = 1,
.buf = (uint8_t *)data
}
}; };
int error; int error;
@ -144,7 +157,7 @@ out:
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit as5011_configure_chip(struct as5011_device *as5011, static int as5011_configure_chip(struct as5011_device *as5011,
const struct as5011_platform_data *plat_dat) const struct as5011_platform_data *plat_dat)
{ {
struct i2c_client *client = as5011->i2c_client; struct i2c_client *client = as5011->i2c_client;
@ -212,8 +225,8 @@ static int __devinit as5011_configure_chip(struct as5011_device *as5011,
return 0; return 0;
} }
static int __devinit as5011_probe(struct i2c_client *client, static int as5011_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct as5011_platform_data *plat_data; const struct as5011_platform_data *plat_data;
struct as5011_device *as5011; struct as5011_device *as5011;
@ -328,7 +341,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit as5011_remove(struct i2c_client *client) static int as5011_remove(struct i2c_client *client)
{ {
struct as5011_device *as5011 = i2c_get_clientdata(client); struct as5011_device *as5011 = i2c_get_clientdata(client);
@ -353,7 +366,7 @@ static struct i2c_driver as5011_driver = {
.name = "as5011", .name = "as5011",
}, },
.probe = as5011_probe, .probe = as5011_probe,
.remove = __devexit_p(as5011_remove), .remove = as5011_remove,
.id_table = as5011_id, .id_table = as5011_id,
}; };

View File

@ -78,7 +78,7 @@ static void dc_pad_close(struct input_dev *dev)
} }
/* allow the controller to be used */ /* allow the controller to be used */
static int __devinit probe_maple_controller(struct device *dev) static int probe_maple_controller(struct device *dev)
{ {
static const short btn_bit[32] = { static const short btn_bit[32] = {
BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1, BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1,
@ -157,7 +157,7 @@ fail:
return error; return error;
} }
static int __devexit remove_maple_controller(struct device *dev) static int remove_maple_controller(struct device *dev)
{ {
struct maple_device *mdev = to_maple_dev(dev); struct maple_device *mdev = to_maple_dev(dev);
struct dc_pad *pad = maple_get_drvdata(mdev); struct dc_pad *pad = maple_get_drvdata(mdev);
@ -175,7 +175,7 @@ static struct maple_driver dc_pad_driver = {
.drv = { .drv = {
.name = "Dreamcast_controller", .name = "Dreamcast_controller",
.probe = probe_maple_controller, .probe = probe_maple_controller,
.remove = __devexit_p(remove_maple_controller), .remove = remove_maple_controller,
}, },
}; };

View File

@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev)
struct walkera_dev *w = input_get_drvdata(dev); struct walkera_dev *w = input_get_drvdata(dev);
parport_disable_irq(w->parport); parport_disable_irq(w->parport);
hrtimer_cancel(&w->timer);
} }
static int walkera0701_connect(struct walkera_dev *w, int parport) static int walkera0701_connect(struct walkera_dev *w, int parport)
@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
if (parport_claim(w->pardevice)) if (parport_claim(w->pardevice))
goto init_err1; goto init_err1;
hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
w->timer.function = timer_handler;
w->input_dev = input_allocate_device(); w->input_dev = input_allocate_device();
if (!w->input_dev) if (!w->input_dev)
goto init_err2; goto init_err2;
@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
if (err) if (err)
goto init_err3; goto init_err3;
hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
w->timer.function = timer_handler;
return 0; return 0;
init_err3: init_err3:
@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
static void walkera0701_disconnect(struct walkera_dev *w) static void walkera0701_disconnect(struct walkera_dev *w)
{ {
hrtimer_cancel(&w->timer);
input_unregister_device(w->input_dev); input_unregister_device(w->input_dev);
parport_release(w->pardevice); parport_release(w->pardevice);
parport_unregister_device(w->pardevice); parport_unregister_device(w->pardevice);

View File

@ -118,11 +118,12 @@ static const struct xpad_device {
u8 xtype; u8 xtype;
} xpad_device[] = { } xpad_device[] = {
{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
{ 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX }, { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
{ 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
{ 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
{ 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 }, { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
{ 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
@ -136,9 +137,12 @@ static const struct xpad_device {
{ 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
{ 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX }, { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
{ 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
{ 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", XTYPE_XBOX360 },
{ 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
{ 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
@ -148,24 +152,28 @@ static const struct xpad_device {
{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
{ 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX }, { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
{ 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
{ 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
{ 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX }, { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
{ 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 }, { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
{ 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 }, { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
{ 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
}; };
@ -235,7 +243,7 @@ static const signed short xpad_abs_triggers[] = {
{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
static struct usb_device_id xpad_table [] = { static struct usb_device_id xpad_table[] = {
{ USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */
XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */
XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */
@ -248,10 +256,11 @@ static struct usb_device_id xpad_table [] = {
XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */ XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
XPAD_XBOX360_VENDOR(0x24c6), /* PowerA Controllers */
{ } { }
}; };
MODULE_DEVICE_TABLE (usb, xpad_table); MODULE_DEVICE_TABLE(usb, xpad_table);
struct usb_xpad { struct usb_xpad {
struct input_dev *dev; /* input device interface */ struct input_dev *dev; /* input device interface */
@ -783,7 +792,7 @@ static int xpad_open(struct input_dev *dev)
struct usb_xpad *xpad = input_get_drvdata(dev); struct usb_xpad *xpad = input_get_drvdata(dev);
/* URB was submitted in probe */ /* URB was submitted in probe */
if(xpad->xtype == XTYPE_XBOX360W) if (xpad->xtype == XTYPE_XBOX360W)
return 0; return 0;
xpad->irq_in->dev = xpad->udev; xpad->irq_in->dev = xpad->udev;

View File

@ -134,7 +134,7 @@ config KEYBOARD_QT1070
config KEYBOARD_QT2160 config KEYBOARD_QT2160
tristate "Atmel AT42QT2160 Touch Sensor Chip" tristate "Atmel AT42QT2160 Touch Sensor Chip"
depends on I2C && EXPERIMENTAL depends on I2C
help help
If you say yes here you get support for Atmel AT42QT2160 Touch If you say yes here you get support for Atmel AT42QT2160 Touch
Sensor chip as a keyboard input. Sensor chip as a keyboard input.

View File

@ -69,7 +69,7 @@ static int adp5520_keys_notifier(struct notifier_block *nb,
return 0; return 0;
} }
static int __devinit adp5520_keys_probe(struct platform_device *pdev) static int adp5520_keys_probe(struct platform_device *pdev)
{ {
struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data; struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data;
struct input_dev *input; struct input_dev *input;
@ -182,7 +182,7 @@ err:
return ret; return ret;
} }
static int __devexit adp5520_keys_remove(struct platform_device *pdev) static int adp5520_keys_remove(struct platform_device *pdev)
{ {
struct adp5520_keys *dev = platform_get_drvdata(pdev); struct adp5520_keys *dev = platform_get_drvdata(pdev);
@ -200,7 +200,7 @@ static struct platform_driver adp5520_keys_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = adp5520_keys_probe, .probe = adp5520_keys_probe,
.remove = __devexit_p(adp5520_keys_remove), .remove = adp5520_keys_remove,
}; };
module_platform_driver(adp5520_keys_driver); module_platform_driver(adp5520_keys_driver);

View File

@ -145,7 +145,7 @@ static int adp5588_gpio_direction_output(struct gpio_chip *chip,
return ret; return ret;
} }
static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad, static int adp5588_build_gpiomap(struct adp5588_kpad *kpad,
const struct adp5588_kpad_platform_data *pdata) const struct adp5588_kpad_platform_data *pdata)
{ {
bool pin_used[ADP5588_MAXGPIO]; bool pin_used[ADP5588_MAXGPIO];
@ -170,7 +170,7 @@ static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad,
return n_unused; return n_unused;
} }
static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad) static int adp5588_gpio_add(struct adp5588_kpad *kpad)
{ {
struct device *dev = &kpad->client->dev; struct device *dev = &kpad->client->dev;
const struct adp5588_kpad_platform_data *pdata = dev->platform_data; const struct adp5588_kpad_platform_data *pdata = dev->platform_data;
@ -224,7 +224,7 @@ static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad)
return 0; return 0;
} }
static void __devexit adp5588_gpio_remove(struct adp5588_kpad *kpad) static void adp5588_gpio_remove(struct adp5588_kpad *kpad)
{ {
struct device *dev = &kpad->client->dev; struct device *dev = &kpad->client->dev;
const struct adp5588_kpad_platform_data *pdata = dev->platform_data; const struct adp5588_kpad_platform_data *pdata = dev->platform_data;
@ -319,7 +319,7 @@ static irqreturn_t adp5588_irq(int irq, void *handle)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit adp5588_setup(struct i2c_client *client) static int adp5588_setup(struct i2c_client *client)
{ {
const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;
const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data;
@ -382,7 +382,7 @@ static int __devinit adp5588_setup(struct i2c_client *client)
return 0; return 0;
} }
static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad) static void adp5588_report_switch_state(struct adp5588_kpad *kpad)
{ {
int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1); int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1);
int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2); int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2);
@ -420,8 +420,8 @@ static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad)
} }
static int __devinit adp5588_probe(struct i2c_client *client, static int adp5588_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct adp5588_kpad *kpad; struct adp5588_kpad *kpad;
const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;
@ -587,7 +587,7 @@ static int __devinit adp5588_probe(struct i2c_client *client,
return error; return error;
} }
static int __devexit adp5588_remove(struct i2c_client *client) static int adp5588_remove(struct i2c_client *client)
{ {
struct adp5588_kpad *kpad = i2c_get_clientdata(client); struct adp5588_kpad *kpad = i2c_get_clientdata(client);
@ -650,7 +650,7 @@ static struct i2c_driver adp5588_driver = {
#endif #endif
}, },
.probe = adp5588_probe, .probe = adp5588_probe,
.remove = __devexit_p(adp5588_remove), .remove = adp5588_remove,
.id_table = adp5588_id, .id_table = adp5588_id,
}; };

View File

@ -464,7 +464,7 @@ static int adp5589_gpio_direction_output(struct gpio_chip *chip,
return ret; return ret;
} }
static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad, static int adp5589_build_gpiomap(struct adp5589_kpad *kpad,
const struct adp5589_kpad_platform_data *pdata) const struct adp5589_kpad_platform_data *pdata)
{ {
bool pin_used[ADP5589_MAXGPIO]; bool pin_used[ADP5589_MAXGPIO];
@ -496,7 +496,7 @@ static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad,
return n_unused; return n_unused;
} }
static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad) static int adp5589_gpio_add(struct adp5589_kpad *kpad)
{ {
struct device *dev = &kpad->client->dev; struct device *dev = &kpad->client->dev;
const struct adp5589_kpad_platform_data *pdata = dev->platform_data; const struct adp5589_kpad_platform_data *pdata = dev->platform_data;
@ -550,7 +550,7 @@ static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad)
return 0; return 0;
} }
static void __devexit adp5589_gpio_remove(struct adp5589_kpad *kpad) static void adp5589_gpio_remove(struct adp5589_kpad *kpad)
{ {
struct device *dev = &kpad->client->dev; struct device *dev = &kpad->client->dev;
const struct adp5589_kpad_platform_data *pdata = dev->platform_data; const struct adp5589_kpad_platform_data *pdata = dev->platform_data;
@ -641,8 +641,7 @@ static irqreturn_t adp5589_irq(int irq, void *handle)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad, static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key)
unsigned short key)
{ {
int i; int i;
@ -655,7 +654,7 @@ static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad,
return -EINVAL; return -EINVAL;
} }
static int __devinit adp5589_setup(struct adp5589_kpad *kpad) static int adp5589_setup(struct adp5589_kpad *kpad)
{ {
struct i2c_client *client = kpad->client; struct i2c_client *client = kpad->client;
const struct adp5589_kpad_platform_data *pdata = const struct adp5589_kpad_platform_data *pdata =
@ -820,7 +819,7 @@ static int __devinit adp5589_setup(struct adp5589_kpad *kpad)
return 0; return 0;
} }
static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad) static void adp5589_report_switch_state(struct adp5589_kpad *kpad)
{ {
int gpi_stat_tmp, pin_loc; int gpi_stat_tmp, pin_loc;
int i; int i;
@ -860,8 +859,8 @@ static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad)
input_sync(kpad->input); input_sync(kpad->input);
} }
static int __devinit adp5589_probe(struct i2c_client *client, static int adp5589_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct adp5589_kpad *kpad; struct adp5589_kpad *kpad;
const struct adp5589_kpad_platform_data *pdata = const struct adp5589_kpad_platform_data *pdata =
@ -1045,7 +1044,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit adp5589_remove(struct i2c_client *client) static int adp5589_remove(struct i2c_client *client)
{ {
struct adp5589_kpad *kpad = i2c_get_clientdata(client); struct adp5589_kpad *kpad = i2c_get_clientdata(client);
@ -1104,7 +1103,7 @@ static struct i2c_driver adp5589_driver = {
.pm = &adp5589_dev_pm_ops, .pm = &adp5589_dev_pm_ops,
}, },
.probe = adp5589_probe, .probe = adp5589_probe,
.remove = __devexit_p(adp5589_remove), .remove = adp5589_remove,
.id_table = adp5589_id, .id_table = adp5589_id,
}; };

View File

@ -177,7 +177,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit bfin_kpad_probe(struct platform_device *pdev) static int bfin_kpad_probe(struct platform_device *pdev)
{ {
struct bf54x_kpad *bf54x_kpad; struct bf54x_kpad *bf54x_kpad;
struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;
@ -331,7 +331,7 @@ out:
return error; return error;
} }
static int __devexit bfin_kpad_remove(struct platform_device *pdev) static int bfin_kpad_remove(struct platform_device *pdev)
{ {
struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;
struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev);
@ -390,7 +390,7 @@ static struct platform_driver bfin_kpad_device_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = bfin_kpad_probe, .probe = bfin_kpad_probe,
.remove = __devexit_p(bfin_kpad_remove), .remove = bfin_kpad_remove,
.suspend = bfin_kpad_suspend, .suspend = bfin_kpad_suspend,
.resume = bfin_kpad_resume, .resume = bfin_kpad_resume,
}; };

View File

@ -303,7 +303,7 @@ fail1:
return error; return error;
} }
static int __devexit davinci_ks_remove(struct platform_device *pdev) static int davinci_ks_remove(struct platform_device *pdev)
{ {
struct davinci_ks *davinci_ks = platform_get_drvdata(pdev); struct davinci_ks *davinci_ks = platform_get_drvdata(pdev);
@ -326,7 +326,7 @@ static struct platform_driver davinci_ks_driver = {
.name = "davinci_keyscan", .name = "davinci_keyscan",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.remove = __devexit_p(davinci_ks_remove), .remove = davinci_ks_remove,
}; };
static int __init davinci_ks_init(void) static int __init davinci_ks_init(void)

View File

@ -232,7 +232,7 @@ static int ep93xx_keypad_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,
ep93xx_keypad_suspend, ep93xx_keypad_resume); ep93xx_keypad_suspend, ep93xx_keypad_resume);
static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) static int ep93xx_keypad_probe(struct platform_device *pdev)
{ {
struct ep93xx_keypad *keypad; struct ep93xx_keypad *keypad;
const struct matrix_keymap_data *keymap_data; const struct matrix_keymap_data *keymap_data;
@ -346,7 +346,7 @@ failed_free:
return err; return err;
} }
static int __devexit ep93xx_keypad_remove(struct platform_device *pdev) static int ep93xx_keypad_remove(struct platform_device *pdev)
{ {
struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
struct resource *res; struct resource *res;
@ -380,7 +380,7 @@ static struct platform_driver ep93xx_keypad_driver = {
.pm = &ep93xx_keypad_pm_ops, .pm = &ep93xx_keypad_pm_ops,
}, },
.probe = ep93xx_keypad_probe, .probe = ep93xx_keypad_probe,
.remove = __devexit_p(ep93xx_keypad_remove), .remove = ep93xx_keypad_remove,
}; };
module_platform_driver(ep93xx_keypad_driver); module_platform_driver(ep93xx_keypad_driver);

View File

@ -423,10 +423,10 @@ out:
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit gpio_keys_setup_key(struct platform_device *pdev, static int gpio_keys_setup_key(struct platform_device *pdev,
struct input_dev *input, struct input_dev *input,
struct gpio_button_data *bdata, struct gpio_button_data *bdata,
const struct gpio_keys_button *button) const struct gpio_keys_button *button)
{ {
const char *desc = button->desc ? button->desc : "gpio_keys"; const char *desc = button->desc ? button->desc : "gpio_keys";
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
@ -440,21 +440,13 @@ static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
if (gpio_is_valid(button->gpio)) { if (gpio_is_valid(button->gpio)) {
error = gpio_request(button->gpio, desc); error = gpio_request_one(button->gpio, GPIOF_IN, desc);
if (error < 0) { if (error < 0) {
dev_err(dev, "Failed to request GPIO %d, error %d\n", dev_err(dev, "Failed to request GPIO %d, error %d\n",
button->gpio, error); button->gpio, error);
return error; return error;
} }
error = gpio_direction_input(button->gpio);
if (error < 0) {
dev_err(dev,
"Failed to configure direction for GPIO %d, error %d\n",
button->gpio, error);
goto fail;
}
if (button->debounce_interval) { if (button->debounce_interval) {
error = gpio_set_debounce(button->gpio, error = gpio_set_debounce(button->gpio,
button->debounce_interval * 1000); button->debounce_interval * 1000);
@ -526,12 +518,35 @@ fail:
return error; return error;
} }
static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata)
{
struct input_dev *input = ddata->input;
int i;
for (i = 0; i < ddata->pdata->nbuttons; i++) {
struct gpio_button_data *bdata = &ddata->data[i];
if (gpio_is_valid(bdata->button->gpio))
gpio_keys_gpio_report_event(bdata);
}
input_sync(input);
}
static int gpio_keys_open(struct input_dev *input) static int gpio_keys_open(struct input_dev *input)
{ {
struct gpio_keys_drvdata *ddata = input_get_drvdata(input); struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
const struct gpio_keys_platform_data *pdata = ddata->pdata; const struct gpio_keys_platform_data *pdata = ddata->pdata;
int error;
return pdata->enable ? pdata->enable(input->dev.parent) : 0; if (pdata->enable) {
error = pdata->enable(input->dev.parent);
if (error)
return error;
}
/* Report current state of buttons that are connected to GPIOs */
gpio_keys_report_state(ddata);
return 0;
} }
static void gpio_keys_close(struct input_dev *input) static void gpio_keys_close(struct input_dev *input)
@ -551,7 +566,7 @@ static void gpio_keys_close(struct input_dev *input)
/* /*
* Translate OpenFirmware node properties into platform_data * Translate OpenFirmware node properties into platform_data
*/ */
static struct gpio_keys_platform_data * __devinit static struct gpio_keys_platform_data *
gpio_keys_get_devtree_pdata(struct device *dev) gpio_keys_get_devtree_pdata(struct device *dev)
{ {
struct device_node *node, *pp; struct device_node *node, *pp;
@ -658,7 +673,7 @@ static void gpio_remove_key(struct gpio_button_data *bdata)
gpio_free(bdata->button->gpio); gpio_free(bdata->button->gpio);
} }
static int __devinit gpio_keys_probe(struct platform_device *pdev) static int gpio_keys_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
@ -731,14 +746,6 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
goto fail3; goto fail3;
} }
/* get current state of buttons that are connected to GPIOs */
for (i = 0; i < pdata->nbuttons; i++) {
struct gpio_button_data *bdata = &ddata->data[i];
if (gpio_is_valid(bdata->button->gpio))
gpio_keys_gpio_report_event(bdata);
}
input_sync(input);
device_init_wakeup(&pdev->dev, wakeup); device_init_wakeup(&pdev->dev, wakeup);
return 0; return 0;
@ -760,7 +767,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
return error; return error;
} }
static int __devexit gpio_keys_remove(struct platform_device *pdev) static int gpio_keys_remove(struct platform_device *pdev)
{ {
struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
struct input_dev *input = ddata->input; struct input_dev *input = ddata->input;
@ -788,6 +795,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
static int gpio_keys_suspend(struct device *dev) static int gpio_keys_suspend(struct device *dev)
{ {
struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
struct input_dev *input = ddata->input;
int i; int i;
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
@ -796,6 +804,11 @@ static int gpio_keys_suspend(struct device *dev)
if (bdata->button->wakeup) if (bdata->button->wakeup)
enable_irq_wake(bdata->irq); enable_irq_wake(bdata->irq);
} }
} else {
mutex_lock(&input->mutex);
if (input->users)
gpio_keys_close(input);
mutex_unlock(&input->mutex);
} }
return 0; return 0;
@ -804,18 +817,27 @@ static int gpio_keys_suspend(struct device *dev)
static int gpio_keys_resume(struct device *dev) static int gpio_keys_resume(struct device *dev)
{ {
struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
struct input_dev *input = ddata->input;
int error = 0;
int i; int i;
for (i = 0; i < ddata->pdata->nbuttons; i++) { if (device_may_wakeup(dev)) {
struct gpio_button_data *bdata = &ddata->data[i]; for (i = 0; i < ddata->pdata->nbuttons; i++) {
if (bdata->button->wakeup && device_may_wakeup(dev)) struct gpio_button_data *bdata = &ddata->data[i];
disable_irq_wake(bdata->irq); if (bdata->button->wakeup)
disable_irq_wake(bdata->irq);
if (gpio_is_valid(bdata->button->gpio)) }
gpio_keys_gpio_report_event(bdata); } else {
mutex_lock(&input->mutex);
if (input->users)
error = gpio_keys_open(input);
mutex_unlock(&input->mutex);
} }
input_sync(ddata->input);
if (error)
return error;
gpio_keys_report_state(ddata);
return 0; return 0;
} }
#endif #endif
@ -824,7 +846,7 @@ static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume);
static struct platform_driver gpio_keys_device_driver = { static struct platform_driver gpio_keys_device_driver = {
.probe = gpio_keys_probe, .probe = gpio_keys_probe,
.remove = __devexit_p(gpio_keys_remove), .remove = gpio_keys_remove,
.driver = { .driver = {
.name = "gpio-keys", .name = "gpio-keys",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -103,8 +103,7 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev)
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
static struct gpio_keys_platform_data * __devinit static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)
gpio_keys_polled_get_devtree_pdata(struct device *dev)
{ {
struct device_node *node, *pp; struct device_node *node, *pp;
struct gpio_keys_platform_data *pdata; struct gpio_keys_platform_data *pdata;
@ -196,7 +195,7 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev)
} }
#endif #endif
static int __devinit gpio_keys_polled_probe(struct platform_device *pdev) static int gpio_keys_polled_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
@ -246,7 +245,6 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
input = poll_dev->input; input = poll_dev->input;
input->evbit[0] = BIT(EV_KEY);
input->name = pdev->name; input->name = pdev->name;
input->phys = DRV_NAME"/input0"; input->phys = DRV_NAME"/input0";
input->dev.parent = &pdev->dev; input->dev.parent = &pdev->dev;
@ -256,6 +254,10 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
input->id.product = 0x0001; input->id.product = 0x0001;
input->id.version = 0x0100; input->id.version = 0x0100;
__set_bit(EV_KEY, input->evbit);
if (pdata->rep)
__set_bit(EV_REP, input->evbit);
for (i = 0; i < pdata->nbuttons; i++) { for (i = 0; i < pdata->nbuttons; i++) {
struct gpio_keys_button *button = &pdata->buttons[i]; struct gpio_keys_button *button = &pdata->buttons[i];
struct gpio_keys_button_data *bdata = &bdev->data[i]; struct gpio_keys_button_data *bdata = &bdev->data[i];
@ -268,22 +270,14 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
goto err_free_gpio; goto err_free_gpio;
} }
error = gpio_request(gpio, error = gpio_request_one(gpio, GPIOF_IN,
button->desc ? button->desc : DRV_NAME); button->desc ?: DRV_NAME);
if (error) { if (error) {
dev_err(dev, "unable to claim gpio %u, err=%d\n", dev_err(dev, "unable to claim gpio %u, err=%d\n",
gpio, error); gpio, error);
goto err_free_gpio; goto err_free_gpio;
} }
error = gpio_direction_input(gpio);
if (error) {
dev_err(dev,
"unable to set direction on gpio %u, err=%d\n",
gpio, error);
goto err_free_gpio;
}
bdata->can_sleep = gpio_cansleep(gpio); bdata->can_sleep = gpio_cansleep(gpio);
bdata->last_state = -1; bdata->last_state = -1;
bdata->threshold = DIV_ROUND_UP(button->debounce_interval, bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
@ -329,7 +323,7 @@ err_free_pdata:
return error; return error;
} }
static int __devexit gpio_keys_polled_remove(struct platform_device *pdev) static int gpio_keys_polled_remove(struct platform_device *pdev)
{ {
struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev); struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev);
const struct gpio_keys_platform_data *pdata = bdev->pdata; const struct gpio_keys_platform_data *pdata = bdev->pdata;
@ -357,7 +351,7 @@ static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
static struct platform_driver gpio_keys_polled_driver = { static struct platform_driver gpio_keys_polled_driver = {
.probe = gpio_keys_polled_probe, .probe = gpio_keys_polled_probe,
.remove = __devexit_p(gpio_keys_polled_remove), .remove = gpio_keys_polled_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -200,7 +200,7 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
/* initialize HIL */ /* initialize HIL */
static int __devinit hil_keyb_init(void) static int hil_keyb_init(void)
{ {
unsigned char c; unsigned char c;
unsigned int i, kbid; unsigned int i, kbid;
@ -286,7 +286,7 @@ err1:
return err; return err;
} }
static void __devexit hil_keyb_exit(void) static void hil_keyb_exit(void)
{ {
if (HIL_IRQ) if (HIL_IRQ)
free_irq(HIL_IRQ, hil_dev.dev_id); free_irq(HIL_IRQ, hil_dev.dev_id);
@ -299,7 +299,7 @@ static void __devexit hil_keyb_exit(void)
} }
#if defined(CONFIG_PARISC) #if defined(CONFIG_PARISC)
static int __devinit hil_probe_chip(struct parisc_device *dev) static int hil_probe_chip(struct parisc_device *dev)
{ {
/* Only allow one HIL keyboard */ /* Only allow one HIL keyboard */
if (hil_dev.dev) if (hil_dev.dev)
@ -320,7 +320,7 @@ static int __devinit hil_probe_chip(struct parisc_device *dev)
return hil_keyb_init(); return hil_keyb_init();
} }
static int __devexit hil_remove_chip(struct parisc_device *dev) static int hil_remove_chip(struct parisc_device *dev)
{ {
hil_keyb_exit(); hil_keyb_exit();
@ -341,7 +341,7 @@ static struct parisc_driver hil_driver = {
.name = "hil", .name = "hil",
.id_table = hil_tbl, .id_table = hil_tbl,
.probe = hil_probe_chip, .probe = hil_probe_chip,
.remove = __devexit_p(hil_remove_chip), .remove = hil_remove_chip,
}; };
static int __init hil_init(void) static int __init hil_init(void)

View File

@ -362,7 +362,8 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)
writew(reg_val, keypad->mmio_base + KPSR); writew(reg_val, keypad->mmio_base + KPSR);
/* Colums as open drain and disable all rows */ /* Colums as open drain and disable all rows */
writew(0xff00, keypad->mmio_base + KPCR); reg_val = (keypad->cols_en_mask & 0xff) << 8;
writew(reg_val, keypad->mmio_base + KPCR);
} }
static void imx_keypad_close(struct input_dev *dev) static void imx_keypad_close(struct input_dev *dev)
@ -413,7 +414,7 @@ open_err:
return -EIO; return -EIO;
} }
static int __devinit imx_keypad_probe(struct platform_device *pdev) static int imx_keypad_probe(struct platform_device *pdev)
{ {
const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data;
struct imx_keypad *keypad; struct imx_keypad *keypad;
@ -554,7 +555,7 @@ failed_rel_mem:
return error; return error;
} }
static int __devexit imx_keypad_remove(struct platform_device *pdev) static int imx_keypad_remove(struct platform_device *pdev)
{ {
struct imx_keypad *keypad = platform_get_drvdata(pdev); struct imx_keypad *keypad = platform_get_drvdata(pdev);
struct resource *res; struct resource *res;
@ -632,7 +633,7 @@ static struct platform_driver imx_keypad_driver = {
.pm = &imx_kbd_pm_ops, .pm = &imx_kbd_pm_ops,
}, },
.probe = imx_keypad_probe, .probe = imx_keypad_probe,
.remove = __devexit_p(imx_keypad_remove), .remove = imx_keypad_remove,
}; };
module_platform_driver(imx_keypad_driver); module_platform_driver(imx_keypad_driver);

View File

@ -179,7 +179,7 @@ static void jornadakbd680_poll(struct input_polled_dev *dev)
memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE); memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE);
} }
static int __devinit jornada680kbd_probe(struct platform_device *pdev) static int jornada680kbd_probe(struct platform_device *pdev)
{ {
struct jornadakbd *jornadakbd; struct jornadakbd *jornadakbd;
struct input_polled_dev *poll_dev; struct input_polled_dev *poll_dev;
@ -240,7 +240,7 @@ static int __devinit jornada680kbd_probe(struct platform_device *pdev)
} }
static int __devexit jornada680kbd_remove(struct platform_device *pdev) static int jornada680kbd_remove(struct platform_device *pdev)
{ {
struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
@ -258,7 +258,7 @@ static struct platform_driver jornada680kbd_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = jornada680kbd_probe, .probe = jornada680kbd_probe,
.remove = __devexit_p(jornada680kbd_remove), .remove = jornada680kbd_remove,
}; };
module_platform_driver(jornada680kbd_driver); module_platform_driver(jornada680kbd_driver);

View File

@ -94,7 +94,7 @@ static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
}; };
static int __devinit jornada720_kbd_probe(struct platform_device *pdev) static int jornada720_kbd_probe(struct platform_device *pdev)
{ {
struct jornadakbd *jornadakbd; struct jornadakbd *jornadakbd;
struct input_dev *input_dev; struct input_dev *input_dev;
@ -152,7 +152,7 @@ static int __devinit jornada720_kbd_probe(struct platform_device *pdev)
return err; return err;
}; };
static int __devexit jornada720_kbd_remove(struct platform_device *pdev) static int jornada720_kbd_remove(struct platform_device *pdev)
{ {
struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
@ -173,6 +173,6 @@ static struct platform_driver jornada720_kbd_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = jornada720_kbd_probe, .probe = jornada720_kbd_probe,
.remove = __devexit_p(jornada720_kbd_remove), .remove = jornada720_kbd_remove,
}; };
module_platform_driver(jornada720_kbd_driver); module_platform_driver(jornada720_kbd_driver);

View File

@ -624,7 +624,7 @@ static ssize_t lm8323_set_disable(struct device *dev,
} }
static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable); static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable);
static int __devinit lm8323_probe(struct i2c_client *client, static int lm8323_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct lm8323_platform_data *pdata = client->dev.platform_data; struct lm8323_platform_data *pdata = client->dev.platform_data;
@ -764,7 +764,7 @@ fail1:
return err; return err;
} }
static int __devexit lm8323_remove(struct i2c_client *client) static int lm8323_remove(struct i2c_client *client)
{ {
struct lm8323_chip *lm = i2c_get_clientdata(client); struct lm8323_chip *lm = i2c_get_clientdata(client);
int i; int i;
@ -846,7 +846,7 @@ static struct i2c_driver lm8323_i2c_driver = {
.pm = &lm8323_pm_ops, .pm = &lm8323_pm_ops,
}, },
.probe = lm8323_probe, .probe = lm8323_probe,
.remove = __devexit_p(lm8323_remove), .remove = lm8323_remove,
.id_table = lm8323_id, .id_table = lm8323_id,
}; };
MODULE_DEVICE_TABLE(i2c, lm8323_id); MODULE_DEVICE_TABLE(i2c, lm8323_id);

View File

@ -128,7 +128,7 @@ static irqreturn_t lm8333_irq_thread(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit lm8333_probe(struct i2c_client *client, static int lm8333_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct lm8333_platform_data *pdata = client->dev.platform_data; const struct lm8333_platform_data *pdata = client->dev.platform_data;
@ -202,7 +202,7 @@ static int __devinit lm8333_probe(struct i2c_client *client,
return err; return err;
} }
static int __devexit lm8333_remove(struct i2c_client *client) static int lm8333_remove(struct i2c_client *client)
{ {
struct lm8333 *lm8333 = i2c_get_clientdata(client); struct lm8333 *lm8333 = i2c_get_clientdata(client);
@ -225,7 +225,7 @@ static struct i2c_driver lm8333_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = lm8333_probe, .probe = lm8333_probe,
.remove = __devexit_p(lm8333_remove), .remove = lm8333_remove,
.id_table = lm8333_id, .id_table = lm8333_id,
}; };
module_i2c_driver(lm8333_driver); module_i2c_driver(lm8333_driver);

View File

@ -46,7 +46,7 @@ MODULE_LICENSE("GPL");
#define KEY_CENTER KEY_F15 #define KEY_CENTER KEY_F15
static const unsigned char static const unsigned char
locomokbd_keycode[LOCOMOKBD_NUMKEYS] __devinitconst = { locomokbd_keycode[LOCOMOKBD_NUMKEYS] = {
0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0, /* 0 - 9 */ 0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0, /* 0 - 9 */
0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT, /* 10 - 19 */ 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT, /* 10 - 19 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 - 29 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 - 29 */
@ -236,7 +236,7 @@ static void locomokbd_close(struct input_dev *dev)
locomo_writel(r, locomokbd->base + LOCOMO_KIC); locomo_writel(r, locomokbd->base + LOCOMO_KIC);
} }
static int __devinit locomokbd_probe(struct locomo_dev *dev) static int locomokbd_probe(struct locomo_dev *dev)
{ {
struct locomokbd *locomokbd; struct locomokbd *locomokbd;
struct input_dev *input_dev; struct input_dev *input_dev;
@ -321,7 +321,7 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev)
return err; return err;
} }
static int __devexit locomokbd_remove(struct locomo_dev *dev) static int locomokbd_remove(struct locomo_dev *dev)
{ {
struct locomokbd *locomokbd = locomo_get_drvdata(dev); struct locomokbd *locomokbd = locomo_get_drvdata(dev);
@ -345,7 +345,7 @@ static struct locomo_driver keyboard_driver = {
}, },
.devid = LOCOMO_DEVID_KEYBOARD, .devid = LOCOMO_DEVID_KEYBOARD,
.probe = locomokbd_probe, .probe = locomokbd_probe,
.remove = __devexit_p(locomokbd_remove), .remove = locomokbd_remove,
}; };
static int __init locomokbd_init(void) static int __init locomokbd_init(void)

View File

@ -139,7 +139,7 @@ static void lpc32xx_kscan_close(struct input_dev *dev)
clk_disable_unprepare(kscandat->clk); clk_disable_unprepare(kscandat->clk);
} }
static int __devinit lpc32xx_parse_dt(struct device *dev, static int lpc32xx_parse_dt(struct device *dev,
struct lpc32xx_kscan_drv *kscandat) struct lpc32xx_kscan_drv *kscandat)
{ {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
@ -166,7 +166,7 @@ static int __devinit lpc32xx_parse_dt(struct device *dev,
return 0; return 0;
} }
static int __devinit lpc32xx_kscan_probe(struct platform_device *pdev) static int lpc32xx_kscan_probe(struct platform_device *pdev)
{ {
struct lpc32xx_kscan_drv *kscandat; struct lpc32xx_kscan_drv *kscandat;
struct input_dev *input; struct input_dev *input;
@ -310,7 +310,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit lpc32xx_kscan_remove(struct platform_device *pdev) static int lpc32xx_kscan_remove(struct platform_device *pdev)
{ {
struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev);
@ -377,7 +377,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_kscan_match);
static struct platform_driver lpc32xx_kscan_driver = { static struct platform_driver lpc32xx_kscan_driver = {
.probe = lpc32xx_kscan_probe, .probe = lpc32xx_kscan_probe,
.remove = __devexit_p(lpc32xx_kscan_remove), .remove = lpc32xx_kscan_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -23,6 +23,9 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
struct matrix_keypad { struct matrix_keypad {
const struct matrix_keypad_platform_data *pdata; const struct matrix_keypad_platform_data *pdata;
@ -37,8 +40,6 @@ struct matrix_keypad {
bool scan_pending; bool scan_pending;
bool stopped; bool stopped;
bool gpio_all_disabled; bool gpio_all_disabled;
unsigned short keycodes[];
}; };
/* /*
@ -118,6 +119,7 @@ static void matrix_keypad_scan(struct work_struct *work)
struct matrix_keypad *keypad = struct matrix_keypad *keypad =
container_of(work, struct matrix_keypad, work.work); container_of(work, struct matrix_keypad, work.work);
struct input_dev *input_dev = keypad->input_dev; struct input_dev *input_dev = keypad->input_dev;
const unsigned short *keycodes = input_dev->keycode;
const struct matrix_keypad_platform_data *pdata = keypad->pdata; const struct matrix_keypad_platform_data *pdata = keypad->pdata;
uint32_t new_state[MATRIX_MAX_COLS]; uint32_t new_state[MATRIX_MAX_COLS];
int row, col, code; int row, col, code;
@ -153,7 +155,7 @@ static void matrix_keypad_scan(struct work_struct *work)
code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
input_event(input_dev, EV_MSC, MSC_SCAN, code); input_event(input_dev, EV_MSC, MSC_SCAN, code);
input_report_key(input_dev, input_report_key(input_dev,
keypad->keycodes[code], keycodes[code],
new_state[col] & (1 << row)); new_state[col] & (1 << row));
} }
} }
@ -299,8 +301,8 @@ static int matrix_keypad_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops, static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops,
matrix_keypad_suspend, matrix_keypad_resume); matrix_keypad_suspend, matrix_keypad_resume);
static int __devinit matrix_keypad_init_gpio(struct platform_device *pdev, static int matrix_keypad_init_gpio(struct platform_device *pdev,
struct matrix_keypad *keypad) struct matrix_keypad *keypad)
{ {
const struct matrix_keypad_platform_data *pdata = keypad->pdata; const struct matrix_keypad_platform_data *pdata = keypad->pdata;
int i, err; int i, err;
@ -394,33 +396,95 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
gpio_free(pdata->col_gpios[i]); gpio_free(pdata->col_gpios[i]);
} }
static int __devinit matrix_keypad_probe(struct platform_device *pdev) #ifdef CONFIG_OF
static struct matrix_keypad_platform_data *
matrix_keypad_parse_dt(struct device *dev)
{ {
const struct matrix_keypad_platform_data *pdata; struct matrix_keypad_platform_data *pdata;
const struct matrix_keymap_data *keymap_data; struct device_node *np = dev->of_node;
struct matrix_keypad *keypad; unsigned int *gpios;
struct input_dev *input_dev; int i;
unsigned int row_shift;
size_t keymap_size;
int err;
pdata = pdev->dev.platform_data; if (!np) {
if (!pdata) { dev_err(dev, "device lacks DT data\n");
dev_err(&pdev->dev, "no platform data defined\n"); return ERR_PTR(-ENODEV);
return -EINVAL;
} }
keymap_data = pdata->keymap_data; pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!keymap_data) { if (!pdata) {
dev_err(dev, "could not allocate memory for platform data\n");
return ERR_PTR(-ENOMEM);
}
pdata->num_row_gpios = of_gpio_named_count(np, "row-gpios");
pdata->num_col_gpios = of_gpio_named_count(np, "col-gpios");
if (!pdata->num_row_gpios || !pdata->num_col_gpios) {
dev_err(dev, "number of keypad rows/columns not specified\n");
return ERR_PTR(-EINVAL);
}
if (of_get_property(np, "linux,no-autorepeat", NULL))
pdata->no_autorepeat = true;
if (of_get_property(np, "linux,wakeup", NULL))
pdata->wakeup = true;
if (of_get_property(np, "gpio-activelow", NULL))
pdata->active_low = true;
of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms);
of_property_read_u32(np, "col-scan-delay-us",
&pdata->col_scan_delay_us);
gpios = devm_kzalloc(dev,
sizeof(unsigned int) *
(pdata->num_row_gpios + pdata->num_col_gpios),
GFP_KERNEL);
if (!gpios) {
dev_err(dev, "could not allocate memory for gpios\n");
return ERR_PTR(-ENOMEM);
}
for (i = 0; i < pdata->num_row_gpios; i++)
gpios[i] = of_get_named_gpio(np, "row-gpios", i);
for (i = 0; i < pdata->num_col_gpios; i++)
gpios[pdata->num_row_gpios + i] =
of_get_named_gpio(np, "col-gpios", i);
pdata->row_gpios = gpios;
pdata->col_gpios = &gpios[pdata->num_row_gpios];
return pdata;
}
#else
static inline struct matrix_keypad_platform_data *
matrix_keypad_parse_dt(struct device *dev)
{
dev_err(dev, "no platform data defined\n");
return ERR_PTR(-EINVAL);
}
#endif
static int matrix_keypad_probe(struct platform_device *pdev)
{
const struct matrix_keypad_platform_data *pdata;
struct matrix_keypad *keypad;
struct input_dev *input_dev;
int err;
pdata = dev_get_platdata(&pdev->dev);
if (!pdata) {
pdata = matrix_keypad_parse_dt(&pdev->dev);
if (IS_ERR(pdata)) {
dev_err(&pdev->dev, "no platform data defined\n");
return PTR_ERR(pdata);
}
} else if (!pdata->keymap_data) {
dev_err(&pdev->dev, "no keymap data defined\n"); dev_err(&pdev->dev, "no keymap data defined\n");
return -EINVAL; return -EINVAL;
} }
row_shift = get_count_order(pdata->num_col_gpios); keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
keymap_size = (pdata->num_row_gpios << row_shift) *
sizeof(keypad->keycodes[0]);
keypad = kzalloc(sizeof(struct matrix_keypad) + keymap_size,
GFP_KERNEL);
input_dev = input_allocate_device(); input_dev = input_allocate_device();
if (!keypad || !input_dev) { if (!keypad || !input_dev) {
err = -ENOMEM; err = -ENOMEM;
@ -429,7 +493,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
keypad->input_dev = input_dev; keypad->input_dev = input_dev;
keypad->pdata = pdata; keypad->pdata = pdata;
keypad->row_shift = row_shift; keypad->row_shift = get_count_order(pdata->num_col_gpios);
keypad->stopped = true; keypad->stopped = true;
INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
spin_lock_init(&keypad->lock); spin_lock_init(&keypad->lock);
@ -440,12 +504,14 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
input_dev->open = matrix_keypad_start; input_dev->open = matrix_keypad_start;
input_dev->close = matrix_keypad_stop; input_dev->close = matrix_keypad_stop;
err = matrix_keypad_build_keymap(keymap_data, NULL, err = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
pdata->num_row_gpios, pdata->num_row_gpios,
pdata->num_col_gpios, pdata->num_col_gpios,
keypad->keycodes, input_dev); NULL, input_dev);
if (err) if (err) {
dev_err(&pdev->dev, "failed to build keymap\n");
goto err_free_mem; goto err_free_mem;
}
if (!pdata->no_autorepeat) if (!pdata->no_autorepeat)
__set_bit(EV_REP, input_dev->evbit); __set_bit(EV_REP, input_dev->evbit);
@ -473,7 +539,7 @@ err_free_mem:
return err; return err;
} }
static int __devexit matrix_keypad_remove(struct platform_device *pdev) static int matrix_keypad_remove(struct platform_device *pdev)
{ {
struct matrix_keypad *keypad = platform_get_drvdata(pdev); struct matrix_keypad *keypad = platform_get_drvdata(pdev);
@ -488,13 +554,22 @@ static int __devexit matrix_keypad_remove(struct platform_device *pdev)
return 0; return 0;
} }
#ifdef CONFIG_OF
static const struct of_device_id matrix_keypad_dt_match[] = {
{ .compatible = "gpio-matrix-keypad" },
{ }
};
MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match);
#endif
static struct platform_driver matrix_keypad_driver = { static struct platform_driver matrix_keypad_driver = {
.probe = matrix_keypad_probe, .probe = matrix_keypad_probe,
.remove = __devexit_p(matrix_keypad_remove), .remove = matrix_keypad_remove,
.driver = { .driver = {
.name = "matrix-keypad", .name = "matrix-keypad",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = &matrix_keypad_pm_ops, .pm = &matrix_keypad_pm_ops,
.of_match_table = of_match_ptr(matrix_keypad_dt_match),
}, },
}; };
module_platform_driver(matrix_keypad_driver); module_platform_driver(matrix_keypad_driver);

View File

@ -179,7 +179,7 @@ static void max7359_initialize(struct i2c_client *client)
max7359_fall_deepsleep(client); max7359_fall_deepsleep(client);
} }
static int __devinit max7359_probe(struct i2c_client *client, static int max7359_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct matrix_keymap_data *keymap_data = client->dev.platform_data; const struct matrix_keymap_data *keymap_data = client->dev.platform_data;
@ -260,7 +260,7 @@ failed_free_mem:
return error; return error;
} }
static int __devexit max7359_remove(struct i2c_client *client) static int max7359_remove(struct i2c_client *client)
{ {
struct max7359_keypad *keypad = i2c_get_clientdata(client); struct max7359_keypad *keypad = i2c_get_clientdata(client);
@ -312,7 +312,7 @@ static struct i2c_driver max7359_i2c_driver = {
.pm = &max7359_pm, .pm = &max7359_pm,
}, },
.probe = max7359_probe, .probe = max7359_probe,
.remove = __devexit_p(max7359_remove), .remove = max7359_remove,
.id_table = max7359_ids, .id_table = max7359_ids,
}; };

View File

@ -97,7 +97,7 @@ static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit mcs_touchkey_probe(struct i2c_client *client, static int mcs_touchkey_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct mcs_platform_data *pdata; const struct mcs_platform_data *pdata;
@ -200,7 +200,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit mcs_touchkey_remove(struct i2c_client *client) static int mcs_touchkey_remove(struct i2c_client *client)
{ {
struct mcs_touchkey_data *data = i2c_get_clientdata(client); struct mcs_touchkey_data *data = i2c_get_clientdata(client);
@ -270,7 +270,7 @@ static struct i2c_driver mcs_touchkey_driver = {
.pm = &mcs_touchkey_pm_ops, .pm = &mcs_touchkey_pm_ops,
}, },
.probe = mcs_touchkey_probe, .probe = mcs_touchkey_probe,
.remove = __devexit_p(mcs_touchkey_remove), .remove = mcs_touchkey_remove,
.shutdown = mcs_touchkey_shutdown, .shutdown = mcs_touchkey_shutdown,
.id_table = mcs_touchkey_id, .id_table = mcs_touchkey_id,
}; };

View File

@ -71,7 +71,7 @@ struct mpr121_init_register {
u8 val; u8 val;
}; };
static const struct mpr121_init_register init_reg_table[] __devinitconst = { static const struct mpr121_init_register init_reg_table[] = {
{ MHD_RISING_ADDR, 0x1 }, { MHD_RISING_ADDR, 0x1 },
{ NHD_RISING_ADDR, 0x1 }, { NHD_RISING_ADDR, 0x1 },
{ MHD_FALLING_ADDR, 0x1 }, { MHD_FALLING_ADDR, 0x1 },
@ -123,7 +123,7 @@ out:
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit mpr121_phys_init(const struct mpr121_platform_data *pdata, static int mpr121_phys_init(const struct mpr121_platform_data *pdata,
struct mpr121_touchkey *mpr121, struct mpr121_touchkey *mpr121,
struct i2c_client *client) struct i2c_client *client)
{ {
@ -185,8 +185,8 @@ err_i2c_write:
return ret; return ret;
} }
static int __devinit mpr_touchkey_probe(struct i2c_client *client, static int mpr_touchkey_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct mpr121_platform_data *pdata = client->dev.platform_data; const struct mpr121_platform_data *pdata = client->dev.platform_data;
struct mpr121_touchkey *mpr121; struct mpr121_touchkey *mpr121;
@ -272,7 +272,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit mpr_touchkey_remove(struct i2c_client *client) static int mpr_touchkey_remove(struct i2c_client *client)
{ {
struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client);
@ -327,7 +327,7 @@ static struct i2c_driver mpr_touchkey_driver = {
}, },
.id_table = mpr121_id, .id_table = mpr121_id,
.probe = mpr_touchkey_probe, .probe = mpr_touchkey_probe,
.remove = __devexit_p(mpr_touchkey_remove), .remove = mpr_touchkey_remove,
}; };
module_i2c_driver(mpr_touchkey_driver); module_i2c_driver(mpr_touchkey_driver);

View File

@ -67,6 +67,7 @@ struct ske_keypad {
const struct ske_keypad_platform_data *board; const struct ske_keypad_platform_data *board;
unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS]; unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS];
struct clk *clk; struct clk *clk;
struct clk *pclk;
spinlock_t ske_keypad_lock; spinlock_t ske_keypad_lock;
}; };
@ -271,11 +272,18 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
goto err_free_mem_region; goto err_free_mem_region;
} }
keypad->pclk = clk_get(&pdev->dev, "apb_pclk");
if (IS_ERR(keypad->pclk)) {
dev_err(&pdev->dev, "failed to get pclk\n");
error = PTR_ERR(keypad->pclk);
goto err_iounmap;
}
keypad->clk = clk_get(&pdev->dev, NULL); keypad->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(keypad->clk)) { if (IS_ERR(keypad->clk)) {
dev_err(&pdev->dev, "failed to get clk\n"); dev_err(&pdev->dev, "failed to get clk\n");
error = PTR_ERR(keypad->clk); error = PTR_ERR(keypad->clk);
goto err_iounmap; goto err_pclk;
} }
input->id.bustype = BUS_HOST; input->id.bustype = BUS_HOST;
@ -287,14 +295,25 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
keypad->keymap, input); keypad->keymap, input);
if (error) { if (error) {
dev_err(&pdev->dev, "Failed to build keymap\n"); dev_err(&pdev->dev, "Failed to build keymap\n");
goto err_iounmap; goto err_clk;
} }
input_set_capability(input, EV_MSC, MSC_SCAN); input_set_capability(input, EV_MSC, MSC_SCAN);
if (!plat->no_autorepeat) if (!plat->no_autorepeat)
__set_bit(EV_REP, input->evbit); __set_bit(EV_REP, input->evbit);
clk_enable(keypad->clk); error = clk_prepare_enable(keypad->pclk);
if (error) {
dev_err(&pdev->dev, "Failed to prepare/enable pclk\n");
goto err_clk;
}
error = clk_prepare_enable(keypad->clk);
if (error) {
dev_err(&pdev->dev, "Failed to prepare/enable clk\n");
goto err_pclk_disable;
}
/* go through board initialization helpers */ /* go through board initialization helpers */
if (keypad->board->init) if (keypad->board->init)
@ -330,8 +349,13 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
err_free_irq: err_free_irq:
free_irq(keypad->irq, keypad); free_irq(keypad->irq, keypad);
err_clk_disable: err_clk_disable:
clk_disable(keypad->clk); clk_disable_unprepare(keypad->clk);
err_pclk_disable:
clk_disable_unprepare(keypad->pclk);
err_clk:
clk_put(keypad->clk); clk_put(keypad->clk);
err_pclk:
clk_put(keypad->pclk);
err_iounmap: err_iounmap:
iounmap(keypad->reg_base); iounmap(keypad->reg_base);
err_free_mem_region: err_free_mem_region:
@ -342,7 +366,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit ske_keypad_remove(struct platform_device *pdev) static int ske_keypad_remove(struct platform_device *pdev)
{ {
struct ske_keypad *keypad = platform_get_drvdata(pdev); struct ske_keypad *keypad = platform_get_drvdata(pdev);
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@ -351,7 +375,7 @@ static int __devexit ske_keypad_remove(struct platform_device *pdev)
input_unregister_device(keypad->input); input_unregister_device(keypad->input);
clk_disable(keypad->clk); clk_disable_unprepare(keypad->clk);
clk_put(keypad->clk); clk_put(keypad->clk);
if (keypad->board->exit) if (keypad->board->exit)
@ -403,7 +427,7 @@ static struct platform_driver ske_keypad_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = &ske_keypad_dev_pm_ops, .pm = &ske_keypad_dev_pm_ops,
}, },
.remove = __devexit_p(ske_keypad_remove), .remove = ske_keypad_remove,
}; };
static int __init ske_keypad_init(void) static int __init ske_keypad_init(void)

View File

@ -244,7 +244,7 @@ static int omap_kp_resume(struct platform_device *dev)
#define omap_kp_resume NULL #define omap_kp_resume NULL
#endif #endif
static int __devinit omap_kp_probe(struct platform_device *pdev) static int omap_kp_probe(struct platform_device *pdev)
{ {
struct omap_kp *omap_kp; struct omap_kp *omap_kp;
struct input_dev *input_dev; struct input_dev *input_dev;
@ -357,7 +357,7 @@ err2:
return -EINVAL; return -EINVAL;
} }
static int __devexit omap_kp_remove(struct platform_device *pdev) static int omap_kp_remove(struct platform_device *pdev)
{ {
struct omap_kp *omap_kp = platform_get_drvdata(pdev); struct omap_kp *omap_kp = platform_get_drvdata(pdev);
@ -379,7 +379,7 @@ static int __devexit omap_kp_remove(struct platform_device *pdev)
static struct platform_driver omap_kp_driver = { static struct platform_driver omap_kp_driver = {
.probe = omap_kp_probe, .probe = omap_kp_probe,
.remove = __devexit_p(omap_kp_remove), .remove = omap_kp_remove,
.suspend = omap_kp_suspend, .suspend = omap_kp_suspend,
.resume = omap_kp_resume, .resume = omap_kp_resume,
.driver = { .driver = {

View File

@ -211,8 +211,8 @@ static void omap4_keypad_close(struct input_dev *input)
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
static int __devinit omap4_keypad_parse_dt(struct device *dev, static int omap4_keypad_parse_dt(struct device *dev,
struct omap4_keypad *keypad_data) struct omap4_keypad *keypad_data)
{ {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
@ -241,7 +241,7 @@ static inline int omap4_keypad_parse_dt(struct device *dev,
} }
#endif #endif
static int __devinit omap4_keypad_probe(struct platform_device *pdev) static int omap4_keypad_probe(struct platform_device *pdev)
{ {
const struct omap4_keypad_platform_data *pdata = const struct omap4_keypad_platform_data *pdata =
dev_get_platdata(&pdev->dev); dev_get_platdata(&pdev->dev);
@ -406,7 +406,7 @@ err_free_keypad:
return error; return error;
} }
static int __devexit omap4_keypad_remove(struct platform_device *pdev) static int omap4_keypad_remove(struct platform_device *pdev)
{ {
struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);
struct resource *res; struct resource *res;
@ -440,7 +440,7 @@ MODULE_DEVICE_TABLE(of, omap_keypad_dt_match);
static struct platform_driver omap4_keypad_driver = { static struct platform_driver omap4_keypad_driver = {
.probe = omap4_keypad_probe, .probe = omap4_keypad_probe,
.remove = __devexit_p(omap4_keypad_remove), .remove = omap4_keypad_remove,
.driver = { .driver = {
.name = "omap4-keypad", .name = "omap4-keypad",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -37,7 +37,7 @@ static irqreturn_t opencores_kbd_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit opencores_kbd_probe(struct platform_device *pdev) static int opencores_kbd_probe(struct platform_device *pdev)
{ {
struct input_dev *input; struct input_dev *input;
struct opencores_kbd *opencores_kbd; struct opencores_kbd *opencores_kbd;
@ -139,7 +139,7 @@ static int __devinit opencores_kbd_probe(struct platform_device *pdev)
return error; return error;
} }
static int __devexit opencores_kbd_remove(struct platform_device *pdev) static int opencores_kbd_remove(struct platform_device *pdev)
{ {
struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev); struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev);
@ -158,7 +158,7 @@ static int __devexit opencores_kbd_remove(struct platform_device *pdev)
static struct platform_driver opencores_kbd_device_driver = { static struct platform_driver opencores_kbd_device_driver = {
.probe = opencores_kbd_probe, .probe = opencores_kbd_probe,
.remove = __devexit_p(opencores_kbd_remove), .remove = opencores_kbd_remove,
.driver = { .driver = {
.name = "opencores-kbd", .name = "opencores-kbd",
}, },

View File

@ -397,7 +397,7 @@ static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
{ {
int bits, rc, cycles; int bits, rc, cycles;
u8 scan_val = 0, ctrl_val = 0; u8 scan_val = 0, ctrl_val = 0;
@ -447,7 +447,7 @@ static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
} }
static int __devinit pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios, static int pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios,
struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config) struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config)
{ {
int rc, i; int rc, i;
@ -518,7 +518,7 @@ static void pmic8xxx_kp_close(struct input_dev *dev)
* - set irq edge type. * - set irq edge type.
* - enable the keypad controller. * - enable the keypad controller.
*/ */
static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev) static int pmic8xxx_kp_probe(struct platform_device *pdev)
{ {
const struct pm8xxx_keypad_platform_data *pdata = const struct pm8xxx_keypad_platform_data *pdata =
dev_get_platdata(&pdev->dev); dev_get_platdata(&pdev->dev);
@ -712,7 +712,7 @@ err_alloc_device:
return rc; return rc;
} }
static int __devexit pmic8xxx_kp_remove(struct platform_device *pdev) static int pmic8xxx_kp_remove(struct platform_device *pdev)
{ {
struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); struct pmic8xxx_kp *kp = platform_get_drvdata(pdev);
@ -773,7 +773,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops,
static struct platform_driver pmic8xxx_kp_driver = { static struct platform_driver pmic8xxx_kp_driver = {
.probe = pmic8xxx_kp_probe, .probe = pmic8xxx_kp_probe,
.remove = __devexit_p(pmic8xxx_kp_remove), .remove = pmic8xxx_kp_remove,
.driver = { .driver = {
.name = PM8XXX_KEYPAD_DEV_NAME, .name = PM8XXX_KEYPAD_DEV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -482,7 +482,7 @@ static const struct dev_pm_ops pxa27x_keypad_pm_ops = {
}; };
#endif #endif
static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) static int pxa27x_keypad_probe(struct platform_device *pdev)
{ {
struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data; struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data;
struct pxa27x_keypad *keypad; struct pxa27x_keypad *keypad;
@ -595,7 +595,7 @@ failed_free:
return error; return error;
} }
static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) static int pxa27x_keypad_remove(struct platform_device *pdev)
{ {
struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
struct resource *res; struct resource *res;
@ -620,7 +620,7 @@ MODULE_ALIAS("platform:pxa27x-keypad");
static struct platform_driver pxa27x_keypad_driver = { static struct platform_driver pxa27x_keypad_driver = {
.probe = pxa27x_keypad_probe, .probe = pxa27x_keypad_probe,
.remove = __devexit_p(pxa27x_keypad_remove), .remove = pxa27x_keypad_remove,
.driver = { .driver = {
.name = "pxa27x-keypad", .name = "pxa27x-keypad",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -82,7 +82,7 @@ static void pxa930_rotary_close(struct input_dev *dev)
clear_sbcr(r); clear_sbcr(r);
} }
static int __devinit pxa930_rotary_probe(struct platform_device *pdev) static int pxa930_rotary_probe(struct platform_device *pdev)
{ {
struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data; struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data;
struct pxa930_rotary *r; struct pxa930_rotary *r;
@ -174,7 +174,7 @@ failed_free:
return err; return err;
} }
static int __devexit pxa930_rotary_remove(struct platform_device *pdev) static int pxa930_rotary_remove(struct platform_device *pdev)
{ {
struct pxa930_rotary *r = platform_get_drvdata(pdev); struct pxa930_rotary *r = platform_get_drvdata(pdev);
@ -193,7 +193,7 @@ static struct platform_driver pxa930_rotary_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = pxa930_rotary_probe, .probe = pxa930_rotary_probe,
.remove = __devexit_p(pxa930_rotary_remove), .remove = pxa930_rotary_remove,
}; };
module_platform_driver(pxa930_rotary_driver); module_platform_driver(pxa930_rotary_driver);

View File

@ -91,7 +91,7 @@ static int qt1070_write(struct i2c_client *client, u8 reg, u8 data)
return ret; return ret;
} }
static bool __devinit qt1070_identify(struct i2c_client *client) static bool qt1070_identify(struct i2c_client *client)
{ {
int id, ver; int id, ver;
@ -140,7 +140,7 @@ static irqreturn_t qt1070_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit qt1070_probe(struct i2c_client *client, static int qt1070_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct qt1070_data *data; struct qt1070_data *data;
@ -230,7 +230,7 @@ err_free_mem:
return err; return err;
} }
static int __devexit qt1070_remove(struct i2c_client *client) static int qt1070_remove(struct i2c_client *client)
{ {
struct qt1070_data *data = i2c_get_clientdata(client); struct qt1070_data *data = i2c_get_clientdata(client);
@ -256,7 +256,7 @@ static struct i2c_driver qt1070_driver = {
}, },
.id_table = qt1070_id, .id_table = qt1070_id,
.probe = qt1070_probe, .probe = qt1070_probe,
.remove = __devexit_p(qt1070_remove), .remove = qt1070_remove,
}; };
module_i2c_driver(qt1070_driver); module_i2c_driver(qt1070_driver);

View File

@ -183,7 +183,7 @@ static void qt2160_worker(struct work_struct *work)
qt2160_schedule_read(qt2160); qt2160_schedule_read(qt2160);
} }
static int __devinit qt2160_read(struct i2c_client *client, u8 reg) static int qt2160_read(struct i2c_client *client, u8 reg)
{ {
int ret; int ret;
@ -204,29 +204,20 @@ static int __devinit qt2160_read(struct i2c_client *client, u8 reg)
return ret; return ret;
} }
static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data) static int qt2160_write(struct i2c_client *client, u8 reg, u8 data)
{ {
int error; int ret;
error = i2c_smbus_write_byte(client, reg); ret = i2c_smbus_write_byte_data(client, reg, data);
if (error) { if (ret < 0)
dev_err(&client->dev, dev_err(&client->dev,
"couldn't send request. Returned %d\n", error); "couldn't write data. Returned %d\n", ret);
return error;
}
error = i2c_smbus_write_byte(client, data); return ret;
if (error) {
dev_err(&client->dev,
"couldn't write data. Returned %d\n", error);
return error;
}
return error;
} }
static bool __devinit qt2160_identify(struct i2c_client *client) static bool qt2160_identify(struct i2c_client *client)
{ {
int id, ver, rev; int id, ver, rev;
@ -257,7 +248,7 @@ static bool __devinit qt2160_identify(struct i2c_client *client)
return true; return true;
} }
static int __devinit qt2160_probe(struct i2c_client *client, static int qt2160_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct qt2160_data *qt2160; struct qt2160_data *qt2160;
@ -344,7 +335,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit qt2160_remove(struct i2c_client *client) static int qt2160_remove(struct i2c_client *client)
{ {
struct qt2160_data *qt2160 = i2c_get_clientdata(client); struct qt2160_data *qt2160 = i2c_get_clientdata(client);
@ -375,7 +366,7 @@ static struct i2c_driver qt2160_driver = {
.id_table = qt2160_idtable, .id_table = qt2160_idtable,
.probe = qt2160_probe, .probe = qt2160_probe,
.remove = __devexit_p(qt2160_remove), .remove = qt2160_remove,
}; };
module_i2c_driver(qt2160_driver); module_i2c_driver(qt2160_driver);

View File

@ -309,7 +309,7 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
struct samsung_keypad *keypad) struct samsung_keypad *keypad)
{ {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
int gpio, ret, row, col; int gpio, error, row, col;
for (row = 0; row < keypad->rows; row++) { for (row = 0; row < keypad->rows; row++) {
gpio = of_get_named_gpio(np, "row-gpios", row); gpio = of_get_named_gpio(np, "row-gpios", row);
@ -320,10 +320,11 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
continue; continue;
} }
ret = gpio_request(gpio, "keypad-row"); error = devm_gpio_request(dev, gpio, "keypad-row");
if (ret) if (error)
dev_err(dev, "keypad row[%d] gpio request failed\n", dev_err(dev,
row); "keypad row[%d] gpio request failed: %d\n",
row, error);
} }
for (col = 0; col < keypad->cols; col++) { for (col = 0; col < keypad->cols; col++) {
@ -335,38 +336,22 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
continue; continue;
} }
ret = gpio_request(gpio, "keypad-col"); error = devm_gpio_request(dev, gpio, "keypad-col");
if (ret) if (error)
dev_err(dev, "keypad column[%d] gpio request failed\n", dev_err(dev,
col); "keypad column[%d] gpio request failed: %d\n",
col, error);
} }
} }
static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad)
{
int cnt;
for (cnt = 0; cnt < keypad->rows; cnt++)
if (gpio_is_valid(keypad->row_gpios[cnt]))
gpio_free(keypad->row_gpios[cnt]);
for (cnt = 0; cnt < keypad->cols; cnt++)
if (gpio_is_valid(keypad->col_gpios[cnt]))
gpio_free(keypad->col_gpios[cnt]);
}
#else #else
static static
struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev) struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev)
{ {
return NULL; return NULL;
} }
static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad)
{
}
#endif #endif
static int __devinit samsung_keypad_probe(struct platform_device *pdev) static int samsung_keypad_probe(struct platform_device *pdev)
{ {
const struct samsung_keypad_platdata *pdata; const struct samsung_keypad_platdata *pdata;
const struct matrix_keymap_data *keymap_data; const struct matrix_keymap_data *keymap_data;
@ -405,36 +390,30 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
row_shift = get_count_order(pdata->cols); row_shift = get_count_order(pdata->cols);
keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]); keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]);
keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL); keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size,
input_dev = input_allocate_device(); GFP_KERNEL);
if (!keypad || !input_dev) { input_dev = devm_input_allocate_device(&pdev->dev);
error = -ENOMEM; if (!keypad || !input_dev)
goto err_free_mem; return -ENOMEM;
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) { if (!res)
error = -ENODEV; return -ENODEV;
goto err_free_mem;
}
keypad->base = ioremap(res->start, resource_size(res)); keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
if (!keypad->base) { if (!keypad->base)
error = -EBUSY; return -EBUSY;
goto err_free_mem;
}
keypad->clk = clk_get(&pdev->dev, "keypad"); keypad->clk = devm_clk_get(&pdev->dev, "keypad");
if (IS_ERR(keypad->clk)) { if (IS_ERR(keypad->clk)) {
dev_err(&pdev->dev, "failed to get keypad clk\n"); dev_err(&pdev->dev, "failed to get keypad clk\n");
error = PTR_ERR(keypad->clk); return PTR_ERR(keypad->clk);
goto err_unmap_base;
} }
error = clk_prepare(keypad->clk); error = clk_prepare(keypad->clk);
if (error) { if (error) {
dev_err(&pdev->dev, "keypad clock prepare failed\n"); dev_err(&pdev->dev, "keypad clock prepare failed\n");
goto err_put_clk; return error;
} }
keypad->input_dev = input_dev; keypad->input_dev = input_dev;
@ -479,14 +458,15 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
keypad->irq = platform_get_irq(pdev, 0); keypad->irq = platform_get_irq(pdev, 0);
if (keypad->irq < 0) { if (keypad->irq < 0) {
error = keypad->irq; error = keypad->irq;
goto err_put_clk; goto err_unprepare_clk;
} }
error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq, error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL,
IRQF_ONESHOT, dev_name(&pdev->dev), keypad); samsung_keypad_irq, IRQF_ONESHOT,
dev_name(&pdev->dev), keypad);
if (error) { if (error) {
dev_err(&pdev->dev, "failed to register keypad interrupt\n"); dev_err(&pdev->dev, "failed to register keypad interrupt\n");
goto err_put_clk; goto err_unprepare_clk;
} }
device_init_wakeup(&pdev->dev, pdata->wakeup); device_init_wakeup(&pdev->dev, pdata->wakeup);
@ -495,7 +475,7 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
error = input_register_device(keypad->input_dev); error = input_register_device(keypad->input_dev);
if (error) if (error)
goto err_free_irq; goto err_disable_runtime_pm;
if (pdev->dev.of_node) { if (pdev->dev.of_node) {
devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap); devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap);
@ -504,26 +484,16 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
} }
return 0; return 0;
err_free_irq: err_disable_runtime_pm:
free_irq(keypad->irq, keypad);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
device_init_wakeup(&pdev->dev, 0); device_init_wakeup(&pdev->dev, 0);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
err_unprepare_clk: err_unprepare_clk:
clk_unprepare(keypad->clk); clk_unprepare(keypad->clk);
err_put_clk:
clk_put(keypad->clk);
samsung_keypad_dt_gpio_free(keypad);
err_unmap_base:
iounmap(keypad->base);
err_free_mem:
input_free_device(input_dev);
kfree(keypad);
return error; return error;
} }
static int __devexit samsung_keypad_remove(struct platform_device *pdev) static int samsung_keypad_remove(struct platform_device *pdev)
{ {
struct samsung_keypad *keypad = platform_get_drvdata(pdev); struct samsung_keypad *keypad = platform_get_drvdata(pdev);
@ -533,18 +503,7 @@ static int __devexit samsung_keypad_remove(struct platform_device *pdev)
input_unregister_device(keypad->input_dev); input_unregister_device(keypad->input_dev);
/*
* It is safe to free IRQ after unregistering device because
* samsung_keypad_close will shut off interrupts.
*/
free_irq(keypad->irq, keypad);
clk_unprepare(keypad->clk); clk_unprepare(keypad->clk);
clk_put(keypad->clk);
samsung_keypad_dt_gpio_free(keypad);
iounmap(keypad->base);
kfree(keypad);
return 0; return 0;
} }
@ -685,7 +644,7 @@ MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids);
static struct platform_driver samsung_keypad_driver = { static struct platform_driver samsung_keypad_driver = {
.probe = samsung_keypad_probe, .probe = samsung_keypad_probe,
.remove = __devexit_p(samsung_keypad_remove), .remove = samsung_keypad_remove,
.driver = { .driver = {
.name = "samsung-keypad", .name = "samsung-keypad",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -162,7 +162,7 @@ static irqreturn_t sh_keysc_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit sh_keysc_probe(struct platform_device *pdev) static int sh_keysc_probe(struct platform_device *pdev)
{ {
struct sh_keysc_priv *priv; struct sh_keysc_priv *priv;
struct sh_keysc_info *pdata; struct sh_keysc_info *pdata;
@ -272,7 +272,7 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
return error; return error;
} }
static int __devexit sh_keysc_remove(struct platform_device *pdev) static int sh_keysc_remove(struct platform_device *pdev)
{ {
struct sh_keysc_priv *priv = platform_get_drvdata(pdev); struct sh_keysc_priv *priv = platform_get_drvdata(pdev);
@ -331,7 +331,7 @@ static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops,
static struct platform_driver sh_keysc_device_driver = { static struct platform_driver sh_keysc_device_driver = {
.probe = sh_keysc_probe, .probe = sh_keysc_probe,
.remove = __devexit_p(sh_keysc_remove), .remove = sh_keysc_remove,
.driver = { .driver = {
.name = "sh_keysc", .name = "sh_keysc",
.pm = &sh_keysc_dev_pm_ops, .pm = &sh_keysc_dev_pm_ops,

View File

@ -55,15 +55,15 @@
struct spear_kbd { struct spear_kbd {
struct input_dev *input; struct input_dev *input;
struct resource *res;
void __iomem *io_base; void __iomem *io_base;
struct clk *clk; struct clk *clk;
unsigned int irq; unsigned int irq;
unsigned int mode; unsigned int mode;
unsigned int suspended_rate;
unsigned short last_key; unsigned short last_key;
unsigned short keycodes[NUM_ROWS * NUM_COLS]; unsigned short keycodes[NUM_ROWS * NUM_COLS];
bool rep; bool rep;
unsigned int suspended_rate; bool irq_wake_enabled;
u32 mode_ctl_reg; u32 mode_ctl_reg;
}; };
@ -146,7 +146,7 @@ static void spear_kbd_close(struct input_dev *dev)
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
static int __devinit spear_kbd_parse_dt(struct platform_device *pdev, static int spear_kbd_parse_dt(struct platform_device *pdev,
struct spear_kbd *kbd) struct spear_kbd *kbd)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
@ -181,7 +181,7 @@ static inline int spear_kbd_parse_dt(struct platform_device *pdev,
} }
#endif #endif
static int __devinit spear_kbd_probe(struct platform_device *pdev) static int spear_kbd_probe(struct platform_device *pdev)
{ {
struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev); struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev);
const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL; const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL;
@ -203,12 +203,16 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
return irq; return irq;
} }
kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL);
input_dev = input_allocate_device(); if (!kbd) {
if (!kbd || !input_dev) { dev_err(&pdev->dev, "not enough memory for driver data\n");
dev_err(&pdev->dev, "out of memory\n"); return -ENOMEM;
error = -ENOMEM; }
goto err_free_mem;
input_dev = devm_input_allocate_device(&pdev->dev);
if (!input_dev) {
dev_err(&pdev->dev, "unable to allocate input device\n");
return -ENOMEM;
} }
kbd->input = input_dev; kbd->input = input_dev;
@ -217,37 +221,25 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
if (!pdata) { if (!pdata) {
error = spear_kbd_parse_dt(pdev, kbd); error = spear_kbd_parse_dt(pdev, kbd);
if (error) if (error)
goto err_free_mem; return error;
} else { } else {
kbd->mode = pdata->mode; kbd->mode = pdata->mode;
kbd->rep = pdata->rep; kbd->rep = pdata->rep;
kbd->suspended_rate = pdata->suspended_rate; kbd->suspended_rate = pdata->suspended_rate;
} }
kbd->res = request_mem_region(res->start, resource_size(res), kbd->io_base = devm_request_and_ioremap(&pdev->dev, res);
pdev->name);
if (!kbd->res) {
dev_err(&pdev->dev, "keyboard region already claimed\n");
error = -EBUSY;
goto err_free_mem;
}
kbd->io_base = ioremap(res->start, resource_size(res));
if (!kbd->io_base) { if (!kbd->io_base) {
dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n");
error = -ENOMEM; return -ENOMEM;
goto err_release_mem_region;
} }
kbd->clk = clk_get(&pdev->dev, NULL); kbd->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(kbd->clk)) { if (IS_ERR(kbd->clk))
error = PTR_ERR(kbd->clk); return PTR_ERR(kbd->clk);
goto err_iounmap;
}
input_dev->name = "Spear Keyboard"; input_dev->name = "Spear Keyboard";
input_dev->phys = "keyboard/input0"; input_dev->phys = "keyboard/input0";
input_dev->dev.parent = &pdev->dev;
input_dev->id.bustype = BUS_HOST; input_dev->id.bustype = BUS_HOST;
input_dev->id.vendor = 0x0001; input_dev->id.vendor = 0x0001;
input_dev->id.product = 0x0001; input_dev->id.product = 0x0001;
@ -259,7 +251,7 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
kbd->keycodes, input_dev); kbd->keycodes, input_dev);
if (error) { if (error) {
dev_err(&pdev->dev, "Failed to build keymap\n"); dev_err(&pdev->dev, "Failed to build keymap\n");
goto err_put_clk; return error;
} }
if (kbd->rep) if (kbd->rep)
@ -268,48 +260,36 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
input_set_drvdata(input_dev, kbd); input_set_drvdata(input_dev, kbd);
error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd); error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0,
"keyboard", kbd);
if (error) { if (error) {
dev_err(&pdev->dev, "request_irq fail\n"); dev_err(&pdev->dev, "request_irq failed\n");
goto err_put_clk; return error;
} }
error = clk_prepare(kbd->clk);
if (error)
return error;
error = input_register_device(input_dev); error = input_register_device(input_dev);
if (error) { if (error) {
dev_err(&pdev->dev, "Unable to register keyboard device\n"); dev_err(&pdev->dev, "Unable to register keyboard device\n");
goto err_free_irq; clk_unprepare(kbd->clk);
return error;
} }
device_init_wakeup(&pdev->dev, 1); device_init_wakeup(&pdev->dev, 1);
platform_set_drvdata(pdev, kbd); platform_set_drvdata(pdev, kbd);
return 0; return 0;
err_free_irq:
free_irq(kbd->irq, kbd);
err_put_clk:
clk_put(kbd->clk);
err_iounmap:
iounmap(kbd->io_base);
err_release_mem_region:
release_mem_region(res->start, resource_size(res));
err_free_mem:
input_free_device(input_dev);
kfree(kbd);
return error;
} }
static int __devexit spear_kbd_remove(struct platform_device *pdev) static int spear_kbd_remove(struct platform_device *pdev)
{ {
struct spear_kbd *kbd = platform_get_drvdata(pdev); struct spear_kbd *kbd = platform_get_drvdata(pdev);
free_irq(kbd->irq, kbd);
input_unregister_device(kbd->input); input_unregister_device(kbd->input);
clk_put(kbd->clk); clk_unprepare(kbd->clk);
iounmap(kbd->io_base);
release_mem_region(kbd->res->start, resource_size(kbd->res));
kfree(kbd);
device_init_wakeup(&pdev->dev, 0); device_init_wakeup(&pdev->dev, 0);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
@ -333,7 +313,8 @@ static int spear_kbd_suspend(struct device *dev)
mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG); mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG);
if (device_may_wakeup(&pdev->dev)) { if (device_may_wakeup(&pdev->dev)) {
enable_irq_wake(kbd->irq); if (!enable_irq_wake(kbd->irq))
kbd->irq_wake_enabled = true;
/* /*
* reprogram the keyboard operating frequency as on some * reprogram the keyboard operating frequency as on some
@ -379,7 +360,10 @@ static int spear_kbd_resume(struct device *dev)
mutex_lock(&input_dev->mutex); mutex_lock(&input_dev->mutex);
if (device_may_wakeup(&pdev->dev)) { if (device_may_wakeup(&pdev->dev)) {
disable_irq_wake(kbd->irq); if (kbd->irq_wake_enabled) {
kbd->irq_wake_enabled = false;
disable_irq_wake(kbd->irq);
}
} else { } else {
if (input_dev->users) if (input_dev->users)
clk_enable(kbd->clk); clk_enable(kbd->clk);
@ -407,7 +391,7 @@ MODULE_DEVICE_TABLE(of, spear_kbd_id_table);
static struct platform_driver spear_kbd_driver = { static struct platform_driver spear_kbd_driver = {
.probe = spear_kbd_probe, .probe = spear_kbd_probe,
.remove = __devexit_p(spear_kbd_remove), .remove = spear_kbd_remove,
.driver = { .driver = {
.name = "keyboard", .name = "keyboard",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -166,7 +166,7 @@ static irqreturn_t stmpe_keypad_irq(int irq, void *dev)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
{ {
const struct stmpe_keypad_variant *variant = keypad->variant; const struct stmpe_keypad_variant *variant = keypad->variant;
unsigned int col_gpios = variant->col_gpios; unsigned int col_gpios = variant->col_gpios;
@ -207,7 +207,7 @@ static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD); return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD);
} }
static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad) static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
{ {
const struct stmpe_keypad_platform_data *plat = keypad->plat; const struct stmpe_keypad_platform_data *plat = keypad->plat;
const struct stmpe_keypad_variant *variant = keypad->variant; const struct stmpe_keypad_variant *variant = keypad->variant;
@ -257,105 +257,131 @@ static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
(plat->debounce_ms << 1)); (plat->debounce_ms << 1));
} }
static int __devinit stmpe_keypad_probe(struct platform_device *pdev) static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad)
{
int row, col;
for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) {
for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) {
int code = MATRIX_SCAN_CODE(row, col,
STMPE_KEYPAD_ROW_SHIFT);
if (keypad->keymap[code] != KEY_RESERVED) {
keypad->rows |= 1 << row;
keypad->cols |= 1 << col;
}
}
}
}
#ifdef CONFIG_OF
static const struct stmpe_keypad_platform_data *
stmpe_keypad_of_probe(struct device *dev)
{
struct device_node *np = dev->of_node;
struct stmpe_keypad_platform_data *plat;
if (!np)
return ERR_PTR(-ENODEV);
plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL);
if (!plat)
return ERR_PTR(-ENOMEM);
of_property_read_u32(np, "debounce-interval", &plat->debounce_ms);
of_property_read_u32(np, "st,scan-count", &plat->scan_count);
plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat");
return plat;
}
#else
static inline const struct stmpe_keypad_platform_data *
stmpe_keypad_of_probe(struct device *dev)
{
return ERR_PTR(-EINVAL);
}
#endif
static int stmpe_keypad_probe(struct platform_device *pdev)
{ {
struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent);
struct stmpe_keypad_platform_data *plat; const struct stmpe_keypad_platform_data *plat;
struct stmpe_keypad *keypad; struct stmpe_keypad *keypad;
struct input_dev *input; struct input_dev *input;
int ret; int error;
int irq; int irq;
int i;
plat = stmpe->pdata->keypad; plat = stmpe->pdata->keypad;
if (!plat) if (!plat) {
return -ENODEV; plat = stmpe_keypad_of_probe(&pdev->dev);
if (IS_ERR(plat))
return PTR_ERR(plat);
}
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq < 0) if (irq < 0)
return irq; return irq;
keypad = kzalloc(sizeof(struct stmpe_keypad), GFP_KERNEL); keypad = devm_kzalloc(&pdev->dev, sizeof(struct stmpe_keypad),
GFP_KERNEL);
if (!keypad) if (!keypad)
return -ENOMEM; return -ENOMEM;
input = input_allocate_device(); input = devm_input_allocate_device(&pdev->dev);
if (!input) { if (!input)
ret = -ENOMEM; return -ENOMEM;
goto out_freekeypad;
}
input->name = "STMPE keypad"; input->name = "STMPE keypad";
input->id.bustype = BUS_I2C; input->id.bustype = BUS_I2C;
input->dev.parent = &pdev->dev; input->dev.parent = &pdev->dev;
ret = matrix_keypad_build_keymap(plat->keymap_data, NULL, error = matrix_keypad_build_keymap(plat->keymap_data, NULL,
STMPE_KEYPAD_MAX_ROWS, STMPE_KEYPAD_MAX_ROWS,
STMPE_KEYPAD_MAX_COLS, STMPE_KEYPAD_MAX_COLS,
keypad->keymap, input); keypad->keymap, input);
if (ret) if (error)
goto out_freeinput; return error;
input_set_capability(input, EV_MSC, MSC_SCAN); input_set_capability(input, EV_MSC, MSC_SCAN);
if (!plat->no_autorepeat) if (!plat->no_autorepeat)
__set_bit(EV_REP, input->evbit); __set_bit(EV_REP, input->evbit);
for (i = 0; i < plat->keymap_data->keymap_size; i++) { stmpe_keypad_fill_used_pins(keypad);
unsigned int key = plat->keymap_data->keymap[i];
keypad->cols |= 1 << KEY_COL(key);
keypad->rows |= 1 << KEY_ROW(key);
}
keypad->stmpe = stmpe; keypad->stmpe = stmpe;
keypad->plat = plat; keypad->plat = plat;
keypad->input = input; keypad->input = input;
keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; keypad->variant = &stmpe_keypad_variants[stmpe->partnum];
ret = stmpe_keypad_chip_init(keypad); error = stmpe_keypad_chip_init(keypad);
if (ret < 0) if (error < 0)
goto out_freeinput; return error;
ret = input_register_device(input); error = devm_request_threaded_irq(&pdev->dev, irq,
if (ret) { NULL, stmpe_keypad_irq,
dev_err(&pdev->dev, IRQF_ONESHOT, "stmpe-keypad", keypad);
"unable to register input device: %d\n", ret); if (error) {
goto out_freeinput; dev_err(&pdev->dev, "unable to get irq: %d\n", error);
return error;
} }
ret = request_threaded_irq(irq, NULL, stmpe_keypad_irq, IRQF_ONESHOT, error = input_register_device(input);
"stmpe-keypad", keypad); if (error) {
if (ret) { dev_err(&pdev->dev,
dev_err(&pdev->dev, "unable to get irq: %d\n", ret); "unable to register input device: %d\n", error);
goto out_unregisterinput; return error;
} }
platform_set_drvdata(pdev, keypad); platform_set_drvdata(pdev, keypad);
return 0; return 0;
out_unregisterinput:
input_unregister_device(input);
input = NULL;
out_freeinput:
input_free_device(input);
out_freekeypad:
kfree(keypad);
return ret;
} }
static int __devexit stmpe_keypad_remove(struct platform_device *pdev) static int stmpe_keypad_remove(struct platform_device *pdev)
{ {
struct stmpe_keypad *keypad = platform_get_drvdata(pdev); struct stmpe_keypad *keypad = platform_get_drvdata(pdev);
struct stmpe *stmpe = keypad->stmpe;
int irq = platform_get_irq(pdev, 0);
stmpe_disable(stmpe, STMPE_BLOCK_KEYPAD); stmpe_disable(keypad->stmpe, STMPE_BLOCK_KEYPAD);
free_irq(irq, keypad);
input_unregister_device(keypad->input);
platform_set_drvdata(pdev, NULL);
kfree(keypad);
return 0; return 0;
} }
@ -364,7 +390,7 @@ static struct platform_driver stmpe_keypad_driver = {
.driver.name = "stmpe-keypad", .driver.name = "stmpe-keypad",
.driver.owner = THIS_MODULE, .driver.owner = THIS_MODULE,
.probe = stmpe_keypad_probe, .probe = stmpe_keypad_probe,
.remove = __devexit_p(stmpe_keypad_remove), .remove = stmpe_keypad_remove,
}; };
module_platform_driver(stmpe_keypad_driver); module_platform_driver(stmpe_keypad_driver);

View File

@ -299,7 +299,7 @@ static void tc3589x_keypad_close(struct input_dev *input)
tc3589x_keypad_disable(keypad); tc3589x_keypad_disable(keypad);
} }
static int __devinit tc3589x_keypad_probe(struct platform_device *pdev) static int tc3589x_keypad_probe(struct platform_device *pdev)
{ {
struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent); struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
struct tc_keypad *keypad; struct tc_keypad *keypad;
@ -382,7 +382,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit tc3589x_keypad_remove(struct platform_device *pdev) static int tc3589x_keypad_remove(struct platform_device *pdev)
{ {
struct tc_keypad *keypad = platform_get_drvdata(pdev); struct tc_keypad *keypad = platform_get_drvdata(pdev);
int irq = platform_get_irq(pdev, 0); int irq = platform_get_irq(pdev, 0);
@ -448,7 +448,7 @@ static struct platform_driver tc3589x_keypad_driver = {
.pm = &tc3589x_keypad_dev_pm_ops, .pm = &tc3589x_keypad_dev_pm_ops,
}, },
.probe = tc3589x_keypad_probe, .probe = tc3589x_keypad_probe,
.remove = __devexit_p(tc3589x_keypad_remove), .remove = tc3589x_keypad_remove,
}; };
module_platform_driver(tc3589x_keypad_driver); module_platform_driver(tc3589x_keypad_driver);

View File

@ -166,7 +166,7 @@ static void tca6416_keys_close(struct input_dev *dev)
disable_irq(chip->irqnum); disable_irq(chip->irqnum);
} }
static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip) static int tca6416_setup_registers(struct tca6416_keypad_chip *chip)
{ {
int error; int error;
@ -197,7 +197,7 @@ static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip)
return 0; return 0;
} }
static int __devinit tca6416_keypad_probe(struct i2c_client *client, static int tca6416_keypad_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct tca6416_keys_platform_data *pdata; struct tca6416_keys_platform_data *pdata;
@ -313,7 +313,7 @@ fail1:
return error; return error;
} }
static int __devexit tca6416_keypad_remove(struct i2c_client *client) static int tca6416_keypad_remove(struct i2c_client *client)
{ {
struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); struct tca6416_keypad_chip *chip = i2c_get_clientdata(client);
@ -361,7 +361,7 @@ static struct i2c_driver tca6416_keypad_driver = {
.pm = &tca6416_keypad_dev_pm_ops, .pm = &tca6416_keypad_dev_pm_ops,
}, },
.probe = tca6416_keypad_probe, .probe = tca6416_keypad_probe,
.remove = __devexit_p(tca6416_keypad_remove), .remove = tca6416_keypad_remove,
.id_table = tca6416_id, .id_table = tca6416_id,
}; };

View File

@ -35,6 +35,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/tca8418_keypad.h> #include <linux/input/tca8418_keypad.h>
#include <linux/of.h>
/* TCA8418 hardware limits */ /* TCA8418 hardware limits */
#define TCA8418_MAX_ROWS 8 #define TCA8418_MAX_ROWS 8
@ -109,25 +110,11 @@
#define KEY_EVENT_CODE 0x7f #define KEY_EVENT_CODE 0x7f
#define KEY_EVENT_VALUE 0x80 #define KEY_EVENT_VALUE 0x80
static const struct i2c_device_id tca8418_id[] = {
{ TCA8418_NAME, 8418, },
{ }
};
MODULE_DEVICE_TABLE(i2c, tca8418_id);
struct tca8418_keypad { struct tca8418_keypad {
unsigned int rows;
unsigned int cols;
unsigned int keypad_mask; /* Mask for keypad col/rol regs */
unsigned int irq;
unsigned int row_shift;
struct i2c_client *client; struct i2c_client *client;
struct input_dev *input; struct input_dev *input;
/* Flexible array member, must be at end of struct */ unsigned int row_shift;
unsigned short keymap[];
}; };
/* /*
@ -172,6 +159,8 @@ static int tca8418_read_byte(struct tca8418_keypad *keypad_data,
static void tca8418_read_keypad(struct tca8418_keypad *keypad_data) static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
{ {
struct input_dev *input = keypad_data->input;
unsigned short *keymap = input->keycode;
int error, col, row; int error, col, row;
u8 reg, state, code; u8 reg, state, code;
@ -190,9 +179,8 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
col = (col) ? col - 1 : TCA8418_MAX_COLS - 1; col = (col) ? col - 1 : TCA8418_MAX_COLS - 1;
code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift); code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift);
input_event(keypad_data->input, EV_MSC, MSC_SCAN, code); input_event(input, EV_MSC, MSC_SCAN, code);
input_report_key(keypad_data->input, input_report_key(input, keymap[code], state);
keypad_data->keymap[code], state);
/* Read for next loop */ /* Read for next loop */
error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, &reg); error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, &reg);
@ -202,7 +190,7 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
dev_err(&keypad_data->client->dev, dev_err(&keypad_data->client->dev,
"unable to read REG_KEY_EVENT_A\n"); "unable to read REG_KEY_EVENT_A\n");
input_sync(keypad_data->input); input_sync(input);
} }
/* /*
@ -218,16 +206,18 @@ static irqreturn_t tca8418_irq_handler(int irq, void *dev_id)
if (error) { if (error) {
dev_err(&keypad_data->client->dev, dev_err(&keypad_data->client->dev,
"unable to read REG_INT_STAT\n"); "unable to read REG_INT_STAT\n");
goto exit; return IRQ_NONE;
} }
if (!reg)
return IRQ_NONE;
if (reg & INT_STAT_OVR_FLOW_INT) if (reg & INT_STAT_OVR_FLOW_INT)
dev_warn(&keypad_data->client->dev, "overflow occurred\n"); dev_warn(&keypad_data->client->dev, "overflow occurred\n");
if (reg & INT_STAT_K_INT) if (reg & INT_STAT_K_INT)
tca8418_read_keypad(keypad_data); tca8418_read_keypad(keypad_data);
exit:
/* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */ /* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */
reg = 0xff; reg = 0xff;
error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg); error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg);
@ -241,7 +231,8 @@ exit:
/* /*
* Configure the TCA8418 for keypad operation * Configure the TCA8418 for keypad operation
*/ */
static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data) static int tca8418_configure(struct tca8418_keypad *keypad_data,
u32 rows, u32 cols)
{ {
int reg, error; int reg, error;
@ -253,9 +244,8 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
/* Assemble a mask for row and column registers */ /* Assemble a mask for row and column registers */
reg = ~(~0 << keypad_data->rows); reg = ~(~0 << rows);
reg += (~(~0 << keypad_data->cols)) << 8; reg += (~(~0 << cols)) << 8;
keypad_data->keypad_mask = reg;
/* Set registers to keypad mode */ /* Set registers to keypad mode */
error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg); error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg);
@ -270,145 +260,144 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
return error; return error;
} }
static int __devinit tca8418_keypad_probe(struct i2c_client *client, static int tca8418_keypad_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct device *dev = &client->dev;
const struct tca8418_keypad_platform_data *pdata = const struct tca8418_keypad_platform_data *pdata =
client->dev.platform_data; dev_get_platdata(dev);
struct tca8418_keypad *keypad_data; struct tca8418_keypad *keypad_data;
struct input_dev *input; struct input_dev *input;
const struct matrix_keymap_data *keymap_data = NULL;
u32 rows = 0, cols = 0;
bool rep = false;
bool irq_is_gpio = false;
int irq;
int error, row_shift, max_keys; int error, row_shift, max_keys;
/* Copy the platform data */ /* Copy the platform data */
if (!pdata) { if (pdata) {
dev_dbg(&client->dev, "no platform data\n"); if (!pdata->keymap_data) {
dev_err(dev, "no keymap data defined\n");
return -EINVAL;
}
keymap_data = pdata->keymap_data;
rows = pdata->rows;
cols = pdata->cols;
rep = pdata->rep;
irq_is_gpio = pdata->irq_is_gpio;
} else {
struct device_node *np = dev->of_node;
of_property_read_u32(np, "keypad,num-rows", &rows);
of_property_read_u32(np, "keypad,num-columns", &cols);
rep = of_property_read_bool(np, "keypad,autorepeat");
}
if (!rows || rows > TCA8418_MAX_ROWS) {
dev_err(dev, "invalid rows\n");
return -EINVAL; return -EINVAL;
} }
if (!pdata->keymap_data) { if (!cols || cols > TCA8418_MAX_COLS) {
dev_err(&client->dev, "no keymap data defined\n"); dev_err(dev, "invalid columns\n");
return -EINVAL;
}
if (!pdata->rows || pdata->rows > TCA8418_MAX_ROWS) {
dev_err(&client->dev, "invalid rows\n");
return -EINVAL;
}
if (!pdata->cols || pdata->cols > TCA8418_MAX_COLS) {
dev_err(&client->dev, "invalid columns\n");
return -EINVAL; return -EINVAL;
} }
/* Check i2c driver capabilities */ /* Check i2c driver capabilities */
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) {
dev_err(&client->dev, "%s adapter not supported\n", dev_err(dev, "%s adapter not supported\n",
dev_driver_string(&client->adapter->dev)); dev_driver_string(&client->adapter->dev));
return -ENODEV; return -ENODEV;
} }
row_shift = get_count_order(pdata->cols); row_shift = get_count_order(cols);
max_keys = pdata->rows << row_shift; max_keys = rows << row_shift;
/* Allocate memory for keypad_data, keymap and input device */ /* Allocate memory for keypad_data and input device */
keypad_data = kzalloc(sizeof(*keypad_data) + keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL);
max_keys * sizeof(keypad_data->keymap[0]), GFP_KERNEL);
if (!keypad_data) if (!keypad_data)
return -ENOMEM; return -ENOMEM;
keypad_data->rows = pdata->rows;
keypad_data->cols = pdata->cols;
keypad_data->client = client; keypad_data->client = client;
keypad_data->row_shift = row_shift; keypad_data->row_shift = row_shift;
/* Initialize the chip or fail if chip isn't present */ /* Initialize the chip or fail if chip isn't present */
error = tca8418_configure(keypad_data); error = tca8418_configure(keypad_data, rows, cols);
if (error < 0) if (error < 0)
goto fail1; return error;
/* Configure input device */ /* Configure input device */
input = input_allocate_device(); input = devm_input_allocate_device(dev);
if (!input) { if (!input)
error = -ENOMEM; return -ENOMEM;
goto fail1;
}
keypad_data->input = input; keypad_data->input = input;
input->name = client->name; input->name = client->name;
input->dev.parent = &client->dev;
input->id.bustype = BUS_I2C; input->id.bustype = BUS_I2C;
input->id.vendor = 0x0001; input->id.vendor = 0x0001;
input->id.product = 0x001; input->id.product = 0x001;
input->id.version = 0x0001; input->id.version = 0x0001;
error = matrix_keypad_build_keymap(pdata->keymap_data, NULL, error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols,
pdata->rows, pdata->cols, NULL, input);
keypad_data->keymap, input);
if (error) { if (error) {
dev_dbg(&client->dev, "Failed to build keymap\n"); dev_err(dev, "Failed to build keymap\n");
goto fail2; return error;
} }
if (pdata->rep) if (rep)
__set_bit(EV_REP, input->evbit); __set_bit(EV_REP, input->evbit);
input_set_capability(input, EV_MSC, MSC_SCAN); input_set_capability(input, EV_MSC, MSC_SCAN);
input_set_drvdata(input, keypad_data); input_set_drvdata(input, keypad_data);
if (pdata->irq_is_gpio) irq = client->irq;
client->irq = gpio_to_irq(client->irq); if (irq_is_gpio)
irq = gpio_to_irq(irq);
error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler, error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT, IRQF_TRIGGER_FALLING |
client->name, keypad_data); IRQF_SHARED |
IRQF_ONESHOT,
client->name, keypad_data);
if (error) { if (error) {
dev_dbg(&client->dev, dev_err(dev, "Unable to claim irq %d; error %d\n",
"Unable to claim irq %d; error %d\n",
client->irq, error); client->irq, error);
goto fail2; return error;
} }
error = input_register_device(input); error = input_register_device(input);
if (error) { if (error) {
dev_dbg(&client->dev, dev_err(dev, "Unable to register input device, error: %d\n",
"Unable to register input device, error: %d\n", error); error);
goto fail3; return error;
} }
i2c_set_clientdata(client, keypad_data);
return 0;
fail3:
free_irq(client->irq, keypad_data);
fail2:
input_free_device(input);
fail1:
kfree(keypad_data);
return error;
}
static int __devexit tca8418_keypad_remove(struct i2c_client *client)
{
struct tca8418_keypad *keypad_data = i2c_get_clientdata(client);
free_irq(keypad_data->client->irq, keypad_data);
input_unregister_device(keypad_data->input);
kfree(keypad_data);
return 0; return 0;
} }
static const struct i2c_device_id tca8418_id[] = {
{ TCA8418_NAME, 8418, },
{ }
};
MODULE_DEVICE_TABLE(i2c, tca8418_id);
#ifdef CONFIG_OF
static const struct of_device_id tca8418_dt_ids[] __devinitconst = {
{ .compatible = "ti,tca8418", },
{ }
};
MODULE_DEVICE_TABLE(of, tca8418_dt_ids);
#endif
static struct i2c_driver tca8418_keypad_driver = { static struct i2c_driver tca8418_keypad_driver = {
.driver = { .driver = {
.name = TCA8418_NAME, .name = TCA8418_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = of_match_ptr(tca8418_dt_ids),
}, },
.probe = tca8418_keypad_probe, .probe = tca8418_keypad_probe,
.remove = __devexit_p(tca8418_keypad_remove),
.id_table = tca8418_id, .id_table = tca8418_id,
}; };

View File

@ -87,7 +87,7 @@ struct tegra_kbc {
struct clk *clk; struct clk *clk;
}; };
static const u32 tegra_kbc_default_keymap[] __devinitdata = { static const u32 tegra_kbc_default_keymap[] = {
KEY(0, 2, KEY_W), KEY(0, 2, KEY_W),
KEY(0, 3, KEY_S), KEY(0, 3, KEY_S),
KEY(0, 4, KEY_A), KEY(0, 4, KEY_A),
@ -223,7 +223,7 @@ static const u32 tegra_kbc_default_keymap[] __devinitdata = {
}; };
static const static const
struct matrix_keymap_data tegra_kbc_default_keymap_data __devinitdata = { struct matrix_keymap_data tegra_kbc_default_keymap_data = {
.keymap = tegra_kbc_default_keymap, .keymap = tegra_kbc_default_keymap,
.keymap_size = ARRAY_SIZE(tegra_kbc_default_keymap), .keymap_size = ARRAY_SIZE(tegra_kbc_default_keymap),
}; };
@ -573,7 +573,7 @@ static void tegra_kbc_close(struct input_dev *dev)
return tegra_kbc_stop(kbc); return tegra_kbc_stop(kbc);
} }
static bool __devinit static bool
tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
struct device *dev, unsigned int *num_rows) struct device *dev, unsigned int *num_rows)
{ {
@ -619,7 +619,7 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
static struct tegra_kbc_platform_data * __devinit tegra_kbc_dt_parse_pdata( static struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
struct platform_device *pdev) struct platform_device *pdev)
{ {
struct tegra_kbc_platform_data *pdata; struct tegra_kbc_platform_data *pdata;
@ -670,7 +670,7 @@ static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
} }
#endif #endif
static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc) static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
{ {
const struct tegra_kbc_platform_data *pdata = kbc->pdata; const struct tegra_kbc_platform_data *pdata = kbc->pdata;
const struct matrix_keymap_data *keymap_data = pdata->keymap_data; const struct matrix_keymap_data *keymap_data = pdata->keymap_data;
@ -697,7 +697,7 @@ static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
return retval; return retval;
} }
static int __devinit tegra_kbc_probe(struct platform_device *pdev) static int tegra_kbc_probe(struct platform_device *pdev)
{ {
const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data; const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data;
struct tegra_kbc *kbc; struct tegra_kbc *kbc;
@ -838,7 +838,7 @@ err_free_pdata:
return err; return err;
} }
static int __devexit tegra_kbc_remove(struct platform_device *pdev) static int tegra_kbc_remove(struct platform_device *pdev)
{ {
struct tegra_kbc *kbc = platform_get_drvdata(pdev); struct tegra_kbc *kbc = platform_get_drvdata(pdev);
struct resource *res; struct resource *res;
@ -954,7 +954,7 @@ MODULE_DEVICE_TABLE(of, tegra_kbc_of_match);
static struct platform_driver tegra_kbc_driver = { static struct platform_driver tegra_kbc_driver = {
.probe = tegra_kbc_probe, .probe = tegra_kbc_probe,
.remove = __devexit_p(tegra_kbc_remove), .remove = tegra_kbc_remove,
.driver = { .driver = {
.name = "tegra-kbc", .name = "tegra-kbc",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -153,7 +153,7 @@ static void keypad_stop(struct input_dev *dev)
clk_disable(kp->clk); clk_disable(kp->clk);
} }
static int __devinit keypad_probe(struct platform_device *pdev) static int keypad_probe(struct platform_device *pdev)
{ {
const struct matrix_keypad_platform_data *pdata; const struct matrix_keypad_platform_data *pdata;
const struct matrix_keymap_data *keymap_data; const struct matrix_keymap_data *keymap_data;
@ -301,7 +301,7 @@ error_res:
return error; return error;
} }
static int __devexit keypad_remove(struct platform_device *pdev) static int keypad_remove(struct platform_device *pdev)
{ {
struct keypad_data *kp = platform_get_drvdata(pdev); struct keypad_data *kp = platform_get_drvdata(pdev);
@ -319,7 +319,7 @@ static int __devexit keypad_remove(struct platform_device *pdev)
static struct platform_driver keypad_driver = { static struct platform_driver keypad_driver = {
.probe = keypad_probe, .probe = keypad_probe,
.remove = __devexit_p(keypad_remove), .remove = keypad_remove,
.driver.name = "tnetv107x-keypad", .driver.name = "tnetv107x-keypad",
.driver.owner = THIS_MODULE, .driver.owner = THIS_MODULE,
}; };

View File

@ -271,7 +271,7 @@ static irqreturn_t do_kp_irq(int irq, void *_kp)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit twl4030_kp_program(struct twl4030_keypad *kp) static int twl4030_kp_program(struct twl4030_keypad *kp)
{ {
u8 reg; u8 reg;
int i; int i;
@ -328,7 +328,7 @@ static int __devinit twl4030_kp_program(struct twl4030_keypad *kp)
* Registers keypad device with input subsystem * Registers keypad device with input subsystem
* and configures TWL4030 keypad registers * and configures TWL4030 keypad registers
*/ */
static int __devinit twl4030_kp_probe(struct platform_device *pdev) static int twl4030_kp_probe(struct platform_device *pdev)
{ {
struct twl4030_keypad_data *pdata = pdev->dev.platform_data; struct twl4030_keypad_data *pdata = pdev->dev.platform_data;
const struct matrix_keymap_data *keymap_data; const struct matrix_keymap_data *keymap_data;
@ -432,7 +432,7 @@ err1:
return error; return error;
} }
static int __devexit twl4030_kp_remove(struct platform_device *pdev) static int twl4030_kp_remove(struct platform_device *pdev)
{ {
struct twl4030_keypad *kp = platform_get_drvdata(pdev); struct twl4030_keypad *kp = platform_get_drvdata(pdev);
@ -452,7 +452,7 @@ static int __devexit twl4030_kp_remove(struct platform_device *pdev)
static struct platform_driver twl4030_kp_driver = { static struct platform_driver twl4030_kp_driver = {
.probe = twl4030_kp_probe, .probe = twl4030_kp_probe,
.remove = __devexit_p(twl4030_kp_remove), .remove = twl4030_kp_remove,
.driver = { .driver = {
.name = "twl4030_keypad", .name = "twl4030_keypad",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -118,7 +118,7 @@ static void w90p910_keypad_close(struct input_dev *dev)
clk_disable(keypad->clk); clk_disable(keypad->clk);
} }
static int __devinit w90p910_keypad_probe(struct platform_device *pdev) static int w90p910_keypad_probe(struct platform_device *pdev)
{ {
const struct w90p910_keypad_platform_data *pdata = const struct w90p910_keypad_platform_data *pdata =
pdev->dev.platform_data; pdev->dev.platform_data;
@ -234,7 +234,7 @@ failed_free:
return error; return error;
} }
static int __devexit w90p910_keypad_remove(struct platform_device *pdev) static int w90p910_keypad_remove(struct platform_device *pdev)
{ {
struct w90p910_keypad *keypad = platform_get_drvdata(pdev); struct w90p910_keypad *keypad = platform_get_drvdata(pdev);
struct resource *res; struct resource *res;
@ -257,7 +257,7 @@ static int __devexit w90p910_keypad_remove(struct platform_device *pdev)
static struct platform_driver w90p910_keypad_driver = { static struct platform_driver w90p910_keypad_driver = {
.probe = w90p910_keypad_probe, .probe = w90p910_keypad_probe,
.remove = __devexit_p(w90p910_keypad_remove), .remove = w90p910_keypad_remove,
.driver = { .driver = {
.name = "nuc900-kpi", .name = "nuc900-kpi",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -18,6 +18,7 @@
*/ */
#include <linux/device.h> #include <linux/device.h>
#include <linux/gfp.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/input.h> #include <linux/input.h>
@ -123,6 +124,11 @@ static int matrix_keypad_parse_of_keymap(const char *propname,
* it will attempt load the keymap from property specified by @keymap_name * it will attempt load the keymap from property specified by @keymap_name
* argument (or "linux,keymap" if @keymap_name is %NULL). * argument (or "linux,keymap" if @keymap_name is %NULL).
* *
* If @keymap is %NULL the function will automatically allocate managed
* block of memory to store the keymap. This memory will be associated with
* the parent device and automatically freed when device unbinds from the
* driver.
*
* Callers are expected to set up input_dev->dev.parent before calling this * Callers are expected to set up input_dev->dev.parent before calling this
* function. * function.
*/ */
@ -133,12 +139,27 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
struct input_dev *input_dev) struct input_dev *input_dev)
{ {
unsigned int row_shift = get_count_order(cols); unsigned int row_shift = get_count_order(cols);
size_t max_keys = rows << row_shift;
int i; int i;
int error; int error;
if (WARN_ON(!input_dev->dev.parent))
return -EINVAL;
if (!keymap) {
keymap = devm_kzalloc(input_dev->dev.parent,
max_keys * sizeof(*keymap),
GFP_KERNEL);
if (!keymap) {
dev_err(input_dev->dev.parent,
"Unable to allocate memory for keymap");
return -ENOMEM;
}
}
input_dev->keycode = keymap; input_dev->keycode = keymap;
input_dev->keycodesize = sizeof(*keymap); input_dev->keycodesize = sizeof(*keymap);
input_dev->keycodemax = rows << row_shift; input_dev->keycodemax = max_keys;
__set_bit(EV_KEY, input_dev->evbit); __set_bit(EV_KEY, input_dev->evbit);

View File

@ -62,7 +62,7 @@ static irqreturn_t pm80x_onkey_handler(int irq, void *data)
static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend, static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend,
pm80x_dev_resume); pm80x_dev_resume);
static int __devinit pm80x_onkey_probe(struct platform_device *pdev) static int pm80x_onkey_probe(struct platform_device *pdev)
{ {
struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
@ -139,7 +139,7 @@ out:
return err; return err;
} }
static int __devexit pm80x_onkey_remove(struct platform_device *pdev) static int pm80x_onkey_remove(struct platform_device *pdev)
{ {
struct pm80x_onkey_info *info = platform_get_drvdata(pdev); struct pm80x_onkey_info *info = platform_get_drvdata(pdev);
@ -157,7 +157,7 @@ static struct platform_driver pm80x_onkey_driver = {
.pm = &pm80x_onkey_pm_ops, .pm = &pm80x_onkey_pm_ops,
}, },
.probe = pm80x_onkey_probe, .probe = pm80x_onkey_probe,
.remove = __devexit_p(pm80x_onkey_remove), .remove = pm80x_onkey_remove,
}; };
module_platform_driver(pm80x_onkey_driver); module_platform_driver(pm80x_onkey_driver);

View File

@ -56,7 +56,7 @@ static irqreturn_t pm860x_onkey_handler(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit pm860x_onkey_probe(struct platform_device *pdev) static int pm860x_onkey_probe(struct platform_device *pdev)
{ {
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
struct pm860x_onkey_info *info; struct pm860x_onkey_info *info;
@ -121,7 +121,7 @@ out:
return ret; return ret;
} }
static int __devexit pm860x_onkey_remove(struct platform_device *pdev) static int pm860x_onkey_remove(struct platform_device *pdev)
{ {
struct pm860x_onkey_info *info = platform_get_drvdata(pdev); struct pm860x_onkey_info *info = platform_get_drvdata(pdev);
@ -161,7 +161,7 @@ static struct platform_driver pm860x_onkey_driver = {
.pm = &pm860x_onkey_pm_ops, .pm = &pm860x_onkey_pm_ops,
}, },
.probe = pm860x_onkey_probe, .probe = pm860x_onkey_probe,
.remove = __devexit_p(pm860x_onkey_remove), .remove = pm860x_onkey_remove,
}; };
module_platform_driver(pm860x_onkey_driver); module_platform_driver(pm860x_onkey_driver);

View File

@ -300,8 +300,7 @@ config INPUT_ATI_REMOTE2
called ati_remote2. called ati_remote2.
config INPUT_KEYSPAN_REMOTE config INPUT_KEYSPAN_REMOTE
tristate "Keyspan DMR USB remote control (EXPERIMENTAL)" tristate "Keyspan DMR USB remote control"
depends on EXPERIMENTAL
depends on USB_ARCH_HAS_HCD depends on USB_ARCH_HAS_HCD
select USB select USB
help help
@ -350,7 +349,6 @@ config INPUT_POWERMATE
config INPUT_YEALINK config INPUT_YEALINK
tristate "Yealink usb-p1k voip phone" tristate "Yealink usb-p1k voip phone"
depends on EXPERIMENTAL
depends on USB_ARCH_HAS_HCD depends on USB_ARCH_HAS_HCD
select USB select USB
help help
@ -366,7 +364,6 @@ config INPUT_YEALINK
config INPUT_CM109 config INPUT_CM109
tristate "C-Media CM109 USB I/O Controller" tristate "C-Media CM109 USB I/O Controller"
depends on EXPERIMENTAL
depends on USB_ARCH_HAS_HCD depends on USB_ARCH_HAS_HCD
select USB select USB
help help
@ -377,6 +374,16 @@ config INPUT_CM109
To compile this driver as a module, choose M here: the module will be To compile this driver as a module, choose M here: the module will be
called cm109. called cm109.
config INPUT_RETU_PWRBUTTON
tristate "Retu Power button Driver"
depends on MFD_RETU
help
Say Y here if you want to enable power key reporting via the
Retu chips found in Nokia Internet Tablets (770, N800, N810).
To compile this driver as a module, choose M here. The module will
be called retu-pwrbutton.
config INPUT_TWL4030_PWRBUTTON config INPUT_TWL4030_PWRBUTTON
tristate "TWL4030 Power button Driver" tristate "TWL4030 Power button Driver"
depends on TWL4030_CORE depends on TWL4030_CORE
@ -444,7 +451,7 @@ config INPUT_PCF50633_PMU
config INPUT_PCF8574 config INPUT_PCF8574
tristate "PCF8574 Keypad input device" tristate "PCF8574 Keypad input device"
depends on I2C && EXPERIMENTAL depends on I2C
help help
Say Y here if you want to support a keypad connected via I2C Say Y here if you want to support a keypad connected via I2C
with a PCF8574. with a PCF8574.
@ -454,7 +461,7 @@ config INPUT_PCF8574
config INPUT_PWM_BEEPER config INPUT_PWM_BEEPER
tristate "PWM beeper support" tristate "PWM beeper support"
depends on HAVE_PWM depends on HAVE_PWM || PWM
help help
Say Y here to get support for PWM based beeper devices. Say Y here to get support for PWM based beeper devices.
@ -496,6 +503,16 @@ config INPUT_DA9052_ONKEY
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called da9052_onkey. module will be called da9052_onkey.
config INPUT_DA9055_ONKEY
tristate "Dialog Semiconductor DA9055 ONKEY"
depends on MFD_DA9055
help
Support the ONKEY of DA9055 PMICs as an input device
reporting power button status.
To compile this driver as a module, choose M here: the module
will be called da9055_onkey.
config INPUT_DM355EVM config INPUT_DM355EVM
tristate "TI DaVinci DM355 EVM Keypad and IR Remote" tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
depends on MFD_DM355EVM_MSP depends on MFD_DM355EVM_MSP

View File

@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o
obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o
obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o
obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o
obj-$(CONFIG_INPUT_DA9055_ONKEY) += da9055_onkey.o
obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o
obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o
obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o
@ -46,6 +47,7 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o
obj-$(CONFIG_INPUT_POWERMATE) += powermate.o obj-$(CONFIG_INPUT_POWERMATE) += powermate.o
obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o
obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o
obj-$(CONFIG_INPUT_RETU_PWRBUTTON) += retu-pwrbutton.o
obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o
obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o
obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o

View File

@ -45,7 +45,7 @@ static irqreturn_t ab8500_ponkey_handler(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit ab8500_ponkey_probe(struct platform_device *pdev) static int ab8500_ponkey_probe(struct platform_device *pdev)
{ {
struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent); struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
struct ab8500_ponkey *ponkey; struct ab8500_ponkey *ponkey;
@ -118,7 +118,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit ab8500_ponkey_remove(struct platform_device *pdev) static int ab8500_ponkey_remove(struct platform_device *pdev)
{ {
struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev); struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev);
@ -146,7 +146,7 @@ static struct platform_driver ab8500_ponkey_driver = {
.of_match_table = of_match_ptr(ab8500_ponkey_match), .of_match_table = of_match_ptr(ab8500_ponkey_match),
}, },
.probe = ab8500_ponkey_probe, .probe = ab8500_ponkey_probe,
.remove = __devexit_p(ab8500_ponkey_remove), .remove = ab8500_ponkey_remove,
}; };
module_platform_driver(ab8500_ponkey_driver); module_platform_driver(ab8500_ponkey_driver);

View File

@ -72,7 +72,7 @@ static int ad714x_i2c_read(struct ad714x_chip *chip,
return 0; return 0;
} }
static int __devinit ad714x_i2c_probe(struct i2c_client *client, static int ad714x_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct ad714x_chip *chip; struct ad714x_chip *chip;
@ -87,7 +87,7 @@ static int __devinit ad714x_i2c_probe(struct i2c_client *client,
return 0; return 0;
} }
static int __devexit ad714x_i2c_remove(struct i2c_client *client) static int ad714x_i2c_remove(struct i2c_client *client)
{ {
struct ad714x_chip *chip = i2c_get_clientdata(client); struct ad714x_chip *chip = i2c_get_clientdata(client);
@ -112,7 +112,7 @@ static struct i2c_driver ad714x_i2c_driver = {
.pm = &ad714x_i2c_pm, .pm = &ad714x_i2c_pm,
}, },
.probe = ad714x_i2c_probe, .probe = ad714x_i2c_probe,
.remove = __devexit_p(ad714x_i2c_remove), .remove = ad714x_i2c_remove,
.id_table = ad714x_id, .id_table = ad714x_id,
}; };

View File

@ -83,7 +83,7 @@ static int ad714x_spi_write(struct ad714x_chip *chip,
return 0; return 0;
} }
static int __devinit ad714x_spi_probe(struct spi_device *spi) static int ad714x_spi_probe(struct spi_device *spi)
{ {
struct ad714x_chip *chip; struct ad714x_chip *chip;
int err; int err;
@ -103,7 +103,7 @@ static int __devinit ad714x_spi_probe(struct spi_device *spi)
return 0; return 0;
} }
static int __devexit ad714x_spi_remove(struct spi_device *spi) static int ad714x_spi_remove(struct spi_device *spi)
{ {
struct ad714x_chip *chip = spi_get_drvdata(spi); struct ad714x_chip *chip = spi_get_drvdata(spi);
@ -120,7 +120,7 @@ static struct spi_driver ad714x_spi_driver = {
.pm = &ad714x_spi_pm, .pm = &ad714x_spi_pm,
}, },
.probe = ad714x_spi_probe, .probe = ad714x_spi_probe,
.remove = __devexit_p(ad714x_spi_remove), .remove = ad714x_spi_remove,
}; };
module_spi_driver(ad714x_spi_driver); module_spi_driver(ad714x_spi_driver);

View File

@ -73,7 +73,7 @@ static const struct adxl34x_bus_ops adxl34x_i2c_bops = {
.read_block = adxl34x_i2c_read_block, .read_block = adxl34x_i2c_read_block,
}; };
static int __devinit adxl34x_i2c_probe(struct i2c_client *client, static int adxl34x_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct adxl34x *ac; struct adxl34x *ac;
@ -98,7 +98,7 @@ static int __devinit adxl34x_i2c_probe(struct i2c_client *client,
return 0; return 0;
} }
static int __devexit adxl34x_i2c_remove(struct i2c_client *client) static int adxl34x_i2c_remove(struct i2c_client *client)
{ {
struct adxl34x *ac = i2c_get_clientdata(client); struct adxl34x *ac = i2c_get_clientdata(client);
@ -144,7 +144,7 @@ static struct i2c_driver adxl34x_driver = {
.pm = &adxl34x_i2c_pm, .pm = &adxl34x_i2c_pm,
}, },
.probe = adxl34x_i2c_probe, .probe = adxl34x_i2c_probe,
.remove = __devexit_p(adxl34x_i2c_remove), .remove = adxl34x_i2c_remove,
.id_table = adxl34x_id, .id_table = adxl34x_id,
}; };

View File

@ -65,7 +65,7 @@ static const struct adxl34x_bus_ops adxl34x_spi_bops = {
.read_block = adxl34x_spi_read_block, .read_block = adxl34x_spi_read_block,
}; };
static int __devinit adxl34x_spi_probe(struct spi_device *spi) static int adxl34x_spi_probe(struct spi_device *spi)
{ {
struct adxl34x *ac; struct adxl34x *ac;
@ -87,7 +87,7 @@ static int __devinit adxl34x_spi_probe(struct spi_device *spi)
return 0; return 0;
} }
static int __devexit adxl34x_spi_remove(struct spi_device *spi) static int adxl34x_spi_remove(struct spi_device *spi)
{ {
struct adxl34x *ac = dev_get_drvdata(&spi->dev); struct adxl34x *ac = dev_get_drvdata(&spi->dev);
@ -126,7 +126,7 @@ static struct spi_driver adxl34x_driver = {
.pm = &adxl34x_spi_pm, .pm = &adxl34x_spi_pm,
}, },
.probe = adxl34x_spi_probe, .probe = adxl34x_spi_probe,
.remove = __devexit_p(adxl34x_spi_remove), .remove = adxl34x_spi_remove,
}; };
module_spi_driver(adxl34x_driver); module_spi_driver(adxl34x_driver);

View File

@ -90,7 +90,7 @@ static irqreturn_t bfin_rotary_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit bfin_rotary_probe(struct platform_device *pdev) static int bfin_rotary_probe(struct platform_device *pdev)
{ {
struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data; struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data;
struct bfin_rot *rotary; struct bfin_rot *rotary;
@ -196,7 +196,7 @@ out1:
return error; return error;
} }
static int __devexit bfin_rotary_remove(struct platform_device *pdev) static int bfin_rotary_remove(struct platform_device *pdev)
{ {
struct bfin_rot *rotary = platform_get_drvdata(pdev); struct bfin_rot *rotary = platform_get_drvdata(pdev);
@ -255,7 +255,7 @@ static const struct dev_pm_ops bfin_rotary_pm_ops = {
static struct platform_driver bfin_rotary_device_driver = { static struct platform_driver bfin_rotary_device_driver = {
.probe = bfin_rotary_probe, .probe = bfin_rotary_probe,
.remove = __devexit_p(bfin_rotary_remove), .remove = bfin_rotary_remove,
.driver = { .driver = {
.name = "bfin-rotary", .name = "bfin-rotary",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -158,7 +158,7 @@ struct bma150_data {
* are stated and verified by Bosch Sensortec where they are configured * are stated and verified by Bosch Sensortec where they are configured
* to provide a generic sensitivity performance. * to provide a generic sensitivity performance.
*/ */
static struct bma150_cfg default_cfg __devinitdata = { static struct bma150_cfg default_cfg = {
.any_motion_int = 1, .any_motion_int = 1,
.hg_int = 1, .hg_int = 1,
.lg_int = 1, .lg_int = 1,
@ -224,7 +224,7 @@ static int bma150_set_mode(struct bma150_data *bma150, u8 mode)
return 0; return 0;
} }
static int __devinit bma150_soft_reset(struct bma150_data *bma150) static int bma150_soft_reset(struct bma150_data *bma150)
{ {
int error; int error;
@ -237,19 +237,19 @@ static int __devinit bma150_soft_reset(struct bma150_data *bma150)
return 0; return 0;
} }
static int __devinit bma150_set_range(struct bma150_data *bma150, u8 range) static int bma150_set_range(struct bma150_data *bma150, u8 range)
{ {
return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS, return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS,
BMA150_RANGE_MSK, BMA150_RANGE_REG); BMA150_RANGE_MSK, BMA150_RANGE_REG);
} }
static int __devinit bma150_set_bandwidth(struct bma150_data *bma150, u8 bw) static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)
{ {
return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS, return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS,
BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG); BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG);
} }
static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150, static int bma150_set_low_g_interrupt(struct bma150_data *bma150,
u8 enable, u8 hyst, u8 dur, u8 thres) u8 enable, u8 hyst, u8 dur, u8 thres)
{ {
int error; int error;
@ -273,7 +273,7 @@ static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150,
BMA150_LOW_G_EN_REG); BMA150_LOW_G_EN_REG);
} }
static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150, static int bma150_set_high_g_interrupt(struct bma150_data *bma150,
u8 enable, u8 hyst, u8 dur, u8 thres) u8 enable, u8 hyst, u8 dur, u8 thres)
{ {
int error; int error;
@ -300,7 +300,7 @@ static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150,
} }
static int __devinit bma150_set_any_motion_interrupt(struct bma150_data *bma150, static int bma150_set_any_motion_interrupt(struct bma150_data *bma150,
u8 enable, u8 dur, u8 thres) u8 enable, u8 dur, u8 thres)
{ {
int error; int error;
@ -424,7 +424,7 @@ static void bma150_poll_close(struct input_polled_dev *ipoll_dev)
bma150_close(bma150); bma150_close(bma150);
} }
static int __devinit bma150_initialize(struct bma150_data *bma150, static int bma150_initialize(struct bma150_data *bma150,
const struct bma150_cfg *cfg) const struct bma150_cfg *cfg)
{ {
int error; int error;
@ -465,7 +465,7 @@ static int __devinit bma150_initialize(struct bma150_data *bma150,
return bma150_set_mode(bma150, BMA150_MODE_SLEEP); return bma150_set_mode(bma150, BMA150_MODE_SLEEP);
} }
static void __devinit bma150_init_input_device(struct bma150_data *bma150, static void bma150_init_input_device(struct bma150_data *bma150,
struct input_dev *idev) struct input_dev *idev)
{ {
idev->name = BMA150_DRIVER; idev->name = BMA150_DRIVER;
@ -479,7 +479,7 @@ static void __devinit bma150_init_input_device(struct bma150_data *bma150,
input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0); input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);
} }
static int __devinit bma150_register_input_device(struct bma150_data *bma150) static int bma150_register_input_device(struct bma150_data *bma150)
{ {
struct input_dev *idev; struct input_dev *idev;
int error; int error;
@ -504,7 +504,7 @@ static int __devinit bma150_register_input_device(struct bma150_data *bma150)
return 0; return 0;
} }
static int __devinit bma150_register_polled_device(struct bma150_data *bma150) static int bma150_register_polled_device(struct bma150_data *bma150)
{ {
struct input_polled_dev *ipoll_dev; struct input_polled_dev *ipoll_dev;
int error; int error;
@ -535,7 +535,7 @@ static int __devinit bma150_register_polled_device(struct bma150_data *bma150)
return 0; return 0;
} }
static int __devinit bma150_probe(struct i2c_client *client, static int bma150_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct bma150_platform_data *pdata = client->dev.platform_data; const struct bma150_platform_data *pdata = client->dev.platform_data;
@ -613,7 +613,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit bma150_remove(struct i2c_client *client) static int bma150_remove(struct i2c_client *client)
{ {
struct bma150_data *bma150 = i2c_get_clientdata(client); struct bma150_data *bma150 = i2c_get_clientdata(client);
@ -670,7 +670,7 @@ static struct i2c_driver bma150_driver = {
.class = I2C_CLASS_HWMON, .class = I2C_CLASS_HWMON,
.id_table = bma150_id, .id_table = bma150_id,
.probe = bma150_probe, .probe = bma150_probe,
.remove = __devexit_p(bma150_remove), .remove = bma150_remove,
}; };
module_i2c_driver(bma150_driver); module_i2c_driver(bma150_driver);

View File

@ -55,7 +55,7 @@ static const struct cma3000_bus_ops cma3000_i2c_bops = {
.write = cma3000_i2c_set, .write = cma3000_i2c_set,
}; };
static int __devinit cma3000_i2c_probe(struct i2c_client *client, static int cma3000_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct cma3000_accl_data *data; struct cma3000_accl_data *data;
@ -69,7 +69,7 @@ static int __devinit cma3000_i2c_probe(struct i2c_client *client,
return 0; return 0;
} }
static int __devexit cma3000_i2c_remove(struct i2c_client *client) static int cma3000_i2c_remove(struct i2c_client *client)
{ {
struct cma3000_accl_data *data = i2c_get_clientdata(client); struct cma3000_accl_data *data = i2c_get_clientdata(client);
@ -114,7 +114,7 @@ MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id);
static struct i2c_driver cma3000_i2c_driver = { static struct i2c_driver cma3000_i2c_driver = {
.probe = cma3000_i2c_probe, .probe = cma3000_i2c_probe,
.remove = __devexit_p(cma3000_i2c_remove), .remove = cma3000_i2c_remove,
.id_table = cma3000_i2c_id, .id_table = cma3000_i2c_id,
.driver = { .driver = {
.name = "cma3000_i2c_accl", .name = "cma3000_i2c_accl",

View File

@ -73,7 +73,7 @@ static void handle_buttons(struct input_polled_dev *dev)
} }
} }
static int __devinit cobalt_buttons_probe(struct platform_device *pdev) static int cobalt_buttons_probe(struct platform_device *pdev)
{ {
struct buttons_dev *bdev; struct buttons_dev *bdev;
struct input_polled_dev *poll_dev; struct input_polled_dev *poll_dev;
@ -135,7 +135,7 @@ static int __devinit cobalt_buttons_probe(struct platform_device *pdev)
return error; return error;
} }
static int __devexit cobalt_buttons_remove(struct platform_device *pdev) static int cobalt_buttons_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct buttons_dev *bdev = dev_get_drvdata(dev); struct buttons_dev *bdev = dev_get_drvdata(dev);
@ -157,7 +157,7 @@ MODULE_ALIAS("platform:Cobalt buttons");
static struct platform_driver cobalt_buttons_driver = { static struct platform_driver cobalt_buttons_driver = {
.probe = cobalt_buttons_probe, .probe = cobalt_buttons_probe,
.remove = __devexit_p(cobalt_buttons_remove), .remove = cobalt_buttons_remove,
.driver = { .driver = {
.name = "Cobalt buttons", .name = "Cobalt buttons",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -70,7 +70,7 @@ static irqreturn_t da9052_onkey_irq(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit da9052_onkey_probe(struct platform_device *pdev) static int da9052_onkey_probe(struct platform_device *pdev)
{ {
struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent); struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent);
struct da9052_onkey *onkey; struct da9052_onkey *onkey;
@ -129,7 +129,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit da9052_onkey_remove(struct platform_device *pdev) static int da9052_onkey_remove(struct platform_device *pdev)
{ {
struct da9052_onkey *onkey = platform_get_drvdata(pdev); struct da9052_onkey *onkey = platform_get_drvdata(pdev);
@ -144,7 +144,7 @@ static int __devexit da9052_onkey_remove(struct platform_device *pdev)
static struct platform_driver da9052_onkey_driver = { static struct platform_driver da9052_onkey_driver = {
.probe = da9052_onkey_probe, .probe = da9052_onkey_probe,
.remove = __devexit_p(da9052_onkey_remove), .remove = da9052_onkey_remove,
.driver = { .driver = {
.name = "da9052-onkey", .name = "da9052-onkey",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -0,0 +1,171 @@
/*
* ON pin driver for Dialog DA9055 PMICs
*
* Copyright(c) 2012 Dialog Semiconductor Ltd.
*
* Author: David Dajun Chen <dchen@diasemi.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/init.h>
#include <linux/input.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mfd/da9055/core.h>
#include <linux/mfd/da9055/reg.h>
struct da9055_onkey {
struct da9055 *da9055;
struct input_dev *input;
struct delayed_work work;
};
static void da9055_onkey_query(struct da9055_onkey *onkey)
{
int key_stat;
key_stat = da9055_reg_read(onkey->da9055, DA9055_REG_STATUS_A);
if (key_stat < 0) {
dev_err(onkey->da9055->dev,
"Failed to read onkey event %d\n", key_stat);
} else {
key_stat &= DA9055_NOKEY_STS;
/*
* Onkey status bit is cleared when onkey button is relased.
*/
if (!key_stat) {
input_report_key(onkey->input, KEY_POWER, 0);
input_sync(onkey->input);
}
}
/*
* Interrupt is generated only when the ONKEY pin is asserted.
* Hence the deassertion of the pin is simulated through work queue.
*/
if (key_stat)
schedule_delayed_work(&onkey->work, msecs_to_jiffies(10));
}
static void da9055_onkey_work(struct work_struct *work)
{
struct da9055_onkey *onkey = container_of(work, struct da9055_onkey,
work.work);
da9055_onkey_query(onkey);
}
static irqreturn_t da9055_onkey_irq(int irq, void *data)
{
struct da9055_onkey *onkey = data;
input_report_key(onkey->input, KEY_POWER, 1);
input_sync(onkey->input);
da9055_onkey_query(onkey);
return IRQ_HANDLED;
}
static int da9055_onkey_probe(struct platform_device *pdev)
{
struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent);
struct da9055_onkey *onkey;
struct input_dev *input_dev;
int irq, err;
irq = platform_get_irq_byname(pdev, "ONKEY");
if (irq < 0) {
dev_err(&pdev->dev,
"Failed to get an IRQ for input device, %d\n", irq);
return -EINVAL;
}
onkey = devm_kzalloc(&pdev->dev, sizeof(*onkey), GFP_KERNEL);
if (!onkey) {
dev_err(&pdev->dev, "Failed to allocate memory\n");
return -ENOMEM;
}
input_dev = input_allocate_device();
if (!input_dev) {
dev_err(&pdev->dev, "Failed to allocate memory\n");
return -ENOMEM;
}
onkey->input = input_dev;
onkey->da9055 = da9055;
input_dev->name = "da9055-onkey";
input_dev->phys = "da9055-onkey/input0";
input_dev->dev.parent = &pdev->dev;
input_dev->evbit[0] = BIT_MASK(EV_KEY);
__set_bit(KEY_POWER, input_dev->keybit);
INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work);
irq = regmap_irq_get_virq(da9055->irq_data, irq);
err = request_threaded_irq(irq, NULL, da9055_onkey_irq,
IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
"ONKEY", onkey);
if (err < 0) {
dev_err(&pdev->dev,
"Failed to register ONKEY IRQ %d, error = %d\n",
irq, err);
goto err_free_input;
}
err = input_register_device(input_dev);
if (err) {
dev_err(&pdev->dev, "Unable to register input device, %d\n",
err);
goto err_free_irq;
}
platform_set_drvdata(pdev, onkey);
return 0;
err_free_irq:
free_irq(irq, onkey);
cancel_delayed_work_sync(&onkey->work);
err_free_input:
input_free_device(input_dev);
return err;
}
static int da9055_onkey_remove(struct platform_device *pdev)
{
struct da9055_onkey *onkey = platform_get_drvdata(pdev);
int irq = platform_get_irq_byname(pdev, "ONKEY");
irq = regmap_irq_get_virq(onkey->da9055->irq_data, irq);
free_irq(irq, onkey);
cancel_delayed_work_sync(&onkey->work);
input_unregister_device(onkey->input);
return 0;
}
static struct platform_driver da9055_onkey_driver = {
.probe = da9055_onkey_probe,
.remove = da9055_onkey_remove,
.driver = {
.name = "da9055-onkey",
.owner = THIS_MODULE,
},
};
module_platform_driver(da9055_onkey_driver);
MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
MODULE_DESCRIPTION("Onkey driver for DA9055");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:da9055-onkey");

View File

@ -173,7 +173,7 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys)
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
static int __devinit dm355evm_keys_probe(struct platform_device *pdev) static int dm355evm_keys_probe(struct platform_device *pdev)
{ {
struct dm355evm_keys *keys; struct dm355evm_keys *keys;
struct input_dev *input; struct input_dev *input;
@ -239,7 +239,7 @@ fail1:
return status; return status;
} }
static int __devexit dm355evm_keys_remove(struct platform_device *pdev) static int dm355evm_keys_remove(struct platform_device *pdev)
{ {
struct dm355evm_keys *keys = platform_get_drvdata(pdev); struct dm355evm_keys *keys = platform_get_drvdata(pdev);
@ -262,7 +262,7 @@ static int __devexit dm355evm_keys_remove(struct platform_device *pdev)
*/ */
static struct platform_driver dm355evm_keys_driver = { static struct platform_driver dm355evm_keys_driver = {
.probe = dm355evm_keys_probe, .probe = dm355evm_keys_probe,
.remove = __devexit_p(dm355evm_keys_remove), .remove = dm355evm_keys_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "dm355evm_keys", .name = "dm355evm_keys",

View File

@ -98,7 +98,7 @@ static void gp2a_device_close(struct input_dev *dev)
"unable to deactivate, err %d\n", error); "unable to deactivate, err %d\n", error);
} }
static int __devinit gp2a_initialize(struct gp2a_data *dt) static int gp2a_initialize(struct gp2a_data *dt)
{ {
int error; int error;
@ -122,7 +122,7 @@ static int __devinit gp2a_initialize(struct gp2a_data *dt)
return error; return error;
} }
static int __devinit gp2a_probe(struct i2c_client *client, static int gp2a_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct gp2a_platform_data *pdata = client->dev.platform_data; const struct gp2a_platform_data *pdata = client->dev.platform_data;
@ -205,7 +205,7 @@ err_hw_shutdown:
return error; return error;
} }
static int __devexit gp2a_remove(struct i2c_client *client) static int gp2a_remove(struct i2c_client *client)
{ {
struct gp2a_data *dt = i2c_get_clientdata(client); struct gp2a_data *dt = i2c_get_clientdata(client);
const struct gp2a_platform_data *pdata = dt->pdata; const struct gp2a_platform_data *pdata = dt->pdata;
@ -277,7 +277,7 @@ static struct i2c_driver gp2a_i2c_driver = {
.pm = &gp2a_pm, .pm = &gp2a_pm,
}, },
.probe = gp2a_probe, .probe = gp2a_probe,
.remove = __devexit_p(gp2a_remove), .remove = gp2a_remove,
.id_table = gp2a_i2c_id, .id_table = gp2a_i2c_id,
}; };

View File

@ -96,7 +96,7 @@ static void gpio_tilt_polled_close(struct input_polled_dev *dev)
pdata->disable(tdev->dev); pdata->disable(tdev->dev);
} }
static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev) static int gpio_tilt_polled_probe(struct platform_device *pdev)
{ {
const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data; const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
@ -179,7 +179,7 @@ err_free_tdev:
return error; return error;
} }
static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev) static int gpio_tilt_polled_remove(struct platform_device *pdev)
{ {
struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev); struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev);
const struct gpio_tilt_platform_data *pdata = tdev->pdata; const struct gpio_tilt_platform_data *pdata = tdev->pdata;
@ -198,7 +198,7 @@ static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
static struct platform_driver gpio_tilt_polled_driver = { static struct platform_driver gpio_tilt_polled_driver = {
.probe = gpio_tilt_polled_probe, .probe = gpio_tilt_polled_probe,
.remove = __devexit_p(gpio_tilt_polled_remove), .remove = gpio_tilt_polled_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -87,7 +87,7 @@ static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit ixp4xx_spkr_probe(struct platform_device *dev) static int ixp4xx_spkr_probe(struct platform_device *dev)
{ {
struct input_dev *input_dev; struct input_dev *input_dev;
int err; int err;
@ -132,7 +132,7 @@ static int __devinit ixp4xx_spkr_probe(struct platform_device *dev)
return err; return err;
} }
static int __devexit ixp4xx_spkr_remove(struct platform_device *dev) static int ixp4xx_spkr_remove(struct platform_device *dev)
{ {
struct input_dev *input_dev = platform_get_drvdata(dev); struct input_dev *input_dev = platform_get_drvdata(dev);
unsigned int pin = (unsigned int) input_get_drvdata(input_dev); unsigned int pin = (unsigned int) input_get_drvdata(input_dev);
@ -165,7 +165,7 @@ static struct platform_driver ixp4xx_spkr_platform_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = ixp4xx_spkr_probe, .probe = ixp4xx_spkr_probe,
.remove = __devexit_p(ixp4xx_spkr_remove), .remove = ixp4xx_spkr_remove,
.shutdown = ixp4xx_spkr_shutdown, .shutdown = ixp4xx_spkr_shutdown,
}; };
module_platform_driver(ixp4xx_spkr_platform_driver); module_platform_driver(ixp4xx_spkr_platform_driver);

View File

@ -295,7 +295,7 @@ static void kxtj9_input_close(struct input_dev *dev)
kxtj9_disable(tj9); kxtj9_disable(tj9);
} }
static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9, static void kxtj9_init_input_device(struct kxtj9_data *tj9,
struct input_dev *input_dev) struct input_dev *input_dev)
{ {
__set_bit(EV_ABS, input_dev->evbit); __set_bit(EV_ABS, input_dev->evbit);
@ -308,7 +308,7 @@ static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9,
input_dev->dev.parent = &tj9->client->dev; input_dev->dev.parent = &tj9->client->dev;
} }
static int __devinit kxtj9_setup_input_device(struct kxtj9_data *tj9) static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
{ {
struct input_dev *input_dev; struct input_dev *input_dev;
int err; int err;
@ -433,7 +433,7 @@ static void kxtj9_polled_input_close(struct input_polled_dev *dev)
kxtj9_disable(tj9); kxtj9_disable(tj9);
} }
static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9) static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
{ {
int err; int err;
struct input_polled_dev *poll_dev; struct input_polled_dev *poll_dev;
@ -466,7 +466,7 @@ static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9)
return 0; return 0;
} }
static void __devexit kxtj9_teardown_polled_device(struct kxtj9_data *tj9) static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
{ {
input_unregister_polled_device(tj9->poll_dev); input_unregister_polled_device(tj9->poll_dev);
input_free_polled_device(tj9->poll_dev); input_free_polled_device(tj9->poll_dev);
@ -485,7 +485,7 @@ static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
#endif #endif
static int __devinit kxtj9_verify(struct kxtj9_data *tj9) static int kxtj9_verify(struct kxtj9_data *tj9)
{ {
int retval; int retval;
@ -506,7 +506,7 @@ out:
return retval; return retval;
} }
static int __devinit kxtj9_probe(struct i2c_client *client, static int kxtj9_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct kxtj9_platform_data *pdata = client->dev.platform_data; const struct kxtj9_platform_data *pdata = client->dev.platform_data;
@ -594,7 +594,7 @@ err_free_mem:
return err; return err;
} }
static int __devexit kxtj9_remove(struct i2c_client *client) static int kxtj9_remove(struct i2c_client *client)
{ {
struct kxtj9_data *tj9 = i2c_get_clientdata(client); struct kxtj9_data *tj9 = i2c_get_clientdata(client);
@ -663,7 +663,7 @@ static struct i2c_driver kxtj9_driver = {
.pm = &kxtj9_pm_ops, .pm = &kxtj9_pm_ops,
}, },
.probe = kxtj9_probe, .probe = kxtj9_probe,
.remove = __devexit_p(kxtj9_remove), .remove = kxtj9_remove,
.id_table = kxtj9_id, .id_table = kxtj9_id,
}; };

View File

@ -48,7 +48,7 @@ static int m68kspkr_event(struct input_dev *dev, unsigned int type, unsigned int
return 0; return 0;
} }
static int __devinit m68kspkr_probe(struct platform_device *dev) static int m68kspkr_probe(struct platform_device *dev)
{ {
struct input_dev *input_dev; struct input_dev *input_dev;
int err; int err;
@ -80,7 +80,7 @@ static int __devinit m68kspkr_probe(struct platform_device *dev)
return 0; return 0;
} }
static int __devexit m68kspkr_remove(struct platform_device *dev) static int m68kspkr_remove(struct platform_device *dev)
{ {
struct input_dev *input_dev = platform_get_drvdata(dev); struct input_dev *input_dev = platform_get_drvdata(dev);
@ -104,7 +104,7 @@ static struct platform_driver m68kspkr_platform_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = m68kspkr_probe, .probe = m68kspkr_probe,
.remove = __devexit_p(m68kspkr_remove), .remove = m68kspkr_remove,
.shutdown = m68kspkr_shutdown, .shutdown = m68kspkr_shutdown,
}; };

View File

@ -62,7 +62,7 @@ static irqreturn_t max8925_onkey_handler(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit max8925_onkey_probe(struct platform_device *pdev) static int max8925_onkey_probe(struct platform_device *pdev)
{ {
struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
struct max8925_onkey_info *info; struct max8925_onkey_info *info;
@ -141,7 +141,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit max8925_onkey_remove(struct platform_device *pdev) static int max8925_onkey_remove(struct platform_device *pdev)
{ {
struct max8925_onkey_info *info = platform_get_drvdata(pdev); struct max8925_onkey_info *info = platform_get_drvdata(pdev);
struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
@ -195,7 +195,7 @@ static struct platform_driver max8925_onkey_driver = {
.pm = &max8925_onkey_pm_ops, .pm = &max8925_onkey_pm_ops,
}, },
.probe = max8925_onkey_probe, .probe = max8925_onkey_probe,
.remove = __devexit_p(max8925_onkey_remove), .remove = max8925_onkey_remove,
}; };
module_platform_driver(max8925_onkey_driver); module_platform_driver(max8925_onkey_driver);

View File

@ -241,7 +241,7 @@ static void max8997_haptic_close(struct input_dev *dev)
max8997_haptic_disable(chip); max8997_haptic_disable(chip);
} }
static int __devinit max8997_haptic_probe(struct platform_device *pdev) static int max8997_haptic_probe(struct platform_device *pdev)
{ {
struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
const struct max8997_platform_data *pdata = const struct max8997_platform_data *pdata =
@ -354,7 +354,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit max8997_haptic_remove(struct platform_device *pdev) static int max8997_haptic_remove(struct platform_device *pdev)
{ {
struct max8997_haptic *chip = platform_get_drvdata(pdev); struct max8997_haptic *chip = platform_get_drvdata(pdev);
@ -396,7 +396,7 @@ static struct platform_driver max8997_haptic_driver = {
.pm = &max8997_haptic_pm_ops, .pm = &max8997_haptic_pm_ops,
}, },
.probe = max8997_haptic_probe, .probe = max8997_haptic_probe,
.remove = __devexit_p(max8997_haptic_remove), .remove = max8997_haptic_remove,
.id_table = max8997_haptic_id, .id_table = max8997_haptic_id,
}; };
module_platform_driver(max8997_haptic_driver); module_platform_driver(max8997_haptic_driver);

View File

@ -89,7 +89,7 @@ static irqreturn_t button_irq(int irq, void *_priv)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit mc13783_pwrbutton_probe(struct platform_device *pdev) static int mc13783_pwrbutton_probe(struct platform_device *pdev)
{ {
const struct mc13xxx_buttons_platform_data *pdata; const struct mc13xxx_buttons_platform_data *pdata;
struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent); struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
@ -230,7 +230,7 @@ free_input_dev:
return err; return err;
} }
static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev) static int mc13783_pwrbutton_remove(struct platform_device *pdev)
{ {
struct mc13783_pwrb *priv = platform_get_drvdata(pdev); struct mc13783_pwrb *priv = platform_get_drvdata(pdev);
const struct mc13xxx_buttons_platform_data *pdata; const struct mc13xxx_buttons_platform_data *pdata;
@ -257,7 +257,7 @@ static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
static struct platform_driver mc13783_pwrbutton_driver = { static struct platform_driver mc13783_pwrbutton_driver = {
.probe = mc13783_pwrbutton_probe, .probe = mc13783_pwrbutton_probe,
.remove = __devexit_p(mc13783_pwrbutton_remove), .remove = mc13783_pwrbutton_remove,
.driver = { .driver = {
.name = "mc13783-pwrbutton", .name = "mc13783-pwrbutton",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -167,7 +167,7 @@ static void mma8450_close(struct input_polled_dev *dev)
/* /*
* I2C init/probing/exit functions * I2C init/probing/exit functions
*/ */
static int __devinit mma8450_probe(struct i2c_client *c, static int mma8450_probe(struct i2c_client *c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct input_polled_dev *idev; struct input_polled_dev *idev;
@ -212,7 +212,7 @@ err_free_mem:
return err; return err;
} }
static int __devexit mma8450_remove(struct i2c_client *c) static int mma8450_remove(struct i2c_client *c)
{ {
struct mma8450 *m = i2c_get_clientdata(c); struct mma8450 *m = i2c_get_clientdata(c);
struct input_polled_dev *idev = m->idev; struct input_polled_dev *idev = m->idev;
@ -243,7 +243,7 @@ static struct i2c_driver mma8450_driver = {
.of_match_table = mma8450_dt_ids, .of_match_table = mma8450_dt_ids,
}, },
.probe = mma8450_probe, .probe = mma8450_probe,
.remove = __devexit_p(mma8450_remove), .remove = mma8450_remove,
.id_table = mma8450_id, .id_table = mma8450_id,
}; };

View File

@ -257,7 +257,7 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data)
* *
* Called during device probe; configures the sampling method. * Called during device probe; configures the sampling method.
*/ */
static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor) static int mpu3050_hw_init(struct mpu3050_sensor *sensor)
{ {
struct i2c_client *client = sensor->client; struct i2c_client *client = sensor->client;
int ret; int ret;
@ -306,7 +306,7 @@ static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
* *
* If present install the relevant sysfs interfaces and input device. * If present install the relevant sysfs interfaces and input device.
*/ */
static int __devinit mpu3050_probe(struct i2c_client *client, static int mpu3050_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct mpu3050_sensor *sensor; struct mpu3050_sensor *sensor;
@ -402,7 +402,7 @@ err_free_mem:
* *
* Our sensor is going away, clean up the resources. * Our sensor is going away, clean up the resources.
*/ */
static int __devexit mpu3050_remove(struct i2c_client *client) static int mpu3050_remove(struct i2c_client *client)
{ {
struct mpu3050_sensor *sensor = i2c_get_clientdata(client); struct mpu3050_sensor *sensor = i2c_get_clientdata(client);
@ -471,7 +471,7 @@ static struct i2c_driver mpu3050_i2c_driver = {
.of_match_table = mpu3050_of_match, .of_match_table = mpu3050_of_match,
}, },
.probe = mpu3050_probe, .probe = mpu3050_probe,
.remove = __devexit_p(mpu3050_remove), .remove = mpu3050_remove,
.id_table = mpu3050_ids, .id_table = mpu3050_ids,
}; };

View File

@ -48,7 +48,7 @@ static irqreturn_t pcap_keys_handler(int irq, void *_pcap_keys)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit pcap_keys_probe(struct platform_device *pdev) static int pcap_keys_probe(struct platform_device *pdev)
{ {
int err = -ENOMEM; int err = -ENOMEM;
struct pcap_keys *pcap_keys; struct pcap_keys *pcap_keys;
@ -104,7 +104,7 @@ fail:
return err; return err;
} }
static int __devexit pcap_keys_remove(struct platform_device *pdev) static int pcap_keys_remove(struct platform_device *pdev)
{ {
struct pcap_keys *pcap_keys = platform_get_drvdata(pdev); struct pcap_keys *pcap_keys = platform_get_drvdata(pdev);
@ -119,7 +119,7 @@ static int __devexit pcap_keys_remove(struct platform_device *pdev)
static struct platform_driver pcap_keys_device_driver = { static struct platform_driver pcap_keys_device_driver = {
.probe = pcap_keys_probe, .probe = pcap_keys_probe,
.remove = __devexit_p(pcap_keys_remove), .remove = pcap_keys_remove,
.driver = { .driver = {
.name = "pcap-keys", .name = "pcap-keys",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -53,7 +53,7 @@ pcf50633_input_irq(int irq, void *data)
input_sync(input->input_dev); input_sync(input->input_dev);
} }
static int __devinit pcf50633_input_probe(struct platform_device *pdev) static int pcf50633_input_probe(struct platform_device *pdev)
{ {
struct pcf50633_input *input; struct pcf50633_input *input;
struct input_dev *input_dev; struct input_dev *input_dev;
@ -93,7 +93,7 @@ static int __devinit pcf50633_input_probe(struct platform_device *pdev)
return 0; return 0;
} }
static int __devexit pcf50633_input_remove(struct platform_device *pdev) static int pcf50633_input_remove(struct platform_device *pdev)
{ {
struct pcf50633_input *input = platform_get_drvdata(pdev); struct pcf50633_input *input = platform_get_drvdata(pdev);
@ -111,7 +111,7 @@ static struct platform_driver pcf50633_input_driver = {
.name = "pcf50633-input", .name = "pcf50633-input",
}, },
.probe = pcf50633_input_probe, .probe = pcf50633_input_probe,
.remove = __devexit_p(pcf50633_input_remove), .remove = pcf50633_input_remove,
}; };
module_platform_driver(pcf50633_input_driver); module_platform_driver(pcf50633_input_driver);

View File

@ -82,7 +82,7 @@ static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id) static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id)
{ {
int i, ret; int i, ret;
struct input_dev *idev; struct input_dev *idev;
@ -156,7 +156,7 @@ static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2
return ret; return ret;
} }
static int __devexit pcf8574_kp_remove(struct i2c_client *client) static int pcf8574_kp_remove(struct i2c_client *client)
{ {
struct kp_data *lp = i2c_get_clientdata(client); struct kp_data *lp = i2c_get_clientdata(client);
@ -212,7 +212,7 @@ static struct i2c_driver pcf8574_kp_driver = {
#endif #endif
}, },
.probe = pcf8574_kp_probe, .probe = pcf8574_kp_probe,
.remove = __devexit_p(pcf8574_kp_remove), .remove = pcf8574_kp_remove,
.id_table = pcf8574_kp_id, .id_table = pcf8574_kp_id,
}; };

View File

@ -63,7 +63,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c
return 0; return 0;
} }
static int __devinit pcspkr_probe(struct platform_device *dev) static int pcspkr_probe(struct platform_device *dev)
{ {
struct input_dev *pcspkr_dev; struct input_dev *pcspkr_dev;
int err; int err;
@ -95,7 +95,7 @@ static int __devinit pcspkr_probe(struct platform_device *dev)
return 0; return 0;
} }
static int __devexit pcspkr_remove(struct platform_device *dev) static int pcspkr_remove(struct platform_device *dev)
{ {
struct input_dev *pcspkr_dev = platform_get_drvdata(dev); struct input_dev *pcspkr_dev = platform_get_drvdata(dev);
@ -131,7 +131,7 @@ static struct platform_driver pcspkr_platform_driver = {
.pm = &pcspkr_pm_ops, .pm = &pcspkr_pm_ops,
}, },
.probe = pcspkr_probe, .probe = pcspkr_probe,
.remove = __devexit_p(pcspkr_remove), .remove = pcspkr_remove,
.shutdown = pcspkr_shutdown, .shutdown = pcspkr_shutdown,
}; };
module_platform_driver(pcspkr_platform_driver); module_platform_driver(pcspkr_platform_driver);

View File

@ -178,7 +178,7 @@ static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data,
return 0; return 0;
} }
static int __devinit pm8xxx_vib_probe(struct platform_device *pdev) static int pm8xxx_vib_probe(struct platform_device *pdev)
{ {
struct pm8xxx_vib *vib; struct pm8xxx_vib *vib;
@ -242,7 +242,7 @@ err_free_mem:
return error; return error;
} }
static int __devexit pm8xxx_vib_remove(struct platform_device *pdev) static int pm8xxx_vib_remove(struct platform_device *pdev)
{ {
struct pm8xxx_vib *vib = platform_get_drvdata(pdev); struct pm8xxx_vib *vib = platform_get_drvdata(pdev);
@ -270,7 +270,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);
static struct platform_driver pm8xxx_vib_driver = { static struct platform_driver pm8xxx_vib_driver = {
.probe = pm8xxx_vib_probe, .probe = pm8xxx_vib_probe,
.remove = __devexit_p(pm8xxx_vib_remove), .remove = pm8xxx_vib_remove,
.driver = { .driver = {
.name = "pm8xxx-vib", .name = "pm8xxx-vib",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -81,7 +81,7 @@ static int pmic8xxx_pwrkey_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops, static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops,
pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume); pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume);
static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)
{ {
struct input_dev *pwr; struct input_dev *pwr;
int key_release_irq = platform_get_irq(pdev, 0); int key_release_irq = platform_get_irq(pdev, 0);
@ -187,7 +187,7 @@ free_pwrkey:
return err; return err;
} }
static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev) static int pmic8xxx_pwrkey_remove(struct platform_device *pdev)
{ {
struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev); struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev);
int key_release_irq = platform_get_irq(pdev, 0); int key_release_irq = platform_get_irq(pdev, 0);
@ -206,7 +206,7 @@ static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev)
static struct platform_driver pmic8xxx_pwrkey_driver = { static struct platform_driver pmic8xxx_pwrkey_driver = {
.probe = pmic8xxx_pwrkey_probe, .probe = pmic8xxx_pwrkey_probe,
.remove = __devexit_p(pmic8xxx_pwrkey_remove), .remove = pmic8xxx_pwrkey_remove,
.driver = { .driver = {
.name = PM8XXX_PWRKEY_DEV_NAME, .name = PM8XXX_PWRKEY_DEV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -65,7 +65,7 @@ static int pwm_beeper_event(struct input_dev *input,
return 0; return 0;
} }
static int __devinit pwm_beeper_probe(struct platform_device *pdev) static int pwm_beeper_probe(struct platform_device *pdev)
{ {
unsigned long pwm_id = (unsigned long)pdev->dev.platform_data; unsigned long pwm_id = (unsigned long)pdev->dev.platform_data;
struct pwm_beeper *beeper; struct pwm_beeper *beeper;
@ -75,7 +75,11 @@ static int __devinit pwm_beeper_probe(struct platform_device *pdev)
if (!beeper) if (!beeper)
return -ENOMEM; return -ENOMEM;
beeper->pwm = pwm_request(pwm_id, "pwm beeper"); beeper->pwm = pwm_get(&pdev->dev, NULL);
if (IS_ERR(beeper->pwm)) {
dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n");
beeper->pwm = pwm_request(pwm_id, "pwm beeper");
}
if (IS_ERR(beeper->pwm)) { if (IS_ERR(beeper->pwm)) {
error = PTR_ERR(beeper->pwm); error = PTR_ERR(beeper->pwm);
@ -125,7 +129,7 @@ err_free:
return error; return error;
} }
static int __devexit pwm_beeper_remove(struct platform_device *pdev) static int pwm_beeper_remove(struct platform_device *pdev)
{ {
struct pwm_beeper *beeper = platform_get_drvdata(pdev); struct pwm_beeper *beeper = platform_get_drvdata(pdev);
@ -171,13 +175,21 @@ static SIMPLE_DEV_PM_OPS(pwm_beeper_pm_ops,
#define PWM_BEEPER_PM_OPS NULL #define PWM_BEEPER_PM_OPS NULL
#endif #endif
#ifdef CONFIG_OF
static const struct of_device_id pwm_beeper_match[] = {
{ .compatible = "pwm-beeper", },
{ },
};
#endif
static struct platform_driver pwm_beeper_driver = { static struct platform_driver pwm_beeper_driver = {
.probe = pwm_beeper_probe, .probe = pwm_beeper_probe,
.remove = __devexit_p(pwm_beeper_remove), .remove = pwm_beeper_remove,
.driver = { .driver = {
.name = "pwm-beeper", .name = "pwm-beeper",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = PWM_BEEPER_PM_OPS, .pm = PWM_BEEPER_PM_OPS,
.of_match_table = of_match_ptr(pwm_beeper_match),
}, },
}; };
module_platform_driver(pwm_beeper_driver); module_platform_driver(pwm_beeper_driver);

View File

@ -51,7 +51,7 @@ static void rb532_button_poll(struct input_polled_dev *poll_dev)
input_sync(poll_dev->input); input_sync(poll_dev->input);
} }
static int __devinit rb532_button_probe(struct platform_device *pdev) static int rb532_button_probe(struct platform_device *pdev)
{ {
struct input_polled_dev *poll_dev; struct input_polled_dev *poll_dev;
int error; int error;
@ -81,7 +81,7 @@ static int __devinit rb532_button_probe(struct platform_device *pdev)
return 0; return 0;
} }
static int __devexit rb532_button_remove(struct platform_device *pdev) static int rb532_button_remove(struct platform_device *pdev)
{ {
struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev); struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev);
@ -94,7 +94,7 @@ static int __devexit rb532_button_remove(struct platform_device *pdev)
static struct platform_driver rb532_button_driver = { static struct platform_driver rb532_button_driver = {
.probe = rb532_button_probe, .probe = rb532_button_probe,
.remove = __devexit_p(rb532_button_remove), .remove = rb532_button_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -0,0 +1,99 @@
/*
* Retu power button driver.
*
* Copyright (C) 2004-2010 Nokia Corporation
*
* Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi.
* Rewritten by Aaro Koskinen.
*
* This file is subject to the terms and conditions of the GNU General
* Public License. See the file "COPYING" in the main directory of this
* archive for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/irq.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/input.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mfd/retu.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#define RETU_STATUS_PWRONX (1 << 5)
static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr)
{
struct input_dev *idev = _pwr;
struct retu_dev *rdev = input_get_drvdata(idev);
bool state;
state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX);
input_report_key(idev, KEY_POWER, state);
input_sync(idev);
return IRQ_HANDLED;
}
static int retu_pwrbutton_probe(struct platform_device *pdev)
{
struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent);
struct input_dev *idev;
int irq;
int error;
irq = platform_get_irq(pdev, 0);
if (irq < 0)
return irq;
idev = devm_input_allocate_device(&pdev->dev);
if (!idev)
return -ENOMEM;
idev->name = "retu-pwrbutton";
idev->dev.parent = &pdev->dev;
input_set_capability(idev, EV_KEY, KEY_POWER);
input_set_drvdata(idev, rdev);
error = devm_request_threaded_irq(&pdev->dev, irq,
NULL, retu_pwrbutton_irq, 0,
"retu-pwrbutton", idev);
if (error)
return error;
error = input_register_device(idev);
if (error)
return error;
return 0;
}
static int retu_pwrbutton_remove(struct platform_device *pdev)
{
return 0;
}
static struct platform_driver retu_pwrbutton_driver = {
.probe = retu_pwrbutton_probe,
.remove = retu_pwrbutton_remove,
.driver = {
.name = "retu-pwrbutton",
.owner = THIS_MODULE,
},
};
module_platform_driver(retu_pwrbutton_driver);
MODULE_ALIAS("platform:retu-pwrbutton");
MODULE_DESCRIPTION("Retu Power Button");
MODULE_AUTHOR("Ari Saastamoinen");
MODULE_AUTHOR("Felipe Balbi");
MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>");
MODULE_LICENSE("GPL");

View File

@ -149,8 +149,7 @@ static struct of_device_id rotary_encoder_of_match[] = {
}; };
MODULE_DEVICE_TABLE(of, rotary_encoder_of_match); MODULE_DEVICE_TABLE(of, rotary_encoder_of_match);
static struct rotary_encoder_platform_data * __devinit static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev)
rotary_encoder_parse_dt(struct device *dev)
{ {
const struct of_device_id *of_id = const struct of_device_id *of_id =
of_match_device(rotary_encoder_of_match, dev); of_match_device(rotary_encoder_of_match, dev);
@ -192,7 +191,7 @@ rotary_encoder_parse_dt(struct device *dev)
} }
#endif #endif
static int __devinit rotary_encoder_probe(struct platform_device *pdev) static int rotary_encoder_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev); const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev);
@ -302,7 +301,7 @@ exit_free_mem:
return err; return err;
} }
static int __devexit rotary_encoder_remove(struct platform_device *pdev) static int rotary_encoder_remove(struct platform_device *pdev)
{ {
struct rotary_encoder *encoder = platform_get_drvdata(pdev); struct rotary_encoder *encoder = platform_get_drvdata(pdev);
const struct rotary_encoder_platform_data *pdata = encoder->pdata; const struct rotary_encoder_platform_data *pdata = encoder->pdata;
@ -325,7 +324,7 @@ static int __devexit rotary_encoder_remove(struct platform_device *pdev)
static struct platform_driver rotary_encoder_driver = { static struct platform_driver rotary_encoder_driver = {
.probe = rotary_encoder_probe, .probe = rotary_encoder_probe,
.remove = __devexit_p(rotary_encoder_remove), .remove = rotary_encoder_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -91,7 +91,7 @@ static void handle_buttons(struct input_polled_dev *dev)
} }
} }
static int __devinit sgi_buttons_probe(struct platform_device *pdev) static int sgi_buttons_probe(struct platform_device *pdev)
{ {
struct buttons_dev *bdev; struct buttons_dev *bdev;
struct input_polled_dev *poll_dev; struct input_polled_dev *poll_dev;
@ -143,7 +143,7 @@ static int __devinit sgi_buttons_probe(struct platform_device *pdev)
return error; return error;
} }
static int __devexit sgi_buttons_remove(struct platform_device *pdev) static int sgi_buttons_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct buttons_dev *bdev = dev_get_drvdata(dev); struct buttons_dev *bdev = dev_get_drvdata(dev);
@ -158,7 +158,7 @@ static int __devexit sgi_buttons_remove(struct platform_device *pdev)
static struct platform_driver sgi_buttons_driver = { static struct platform_driver sgi_buttons_driver = {
.probe = sgi_buttons_probe, .probe = sgi_buttons_probe,
.remove = __devexit_p(sgi_buttons_remove), .remove = sgi_buttons_remove,
.driver = { .driver = {
.name = "sgibtns", .name = "sgibtns",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -139,7 +139,7 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned
return 0; return 0;
} }
static int __devinit sparcspkr_probe(struct device *dev) static int sparcspkr_probe(struct device *dev)
{ {
struct sparcspkr_state *state = dev_get_drvdata(dev); struct sparcspkr_state *state = dev_get_drvdata(dev);
struct input_dev *input_dev; struct input_dev *input_dev;
@ -182,7 +182,7 @@ static void sparcspkr_shutdown(struct platform_device *dev)
state->event(input_dev, EV_SND, SND_BELL, 0); state->event(input_dev, EV_SND, SND_BELL, 0);
} }
static int __devinit bbc_beep_probe(struct platform_device *op) static int bbc_beep_probe(struct platform_device *op)
{ {
struct sparcspkr_state *state; struct sparcspkr_state *state;
struct bbc_beep_info *info; struct bbc_beep_info *info;
@ -229,7 +229,7 @@ out_err:
return err; return err;
} }
static int __devexit bbc_remove(struct platform_device *op) static int bbc_remove(struct platform_device *op)
{ {
struct sparcspkr_state *state = dev_get_drvdata(&op->dev); struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
struct input_dev *input_dev = state->input_dev; struct input_dev *input_dev = state->input_dev;
@ -263,11 +263,11 @@ static struct platform_driver bbc_beep_driver = {
.of_match_table = bbc_beep_match, .of_match_table = bbc_beep_match,
}, },
.probe = bbc_beep_probe, .probe = bbc_beep_probe,
.remove = __devexit_p(bbc_remove), .remove = bbc_remove,
.shutdown = sparcspkr_shutdown, .shutdown = sparcspkr_shutdown,
}; };
static int __devinit grover_beep_probe(struct platform_device *op) static int grover_beep_probe(struct platform_device *op)
{ {
struct sparcspkr_state *state; struct sparcspkr_state *state;
struct grover_beep_info *info; struct grover_beep_info *info;
@ -310,7 +310,7 @@ out_err:
return err; return err;
} }
static int __devexit grover_remove(struct platform_device *op) static int grover_remove(struct platform_device *op)
{ {
struct sparcspkr_state *state = dev_get_drvdata(&op->dev); struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
struct grover_beep_info *info = &state->u.grover; struct grover_beep_info *info = &state->u.grover;
@ -345,7 +345,7 @@ static struct platform_driver grover_beep_driver = {
.of_match_table = grover_beep_match, .of_match_table = grover_beep_match,
}, },
.probe = grover_beep_probe, .probe = grover_beep_probe,
.remove = __devexit_p(grover_remove), .remove = grover_remove,
.shutdown = sparcspkr_shutdown, .shutdown = sparcspkr_shutdown,
}; };

View File

@ -39,8 +39,7 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr)
int err; int err;
u8 value; u8 value;
err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value, err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS);
STS_HW_CONDITIONS);
if (!err) { if (!err) {
pm_wakeup_event(pwr->dev.parent, 0); pm_wakeup_event(pwr->dev.parent, 0);
input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ);

View File

@ -207,7 +207,7 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata,
return false; return false;
} }
static int __devinit twl4030_vibra_probe(struct platform_device *pdev) static int twl4030_vibra_probe(struct platform_device *pdev)
{ {
struct twl4030_vibra_data *pdata = pdev->dev.platform_data; struct twl4030_vibra_data *pdata = pdev->dev.platform_data;
struct device_node *twl4030_core_node = pdev->dev.parent->of_node; struct device_node *twl4030_core_node = pdev->dev.parent->of_node;
@ -269,7 +269,7 @@ err_kzalloc:
return ret; return ret;
} }
static int __devexit twl4030_vibra_remove(struct platform_device *pdev) static int twl4030_vibra_remove(struct platform_device *pdev)
{ {
struct vibra_info *info = platform_get_drvdata(pdev); struct vibra_info *info = platform_get_drvdata(pdev);
@ -283,7 +283,7 @@ static int __devexit twl4030_vibra_remove(struct platform_device *pdev)
static struct platform_driver twl4030_vibra_driver = { static struct platform_driver twl4030_vibra_driver = {
.probe = twl4030_vibra_probe, .probe = twl4030_vibra_probe,
.remove = __devexit_p(twl4030_vibra_remove), .remove = twl4030_vibra_remove,
.driver = { .driver = {
.name = "twl4030-vibra", .name = "twl4030-vibra",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -255,7 +255,7 @@ static int twl6040_vibra_suspend(struct device *dev)
static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL); static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL);
static int __devinit twl6040_vibra_probe(struct platform_device *pdev) static int twl6040_vibra_probe(struct platform_device *pdev)
{ {
struct twl6040_vibra_data *pdata = pdev->dev.platform_data; struct twl6040_vibra_data *pdata = pdev->dev.platform_data;
struct device *twl6040_core_dev = pdev->dev.parent; struct device *twl6040_core_dev = pdev->dev.parent;
@ -418,7 +418,7 @@ err_kzalloc:
return ret; return ret;
} }
static int __devexit twl6040_vibra_remove(struct platform_device *pdev) static int twl6040_vibra_remove(struct platform_device *pdev)
{ {
struct vibra_info *info = platform_get_drvdata(pdev); struct vibra_info *info = platform_get_drvdata(pdev);
@ -433,7 +433,7 @@ static int __devexit twl6040_vibra_remove(struct platform_device *pdev)
static struct platform_driver twl6040_vibra_driver = { static struct platform_driver twl6040_vibra_driver = {
.probe = twl6040_vibra_probe, .probe = twl6040_vibra_probe,
.remove = __devexit_p(twl6040_vibra_remove), .remove = twl6040_vibra_remove,
.driver = { .driver = {
.name = "twl6040-vibra", .name = "twl6040-vibra",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -170,7 +170,7 @@ static u16 bios_pop_queue(void)
return regs.eax; return regs.eax;
} }
static void __devinit bios_attach(void) static void bios_attach(void)
{ {
struct regs regs; struct regs regs;
@ -190,7 +190,7 @@ static void bios_detach(void)
call_bios(&regs); call_bios(&regs);
} }
static u8 __devinit bios_get_cmos_address(void) static u8 bios_get_cmos_address(void)
{ {
struct regs regs; struct regs regs;
@ -202,7 +202,7 @@ static u8 __devinit bios_get_cmos_address(void)
return regs.ecx; return regs.ecx;
} }
static u16 __devinit bios_get_default_setting(u8 subsys) static u16 bios_get_default_setting(u8 subsys)
{ {
struct regs regs; struct regs regs;
@ -1052,7 +1052,7 @@ static struct led_classdev wistron_wifi_led = {
.brightness_set = wistron_wifi_led_set, .brightness_set = wistron_wifi_led_set,
}; };
static void __devinit wistron_led_init(struct device *parent) static void wistron_led_init(struct device *parent)
{ {
if (leds_present & FE_WIFI_LED) { if (leds_present & FE_WIFI_LED) {
u16 wifi = bios_get_default_setting(WIFI); u16 wifi = bios_get_default_setting(WIFI);
@ -1077,7 +1077,7 @@ static void __devinit wistron_led_init(struct device *parent)
} }
} }
static void __devexit wistron_led_remove(void) static void wistron_led_remove(void)
{ {
if (leds_present & FE_MAIL_LED) if (leds_present & FE_MAIL_LED)
led_classdev_unregister(&wistron_mail_led); led_classdev_unregister(&wistron_mail_led);
@ -1168,7 +1168,7 @@ static void wistron_poll(struct input_polled_dev *dev)
dev->poll_interval = POLL_INTERVAL_DEFAULT; dev->poll_interval = POLL_INTERVAL_DEFAULT;
} }
static int __devinit wistron_setup_keymap(struct input_dev *dev, static int wistron_setup_keymap(struct input_dev *dev,
struct key_entry *entry) struct key_entry *entry)
{ {
switch (entry->type) { switch (entry->type) {
@ -1199,7 +1199,7 @@ static int __devinit wistron_setup_keymap(struct input_dev *dev,
return 0; return 0;
} }
static int __devinit setup_input_dev(void) static int setup_input_dev(void)
{ {
struct input_dev *input_dev; struct input_dev *input_dev;
int error; int error;
@ -1237,7 +1237,7 @@ static int __devinit setup_input_dev(void)
/* Driver core */ /* Driver core */
static int __devinit wistron_probe(struct platform_device *dev) static int wistron_probe(struct platform_device *dev)
{ {
int err; int err;
@ -1277,7 +1277,7 @@ static int __devinit wistron_probe(struct platform_device *dev)
return 0; return 0;
} }
static int __devexit wistron_remove(struct platform_device *dev) static int wistron_remove(struct platform_device *dev)
{ {
wistron_led_remove(); wistron_led_remove();
input_unregister_polled_device(wistron_idev); input_unregister_polled_device(wistron_idev);
@ -1334,7 +1334,7 @@ static struct platform_driver wistron_driver = {
#endif #endif
}, },
.probe = wistron_probe, .probe = wistron_probe,
.remove = __devexit_p(wistron_remove), .remove = wistron_remove,
}; };
static int __init wb_module_init(void) static int __init wb_module_init(void)

Some files were not shown because too many files have changed in this diff Show More