forked from Minki/linux
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:
commit
31564cbd77
@ -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>;
|
||||
};
|
7
Documentation/devicetree/bindings/input/pwm-beeper.txt
Normal file
7
Documentation/devicetree/bindings/input/pwm-beeper.txt
Normal 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
|
39
Documentation/devicetree/bindings/input/stmpe-keypad.txt
Normal file
39
Documentation/devicetree/bindings/input/stmpe-keypad.txt
Normal 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>;
|
||||
};
|
@ -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.
|
@ -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;
|
||||
};
|
||||
|
||||
/* ... */
|
||||
};
|
@ -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>;
|
||||
};
|
@ -112,17 +112,6 @@ static void __init mipid_dev_init(void)
|
||||
omapfb_set_lcd_config(&nokia770_lcd_config);
|
||||
}
|
||||
|
||||
static void __init ads7846_dev_init(void)
|
||||
{
|
||||
if (gpio_request(ADS7846_PENDOWN_GPIO, "ADS7846 pendown") < 0)
|
||||
printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
|
||||
}
|
||||
|
||||
static int ads7846_get_pendown_state(void)
|
||||
{
|
||||
return !gpio_get_value(ADS7846_PENDOWN_GPIO);
|
||||
}
|
||||
|
||||
static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = {
|
||||
.x_max = 0x0fff,
|
||||
.y_max = 0x0fff,
|
||||
@ -131,7 +120,7 @@ static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata =
|
||||
.debounce_max = 10,
|
||||
.debounce_tol = 3,
|
||||
.debounce_rep = 1,
|
||||
.get_pendown_state = ads7846_get_pendown_state,
|
||||
.gpio_pendown = ADS7846_PENDOWN_GPIO,
|
||||
};
|
||||
|
||||
static struct spi_board_info nokia770_spi_board_info[] __initdata = {
|
||||
@ -241,7 +230,6 @@ static void __init omap_nokia770_init(void)
|
||||
omap_serial_init();
|
||||
omap_register_i2c_bus(1, 100, NULL, 0);
|
||||
hwa742_dev_init();
|
||||
ads7846_dev_init();
|
||||
mipid_dev_init();
|
||||
omap1_usb_init(&nokia770_usb_config);
|
||||
nokia770_mmc_init();
|
||||
|
@ -77,9 +77,6 @@ static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
|
||||
* BU21013 ROHM touchscreen interface on the STUIBs
|
||||
*/
|
||||
|
||||
/* tracks number of bu21013 devices being enabled */
|
||||
static int bu21013_devices;
|
||||
|
||||
#define TOUCH_GPIO_PIN 84
|
||||
|
||||
#define TOUCH_XMAX 384
|
||||
@ -88,73 +85,8 @@ static int bu21013_devices;
|
||||
#define PRCMU_CLOCK_OCR 0x1CC
|
||||
#define TSC_EXT_CLOCK_9_6MHZ 0x840000
|
||||
|
||||
/**
|
||||
* bu21013_gpio_board_init : configures the touch panel.
|
||||
* @reset_pin: reset pin number
|
||||
* This function can be used to configures
|
||||
* the voltage and reset the touch panel controller.
|
||||
*/
|
||||
static int bu21013_gpio_board_init(int reset_pin)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
bu21013_devices++;
|
||||
if (bu21013_devices == 1) {
|
||||
retval = gpio_request(reset_pin, "touchp_reset");
|
||||
if (retval) {
|
||||
printk(KERN_ERR "Unable to request gpio reset_pin");
|
||||
return retval;
|
||||
}
|
||||
retval = gpio_direction_output(reset_pin, 1);
|
||||
if (retval < 0) {
|
||||
printk(KERN_ERR "%s: gpio direction failed\n",
|
||||
__func__);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* bu21013_gpio_board_exit : deconfigures the touch panel controller
|
||||
* @reset_pin: reset pin number
|
||||
* This function can be used to deconfigures the chip selection
|
||||
* for touch panel controller.
|
||||
*/
|
||||
static int bu21013_gpio_board_exit(int reset_pin)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if (bu21013_devices == 1) {
|
||||
retval = gpio_direction_output(reset_pin, 0);
|
||||
if (retval < 0) {
|
||||
printk(KERN_ERR "%s: gpio direction failed\n",
|
||||
__func__);
|
||||
return retval;
|
||||
}
|
||||
gpio_set_value(reset_pin, 0);
|
||||
}
|
||||
bu21013_devices--;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* bu21013_read_pin_val : get the interrupt pin value
|
||||
* This function can be used to get the interrupt pin value for touch panel
|
||||
* controller.
|
||||
*/
|
||||
static int bu21013_read_pin_val(void)
|
||||
{
|
||||
return gpio_get_value(TOUCH_GPIO_PIN);
|
||||
}
|
||||
|
||||
static struct bu21013_platform_device tsc_plat_device = {
|
||||
.cs_en = bu21013_gpio_board_init,
|
||||
.cs_dis = bu21013_gpio_board_exit,
|
||||
.irq_read_val = bu21013_read_pin_val,
|
||||
.irq = NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN),
|
||||
.touch_pin = TOUCH_GPIO_PIN,
|
||||
.touch_x_max = TOUCH_XMAX,
|
||||
.touch_y_max = TOUCH_YMAX,
|
||||
.ext_clk = false,
|
||||
@ -171,7 +103,6 @@ static struct i2c_board_info __initdata u8500_i2c3_devices_stuib[] = {
|
||||
I2C_BOARD_INFO("bu21013_tp", 0x5D),
|
||||
.platform_data = &tsc_plat_device,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
void __init mop500_stuib_init(void)
|
||||
|
@ -57,7 +57,7 @@ static const struct pci_device_id emu_tbl[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, emu_tbl);
|
||||
|
||||
static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct emu *emu;
|
||||
struct gameport *port;
|
||||
@ -107,7 +107,7 @@ static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id
|
||||
return error;
|
||||
}
|
||||
|
||||
static void __devexit emu_remove(struct pci_dev *pdev)
|
||||
static void emu_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct emu *emu = pci_get_drvdata(pdev);
|
||||
|
||||
@ -122,7 +122,7 @@ static struct pci_driver emu_driver = {
|
||||
.name = "Emu10k1_gameport",
|
||||
.id_table = emu_tbl,
|
||||
.probe = emu_probe,
|
||||
.remove = __devexit_p(emu_remove),
|
||||
.remove = emu_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(emu_driver);
|
||||
|
@ -78,7 +78,7 @@ static int fm801_gp_open(struct gameport *gameport, int mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
{
|
||||
struct fm801_gp *gp;
|
||||
struct gameport *port;
|
||||
@ -129,7 +129,7 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device
|
||||
return error;
|
||||
}
|
||||
|
||||
static void __devexit fm801_gp_remove(struct pci_dev *pci)
|
||||
static void fm801_gp_remove(struct pci_dev *pci)
|
||||
{
|
||||
struct fm801_gp *gp = pci_get_drvdata(pci);
|
||||
|
||||
@ -150,7 +150,7 @@ static struct pci_driver fm801_gp_driver = {
|
||||
.name = "FM801_gameport",
|
||||
.id_table = fm801_gp_id_table,
|
||||
.probe = fm801_gp_probe,
|
||||
.remove = __devexit_p(fm801_gp_remove),
|
||||
.remove = fm801_gp_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(fm801_gp_driver);
|
||||
|
@ -194,7 +194,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
|
||||
if (!mt)
|
||||
return;
|
||||
|
||||
oldest = 0;
|
||||
oldest = NULL;
|
||||
oldid = mt->trkid;
|
||||
count = 0;
|
||||
|
||||
|
@ -534,8 +534,11 @@ EXPORT_SYMBOL(input_grab_device);
|
||||
static void __input_release_device(struct input_handle *handle)
|
||||
{
|
||||
struct input_dev *dev = handle->dev;
|
||||
struct input_handle *grabber;
|
||||
|
||||
if (dev->grab == handle) {
|
||||
grabber = rcu_dereference_protected(dev->grab,
|
||||
lockdep_is_held(&dev->mutex));
|
||||
if (grabber == handle) {
|
||||
rcu_assign_pointer(dev->grab, NULL);
|
||||
/* Make sure input_pass_event() notices that grab is gone */
|
||||
synchronize_rcu();
|
||||
@ -1723,7 +1726,7 @@ EXPORT_SYMBOL_GPL(input_class);
|
||||
/**
|
||||
* input_allocate_device - allocate memory for new input device
|
||||
*
|
||||
* Returns prepared struct input_dev or NULL.
|
||||
* Returns prepared struct input_dev or %NULL.
|
||||
*
|
||||
* NOTE: Use input_free_device() to free devices that have not been
|
||||
* registered; input_unregister_device() should be used for already
|
||||
@ -1750,6 +1753,70 @@ struct input_dev *input_allocate_device(void)
|
||||
}
|
||||
EXPORT_SYMBOL(input_allocate_device);
|
||||
|
||||
struct input_devres {
|
||||
struct input_dev *input;
|
||||
};
|
||||
|
||||
static int devm_input_device_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
struct input_devres *devres = res;
|
||||
|
||||
return devres->input == data;
|
||||
}
|
||||
|
||||
static void devm_input_device_release(struct device *dev, void *res)
|
||||
{
|
||||
struct input_devres *devres = res;
|
||||
struct input_dev *input = devres->input;
|
||||
|
||||
dev_dbg(dev, "%s: dropping reference to %s\n",
|
||||
__func__, dev_name(&input->dev));
|
||||
input_put_device(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_input_allocate_device - allocate managed input device
|
||||
* @dev: device owning the input device being created
|
||||
*
|
||||
* Returns prepared struct input_dev or %NULL.
|
||||
*
|
||||
* Managed input devices do not need to be explicitly unregistered or
|
||||
* freed as it will be done automatically when owner device unbinds from
|
||||
* its driver (or binding fails). Once managed input device is allocated,
|
||||
* it is ready to be set up and registered in the same fashion as regular
|
||||
* input device. There are no special devm_input_device_[un]register()
|
||||
* variants, regular ones work with both managed and unmanaged devices.
|
||||
*
|
||||
* NOTE: the owner device is set up as parent of input device and users
|
||||
* should not override it.
|
||||
*/
|
||||
|
||||
struct input_dev *devm_input_allocate_device(struct device *dev)
|
||||
{
|
||||
struct input_dev *input;
|
||||
struct input_devres *devres;
|
||||
|
||||
devres = devres_alloc(devm_input_device_release,
|
||||
sizeof(struct input_devres), GFP_KERNEL);
|
||||
if (!devres)
|
||||
return NULL;
|
||||
|
||||
input = input_allocate_device();
|
||||
if (!input) {
|
||||
devres_free(devres);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
input->dev.parent = dev;
|
||||
input->devres_managed = true;
|
||||
|
||||
devres->input = input;
|
||||
devres_add(dev, devres);
|
||||
|
||||
return input;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_input_allocate_device);
|
||||
|
||||
/**
|
||||
* input_free_device - free memory occupied by input_dev structure
|
||||
* @dev: input device to free
|
||||
@ -1766,8 +1833,14 @@ EXPORT_SYMBOL(input_allocate_device);
|
||||
*/
|
||||
void input_free_device(struct input_dev *dev)
|
||||
{
|
||||
if (dev)
|
||||
if (dev) {
|
||||
if (dev->devres_managed)
|
||||
WARN_ON(devres_destroy(dev->dev.parent,
|
||||
devm_input_device_release,
|
||||
devm_input_device_match,
|
||||
dev));
|
||||
input_put_device(dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(input_free_device);
|
||||
|
||||
@ -1888,6 +1961,38 @@ static void input_cleanse_bitmasks(struct input_dev *dev)
|
||||
INPUT_CLEANSE_BITMASK(dev, SW, sw);
|
||||
}
|
||||
|
||||
static void __input_unregister_device(struct input_dev *dev)
|
||||
{
|
||||
struct input_handle *handle, *next;
|
||||
|
||||
input_disconnect_device(dev);
|
||||
|
||||
mutex_lock(&input_mutex);
|
||||
|
||||
list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
|
||||
handle->handler->disconnect(handle);
|
||||
WARN_ON(!list_empty(&dev->h_list));
|
||||
|
||||
del_timer_sync(&dev->timer);
|
||||
list_del_init(&dev->node);
|
||||
|
||||
input_wakeup_procfs_readers();
|
||||
|
||||
mutex_unlock(&input_mutex);
|
||||
|
||||
device_del(&dev->dev);
|
||||
}
|
||||
|
||||
static void devm_input_device_unregister(struct device *dev, void *res)
|
||||
{
|
||||
struct input_devres *devres = res;
|
||||
struct input_dev *input = devres->input;
|
||||
|
||||
dev_dbg(dev, "%s: unregistering device %s\n",
|
||||
__func__, dev_name(&input->dev));
|
||||
__input_unregister_device(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* input_register_device - register device with input core
|
||||
* @dev: device to be registered
|
||||
@ -1903,11 +2008,21 @@ static void input_cleanse_bitmasks(struct input_dev *dev)
|
||||
int input_register_device(struct input_dev *dev)
|
||||
{
|
||||
static atomic_t input_no = ATOMIC_INIT(0);
|
||||
struct input_devres *devres = NULL;
|
||||
struct input_handler *handler;
|
||||
unsigned int packet_size;
|
||||
const char *path;
|
||||
int error;
|
||||
|
||||
if (dev->devres_managed) {
|
||||
devres = devres_alloc(devm_input_device_unregister,
|
||||
sizeof(struct input_devres), GFP_KERNEL);
|
||||
if (!devres)
|
||||
return -ENOMEM;
|
||||
|
||||
devres->input = dev;
|
||||
}
|
||||
|
||||
/* Every input device generates EV_SYN/SYN_REPORT events. */
|
||||
__set_bit(EV_SYN, dev->evbit);
|
||||
|
||||
@ -1923,8 +2038,10 @@ int input_register_device(struct input_dev *dev)
|
||||
|
||||
dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2;
|
||||
dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL);
|
||||
if (!dev->vals)
|
||||
return -ENOMEM;
|
||||
if (!dev->vals) {
|
||||
error = -ENOMEM;
|
||||
goto err_devres_free;
|
||||
}
|
||||
|
||||
/*
|
||||
* If delay and period are pre-set by the driver, then autorepeating
|
||||
@ -1949,7 +2066,7 @@ int input_register_device(struct input_dev *dev)
|
||||
|
||||
error = device_add(&dev->dev);
|
||||
if (error)
|
||||
return error;
|
||||
goto err_free_vals;
|
||||
|
||||
path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
|
||||
pr_info("%s as %s\n",
|
||||
@ -1958,10 +2075,8 @@ int input_register_device(struct input_dev *dev)
|
||||
kfree(path);
|
||||
|
||||
error = mutex_lock_interruptible(&input_mutex);
|
||||
if (error) {
|
||||
device_del(&dev->dev);
|
||||
return error;
|
||||
}
|
||||
if (error)
|
||||
goto err_device_del;
|
||||
|
||||
list_add_tail(&dev->node, &input_dev_list);
|
||||
|
||||
@ -1972,7 +2087,21 @@ int input_register_device(struct input_dev *dev)
|
||||
|
||||
mutex_unlock(&input_mutex);
|
||||
|
||||
if (dev->devres_managed) {
|
||||
dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n",
|
||||
__func__, dev_name(&dev->dev));
|
||||
devres_add(dev->dev.parent, devres);
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_device_del:
|
||||
device_del(&dev->dev);
|
||||
err_free_vals:
|
||||
kfree(dev->vals);
|
||||
dev->vals = NULL;
|
||||
err_devres_free:
|
||||
devres_free(devres);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL(input_register_device);
|
||||
|
||||
@ -1985,24 +2114,20 @@ EXPORT_SYMBOL(input_register_device);
|
||||
*/
|
||||
void input_unregister_device(struct input_dev *dev)
|
||||
{
|
||||
struct input_handle *handle, *next;
|
||||
|
||||
input_disconnect_device(dev);
|
||||
|
||||
mutex_lock(&input_mutex);
|
||||
|
||||
list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
|
||||
handle->handler->disconnect(handle);
|
||||
WARN_ON(!list_empty(&dev->h_list));
|
||||
|
||||
del_timer_sync(&dev->timer);
|
||||
list_del_init(&dev->node);
|
||||
|
||||
input_wakeup_procfs_readers();
|
||||
|
||||
mutex_unlock(&input_mutex);
|
||||
|
||||
device_unregister(&dev->dev);
|
||||
if (dev->devres_managed) {
|
||||
WARN_ON(devres_destroy(dev->dev.parent,
|
||||
devm_input_device_unregister,
|
||||
devm_input_device_match,
|
||||
dev));
|
||||
__input_unregister_device(dev);
|
||||
/*
|
||||
* We do not do input_put_device() here because it will be done
|
||||
* when 2nd devres fires up.
|
||||
*/
|
||||
} else {
|
||||
__input_unregister_device(dev);
|
||||
input_put_device(dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(input_unregister_device);
|
||||
|
||||
|
@ -85,7 +85,10 @@ static int as5011_i2c_write(struct i2c_client *client,
|
||||
{
|
||||
uint8_t data[2] = { aregaddr, avalue };
|
||||
struct i2c_msg msg = {
|
||||
client->addr, I2C_M_IGNORE_NAK, 2, (uint8_t *)data
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_IGNORE_NAK,
|
||||
.len = 2,
|
||||
.buf = (uint8_t *)data
|
||||
};
|
||||
int error;
|
||||
|
||||
@ -98,8 +101,18 @@ static int as5011_i2c_read(struct i2c_client *client,
|
||||
{
|
||||
uint8_t data[2] = { aregaddr };
|
||||
struct i2c_msg msg_set[2] = {
|
||||
{ client->addr, I2C_M_REV_DIR_ADDR, 1, (uint8_t *)data },
|
||||
{ client->addr, I2C_M_RD | I2C_M_NOSTART, 1, (uint8_t *)data }
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_REV_DIR_ADDR,
|
||||
.len = 1,
|
||||
.buf = (uint8_t *)data
|
||||
},
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_RD | I2C_M_NOSTART,
|
||||
.len = 1,
|
||||
.buf = (uint8_t *)data
|
||||
}
|
||||
};
|
||||
int error;
|
||||
|
||||
@ -144,7 +157,7 @@ out:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit as5011_configure_chip(struct as5011_device *as5011,
|
||||
static int as5011_configure_chip(struct as5011_device *as5011,
|
||||
const struct as5011_platform_data *plat_dat)
|
||||
{
|
||||
struct i2c_client *client = as5011->i2c_client;
|
||||
@ -212,8 +225,8 @@ static int __devinit as5011_configure_chip(struct as5011_device *as5011,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit as5011_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int as5011_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct as5011_platform_data *plat_data;
|
||||
struct as5011_device *as5011;
|
||||
@ -328,7 +341,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit as5011_remove(struct i2c_client *client)
|
||||
static int as5011_remove(struct i2c_client *client)
|
||||
{
|
||||
struct as5011_device *as5011 = i2c_get_clientdata(client);
|
||||
|
||||
@ -353,7 +366,7 @@ static struct i2c_driver as5011_driver = {
|
||||
.name = "as5011",
|
||||
},
|
||||
.probe = as5011_probe,
|
||||
.remove = __devexit_p(as5011_remove),
|
||||
.remove = as5011_remove,
|
||||
.id_table = as5011_id,
|
||||
};
|
||||
|
||||
|
@ -78,7 +78,7 @@ static void dc_pad_close(struct input_dev *dev)
|
||||
}
|
||||
|
||||
/* allow the controller to be used */
|
||||
static int __devinit probe_maple_controller(struct device *dev)
|
||||
static int probe_maple_controller(struct device *dev)
|
||||
{
|
||||
static const short btn_bit[32] = {
|
||||
BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1,
|
||||
@ -157,7 +157,7 @@ fail:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit remove_maple_controller(struct device *dev)
|
||||
static int remove_maple_controller(struct device *dev)
|
||||
{
|
||||
struct maple_device *mdev = to_maple_dev(dev);
|
||||
struct dc_pad *pad = maple_get_drvdata(mdev);
|
||||
@ -175,7 +175,7 @@ static struct maple_driver dc_pad_driver = {
|
||||
.drv = {
|
||||
.name = "Dreamcast_controller",
|
||||
.probe = probe_maple_controller,
|
||||
.remove = __devexit_p(remove_maple_controller),
|
||||
.remove = remove_maple_controller,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev)
|
||||
struct walkera_dev *w = input_get_drvdata(dev);
|
||||
|
||||
parport_disable_irq(w->parport);
|
||||
hrtimer_cancel(&w->timer);
|
||||
}
|
||||
|
||||
static int walkera0701_connect(struct walkera_dev *w, int parport)
|
||||
@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
|
||||
if (parport_claim(w->pardevice))
|
||||
goto init_err1;
|
||||
|
||||
hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
w->timer.function = timer_handler;
|
||||
|
||||
w->input_dev = input_allocate_device();
|
||||
if (!w->input_dev)
|
||||
goto init_err2;
|
||||
@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
|
||||
if (err)
|
||||
goto init_err3;
|
||||
|
||||
hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
w->timer.function = timer_handler;
|
||||
return 0;
|
||||
|
||||
init_err3:
|
||||
@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
|
||||
|
||||
static void walkera0701_disconnect(struct walkera_dev *w)
|
||||
{
|
||||
hrtimer_cancel(&w->timer);
|
||||
input_unregister_device(w->input_dev);
|
||||
parport_release(w->pardevice);
|
||||
parport_unregister_device(w->pardevice);
|
||||
|
@ -118,11 +118,12 @@ static const struct xpad_device {
|
||||
u8 xtype;
|
||||
} xpad_device[] = {
|
||||
{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
|
||||
{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
|
||||
{ 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
|
||||
{ 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
|
||||
{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
|
||||
{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
|
||||
{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
|
||||
{ 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
|
||||
{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
|
||||
{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
|
||||
{ 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
|
||||
@ -136,9 +137,12 @@ static const struct xpad_device {
|
||||
{ 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
|
||||
{ 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", XTYPE_XBOX360 },
|
||||
{ 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
|
||||
{ 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
|
||||
{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
|
||||
@ -148,24 +152,28 @@ static const struct xpad_device {
|
||||
{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
|
||||
{ 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
|
||||
{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
|
||||
{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
|
||||
{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
|
||||
{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
|
||||
{ 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
|
||||
{ 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
|
||||
{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
|
||||
{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
|
||||
};
|
||||
@ -235,7 +243,7 @@ static const signed short xpad_abs_triggers[] = {
|
||||
{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
|
||||
{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
|
||||
|
||||
static struct usb_device_id xpad_table [] = {
|
||||
static struct usb_device_id xpad_table[] = {
|
||||
{ USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */
|
||||
XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */
|
||||
@ -248,10 +256,11 @@ static struct usb_device_id xpad_table [] = {
|
||||
XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
|
||||
XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
|
||||
XPAD_XBOX360_VENDOR(0x24c6), /* PowerA Controllers */
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE (usb, xpad_table);
|
||||
MODULE_DEVICE_TABLE(usb, xpad_table);
|
||||
|
||||
struct usb_xpad {
|
||||
struct input_dev *dev; /* input device interface */
|
||||
@ -783,7 +792,7 @@ static int xpad_open(struct input_dev *dev)
|
||||
struct usb_xpad *xpad = input_get_drvdata(dev);
|
||||
|
||||
/* URB was submitted in probe */
|
||||
if(xpad->xtype == XTYPE_XBOX360W)
|
||||
if (xpad->xtype == XTYPE_XBOX360W)
|
||||
return 0;
|
||||
|
||||
xpad->irq_in->dev = xpad->udev;
|
||||
|
@ -134,7 +134,7 @@ config KEYBOARD_QT1070
|
||||
|
||||
config KEYBOARD_QT2160
|
||||
tristate "Atmel AT42QT2160 Touch Sensor Chip"
|
||||
depends on I2C && EXPERIMENTAL
|
||||
depends on I2C
|
||||
help
|
||||
If you say yes here you get support for Atmel AT42QT2160 Touch
|
||||
Sensor chip as a keyboard input.
|
||||
|
@ -69,7 +69,7 @@ static int adp5520_keys_notifier(struct notifier_block *nb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit adp5520_keys_probe(struct platform_device *pdev)
|
||||
static int adp5520_keys_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct input_dev *input;
|
||||
@ -182,7 +182,7 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit adp5520_keys_remove(struct platform_device *pdev)
|
||||
static int adp5520_keys_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct adp5520_keys *dev = platform_get_drvdata(pdev);
|
||||
|
||||
@ -200,7 +200,7 @@ static struct platform_driver adp5520_keys_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = adp5520_keys_probe,
|
||||
.remove = __devexit_p(adp5520_keys_remove),
|
||||
.remove = adp5520_keys_remove,
|
||||
};
|
||||
module_platform_driver(adp5520_keys_driver);
|
||||
|
||||
|
@ -145,7 +145,7 @@ static int adp5588_gpio_direction_output(struct gpio_chip *chip,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad,
|
||||
static int adp5588_build_gpiomap(struct adp5588_kpad *kpad,
|
||||
const struct adp5588_kpad_platform_data *pdata)
|
||||
{
|
||||
bool pin_used[ADP5588_MAXGPIO];
|
||||
@ -170,7 +170,7 @@ static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad,
|
||||
return n_unused;
|
||||
}
|
||||
|
||||
static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad)
|
||||
static int adp5588_gpio_add(struct adp5588_kpad *kpad)
|
||||
{
|
||||
struct device *dev = &kpad->client->dev;
|
||||
const struct adp5588_kpad_platform_data *pdata = dev->platform_data;
|
||||
@ -224,7 +224,7 @@ static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __devexit adp5588_gpio_remove(struct adp5588_kpad *kpad)
|
||||
static void adp5588_gpio_remove(struct adp5588_kpad *kpad)
|
||||
{
|
||||
struct device *dev = &kpad->client->dev;
|
||||
const struct adp5588_kpad_platform_data *pdata = dev->platform_data;
|
||||
@ -319,7 +319,7 @@ static irqreturn_t adp5588_irq(int irq, void *handle)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit adp5588_setup(struct i2c_client *client)
|
||||
static int adp5588_setup(struct i2c_client *client)
|
||||
{
|
||||
const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;
|
||||
const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data;
|
||||
@ -382,7 +382,7 @@ static int __devinit adp5588_setup(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad)
|
||||
static void adp5588_report_switch_state(struct adp5588_kpad *kpad)
|
||||
{
|
||||
int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1);
|
||||
int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2);
|
||||
@ -420,8 +420,8 @@ static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad)
|
||||
}
|
||||
|
||||
|
||||
static int __devinit adp5588_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adp5588_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct adp5588_kpad *kpad;
|
||||
const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;
|
||||
@ -587,7 +587,7 @@ static int __devinit adp5588_probe(struct i2c_client *client,
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit adp5588_remove(struct i2c_client *client)
|
||||
static int adp5588_remove(struct i2c_client *client)
|
||||
{
|
||||
struct adp5588_kpad *kpad = i2c_get_clientdata(client);
|
||||
|
||||
@ -650,7 +650,7 @@ static struct i2c_driver adp5588_driver = {
|
||||
#endif
|
||||
},
|
||||
.probe = adp5588_probe,
|
||||
.remove = __devexit_p(adp5588_remove),
|
||||
.remove = adp5588_remove,
|
||||
.id_table = adp5588_id,
|
||||
};
|
||||
|
||||
|
@ -464,7 +464,7 @@ static int adp5589_gpio_direction_output(struct gpio_chip *chip,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad,
|
||||
static int adp5589_build_gpiomap(struct adp5589_kpad *kpad,
|
||||
const struct adp5589_kpad_platform_data *pdata)
|
||||
{
|
||||
bool pin_used[ADP5589_MAXGPIO];
|
||||
@ -496,7 +496,7 @@ static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad,
|
||||
return n_unused;
|
||||
}
|
||||
|
||||
static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad)
|
||||
static int adp5589_gpio_add(struct adp5589_kpad *kpad)
|
||||
{
|
||||
struct device *dev = &kpad->client->dev;
|
||||
const struct adp5589_kpad_platform_data *pdata = dev->platform_data;
|
||||
@ -550,7 +550,7 @@ static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __devexit adp5589_gpio_remove(struct adp5589_kpad *kpad)
|
||||
static void adp5589_gpio_remove(struct adp5589_kpad *kpad)
|
||||
{
|
||||
struct device *dev = &kpad->client->dev;
|
||||
const struct adp5589_kpad_platform_data *pdata = dev->platform_data;
|
||||
@ -641,8 +641,7 @@ static irqreturn_t adp5589_irq(int irq, void *handle)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad,
|
||||
unsigned short key)
|
||||
static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -655,7 +654,7 @@ static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int __devinit adp5589_setup(struct adp5589_kpad *kpad)
|
||||
static int adp5589_setup(struct adp5589_kpad *kpad)
|
||||
{
|
||||
struct i2c_client *client = kpad->client;
|
||||
const struct adp5589_kpad_platform_data *pdata =
|
||||
@ -820,7 +819,7 @@ static int __devinit adp5589_setup(struct adp5589_kpad *kpad)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad)
|
||||
static void adp5589_report_switch_state(struct adp5589_kpad *kpad)
|
||||
{
|
||||
int gpi_stat_tmp, pin_loc;
|
||||
int i;
|
||||
@ -860,8 +859,8 @@ static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad)
|
||||
input_sync(kpad->input);
|
||||
}
|
||||
|
||||
static int __devinit adp5589_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adp5589_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct adp5589_kpad *kpad;
|
||||
const struct adp5589_kpad_platform_data *pdata =
|
||||
@ -1045,7 +1044,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit adp5589_remove(struct i2c_client *client)
|
||||
static int adp5589_remove(struct i2c_client *client)
|
||||
{
|
||||
struct adp5589_kpad *kpad = i2c_get_clientdata(client);
|
||||
|
||||
@ -1104,7 +1103,7 @@ static struct i2c_driver adp5589_driver = {
|
||||
.pm = &adp5589_dev_pm_ops,
|
||||
},
|
||||
.probe = adp5589_probe,
|
||||
.remove = __devexit_p(adp5589_remove),
|
||||
.remove = adp5589_remove,
|
||||
.id_table = adp5589_id,
|
||||
};
|
||||
|
||||
|
@ -177,7 +177,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit bfin_kpad_probe(struct platform_device *pdev)
|
||||
static int bfin_kpad_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct bf54x_kpad *bf54x_kpad;
|
||||
struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;
|
||||
@ -331,7 +331,7 @@ out:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit bfin_kpad_remove(struct platform_device *pdev)
|
||||
static int bfin_kpad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev);
|
||||
@ -390,7 +390,7 @@ static struct platform_driver bfin_kpad_device_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = bfin_kpad_probe,
|
||||
.remove = __devexit_p(bfin_kpad_remove),
|
||||
.remove = bfin_kpad_remove,
|
||||
.suspend = bfin_kpad_suspend,
|
||||
.resume = bfin_kpad_resume,
|
||||
};
|
||||
|
@ -303,7 +303,7 @@ fail1:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit davinci_ks_remove(struct platform_device *pdev)
|
||||
static int davinci_ks_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct davinci_ks *davinci_ks = platform_get_drvdata(pdev);
|
||||
|
||||
@ -326,7 +326,7 @@ static struct platform_driver davinci_ks_driver = {
|
||||
.name = "davinci_keyscan",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.remove = __devexit_p(davinci_ks_remove),
|
||||
.remove = davinci_ks_remove,
|
||||
};
|
||||
|
||||
static int __init davinci_ks_init(void)
|
||||
|
@ -232,7 +232,7 @@ static int ep93xx_keypad_resume(struct device *dev)
|
||||
static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,
|
||||
ep93xx_keypad_suspend, ep93xx_keypad_resume);
|
||||
|
||||
static int __devinit ep93xx_keypad_probe(struct platform_device *pdev)
|
||||
static int ep93xx_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ep93xx_keypad *keypad;
|
||||
const struct matrix_keymap_data *keymap_data;
|
||||
@ -346,7 +346,7 @@ failed_free:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit ep93xx_keypad_remove(struct platform_device *pdev)
|
||||
static int ep93xx_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
|
||||
struct resource *res;
|
||||
@ -380,7 +380,7 @@ static struct platform_driver ep93xx_keypad_driver = {
|
||||
.pm = &ep93xx_keypad_pm_ops,
|
||||
},
|
||||
.probe = ep93xx_keypad_probe,
|
||||
.remove = __devexit_p(ep93xx_keypad_remove),
|
||||
.remove = ep93xx_keypad_remove,
|
||||
};
|
||||
module_platform_driver(ep93xx_keypad_driver);
|
||||
|
||||
|
@ -423,10 +423,10 @@ out:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
|
||||
struct input_dev *input,
|
||||
struct gpio_button_data *bdata,
|
||||
const struct gpio_keys_button *button)
|
||||
static int gpio_keys_setup_key(struct platform_device *pdev,
|
||||
struct input_dev *input,
|
||||
struct gpio_button_data *bdata,
|
||||
const struct gpio_keys_button *button)
|
||||
{
|
||||
const char *desc = button->desc ? button->desc : "gpio_keys";
|
||||
struct device *dev = &pdev->dev;
|
||||
@ -440,21 +440,13 @@ static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
|
||||
|
||||
if (gpio_is_valid(button->gpio)) {
|
||||
|
||||
error = gpio_request(button->gpio, desc);
|
||||
error = gpio_request_one(button->gpio, GPIOF_IN, desc);
|
||||
if (error < 0) {
|
||||
dev_err(dev, "Failed to request GPIO %d, error %d\n",
|
||||
button->gpio, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
error = gpio_direction_input(button->gpio);
|
||||
if (error < 0) {
|
||||
dev_err(dev,
|
||||
"Failed to configure direction for GPIO %d, error %d\n",
|
||||
button->gpio, error);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (button->debounce_interval) {
|
||||
error = gpio_set_debounce(button->gpio,
|
||||
button->debounce_interval * 1000);
|
||||
@ -526,12 +518,35 @@ fail:
|
||||
return error;
|
||||
}
|
||||
|
||||
static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata)
|
||||
{
|
||||
struct input_dev *input = ddata->input;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ddata->pdata->nbuttons; i++) {
|
||||
struct gpio_button_data *bdata = &ddata->data[i];
|
||||
if (gpio_is_valid(bdata->button->gpio))
|
||||
gpio_keys_gpio_report_event(bdata);
|
||||
}
|
||||
input_sync(input);
|
||||
}
|
||||
|
||||
static int gpio_keys_open(struct input_dev *input)
|
||||
{
|
||||
struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
|
||||
const struct gpio_keys_platform_data *pdata = ddata->pdata;
|
||||
int error;
|
||||
|
||||
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)
|
||||
@ -551,7 +566,7 @@ static void gpio_keys_close(struct input_dev *input)
|
||||
/*
|
||||
* Translate OpenFirmware node properties into platform_data
|
||||
*/
|
||||
static struct gpio_keys_platform_data * __devinit
|
||||
static struct gpio_keys_platform_data *
|
||||
gpio_keys_get_devtree_pdata(struct device *dev)
|
||||
{
|
||||
struct device_node *node, *pp;
|
||||
@ -658,7 +673,7 @@ static void gpio_remove_key(struct gpio_button_data *bdata)
|
||||
gpio_free(bdata->button->gpio);
|
||||
}
|
||||
|
||||
static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
||||
static int gpio_keys_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
|
||||
@ -731,14 +746,6 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
||||
goto fail3;
|
||||
}
|
||||
|
||||
/* get current state of buttons that are connected to GPIOs */
|
||||
for (i = 0; i < pdata->nbuttons; i++) {
|
||||
struct gpio_button_data *bdata = &ddata->data[i];
|
||||
if (gpio_is_valid(bdata->button->gpio))
|
||||
gpio_keys_gpio_report_event(bdata);
|
||||
}
|
||||
input_sync(input);
|
||||
|
||||
device_init_wakeup(&pdev->dev, wakeup);
|
||||
|
||||
return 0;
|
||||
@ -760,7 +767,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gpio_keys_remove(struct platform_device *pdev)
|
||||
static int gpio_keys_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
|
||||
struct input_dev *input = ddata->input;
|
||||
@ -788,6 +795,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
|
||||
static int gpio_keys_suspend(struct device *dev)
|
||||
{
|
||||
struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
|
||||
struct input_dev *input = ddata->input;
|
||||
int i;
|
||||
|
||||
if (device_may_wakeup(dev)) {
|
||||
@ -796,6 +804,11 @@ static int gpio_keys_suspend(struct device *dev)
|
||||
if (bdata->button->wakeup)
|
||||
enable_irq_wake(bdata->irq);
|
||||
}
|
||||
} else {
|
||||
mutex_lock(&input->mutex);
|
||||
if (input->users)
|
||||
gpio_keys_close(input);
|
||||
mutex_unlock(&input->mutex);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -804,18 +817,27 @@ static int gpio_keys_suspend(struct device *dev)
|
||||
static int gpio_keys_resume(struct device *dev)
|
||||
{
|
||||
struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
|
||||
struct input_dev *input = ddata->input;
|
||||
int error = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ddata->pdata->nbuttons; i++) {
|
||||
struct gpio_button_data *bdata = &ddata->data[i];
|
||||
if (bdata->button->wakeup && device_may_wakeup(dev))
|
||||
disable_irq_wake(bdata->irq);
|
||||
|
||||
if (gpio_is_valid(bdata->button->gpio))
|
||||
gpio_keys_gpio_report_event(bdata);
|
||||
if (device_may_wakeup(dev)) {
|
||||
for (i = 0; i < ddata->pdata->nbuttons; i++) {
|
||||
struct gpio_button_data *bdata = &ddata->data[i];
|
||||
if (bdata->button->wakeup)
|
||||
disable_irq_wake(bdata->irq);
|
||||
}
|
||||
} else {
|
||||
mutex_lock(&input->mutex);
|
||||
if (input->users)
|
||||
error = gpio_keys_open(input);
|
||||
mutex_unlock(&input->mutex);
|
||||
}
|
||||
input_sync(ddata->input);
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
gpio_keys_report_state(ddata);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
@ -824,7 +846,7 @@ static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume);
|
||||
|
||||
static struct platform_driver gpio_keys_device_driver = {
|
||||
.probe = gpio_keys_probe,
|
||||
.remove = __devexit_p(gpio_keys_remove),
|
||||
.remove = gpio_keys_remove,
|
||||
.driver = {
|
||||
.name = "gpio-keys",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -103,8 +103,7 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct gpio_keys_platform_data * __devinit
|
||||
gpio_keys_polled_get_devtree_pdata(struct device *dev)
|
||||
static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)
|
||||
{
|
||||
struct device_node *node, *pp;
|
||||
struct gpio_keys_platform_data *pdata;
|
||||
@ -196,7 +195,7 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
|
||||
@ -246,7 +245,6 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
|
||||
input = poll_dev->input;
|
||||
|
||||
input->evbit[0] = BIT(EV_KEY);
|
||||
input->name = pdev->name;
|
||||
input->phys = DRV_NAME"/input0";
|
||||
input->dev.parent = &pdev->dev;
|
||||
@ -256,6 +254,10 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
input->id.product = 0x0001;
|
||||
input->id.version = 0x0100;
|
||||
|
||||
__set_bit(EV_KEY, input->evbit);
|
||||
if (pdata->rep)
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
for (i = 0; i < pdata->nbuttons; i++) {
|
||||
struct gpio_keys_button *button = &pdata->buttons[i];
|
||||
struct gpio_keys_button_data *bdata = &bdev->data[i];
|
||||
@ -268,22 +270,14 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
error = gpio_request(gpio,
|
||||
button->desc ? button->desc : DRV_NAME);
|
||||
error = gpio_request_one(gpio, GPIOF_IN,
|
||||
button->desc ?: DRV_NAME);
|
||||
if (error) {
|
||||
dev_err(dev, "unable to claim gpio %u, err=%d\n",
|
||||
gpio, error);
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
error = gpio_direction_input(gpio);
|
||||
if (error) {
|
||||
dev_err(dev,
|
||||
"unable to set direction on gpio %u, err=%d\n",
|
||||
gpio, error);
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
bdata->can_sleep = gpio_cansleep(gpio);
|
||||
bdata->last_state = -1;
|
||||
bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
|
||||
@ -329,7 +323,7 @@ err_free_pdata:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
|
||||
static int gpio_keys_polled_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev);
|
||||
const struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
@ -357,7 +351,7 @@ static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver gpio_keys_polled_driver = {
|
||||
.probe = gpio_keys_polled_probe,
|
||||
.remove = __devexit_p(gpio_keys_polled_remove),
|
||||
.remove = gpio_keys_polled_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -200,7 +200,7 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
|
||||
|
||||
|
||||
/* initialize HIL */
|
||||
static int __devinit hil_keyb_init(void)
|
||||
static int hil_keyb_init(void)
|
||||
{
|
||||
unsigned char c;
|
||||
unsigned int i, kbid;
|
||||
@ -286,7 +286,7 @@ err1:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __devexit hil_keyb_exit(void)
|
||||
static void hil_keyb_exit(void)
|
||||
{
|
||||
if (HIL_IRQ)
|
||||
free_irq(HIL_IRQ, hil_dev.dev_id);
|
||||
@ -299,7 +299,7 @@ static void __devexit hil_keyb_exit(void)
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PARISC)
|
||||
static int __devinit hil_probe_chip(struct parisc_device *dev)
|
||||
static int hil_probe_chip(struct parisc_device *dev)
|
||||
{
|
||||
/* Only allow one HIL keyboard */
|
||||
if (hil_dev.dev)
|
||||
@ -320,7 +320,7 @@ static int __devinit hil_probe_chip(struct parisc_device *dev)
|
||||
return hil_keyb_init();
|
||||
}
|
||||
|
||||
static int __devexit hil_remove_chip(struct parisc_device *dev)
|
||||
static int hil_remove_chip(struct parisc_device *dev)
|
||||
{
|
||||
hil_keyb_exit();
|
||||
|
||||
@ -341,7 +341,7 @@ static struct parisc_driver hil_driver = {
|
||||
.name = "hil",
|
||||
.id_table = hil_tbl,
|
||||
.probe = hil_probe_chip,
|
||||
.remove = __devexit_p(hil_remove_chip),
|
||||
.remove = hil_remove_chip,
|
||||
};
|
||||
|
||||
static int __init hil_init(void)
|
||||
|
@ -362,7 +362,8 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)
|
||||
writew(reg_val, keypad->mmio_base + KPSR);
|
||||
|
||||
/* Colums as open drain and disable all rows */
|
||||
writew(0xff00, keypad->mmio_base + KPCR);
|
||||
reg_val = (keypad->cols_en_mask & 0xff) << 8;
|
||||
writew(reg_val, keypad->mmio_base + KPCR);
|
||||
}
|
||||
|
||||
static void imx_keypad_close(struct input_dev *dev)
|
||||
@ -413,7 +414,7 @@ open_err:
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int __devinit imx_keypad_probe(struct platform_device *pdev)
|
||||
static int imx_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data;
|
||||
struct imx_keypad *keypad;
|
||||
@ -554,7 +555,7 @@ failed_rel_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit imx_keypad_remove(struct platform_device *pdev)
|
||||
static int imx_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct imx_keypad *keypad = platform_get_drvdata(pdev);
|
||||
struct resource *res;
|
||||
@ -632,7 +633,7 @@ static struct platform_driver imx_keypad_driver = {
|
||||
.pm = &imx_kbd_pm_ops,
|
||||
},
|
||||
.probe = imx_keypad_probe,
|
||||
.remove = __devexit_p(imx_keypad_remove),
|
||||
.remove = imx_keypad_remove,
|
||||
};
|
||||
module_platform_driver(imx_keypad_driver);
|
||||
|
||||
|
@ -179,7 +179,7 @@ static void jornadakbd680_poll(struct input_polled_dev *dev)
|
||||
memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE);
|
||||
}
|
||||
|
||||
static int __devinit jornada680kbd_probe(struct platform_device *pdev)
|
||||
static int jornada680kbd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct jornadakbd *jornadakbd;
|
||||
struct input_polled_dev *poll_dev;
|
||||
@ -240,7 +240,7 @@ static int __devinit jornada680kbd_probe(struct platform_device *pdev)
|
||||
|
||||
}
|
||||
|
||||
static int __devexit jornada680kbd_remove(struct platform_device *pdev)
|
||||
static int jornada680kbd_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
|
||||
|
||||
@ -258,7 +258,7 @@ static struct platform_driver jornada680kbd_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = jornada680kbd_probe,
|
||||
.remove = __devexit_p(jornada680kbd_remove),
|
||||
.remove = jornada680kbd_remove,
|
||||
};
|
||||
module_platform_driver(jornada680kbd_driver);
|
||||
|
||||
|
@ -94,7 +94,7 @@ static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
};
|
||||
|
||||
static int __devinit jornada720_kbd_probe(struct platform_device *pdev)
|
||||
static int jornada720_kbd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct jornadakbd *jornadakbd;
|
||||
struct input_dev *input_dev;
|
||||
@ -152,7 +152,7 @@ static int __devinit jornada720_kbd_probe(struct platform_device *pdev)
|
||||
return err;
|
||||
};
|
||||
|
||||
static int __devexit jornada720_kbd_remove(struct platform_device *pdev)
|
||||
static int jornada720_kbd_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct jornadakbd *jornadakbd = platform_get_drvdata(pdev);
|
||||
|
||||
@ -173,6 +173,6 @@ static struct platform_driver jornada720_kbd_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = jornada720_kbd_probe,
|
||||
.remove = __devexit_p(jornada720_kbd_remove),
|
||||
.remove = jornada720_kbd_remove,
|
||||
};
|
||||
module_platform_driver(jornada720_kbd_driver);
|
||||
|
@ -624,7 +624,7 @@ static ssize_t lm8323_set_disable(struct device *dev,
|
||||
}
|
||||
static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable);
|
||||
|
||||
static int __devinit lm8323_probe(struct i2c_client *client,
|
||||
static int lm8323_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct lm8323_platform_data *pdata = client->dev.platform_data;
|
||||
@ -764,7 +764,7 @@ fail1:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit lm8323_remove(struct i2c_client *client)
|
||||
static int lm8323_remove(struct i2c_client *client)
|
||||
{
|
||||
struct lm8323_chip *lm = i2c_get_clientdata(client);
|
||||
int i;
|
||||
@ -846,7 +846,7 @@ static struct i2c_driver lm8323_i2c_driver = {
|
||||
.pm = &lm8323_pm_ops,
|
||||
},
|
||||
.probe = lm8323_probe,
|
||||
.remove = __devexit_p(lm8323_remove),
|
||||
.remove = lm8323_remove,
|
||||
.id_table = lm8323_id,
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, lm8323_id);
|
||||
|
@ -128,7 +128,7 @@ static irqreturn_t lm8333_irq_thread(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit lm8333_probe(struct i2c_client *client,
|
||||
static int lm8333_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct lm8333_platform_data *pdata = client->dev.platform_data;
|
||||
@ -202,7 +202,7 @@ static int __devinit lm8333_probe(struct i2c_client *client,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit lm8333_remove(struct i2c_client *client)
|
||||
static int lm8333_remove(struct i2c_client *client)
|
||||
{
|
||||
struct lm8333 *lm8333 = i2c_get_clientdata(client);
|
||||
|
||||
@ -225,7 +225,7 @@ static struct i2c_driver lm8333_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = lm8333_probe,
|
||||
.remove = __devexit_p(lm8333_remove),
|
||||
.remove = lm8333_remove,
|
||||
.id_table = lm8333_id,
|
||||
};
|
||||
module_i2c_driver(lm8333_driver);
|
||||
|
@ -46,7 +46,7 @@ MODULE_LICENSE("GPL");
|
||||
#define KEY_CENTER KEY_F15
|
||||
|
||||
static const unsigned char
|
||||
locomokbd_keycode[LOCOMOKBD_NUMKEYS] __devinitconst = {
|
||||
locomokbd_keycode[LOCOMOKBD_NUMKEYS] = {
|
||||
0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0, /* 0 - 9 */
|
||||
0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT, /* 10 - 19 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 - 29 */
|
||||
@ -236,7 +236,7 @@ static void locomokbd_close(struct input_dev *dev)
|
||||
locomo_writel(r, locomokbd->base + LOCOMO_KIC);
|
||||
}
|
||||
|
||||
static int __devinit locomokbd_probe(struct locomo_dev *dev)
|
||||
static int locomokbd_probe(struct locomo_dev *dev)
|
||||
{
|
||||
struct locomokbd *locomokbd;
|
||||
struct input_dev *input_dev;
|
||||
@ -321,7 +321,7 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit locomokbd_remove(struct locomo_dev *dev)
|
||||
static int locomokbd_remove(struct locomo_dev *dev)
|
||||
{
|
||||
struct locomokbd *locomokbd = locomo_get_drvdata(dev);
|
||||
|
||||
@ -345,7 +345,7 @@ static struct locomo_driver keyboard_driver = {
|
||||
},
|
||||
.devid = LOCOMO_DEVID_KEYBOARD,
|
||||
.probe = locomokbd_probe,
|
||||
.remove = __devexit_p(locomokbd_remove),
|
||||
.remove = locomokbd_remove,
|
||||
};
|
||||
|
||||
static int __init locomokbd_init(void)
|
||||
|
@ -139,7 +139,7 @@ static void lpc32xx_kscan_close(struct input_dev *dev)
|
||||
clk_disable_unprepare(kscandat->clk);
|
||||
}
|
||||
|
||||
static int __devinit lpc32xx_parse_dt(struct device *dev,
|
||||
static int lpc32xx_parse_dt(struct device *dev,
|
||||
struct lpc32xx_kscan_drv *kscandat)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
@ -166,7 +166,7 @@ static int __devinit lpc32xx_parse_dt(struct device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit lpc32xx_kscan_probe(struct platform_device *pdev)
|
||||
static int lpc32xx_kscan_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct lpc32xx_kscan_drv *kscandat;
|
||||
struct input_dev *input;
|
||||
@ -310,7 +310,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit lpc32xx_kscan_remove(struct platform_device *pdev)
|
||||
static int lpc32xx_kscan_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev);
|
||||
|
||||
@ -377,7 +377,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_kscan_match);
|
||||
|
||||
static struct platform_driver lpc32xx_kscan_driver = {
|
||||
.probe = lpc32xx_kscan_probe,
|
||||
.remove = __devexit_p(lpc32xx_kscan_remove),
|
||||
.remove = lpc32xx_kscan_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -23,6 +23,9 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
struct matrix_keypad {
|
||||
const struct matrix_keypad_platform_data *pdata;
|
||||
@ -37,8 +40,6 @@ struct matrix_keypad {
|
||||
bool scan_pending;
|
||||
bool stopped;
|
||||
bool gpio_all_disabled;
|
||||
|
||||
unsigned short keycodes[];
|
||||
};
|
||||
|
||||
/*
|
||||
@ -118,6 +119,7 @@ static void matrix_keypad_scan(struct work_struct *work)
|
||||
struct matrix_keypad *keypad =
|
||||
container_of(work, struct matrix_keypad, work.work);
|
||||
struct input_dev *input_dev = keypad->input_dev;
|
||||
const unsigned short *keycodes = input_dev->keycode;
|
||||
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
|
||||
uint32_t new_state[MATRIX_MAX_COLS];
|
||||
int row, col, code;
|
||||
@ -153,7 +155,7 @@ static void matrix_keypad_scan(struct work_struct *work)
|
||||
code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
|
||||
input_event(input_dev, EV_MSC, MSC_SCAN, code);
|
||||
input_report_key(input_dev,
|
||||
keypad->keycodes[code],
|
||||
keycodes[code],
|
||||
new_state[col] & (1 << row));
|
||||
}
|
||||
}
|
||||
@ -299,8 +301,8 @@ static int matrix_keypad_resume(struct device *dev)
|
||||
static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops,
|
||||
matrix_keypad_suspend, matrix_keypad_resume);
|
||||
|
||||
static int __devinit matrix_keypad_init_gpio(struct platform_device *pdev,
|
||||
struct matrix_keypad *keypad)
|
||||
static int matrix_keypad_init_gpio(struct platform_device *pdev,
|
||||
struct matrix_keypad *keypad)
|
||||
{
|
||||
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
|
||||
int i, err;
|
||||
@ -394,33 +396,95 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
|
||||
gpio_free(pdata->col_gpios[i]);
|
||||
}
|
||||
|
||||
static int __devinit matrix_keypad_probe(struct platform_device *pdev)
|
||||
#ifdef CONFIG_OF
|
||||
static struct matrix_keypad_platform_data *
|
||||
matrix_keypad_parse_dt(struct device *dev)
|
||||
{
|
||||
const struct matrix_keypad_platform_data *pdata;
|
||||
const struct matrix_keymap_data *keymap_data;
|
||||
struct matrix_keypad *keypad;
|
||||
struct input_dev *input_dev;
|
||||
unsigned int row_shift;
|
||||
size_t keymap_size;
|
||||
int err;
|
||||
struct matrix_keypad_platform_data *pdata;
|
||||
struct device_node *np = dev->of_node;
|
||||
unsigned int *gpios;
|
||||
int i;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "no platform data defined\n");
|
||||
return -EINVAL;
|
||||
if (!np) {
|
||||
dev_err(dev, "device lacks DT data\n");
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
keymap_data = pdata->keymap_data;
|
||||
if (!keymap_data) {
|
||||
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
dev_err(dev, "could not allocate memory for platform data\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
pdata->num_row_gpios = of_gpio_named_count(np, "row-gpios");
|
||||
pdata->num_col_gpios = of_gpio_named_count(np, "col-gpios");
|
||||
if (!pdata->num_row_gpios || !pdata->num_col_gpios) {
|
||||
dev_err(dev, "number of keypad rows/columns not specified\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
if (of_get_property(np, "linux,no-autorepeat", NULL))
|
||||
pdata->no_autorepeat = true;
|
||||
if (of_get_property(np, "linux,wakeup", NULL))
|
||||
pdata->wakeup = true;
|
||||
if (of_get_property(np, "gpio-activelow", NULL))
|
||||
pdata->active_low = true;
|
||||
|
||||
of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms);
|
||||
of_property_read_u32(np, "col-scan-delay-us",
|
||||
&pdata->col_scan_delay_us);
|
||||
|
||||
gpios = devm_kzalloc(dev,
|
||||
sizeof(unsigned int) *
|
||||
(pdata->num_row_gpios + pdata->num_col_gpios),
|
||||
GFP_KERNEL);
|
||||
if (!gpios) {
|
||||
dev_err(dev, "could not allocate memory for gpios\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
for (i = 0; i < pdata->num_row_gpios; i++)
|
||||
gpios[i] = of_get_named_gpio(np, "row-gpios", i);
|
||||
|
||||
for (i = 0; i < pdata->num_col_gpios; i++)
|
||||
gpios[pdata->num_row_gpios + i] =
|
||||
of_get_named_gpio(np, "col-gpios", i);
|
||||
|
||||
pdata->row_gpios = gpios;
|
||||
pdata->col_gpios = &gpios[pdata->num_row_gpios];
|
||||
|
||||
return pdata;
|
||||
}
|
||||
#else
|
||||
static inline struct matrix_keypad_platform_data *
|
||||
matrix_keypad_parse_dt(struct device *dev)
|
||||
{
|
||||
dev_err(dev, "no platform data defined\n");
|
||||
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int matrix_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct matrix_keypad_platform_data *pdata;
|
||||
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");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
row_shift = get_count_order(pdata->num_col_gpios);
|
||||
keymap_size = (pdata->num_row_gpios << row_shift) *
|
||||
sizeof(keypad->keycodes[0]);
|
||||
keypad = kzalloc(sizeof(struct matrix_keypad) + keymap_size,
|
||||
GFP_KERNEL);
|
||||
keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!keypad || !input_dev) {
|
||||
err = -ENOMEM;
|
||||
@ -429,7 +493,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
|
||||
|
||||
keypad->input_dev = input_dev;
|
||||
keypad->pdata = pdata;
|
||||
keypad->row_shift = row_shift;
|
||||
keypad->row_shift = get_count_order(pdata->num_col_gpios);
|
||||
keypad->stopped = true;
|
||||
INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
|
||||
spin_lock_init(&keypad->lock);
|
||||
@ -440,12 +504,14 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
|
||||
input_dev->open = matrix_keypad_start;
|
||||
input_dev->close = matrix_keypad_stop;
|
||||
|
||||
err = matrix_keypad_build_keymap(keymap_data, NULL,
|
||||
err = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
|
||||
pdata->num_row_gpios,
|
||||
pdata->num_col_gpios,
|
||||
keypad->keycodes, input_dev);
|
||||
if (err)
|
||||
NULL, input_dev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to build keymap\n");
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
if (!pdata->no_autorepeat)
|
||||
__set_bit(EV_REP, input_dev->evbit);
|
||||
@ -473,7 +539,7 @@ err_free_mem:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit matrix_keypad_remove(struct platform_device *pdev)
|
||||
static int matrix_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct matrix_keypad *keypad = platform_get_drvdata(pdev);
|
||||
|
||||
@ -488,13 +554,22 @@ static int __devexit matrix_keypad_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id matrix_keypad_dt_match[] = {
|
||||
{ .compatible = "gpio-matrix-keypad" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver matrix_keypad_driver = {
|
||||
.probe = matrix_keypad_probe,
|
||||
.remove = __devexit_p(matrix_keypad_remove),
|
||||
.remove = matrix_keypad_remove,
|
||||
.driver = {
|
||||
.name = "matrix-keypad",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &matrix_keypad_pm_ops,
|
||||
.of_match_table = of_match_ptr(matrix_keypad_dt_match),
|
||||
},
|
||||
};
|
||||
module_platform_driver(matrix_keypad_driver);
|
||||
|
@ -179,7 +179,7 @@ static void max7359_initialize(struct i2c_client *client)
|
||||
max7359_fall_deepsleep(client);
|
||||
}
|
||||
|
||||
static int __devinit max7359_probe(struct i2c_client *client,
|
||||
static int max7359_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct matrix_keymap_data *keymap_data = client->dev.platform_data;
|
||||
@ -260,7 +260,7 @@ failed_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit max7359_remove(struct i2c_client *client)
|
||||
static int max7359_remove(struct i2c_client *client)
|
||||
{
|
||||
struct max7359_keypad *keypad = i2c_get_clientdata(client);
|
||||
|
||||
@ -312,7 +312,7 @@ static struct i2c_driver max7359_i2c_driver = {
|
||||
.pm = &max7359_pm,
|
||||
},
|
||||
.probe = max7359_probe,
|
||||
.remove = __devexit_p(max7359_remove),
|
||||
.remove = max7359_remove,
|
||||
.id_table = max7359_ids,
|
||||
};
|
||||
|
||||
|
@ -97,7 +97,7 @@ static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit mcs_touchkey_probe(struct i2c_client *client,
|
||||
static int mcs_touchkey_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct mcs_platform_data *pdata;
|
||||
@ -200,7 +200,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit mcs_touchkey_remove(struct i2c_client *client)
|
||||
static int mcs_touchkey_remove(struct i2c_client *client)
|
||||
{
|
||||
struct mcs_touchkey_data *data = i2c_get_clientdata(client);
|
||||
|
||||
@ -270,7 +270,7 @@ static struct i2c_driver mcs_touchkey_driver = {
|
||||
.pm = &mcs_touchkey_pm_ops,
|
||||
},
|
||||
.probe = mcs_touchkey_probe,
|
||||
.remove = __devexit_p(mcs_touchkey_remove),
|
||||
.remove = mcs_touchkey_remove,
|
||||
.shutdown = mcs_touchkey_shutdown,
|
||||
.id_table = mcs_touchkey_id,
|
||||
};
|
||||
|
@ -71,7 +71,7 @@ struct mpr121_init_register {
|
||||
u8 val;
|
||||
};
|
||||
|
||||
static const struct mpr121_init_register init_reg_table[] __devinitconst = {
|
||||
static const struct mpr121_init_register init_reg_table[] = {
|
||||
{ MHD_RISING_ADDR, 0x1 },
|
||||
{ NHD_RISING_ADDR, 0x1 },
|
||||
{ MHD_FALLING_ADDR, 0x1 },
|
||||
@ -123,7 +123,7 @@ out:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit mpr121_phys_init(const struct mpr121_platform_data *pdata,
|
||||
static int mpr121_phys_init(const struct mpr121_platform_data *pdata,
|
||||
struct mpr121_touchkey *mpr121,
|
||||
struct i2c_client *client)
|
||||
{
|
||||
@ -185,8 +185,8 @@ err_i2c_write:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devinit mpr_touchkey_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int mpr_touchkey_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct mpr121_platform_data *pdata = client->dev.platform_data;
|
||||
struct mpr121_touchkey *mpr121;
|
||||
@ -272,7 +272,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit mpr_touchkey_remove(struct i2c_client *client)
|
||||
static int mpr_touchkey_remove(struct i2c_client *client)
|
||||
{
|
||||
struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client);
|
||||
|
||||
@ -327,7 +327,7 @@ static struct i2c_driver mpr_touchkey_driver = {
|
||||
},
|
||||
.id_table = mpr121_id,
|
||||
.probe = mpr_touchkey_probe,
|
||||
.remove = __devexit_p(mpr_touchkey_remove),
|
||||
.remove = mpr_touchkey_remove,
|
||||
};
|
||||
|
||||
module_i2c_driver(mpr_touchkey_driver);
|
||||
|
@ -67,6 +67,7 @@ struct ske_keypad {
|
||||
const struct ske_keypad_platform_data *board;
|
||||
unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS];
|
||||
struct clk *clk;
|
||||
struct clk *pclk;
|
||||
spinlock_t ske_keypad_lock;
|
||||
};
|
||||
|
||||
@ -271,11 +272,18 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
|
||||
goto err_free_mem_region;
|
||||
}
|
||||
|
||||
keypad->pclk = clk_get(&pdev->dev, "apb_pclk");
|
||||
if (IS_ERR(keypad->pclk)) {
|
||||
dev_err(&pdev->dev, "failed to get pclk\n");
|
||||
error = PTR_ERR(keypad->pclk);
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
keypad->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(keypad->clk)) {
|
||||
dev_err(&pdev->dev, "failed to get clk\n");
|
||||
error = PTR_ERR(keypad->clk);
|
||||
goto err_iounmap;
|
||||
goto err_pclk;
|
||||
}
|
||||
|
||||
input->id.bustype = BUS_HOST;
|
||||
@ -287,14 +295,25 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
|
||||
keypad->keymap, input);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "Failed to build keymap\n");
|
||||
goto err_iounmap;
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
input_set_capability(input, EV_MSC, MSC_SCAN);
|
||||
if (!plat->no_autorepeat)
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
clk_enable(keypad->clk);
|
||||
error = clk_prepare_enable(keypad->pclk);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "Failed to prepare/enable pclk\n");
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
error = clk_prepare_enable(keypad->clk);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "Failed to prepare/enable clk\n");
|
||||
goto err_pclk_disable;
|
||||
}
|
||||
|
||||
|
||||
/* go through board initialization helpers */
|
||||
if (keypad->board->init)
|
||||
@ -330,8 +349,13 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
|
||||
err_free_irq:
|
||||
free_irq(keypad->irq, keypad);
|
||||
err_clk_disable:
|
||||
clk_disable(keypad->clk);
|
||||
clk_disable_unprepare(keypad->clk);
|
||||
err_pclk_disable:
|
||||
clk_disable_unprepare(keypad->pclk);
|
||||
err_clk:
|
||||
clk_put(keypad->clk);
|
||||
err_pclk:
|
||||
clk_put(keypad->pclk);
|
||||
err_iounmap:
|
||||
iounmap(keypad->reg_base);
|
||||
err_free_mem_region:
|
||||
@ -342,7 +366,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit ske_keypad_remove(struct platform_device *pdev)
|
||||
static int ske_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ske_keypad *keypad = platform_get_drvdata(pdev);
|
||||
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
@ -351,7 +375,7 @@ static int __devexit ske_keypad_remove(struct platform_device *pdev)
|
||||
|
||||
input_unregister_device(keypad->input);
|
||||
|
||||
clk_disable(keypad->clk);
|
||||
clk_disable_unprepare(keypad->clk);
|
||||
clk_put(keypad->clk);
|
||||
|
||||
if (keypad->board->exit)
|
||||
@ -403,7 +427,7 @@ static struct platform_driver ske_keypad_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &ske_keypad_dev_pm_ops,
|
||||
},
|
||||
.remove = __devexit_p(ske_keypad_remove),
|
||||
.remove = ske_keypad_remove,
|
||||
};
|
||||
|
||||
static int __init ske_keypad_init(void)
|
||||
|
@ -244,7 +244,7 @@ static int omap_kp_resume(struct platform_device *dev)
|
||||
#define omap_kp_resume NULL
|
||||
#endif
|
||||
|
||||
static int __devinit omap_kp_probe(struct platform_device *pdev)
|
||||
static int omap_kp_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct omap_kp *omap_kp;
|
||||
struct input_dev *input_dev;
|
||||
@ -357,7 +357,7 @@ err2:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int __devexit omap_kp_remove(struct platform_device *pdev)
|
||||
static int omap_kp_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct omap_kp *omap_kp = platform_get_drvdata(pdev);
|
||||
|
||||
@ -379,7 +379,7 @@ static int __devexit omap_kp_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver omap_kp_driver = {
|
||||
.probe = omap_kp_probe,
|
||||
.remove = __devexit_p(omap_kp_remove),
|
||||
.remove = omap_kp_remove,
|
||||
.suspend = omap_kp_suspend,
|
||||
.resume = omap_kp_resume,
|
||||
.driver = {
|
||||
|
@ -211,8 +211,8 @@ static void omap4_keypad_close(struct input_dev *input)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static int __devinit omap4_keypad_parse_dt(struct device *dev,
|
||||
struct omap4_keypad *keypad_data)
|
||||
static int omap4_keypad_parse_dt(struct device *dev,
|
||||
struct omap4_keypad *keypad_data)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
|
||||
@ -241,7 +241,7 @@ static inline int omap4_keypad_parse_dt(struct device *dev,
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit omap4_keypad_probe(struct platform_device *pdev)
|
||||
static int omap4_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct omap4_keypad_platform_data *pdata =
|
||||
dev_get_platdata(&pdev->dev);
|
||||
@ -406,7 +406,7 @@ err_free_keypad:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit omap4_keypad_remove(struct platform_device *pdev)
|
||||
static int omap4_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);
|
||||
struct resource *res;
|
||||
@ -440,7 +440,7 @@ MODULE_DEVICE_TABLE(of, omap_keypad_dt_match);
|
||||
|
||||
static struct platform_driver omap4_keypad_driver = {
|
||||
.probe = omap4_keypad_probe,
|
||||
.remove = __devexit_p(omap4_keypad_remove),
|
||||
.remove = omap4_keypad_remove,
|
||||
.driver = {
|
||||
.name = "omap4-keypad",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -37,7 +37,7 @@ static irqreturn_t opencores_kbd_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit opencores_kbd_probe(struct platform_device *pdev)
|
||||
static int opencores_kbd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct input_dev *input;
|
||||
struct opencores_kbd *opencores_kbd;
|
||||
@ -139,7 +139,7 @@ static int __devinit opencores_kbd_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit opencores_kbd_remove(struct platform_device *pdev)
|
||||
static int opencores_kbd_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev);
|
||||
|
||||
@ -158,7 +158,7 @@ static int __devexit opencores_kbd_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver opencores_kbd_device_driver = {
|
||||
.probe = opencores_kbd_probe,
|
||||
.remove = __devexit_p(opencores_kbd_remove),
|
||||
.remove = opencores_kbd_remove,
|
||||
.driver = {
|
||||
.name = "opencores-kbd",
|
||||
},
|
||||
|
@ -397,7 +397,7 @@ static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
|
||||
static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
|
||||
{
|
||||
int bits, rc, cycles;
|
||||
u8 scan_val = 0, ctrl_val = 0;
|
||||
@ -447,7 +447,7 @@ static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
|
||||
|
||||
}
|
||||
|
||||
static int __devinit pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios,
|
||||
static int pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios,
|
||||
struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config)
|
||||
{
|
||||
int rc, i;
|
||||
@ -518,7 +518,7 @@ static void pmic8xxx_kp_close(struct input_dev *dev)
|
||||
* - set irq edge type.
|
||||
* - enable the keypad controller.
|
||||
*/
|
||||
static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev)
|
||||
static int pmic8xxx_kp_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct pm8xxx_keypad_platform_data *pdata =
|
||||
dev_get_platdata(&pdev->dev);
|
||||
@ -712,7 +712,7 @@ err_alloc_device:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int __devexit pmic8xxx_kp_remove(struct platform_device *pdev)
|
||||
static int pmic8xxx_kp_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pmic8xxx_kp *kp = platform_get_drvdata(pdev);
|
||||
|
||||
@ -773,7 +773,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops,
|
||||
|
||||
static struct platform_driver pmic8xxx_kp_driver = {
|
||||
.probe = pmic8xxx_kp_probe,
|
||||
.remove = __devexit_p(pmic8xxx_kp_remove),
|
||||
.remove = pmic8xxx_kp_remove,
|
||||
.driver = {
|
||||
.name = PM8XXX_KEYPAD_DEV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -482,7 +482,7 @@ static const struct dev_pm_ops pxa27x_keypad_pm_ops = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __devinit pxa27x_keypad_probe(struct platform_device *pdev)
|
||||
static int pxa27x_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct pxa27x_keypad *keypad;
|
||||
@ -595,7 +595,7 @@ failed_free:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit pxa27x_keypad_remove(struct platform_device *pdev)
|
||||
static int pxa27x_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
|
||||
struct resource *res;
|
||||
@ -620,7 +620,7 @@ MODULE_ALIAS("platform:pxa27x-keypad");
|
||||
|
||||
static struct platform_driver pxa27x_keypad_driver = {
|
||||
.probe = pxa27x_keypad_probe,
|
||||
.remove = __devexit_p(pxa27x_keypad_remove),
|
||||
.remove = pxa27x_keypad_remove,
|
||||
.driver = {
|
||||
.name = "pxa27x-keypad",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -82,7 +82,7 @@ static void pxa930_rotary_close(struct input_dev *dev)
|
||||
clear_sbcr(r);
|
||||
}
|
||||
|
||||
static int __devinit pxa930_rotary_probe(struct platform_device *pdev)
|
||||
static int pxa930_rotary_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct pxa930_rotary *r;
|
||||
@ -174,7 +174,7 @@ failed_free:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit pxa930_rotary_remove(struct platform_device *pdev)
|
||||
static int pxa930_rotary_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pxa930_rotary *r = platform_get_drvdata(pdev);
|
||||
|
||||
@ -193,7 +193,7 @@ static struct platform_driver pxa930_rotary_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = pxa930_rotary_probe,
|
||||
.remove = __devexit_p(pxa930_rotary_remove),
|
||||
.remove = pxa930_rotary_remove,
|
||||
};
|
||||
module_platform_driver(pxa930_rotary_driver);
|
||||
|
||||
|
@ -91,7 +91,7 @@ static int qt1070_write(struct i2c_client *client, u8 reg, u8 data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool __devinit qt1070_identify(struct i2c_client *client)
|
||||
static bool qt1070_identify(struct i2c_client *client)
|
||||
{
|
||||
int id, ver;
|
||||
|
||||
@ -140,7 +140,7 @@ static irqreturn_t qt1070_interrupt(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit qt1070_probe(struct i2c_client *client,
|
||||
static int qt1070_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct qt1070_data *data;
|
||||
@ -230,7 +230,7 @@ err_free_mem:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit qt1070_remove(struct i2c_client *client)
|
||||
static int qt1070_remove(struct i2c_client *client)
|
||||
{
|
||||
struct qt1070_data *data = i2c_get_clientdata(client);
|
||||
|
||||
@ -256,7 +256,7 @@ static struct i2c_driver qt1070_driver = {
|
||||
},
|
||||
.id_table = qt1070_id,
|
||||
.probe = qt1070_probe,
|
||||
.remove = __devexit_p(qt1070_remove),
|
||||
.remove = qt1070_remove,
|
||||
};
|
||||
|
||||
module_i2c_driver(qt1070_driver);
|
||||
|
@ -183,7 +183,7 @@ static void qt2160_worker(struct work_struct *work)
|
||||
qt2160_schedule_read(qt2160);
|
||||
}
|
||||
|
||||
static int __devinit qt2160_read(struct i2c_client *client, u8 reg)
|
||||
static int qt2160_read(struct i2c_client *client, u8 reg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -204,29 +204,20 @@ static int __devinit qt2160_read(struct i2c_client *client, u8 reg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data)
|
||||
static int qt2160_write(struct i2c_client *client, u8 reg, u8 data)
|
||||
{
|
||||
int error;
|
||||
int ret;
|
||||
|
||||
error = i2c_smbus_write_byte(client, reg);
|
||||
if (error) {
|
||||
ret = i2c_smbus_write_byte_data(client, reg, data);
|
||||
if (ret < 0)
|
||||
dev_err(&client->dev,
|
||||
"couldn't send request. Returned %d\n", error);
|
||||
return error;
|
||||
}
|
||||
"couldn't write data. Returned %d\n", ret);
|
||||
|
||||
error = i2c_smbus_write_byte(client, data);
|
||||
if (error) {
|
||||
dev_err(&client->dev,
|
||||
"couldn't write data. Returned %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
return error;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static bool __devinit qt2160_identify(struct i2c_client *client)
|
||||
static bool qt2160_identify(struct i2c_client *client)
|
||||
{
|
||||
int id, ver, rev;
|
||||
|
||||
@ -257,7 +248,7 @@ static bool __devinit qt2160_identify(struct i2c_client *client)
|
||||
return true;
|
||||
}
|
||||
|
||||
static int __devinit qt2160_probe(struct i2c_client *client,
|
||||
static int qt2160_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct qt2160_data *qt2160;
|
||||
@ -344,7 +335,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit qt2160_remove(struct i2c_client *client)
|
||||
static int qt2160_remove(struct i2c_client *client)
|
||||
{
|
||||
struct qt2160_data *qt2160 = i2c_get_clientdata(client);
|
||||
|
||||
@ -375,7 +366,7 @@ static struct i2c_driver qt2160_driver = {
|
||||
|
||||
.id_table = qt2160_idtable,
|
||||
.probe = qt2160_probe,
|
||||
.remove = __devexit_p(qt2160_remove),
|
||||
.remove = qt2160_remove,
|
||||
};
|
||||
|
||||
module_i2c_driver(qt2160_driver);
|
||||
|
@ -309,7 +309,7 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
|
||||
struct samsung_keypad *keypad)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
int gpio, ret, row, col;
|
||||
int gpio, error, row, col;
|
||||
|
||||
for (row = 0; row < keypad->rows; row++) {
|
||||
gpio = of_get_named_gpio(np, "row-gpios", row);
|
||||
@ -320,10 +320,11 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = gpio_request(gpio, "keypad-row");
|
||||
if (ret)
|
||||
dev_err(dev, "keypad row[%d] gpio request failed\n",
|
||||
row);
|
||||
error = devm_gpio_request(dev, gpio, "keypad-row");
|
||||
if (error)
|
||||
dev_err(dev,
|
||||
"keypad row[%d] gpio request failed: %d\n",
|
||||
row, error);
|
||||
}
|
||||
|
||||
for (col = 0; col < keypad->cols; col++) {
|
||||
@ -335,38 +336,22 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = gpio_request(gpio, "keypad-col");
|
||||
if (ret)
|
||||
dev_err(dev, "keypad column[%d] gpio request failed\n",
|
||||
col);
|
||||
error = devm_gpio_request(dev, gpio, "keypad-col");
|
||||
if (error)
|
||||
dev_err(dev,
|
||||
"keypad column[%d] gpio request failed: %d\n",
|
||||
col, error);
|
||||
}
|
||||
}
|
||||
|
||||
static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad)
|
||||
{
|
||||
int cnt;
|
||||
|
||||
for (cnt = 0; cnt < keypad->rows; cnt++)
|
||||
if (gpio_is_valid(keypad->row_gpios[cnt]))
|
||||
gpio_free(keypad->row_gpios[cnt]);
|
||||
|
||||
for (cnt = 0; cnt < keypad->cols; cnt++)
|
||||
if (gpio_is_valid(keypad->col_gpios[cnt]))
|
||||
gpio_free(keypad->col_gpios[cnt]);
|
||||
}
|
||||
#else
|
||||
static
|
||||
struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit samsung_keypad_probe(struct platform_device *pdev)
|
||||
static int samsung_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct samsung_keypad_platdata *pdata;
|
||||
const struct matrix_keymap_data *keymap_data;
|
||||
@ -405,36 +390,30 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
|
||||
row_shift = get_count_order(pdata->cols);
|
||||
keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]);
|
||||
|
||||
keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!keypad || !input_dev) {
|
||||
error = -ENOMEM;
|
||||
goto err_free_mem;
|
||||
}
|
||||
keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size,
|
||||
GFP_KERNEL);
|
||||
input_dev = devm_input_allocate_device(&pdev->dev);
|
||||
if (!keypad || !input_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
error = -ENODEV;
|
||||
goto err_free_mem;
|
||||
}
|
||||
if (!res)
|
||||
return -ENODEV;
|
||||
|
||||
keypad->base = ioremap(res->start, resource_size(res));
|
||||
if (!keypad->base) {
|
||||
error = -EBUSY;
|
||||
goto err_free_mem;
|
||||
}
|
||||
keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
|
||||
if (!keypad->base)
|
||||
return -EBUSY;
|
||||
|
||||
keypad->clk = clk_get(&pdev->dev, "keypad");
|
||||
keypad->clk = devm_clk_get(&pdev->dev, "keypad");
|
||||
if (IS_ERR(keypad->clk)) {
|
||||
dev_err(&pdev->dev, "failed to get keypad clk\n");
|
||||
error = PTR_ERR(keypad->clk);
|
||||
goto err_unmap_base;
|
||||
return PTR_ERR(keypad->clk);
|
||||
}
|
||||
|
||||
error = clk_prepare(keypad->clk);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "keypad clock prepare failed\n");
|
||||
goto err_put_clk;
|
||||
return error;
|
||||
}
|
||||
|
||||
keypad->input_dev = input_dev;
|
||||
@ -479,14 +458,15 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
|
||||
keypad->irq = platform_get_irq(pdev, 0);
|
||||
if (keypad->irq < 0) {
|
||||
error = keypad->irq;
|
||||
goto err_put_clk;
|
||||
goto err_unprepare_clk;
|
||||
}
|
||||
|
||||
error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq,
|
||||
IRQF_ONESHOT, dev_name(&pdev->dev), keypad);
|
||||
error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL,
|
||||
samsung_keypad_irq, IRQF_ONESHOT,
|
||||
dev_name(&pdev->dev), keypad);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "failed to register keypad interrupt\n");
|
||||
goto err_put_clk;
|
||||
goto err_unprepare_clk;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, pdata->wakeup);
|
||||
@ -495,7 +475,7 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
|
||||
|
||||
error = input_register_device(keypad->input_dev);
|
||||
if (error)
|
||||
goto err_free_irq;
|
||||
goto err_disable_runtime_pm;
|
||||
|
||||
if (pdev->dev.of_node) {
|
||||
devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap);
|
||||
@ -504,26 +484,16 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
free_irq(keypad->irq, keypad);
|
||||
err_disable_runtime_pm:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
err_unprepare_clk:
|
||||
clk_unprepare(keypad->clk);
|
||||
err_put_clk:
|
||||
clk_put(keypad->clk);
|
||||
samsung_keypad_dt_gpio_free(keypad);
|
||||
err_unmap_base:
|
||||
iounmap(keypad->base);
|
||||
err_free_mem:
|
||||
input_free_device(input_dev);
|
||||
kfree(keypad);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit samsung_keypad_remove(struct platform_device *pdev)
|
||||
static int samsung_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct samsung_keypad *keypad = platform_get_drvdata(pdev);
|
||||
|
||||
@ -533,18 +503,7 @@ static int __devexit samsung_keypad_remove(struct platform_device *pdev)
|
||||
|
||||
input_unregister_device(keypad->input_dev);
|
||||
|
||||
/*
|
||||
* It is safe to free IRQ after unregistering device because
|
||||
* samsung_keypad_close will shut off interrupts.
|
||||
*/
|
||||
free_irq(keypad->irq, keypad);
|
||||
|
||||
clk_unprepare(keypad->clk);
|
||||
clk_put(keypad->clk);
|
||||
samsung_keypad_dt_gpio_free(keypad);
|
||||
|
||||
iounmap(keypad->base);
|
||||
kfree(keypad);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -685,7 +644,7 @@ MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids);
|
||||
|
||||
static struct platform_driver samsung_keypad_driver = {
|
||||
.probe = samsung_keypad_probe,
|
||||
.remove = __devexit_p(samsung_keypad_remove),
|
||||
.remove = samsung_keypad_remove,
|
||||
.driver = {
|
||||
.name = "samsung-keypad",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -162,7 +162,7 @@ static irqreturn_t sh_keysc_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit sh_keysc_probe(struct platform_device *pdev)
|
||||
static int sh_keysc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct sh_keysc_priv *priv;
|
||||
struct sh_keysc_info *pdata;
|
||||
@ -272,7 +272,7 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit sh_keysc_remove(struct platform_device *pdev)
|
||||
static int sh_keysc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sh_keysc_priv *priv = platform_get_drvdata(pdev);
|
||||
|
||||
@ -331,7 +331,7 @@ static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops,
|
||||
|
||||
static struct platform_driver sh_keysc_device_driver = {
|
||||
.probe = sh_keysc_probe,
|
||||
.remove = __devexit_p(sh_keysc_remove),
|
||||
.remove = sh_keysc_remove,
|
||||
.driver = {
|
||||
.name = "sh_keysc",
|
||||
.pm = &sh_keysc_dev_pm_ops,
|
||||
|
@ -55,15 +55,15 @@
|
||||
|
||||
struct spear_kbd {
|
||||
struct input_dev *input;
|
||||
struct resource *res;
|
||||
void __iomem *io_base;
|
||||
struct clk *clk;
|
||||
unsigned int irq;
|
||||
unsigned int mode;
|
||||
unsigned int suspended_rate;
|
||||
unsigned short last_key;
|
||||
unsigned short keycodes[NUM_ROWS * NUM_COLS];
|
||||
bool rep;
|
||||
unsigned int suspended_rate;
|
||||
bool irq_wake_enabled;
|
||||
u32 mode_ctl_reg;
|
||||
};
|
||||
|
||||
@ -146,7 +146,7 @@ static void spear_kbd_close(struct input_dev *dev)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static int __devinit spear_kbd_parse_dt(struct platform_device *pdev,
|
||||
static int spear_kbd_parse_dt(struct platform_device *pdev,
|
||||
struct spear_kbd *kbd)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
@ -181,7 +181,7 @@ static inline int spear_kbd_parse_dt(struct platform_device *pdev,
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit spear_kbd_probe(struct platform_device *pdev)
|
||||
static int spear_kbd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL;
|
||||
@ -203,12 +203,16 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
|
||||
return irq;
|
||||
}
|
||||
|
||||
kbd = kzalloc(sizeof(*kbd), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!kbd || !input_dev) {
|
||||
dev_err(&pdev->dev, "out of memory\n");
|
||||
error = -ENOMEM;
|
||||
goto err_free_mem;
|
||||
kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL);
|
||||
if (!kbd) {
|
||||
dev_err(&pdev->dev, "not enough memory for driver data\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
input_dev = devm_input_allocate_device(&pdev->dev);
|
||||
if (!input_dev) {
|
||||
dev_err(&pdev->dev, "unable to allocate input device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
kbd->input = input_dev;
|
||||
@ -217,37 +221,25 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
|
||||
if (!pdata) {
|
||||
error = spear_kbd_parse_dt(pdev, kbd);
|
||||
if (error)
|
||||
goto err_free_mem;
|
||||
return error;
|
||||
} else {
|
||||
kbd->mode = pdata->mode;
|
||||
kbd->rep = pdata->rep;
|
||||
kbd->suspended_rate = pdata->suspended_rate;
|
||||
}
|
||||
|
||||
kbd->res = request_mem_region(res->start, resource_size(res),
|
||||
pdev->name);
|
||||
if (!kbd->res) {
|
||||
dev_err(&pdev->dev, "keyboard region already claimed\n");
|
||||
error = -EBUSY;
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
kbd->io_base = ioremap(res->start, resource_size(res));
|
||||
kbd->io_base = devm_request_and_ioremap(&pdev->dev, res);
|
||||
if (!kbd->io_base) {
|
||||
dev_err(&pdev->dev, "ioremap failed for kbd_region\n");
|
||||
error = -ENOMEM;
|
||||
goto err_release_mem_region;
|
||||
dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
kbd->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(kbd->clk)) {
|
||||
error = PTR_ERR(kbd->clk);
|
||||
goto err_iounmap;
|
||||
}
|
||||
kbd->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(kbd->clk))
|
||||
return PTR_ERR(kbd->clk);
|
||||
|
||||
input_dev->name = "Spear Keyboard";
|
||||
input_dev->phys = "keyboard/input0";
|
||||
input_dev->dev.parent = &pdev->dev;
|
||||
input_dev->id.bustype = BUS_HOST;
|
||||
input_dev->id.vendor = 0x0001;
|
||||
input_dev->id.product = 0x0001;
|
||||
@ -259,7 +251,7 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
|
||||
kbd->keycodes, input_dev);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "Failed to build keymap\n");
|
||||
goto err_put_clk;
|
||||
return error;
|
||||
}
|
||||
|
||||
if (kbd->rep)
|
||||
@ -268,48 +260,36 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
|
||||
|
||||
input_set_drvdata(input_dev, kbd);
|
||||
|
||||
error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd);
|
||||
error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0,
|
||||
"keyboard", kbd);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "request_irq fail\n");
|
||||
goto err_put_clk;
|
||||
dev_err(&pdev->dev, "request_irq failed\n");
|
||||
return error;
|
||||
}
|
||||
|
||||
error = clk_prepare(kbd->clk);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = input_register_device(input_dev);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "Unable to register keyboard device\n");
|
||||
goto err_free_irq;
|
||||
clk_unprepare(kbd->clk);
|
||||
return error;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
platform_set_drvdata(pdev, kbd);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
free_irq(kbd->irq, kbd);
|
||||
err_put_clk:
|
||||
clk_put(kbd->clk);
|
||||
err_iounmap:
|
||||
iounmap(kbd->io_base);
|
||||
err_release_mem_region:
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
err_free_mem:
|
||||
input_free_device(input_dev);
|
||||
kfree(kbd);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit spear_kbd_remove(struct platform_device *pdev)
|
||||
static int spear_kbd_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct spear_kbd *kbd = platform_get_drvdata(pdev);
|
||||
|
||||
free_irq(kbd->irq, kbd);
|
||||
input_unregister_device(kbd->input);
|
||||
clk_put(kbd->clk);
|
||||
iounmap(kbd->io_base);
|
||||
release_mem_region(kbd->res->start, resource_size(kbd->res));
|
||||
kfree(kbd);
|
||||
clk_unprepare(kbd->clk);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
@ -333,7 +313,8 @@ static int spear_kbd_suspend(struct device *dev)
|
||||
mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG);
|
||||
|
||||
if (device_may_wakeup(&pdev->dev)) {
|
||||
enable_irq_wake(kbd->irq);
|
||||
if (!enable_irq_wake(kbd->irq))
|
||||
kbd->irq_wake_enabled = true;
|
||||
|
||||
/*
|
||||
* reprogram the keyboard operating frequency as on some
|
||||
@ -379,7 +360,10 @@ static int spear_kbd_resume(struct device *dev)
|
||||
mutex_lock(&input_dev->mutex);
|
||||
|
||||
if (device_may_wakeup(&pdev->dev)) {
|
||||
disable_irq_wake(kbd->irq);
|
||||
if (kbd->irq_wake_enabled) {
|
||||
kbd->irq_wake_enabled = false;
|
||||
disable_irq_wake(kbd->irq);
|
||||
}
|
||||
} else {
|
||||
if (input_dev->users)
|
||||
clk_enable(kbd->clk);
|
||||
@ -407,7 +391,7 @@ MODULE_DEVICE_TABLE(of, spear_kbd_id_table);
|
||||
|
||||
static struct platform_driver spear_kbd_driver = {
|
||||
.probe = spear_kbd_probe,
|
||||
.remove = __devexit_p(spear_kbd_remove),
|
||||
.remove = spear_kbd_remove,
|
||||
.driver = {
|
||||
.name = "keyboard",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -166,7 +166,7 @@ static irqreturn_t stmpe_keypad_irq(int irq, void *dev)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
|
||||
static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
|
||||
{
|
||||
const struct stmpe_keypad_variant *variant = keypad->variant;
|
||||
unsigned int col_gpios = variant->col_gpios;
|
||||
@ -207,7 +207,7 @@ static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)
|
||||
return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD);
|
||||
}
|
||||
|
||||
static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
|
||||
static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
|
||||
{
|
||||
const struct stmpe_keypad_platform_data *plat = keypad->plat;
|
||||
const struct stmpe_keypad_variant *variant = keypad->variant;
|
||||
@ -257,105 +257,131 @@ static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad)
|
||||
(plat->debounce_ms << 1));
|
||||
}
|
||||
|
||||
static int __devinit stmpe_keypad_probe(struct platform_device *pdev)
|
||||
static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad)
|
||||
{
|
||||
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_keypad_platform_data *plat;
|
||||
const struct stmpe_keypad_platform_data *plat;
|
||||
struct stmpe_keypad *keypad;
|
||||
struct input_dev *input;
|
||||
int ret;
|
||||
int error;
|
||||
int irq;
|
||||
int i;
|
||||
|
||||
plat = stmpe->pdata->keypad;
|
||||
if (!plat)
|
||||
return -ENODEV;
|
||||
if (!plat) {
|
||||
plat = stmpe_keypad_of_probe(&pdev->dev);
|
||||
if (IS_ERR(plat))
|
||||
return PTR_ERR(plat);
|
||||
}
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
keypad = kzalloc(sizeof(struct stmpe_keypad), GFP_KERNEL);
|
||||
keypad = devm_kzalloc(&pdev->dev, sizeof(struct stmpe_keypad),
|
||||
GFP_KERNEL);
|
||||
if (!keypad)
|
||||
return -ENOMEM;
|
||||
|
||||
input = input_allocate_device();
|
||||
if (!input) {
|
||||
ret = -ENOMEM;
|
||||
goto out_freekeypad;
|
||||
}
|
||||
input = devm_input_allocate_device(&pdev->dev);
|
||||
if (!input)
|
||||
return -ENOMEM;
|
||||
|
||||
input->name = "STMPE keypad";
|
||||
input->id.bustype = BUS_I2C;
|
||||
input->dev.parent = &pdev->dev;
|
||||
|
||||
ret = matrix_keypad_build_keymap(plat->keymap_data, NULL,
|
||||
STMPE_KEYPAD_MAX_ROWS,
|
||||
STMPE_KEYPAD_MAX_COLS,
|
||||
keypad->keymap, input);
|
||||
if (ret)
|
||||
goto out_freeinput;
|
||||
error = matrix_keypad_build_keymap(plat->keymap_data, NULL,
|
||||
STMPE_KEYPAD_MAX_ROWS,
|
||||
STMPE_KEYPAD_MAX_COLS,
|
||||
keypad->keymap, input);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
input_set_capability(input, EV_MSC, MSC_SCAN);
|
||||
if (!plat->no_autorepeat)
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
for (i = 0; i < plat->keymap_data->keymap_size; i++) {
|
||||
unsigned int key = plat->keymap_data->keymap[i];
|
||||
|
||||
keypad->cols |= 1 << KEY_COL(key);
|
||||
keypad->rows |= 1 << KEY_ROW(key);
|
||||
}
|
||||
stmpe_keypad_fill_used_pins(keypad);
|
||||
|
||||
keypad->stmpe = stmpe;
|
||||
keypad->plat = plat;
|
||||
keypad->input = input;
|
||||
keypad->variant = &stmpe_keypad_variants[stmpe->partnum];
|
||||
|
||||
ret = stmpe_keypad_chip_init(keypad);
|
||||
if (ret < 0)
|
||||
goto out_freeinput;
|
||||
error = stmpe_keypad_chip_init(keypad);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
ret = input_register_device(input);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"unable to register input device: %d\n", ret);
|
||||
goto out_freeinput;
|
||||
error = devm_request_threaded_irq(&pdev->dev, irq,
|
||||
NULL, stmpe_keypad_irq,
|
||||
IRQF_ONESHOT, "stmpe-keypad", keypad);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "unable to get irq: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
ret = request_threaded_irq(irq, NULL, stmpe_keypad_irq, IRQF_ONESHOT,
|
||||
"stmpe-keypad", keypad);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
|
||||
goto out_unregisterinput;
|
||||
error = input_register_device(input);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev,
|
||||
"unable to register input device: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, keypad);
|
||||
|
||||
return 0;
|
||||
|
||||
out_unregisterinput:
|
||||
input_unregister_device(input);
|
||||
input = NULL;
|
||||
out_freeinput:
|
||||
input_free_device(input);
|
||||
out_freekeypad:
|
||||
kfree(keypad);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit stmpe_keypad_remove(struct platform_device *pdev)
|
||||
static int stmpe_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct stmpe_keypad *keypad = platform_get_drvdata(pdev);
|
||||
struct stmpe *stmpe = keypad->stmpe;
|
||||
int irq = platform_get_irq(pdev, 0);
|
||||
|
||||
stmpe_disable(stmpe, STMPE_BLOCK_KEYPAD);
|
||||
|
||||
free_irq(irq, keypad);
|
||||
input_unregister_device(keypad->input);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(keypad);
|
||||
stmpe_disable(keypad->stmpe, STMPE_BLOCK_KEYPAD);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -364,7 +390,7 @@ static struct platform_driver stmpe_keypad_driver = {
|
||||
.driver.name = "stmpe-keypad",
|
||||
.driver.owner = THIS_MODULE,
|
||||
.probe = stmpe_keypad_probe,
|
||||
.remove = __devexit_p(stmpe_keypad_remove),
|
||||
.remove = stmpe_keypad_remove,
|
||||
};
|
||||
module_platform_driver(stmpe_keypad_driver);
|
||||
|
||||
|
@ -299,7 +299,7 @@ static void tc3589x_keypad_close(struct input_dev *input)
|
||||
tc3589x_keypad_disable(keypad);
|
||||
}
|
||||
|
||||
static int __devinit tc3589x_keypad_probe(struct platform_device *pdev)
|
||||
static int tc3589x_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
|
||||
struct tc_keypad *keypad;
|
||||
@ -382,7 +382,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit tc3589x_keypad_remove(struct platform_device *pdev)
|
||||
static int tc3589x_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct tc_keypad *keypad = platform_get_drvdata(pdev);
|
||||
int irq = platform_get_irq(pdev, 0);
|
||||
@ -448,7 +448,7 @@ static struct platform_driver tc3589x_keypad_driver = {
|
||||
.pm = &tc3589x_keypad_dev_pm_ops,
|
||||
},
|
||||
.probe = tc3589x_keypad_probe,
|
||||
.remove = __devexit_p(tc3589x_keypad_remove),
|
||||
.remove = tc3589x_keypad_remove,
|
||||
};
|
||||
module_platform_driver(tc3589x_keypad_driver);
|
||||
|
||||
|
@ -166,7 +166,7 @@ static void tca6416_keys_close(struct input_dev *dev)
|
||||
disable_irq(chip->irqnum);
|
||||
}
|
||||
|
||||
static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip)
|
||||
static int tca6416_setup_registers(struct tca6416_keypad_chip *chip)
|
||||
{
|
||||
int error;
|
||||
|
||||
@ -197,7 +197,7 @@ static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit tca6416_keypad_probe(struct i2c_client *client,
|
||||
static int tca6416_keypad_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct tca6416_keys_platform_data *pdata;
|
||||
@ -313,7 +313,7 @@ fail1:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit tca6416_keypad_remove(struct i2c_client *client)
|
||||
static int tca6416_keypad_remove(struct i2c_client *client)
|
||||
{
|
||||
struct tca6416_keypad_chip *chip = i2c_get_clientdata(client);
|
||||
|
||||
@ -361,7 +361,7 @@ static struct i2c_driver tca6416_keypad_driver = {
|
||||
.pm = &tca6416_keypad_dev_pm_ops,
|
||||
},
|
||||
.probe = tca6416_keypad_probe,
|
||||
.remove = __devexit_p(tca6416_keypad_remove),
|
||||
.remove = tca6416_keypad_remove,
|
||||
.id_table = tca6416_id,
|
||||
};
|
||||
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/tca8418_keypad.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
/* TCA8418 hardware limits */
|
||||
#define TCA8418_MAX_ROWS 8
|
||||
@ -109,25 +110,11 @@
|
||||
#define KEY_EVENT_CODE 0x7f
|
||||
#define KEY_EVENT_VALUE 0x80
|
||||
|
||||
|
||||
static const struct i2c_device_id tca8418_id[] = {
|
||||
{ TCA8418_NAME, 8418, },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, tca8418_id);
|
||||
|
||||
struct tca8418_keypad {
|
||||
unsigned int rows;
|
||||
unsigned int cols;
|
||||
unsigned int keypad_mask; /* Mask for keypad col/rol regs */
|
||||
unsigned int irq;
|
||||
unsigned int row_shift;
|
||||
|
||||
struct i2c_client *client;
|
||||
struct input_dev *input;
|
||||
|
||||
/* Flexible array member, must be at end of struct */
|
||||
unsigned short keymap[];
|
||||
unsigned int row_shift;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -172,6 +159,8 @@ static int tca8418_read_byte(struct tca8418_keypad *keypad_data,
|
||||
|
||||
static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
|
||||
{
|
||||
struct input_dev *input = keypad_data->input;
|
||||
unsigned short *keymap = input->keycode;
|
||||
int error, col, row;
|
||||
u8 reg, state, code;
|
||||
|
||||
@ -190,9 +179,8 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
|
||||
col = (col) ? col - 1 : TCA8418_MAX_COLS - 1;
|
||||
|
||||
code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift);
|
||||
input_event(keypad_data->input, EV_MSC, MSC_SCAN, code);
|
||||
input_report_key(keypad_data->input,
|
||||
keypad_data->keymap[code], state);
|
||||
input_event(input, EV_MSC, MSC_SCAN, code);
|
||||
input_report_key(input, keymap[code], state);
|
||||
|
||||
/* Read for next loop */
|
||||
error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®);
|
||||
@ -202,7 +190,7 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
|
||||
dev_err(&keypad_data->client->dev,
|
||||
"unable to read REG_KEY_EVENT_A\n");
|
||||
|
||||
input_sync(keypad_data->input);
|
||||
input_sync(input);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -218,16 +206,18 @@ static irqreturn_t tca8418_irq_handler(int irq, void *dev_id)
|
||||
if (error) {
|
||||
dev_err(&keypad_data->client->dev,
|
||||
"unable to read REG_INT_STAT\n");
|
||||
goto exit;
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
if (!reg)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (reg & INT_STAT_OVR_FLOW_INT)
|
||||
dev_warn(&keypad_data->client->dev, "overflow occurred\n");
|
||||
|
||||
if (reg & INT_STAT_K_INT)
|
||||
tca8418_read_keypad(keypad_data);
|
||||
|
||||
exit:
|
||||
/* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */
|
||||
reg = 0xff;
|
||||
error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg);
|
||||
@ -241,7 +231,8 @@ exit:
|
||||
/*
|
||||
* Configure the TCA8418 for keypad operation
|
||||
*/
|
||||
static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
|
||||
static int tca8418_configure(struct tca8418_keypad *keypad_data,
|
||||
u32 rows, u32 cols)
|
||||
{
|
||||
int reg, error;
|
||||
|
||||
@ -253,9 +244,8 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
|
||||
|
||||
|
||||
/* Assemble a mask for row and column registers */
|
||||
reg = ~(~0 << keypad_data->rows);
|
||||
reg += (~(~0 << keypad_data->cols)) << 8;
|
||||
keypad_data->keypad_mask = reg;
|
||||
reg = ~(~0 << rows);
|
||||
reg += (~(~0 << cols)) << 8;
|
||||
|
||||
/* Set registers to keypad mode */
|
||||
error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg);
|
||||
@ -270,145 +260,144 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devinit tca8418_keypad_probe(struct i2c_client *client,
|
||||
static int tca8418_keypad_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
const struct tca8418_keypad_platform_data *pdata =
|
||||
client->dev.platform_data;
|
||||
dev_get_platdata(dev);
|
||||
struct tca8418_keypad *keypad_data;
|
||||
struct input_dev *input;
|
||||
const struct matrix_keymap_data *keymap_data = NULL;
|
||||
u32 rows = 0, cols = 0;
|
||||
bool rep = false;
|
||||
bool irq_is_gpio = false;
|
||||
int irq;
|
||||
int error, row_shift, max_keys;
|
||||
|
||||
/* Copy the platform data */
|
||||
if (!pdata) {
|
||||
dev_dbg(&client->dev, "no platform data\n");
|
||||
if (pdata) {
|
||||
if (!pdata->keymap_data) {
|
||||
dev_err(dev, "no keymap data defined\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
keymap_data = pdata->keymap_data;
|
||||
rows = pdata->rows;
|
||||
cols = pdata->cols;
|
||||
rep = pdata->rep;
|
||||
irq_is_gpio = pdata->irq_is_gpio;
|
||||
} else {
|
||||
struct device_node *np = dev->of_node;
|
||||
of_property_read_u32(np, "keypad,num-rows", &rows);
|
||||
of_property_read_u32(np, "keypad,num-columns", &cols);
|
||||
rep = of_property_read_bool(np, "keypad,autorepeat");
|
||||
}
|
||||
|
||||
if (!rows || rows > TCA8418_MAX_ROWS) {
|
||||
dev_err(dev, "invalid rows\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!pdata->keymap_data) {
|
||||
dev_err(&client->dev, "no keymap data defined\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");
|
||||
if (!cols || cols > TCA8418_MAX_COLS) {
|
||||
dev_err(dev, "invalid columns\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Check i2c driver capabilities */
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) {
|
||||
dev_err(&client->dev, "%s adapter not supported\n",
|
||||
dev_err(dev, "%s adapter not supported\n",
|
||||
dev_driver_string(&client->adapter->dev));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
row_shift = get_count_order(pdata->cols);
|
||||
max_keys = pdata->rows << row_shift;
|
||||
row_shift = get_count_order(cols);
|
||||
max_keys = rows << row_shift;
|
||||
|
||||
/* Allocate memory for keypad_data, keymap and input device */
|
||||
keypad_data = kzalloc(sizeof(*keypad_data) +
|
||||
max_keys * sizeof(keypad_data->keymap[0]), GFP_KERNEL);
|
||||
/* Allocate memory for keypad_data and input device */
|
||||
keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL);
|
||||
if (!keypad_data)
|
||||
return -ENOMEM;
|
||||
|
||||
keypad_data->rows = pdata->rows;
|
||||
keypad_data->cols = pdata->cols;
|
||||
keypad_data->client = client;
|
||||
keypad_data->row_shift = row_shift;
|
||||
|
||||
/* Initialize the chip or fail if chip isn't present */
|
||||
error = tca8418_configure(keypad_data);
|
||||
error = tca8418_configure(keypad_data, rows, cols);
|
||||
if (error < 0)
|
||||
goto fail1;
|
||||
return error;
|
||||
|
||||
/* Configure input device */
|
||||
input = input_allocate_device();
|
||||
if (!input) {
|
||||
error = -ENOMEM;
|
||||
goto fail1;
|
||||
}
|
||||
input = devm_input_allocate_device(dev);
|
||||
if (!input)
|
||||
return -ENOMEM;
|
||||
|
||||
keypad_data->input = input;
|
||||
|
||||
input->name = client->name;
|
||||
input->dev.parent = &client->dev;
|
||||
|
||||
input->id.bustype = BUS_I2C;
|
||||
input->id.vendor = 0x0001;
|
||||
input->id.product = 0x001;
|
||||
input->id.version = 0x0001;
|
||||
|
||||
error = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
|
||||
pdata->rows, pdata->cols,
|
||||
keypad_data->keymap, input);
|
||||
error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols,
|
||||
NULL, input);
|
||||
if (error) {
|
||||
dev_dbg(&client->dev, "Failed to build keymap\n");
|
||||
goto fail2;
|
||||
dev_err(dev, "Failed to build keymap\n");
|
||||
return error;
|
||||
}
|
||||
|
||||
if (pdata->rep)
|
||||
if (rep)
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
input_set_capability(input, EV_MSC, MSC_SCAN);
|
||||
|
||||
input_set_drvdata(input, keypad_data);
|
||||
|
||||
if (pdata->irq_is_gpio)
|
||||
client->irq = gpio_to_irq(client->irq);
|
||||
irq = client->irq;
|
||||
if (irq_is_gpio)
|
||||
irq = gpio_to_irq(irq);
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
client->name, keypad_data);
|
||||
error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler,
|
||||
IRQF_TRIGGER_FALLING |
|
||||
IRQF_SHARED |
|
||||
IRQF_ONESHOT,
|
||||
client->name, keypad_data);
|
||||
if (error) {
|
||||
dev_dbg(&client->dev,
|
||||
"Unable to claim irq %d; error %d\n",
|
||||
dev_err(dev, "Unable to claim irq %d; error %d\n",
|
||||
client->irq, error);
|
||||
goto fail2;
|
||||
return error;
|
||||
}
|
||||
|
||||
error = input_register_device(input);
|
||||
if (error) {
|
||||
dev_dbg(&client->dev,
|
||||
"Unable to register input device, error: %d\n", error);
|
||||
goto fail3;
|
||||
dev_err(dev, "Unable to register input device, error: %d\n",
|
||||
error);
|
||||
return error;
|
||||
}
|
||||
|
||||
i2c_set_clientdata(client, keypad_data);
|
||||
return 0;
|
||||
|
||||
fail3:
|
||||
free_irq(client->irq, keypad_data);
|
||||
fail2:
|
||||
input_free_device(input);
|
||||
fail1:
|
||||
kfree(keypad_data);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit tca8418_keypad_remove(struct i2c_client *client)
|
||||
{
|
||||
struct tca8418_keypad *keypad_data = i2c_get_clientdata(client);
|
||||
|
||||
free_irq(keypad_data->client->irq, keypad_data);
|
||||
|
||||
input_unregister_device(keypad_data->input);
|
||||
|
||||
kfree(keypad_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id tca8418_id[] = {
|
||||
{ TCA8418_NAME, 8418, },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, tca8418_id);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id tca8418_dt_ids[] __devinitconst = {
|
||||
{ .compatible = "ti,tca8418", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tca8418_dt_ids);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver tca8418_keypad_driver = {
|
||||
.driver = {
|
||||
.name = TCA8418_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(tca8418_dt_ids),
|
||||
},
|
||||
.probe = tca8418_keypad_probe,
|
||||
.remove = __devexit_p(tca8418_keypad_remove),
|
||||
.id_table = tca8418_id,
|
||||
};
|
||||
|
||||
|
@ -87,7 +87,7 @@ struct tegra_kbc {
|
||||
struct clk *clk;
|
||||
};
|
||||
|
||||
static const u32 tegra_kbc_default_keymap[] __devinitdata = {
|
||||
static const u32 tegra_kbc_default_keymap[] = {
|
||||
KEY(0, 2, KEY_W),
|
||||
KEY(0, 3, KEY_S),
|
||||
KEY(0, 4, KEY_A),
|
||||
@ -223,7 +223,7 @@ static const u32 tegra_kbc_default_keymap[] __devinitdata = {
|
||||
};
|
||||
|
||||
static const
|
||||
struct matrix_keymap_data tegra_kbc_default_keymap_data __devinitdata = {
|
||||
struct matrix_keymap_data tegra_kbc_default_keymap_data = {
|
||||
.keymap = tegra_kbc_default_keymap,
|
||||
.keymap_size = ARRAY_SIZE(tegra_kbc_default_keymap),
|
||||
};
|
||||
@ -573,7 +573,7 @@ static void tegra_kbc_close(struct input_dev *dev)
|
||||
return tegra_kbc_stop(kbc);
|
||||
}
|
||||
|
||||
static bool __devinit
|
||||
static bool
|
||||
tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
|
||||
struct device *dev, unsigned int *num_rows)
|
||||
{
|
||||
@ -619,7 +619,7 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct tegra_kbc_platform_data * __devinit tegra_kbc_dt_parse_pdata(
|
||||
static struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
struct tegra_kbc_platform_data *pdata;
|
||||
@ -670,7 +670,7 @@ static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
|
||||
static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
|
||||
{
|
||||
const struct tegra_kbc_platform_data *pdata = kbc->pdata;
|
||||
const struct matrix_keymap_data *keymap_data = pdata->keymap_data;
|
||||
@ -697,7 +697,7 @@ static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int __devinit tegra_kbc_probe(struct platform_device *pdev)
|
||||
static int tegra_kbc_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct tegra_kbc *kbc;
|
||||
@ -838,7 +838,7 @@ err_free_pdata:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit tegra_kbc_remove(struct platform_device *pdev)
|
||||
static int tegra_kbc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct tegra_kbc *kbc = platform_get_drvdata(pdev);
|
||||
struct resource *res;
|
||||
@ -954,7 +954,7 @@ MODULE_DEVICE_TABLE(of, tegra_kbc_of_match);
|
||||
|
||||
static struct platform_driver tegra_kbc_driver = {
|
||||
.probe = tegra_kbc_probe,
|
||||
.remove = __devexit_p(tegra_kbc_remove),
|
||||
.remove = tegra_kbc_remove,
|
||||
.driver = {
|
||||
.name = "tegra-kbc",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -153,7 +153,7 @@ static void keypad_stop(struct input_dev *dev)
|
||||
clk_disable(kp->clk);
|
||||
}
|
||||
|
||||
static int __devinit keypad_probe(struct platform_device *pdev)
|
||||
static int keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct matrix_keypad_platform_data *pdata;
|
||||
const struct matrix_keymap_data *keymap_data;
|
||||
@ -301,7 +301,7 @@ error_res:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit keypad_remove(struct platform_device *pdev)
|
||||
static int keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct keypad_data *kp = platform_get_drvdata(pdev);
|
||||
|
||||
@ -319,7 +319,7 @@ static int __devexit keypad_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver keypad_driver = {
|
||||
.probe = keypad_probe,
|
||||
.remove = __devexit_p(keypad_remove),
|
||||
.remove = keypad_remove,
|
||||
.driver.name = "tnetv107x-keypad",
|
||||
.driver.owner = THIS_MODULE,
|
||||
};
|
||||
|
@ -271,7 +271,7 @@ static irqreturn_t do_kp_irq(int irq, void *_kp)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit twl4030_kp_program(struct twl4030_keypad *kp)
|
||||
static int twl4030_kp_program(struct twl4030_keypad *kp)
|
||||
{
|
||||
u8 reg;
|
||||
int i;
|
||||
@ -328,7 +328,7 @@ static int __devinit twl4030_kp_program(struct twl4030_keypad *kp)
|
||||
* Registers keypad device with input subsystem
|
||||
* and configures TWL4030 keypad registers
|
||||
*/
|
||||
static int __devinit twl4030_kp_probe(struct platform_device *pdev)
|
||||
static int twl4030_kp_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct twl4030_keypad_data *pdata = pdev->dev.platform_data;
|
||||
const struct matrix_keymap_data *keymap_data;
|
||||
@ -432,7 +432,7 @@ err1:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit twl4030_kp_remove(struct platform_device *pdev)
|
||||
static int twl4030_kp_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct twl4030_keypad *kp = platform_get_drvdata(pdev);
|
||||
|
||||
@ -452,7 +452,7 @@ static int __devexit twl4030_kp_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver twl4030_kp_driver = {
|
||||
.probe = twl4030_kp_probe,
|
||||
.remove = __devexit_p(twl4030_kp_remove),
|
||||
.remove = twl4030_kp_remove,
|
||||
.driver = {
|
||||
.name = "twl4030_keypad",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -118,7 +118,7 @@ static void w90p910_keypad_close(struct input_dev *dev)
|
||||
clk_disable(keypad->clk);
|
||||
}
|
||||
|
||||
static int __devinit w90p910_keypad_probe(struct platform_device *pdev)
|
||||
static int w90p910_keypad_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct w90p910_keypad_platform_data *pdata =
|
||||
pdev->dev.platform_data;
|
||||
@ -234,7 +234,7 @@ failed_free:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit w90p910_keypad_remove(struct platform_device *pdev)
|
||||
static int w90p910_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct w90p910_keypad *keypad = platform_get_drvdata(pdev);
|
||||
struct resource *res;
|
||||
@ -257,7 +257,7 @@ static int __devexit w90p910_keypad_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver w90p910_keypad_driver = {
|
||||
.probe = w90p910_keypad_probe,
|
||||
.remove = __devexit_p(w90p910_keypad_remove),
|
||||
.remove = w90p910_keypad_remove,
|
||||
.driver = {
|
||||
.name = "nuc900-kpi",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/input.h>
|
||||
@ -123,6 +124,11 @@ static int matrix_keypad_parse_of_keymap(const char *propname,
|
||||
* it will attempt load the keymap from property specified by @keymap_name
|
||||
* argument (or "linux,keymap" if @keymap_name is %NULL).
|
||||
*
|
||||
* If @keymap is %NULL the function will automatically allocate managed
|
||||
* block of memory to store the keymap. This memory will be associated with
|
||||
* the parent device and automatically freed when device unbinds from the
|
||||
* driver.
|
||||
*
|
||||
* Callers are expected to set up input_dev->dev.parent before calling this
|
||||
* function.
|
||||
*/
|
||||
@ -133,12 +139,27 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
|
||||
struct input_dev *input_dev)
|
||||
{
|
||||
unsigned int row_shift = get_count_order(cols);
|
||||
size_t max_keys = rows << row_shift;
|
||||
int i;
|
||||
int error;
|
||||
|
||||
if (WARN_ON(!input_dev->dev.parent))
|
||||
return -EINVAL;
|
||||
|
||||
if (!keymap) {
|
||||
keymap = devm_kzalloc(input_dev->dev.parent,
|
||||
max_keys * sizeof(*keymap),
|
||||
GFP_KERNEL);
|
||||
if (!keymap) {
|
||||
dev_err(input_dev->dev.parent,
|
||||
"Unable to allocate memory for keymap");
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
input_dev->keycode = keymap;
|
||||
input_dev->keycodesize = sizeof(*keymap);
|
||||
input_dev->keycodemax = rows << row_shift;
|
||||
input_dev->keycodemax = max_keys;
|
||||
|
||||
__set_bit(EV_KEY, input_dev->evbit);
|
||||
|
||||
|
@ -62,7 +62,7 @@ static irqreturn_t pm80x_onkey_handler(int irq, void *data)
|
||||
static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend,
|
||||
pm80x_dev_resume);
|
||||
|
||||
static int __devinit pm80x_onkey_probe(struct platform_device *pdev)
|
||||
static int pm80x_onkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
||||
struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
@ -139,7 +139,7 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit pm80x_onkey_remove(struct platform_device *pdev)
|
||||
static int pm80x_onkey_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pm80x_onkey_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
@ -157,7 +157,7 @@ static struct platform_driver pm80x_onkey_driver = {
|
||||
.pm = &pm80x_onkey_pm_ops,
|
||||
},
|
||||
.probe = pm80x_onkey_probe,
|
||||
.remove = __devexit_p(pm80x_onkey_remove),
|
||||
.remove = pm80x_onkey_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(pm80x_onkey_driver);
|
||||
|
@ -56,7 +56,7 @@ static irqreturn_t pm860x_onkey_handler(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit pm860x_onkey_probe(struct platform_device *pdev)
|
||||
static int pm860x_onkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
struct pm860x_onkey_info *info;
|
||||
@ -121,7 +121,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit pm860x_onkey_remove(struct platform_device *pdev)
|
||||
static int pm860x_onkey_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pm860x_onkey_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
@ -161,7 +161,7 @@ static struct platform_driver pm860x_onkey_driver = {
|
||||
.pm = &pm860x_onkey_pm_ops,
|
||||
},
|
||||
.probe = pm860x_onkey_probe,
|
||||
.remove = __devexit_p(pm860x_onkey_remove),
|
||||
.remove = pm860x_onkey_remove,
|
||||
};
|
||||
module_platform_driver(pm860x_onkey_driver);
|
||||
|
||||
|
@ -300,8 +300,7 @@ config INPUT_ATI_REMOTE2
|
||||
called ati_remote2.
|
||||
|
||||
config INPUT_KEYSPAN_REMOTE
|
||||
tristate "Keyspan DMR USB remote control (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
tristate "Keyspan DMR USB remote control"
|
||||
depends on USB_ARCH_HAS_HCD
|
||||
select USB
|
||||
help
|
||||
@ -350,7 +349,6 @@ config INPUT_POWERMATE
|
||||
|
||||
config INPUT_YEALINK
|
||||
tristate "Yealink usb-p1k voip phone"
|
||||
depends on EXPERIMENTAL
|
||||
depends on USB_ARCH_HAS_HCD
|
||||
select USB
|
||||
help
|
||||
@ -366,7 +364,6 @@ config INPUT_YEALINK
|
||||
|
||||
config INPUT_CM109
|
||||
tristate "C-Media CM109 USB I/O Controller"
|
||||
depends on EXPERIMENTAL
|
||||
depends on USB_ARCH_HAS_HCD
|
||||
select USB
|
||||
help
|
||||
@ -377,6 +374,16 @@ config INPUT_CM109
|
||||
To compile this driver as a module, choose M here: the module will be
|
||||
called cm109.
|
||||
|
||||
config INPUT_RETU_PWRBUTTON
|
||||
tristate "Retu Power button Driver"
|
||||
depends on MFD_RETU
|
||||
help
|
||||
Say Y here if you want to enable power key reporting via the
|
||||
Retu chips found in Nokia Internet Tablets (770, N800, N810).
|
||||
|
||||
To compile this driver as a module, choose M here. The module will
|
||||
be called retu-pwrbutton.
|
||||
|
||||
config INPUT_TWL4030_PWRBUTTON
|
||||
tristate "TWL4030 Power button Driver"
|
||||
depends on TWL4030_CORE
|
||||
@ -444,7 +451,7 @@ config INPUT_PCF50633_PMU
|
||||
|
||||
config INPUT_PCF8574
|
||||
tristate "PCF8574 Keypad input device"
|
||||
depends on I2C && EXPERIMENTAL
|
||||
depends on I2C
|
||||
help
|
||||
Say Y here if you want to support a keypad connected via I2C
|
||||
with a PCF8574.
|
||||
@ -454,7 +461,7 @@ config INPUT_PCF8574
|
||||
|
||||
config INPUT_PWM_BEEPER
|
||||
tristate "PWM beeper support"
|
||||
depends on HAVE_PWM
|
||||
depends on HAVE_PWM || PWM
|
||||
help
|
||||
Say Y here to get support for PWM based beeper devices.
|
||||
|
||||
@ -496,6 +503,16 @@ config INPUT_DA9052_ONKEY
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called da9052_onkey.
|
||||
|
||||
config INPUT_DA9055_ONKEY
|
||||
tristate "Dialog Semiconductor DA9055 ONKEY"
|
||||
depends on MFD_DA9055
|
||||
help
|
||||
Support the ONKEY of DA9055 PMICs as an input device
|
||||
reporting power button status.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called da9055_onkey.
|
||||
|
||||
config INPUT_DM355EVM
|
||||
tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
|
||||
depends on MFD_DM355EVM_MSP
|
||||
|
@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o
|
||||
obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o
|
||||
obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o
|
||||
obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o
|
||||
obj-$(CONFIG_INPUT_DA9055_ONKEY) += da9055_onkey.o
|
||||
obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o
|
||||
obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o
|
||||
obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o
|
||||
@ -46,6 +47,7 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o
|
||||
obj-$(CONFIG_INPUT_POWERMATE) += powermate.o
|
||||
obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o
|
||||
obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o
|
||||
obj-$(CONFIG_INPUT_RETU_PWRBUTTON) += retu-pwrbutton.o
|
||||
obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o
|
||||
obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o
|
||||
obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
|
||||
|
@ -45,7 +45,7 @@ static irqreturn_t ab8500_ponkey_handler(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit ab8500_ponkey_probe(struct platform_device *pdev)
|
||||
static int ab8500_ponkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
|
||||
struct ab8500_ponkey *ponkey;
|
||||
@ -118,7 +118,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit ab8500_ponkey_remove(struct platform_device *pdev)
|
||||
static int ab8500_ponkey_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev);
|
||||
|
||||
@ -146,7 +146,7 @@ static struct platform_driver ab8500_ponkey_driver = {
|
||||
.of_match_table = of_match_ptr(ab8500_ponkey_match),
|
||||
},
|
||||
.probe = ab8500_ponkey_probe,
|
||||
.remove = __devexit_p(ab8500_ponkey_remove),
|
||||
.remove = ab8500_ponkey_remove,
|
||||
};
|
||||
module_platform_driver(ab8500_ponkey_driver);
|
||||
|
||||
|
@ -72,7 +72,7 @@ static int ad714x_i2c_read(struct ad714x_chip *chip,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit ad714x_i2c_probe(struct i2c_client *client,
|
||||
static int ad714x_i2c_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct ad714x_chip *chip;
|
||||
@ -87,7 +87,7 @@ static int __devinit ad714x_i2c_probe(struct i2c_client *client,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit ad714x_i2c_remove(struct i2c_client *client)
|
||||
static int ad714x_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
struct ad714x_chip *chip = i2c_get_clientdata(client);
|
||||
|
||||
@ -112,7 +112,7 @@ static struct i2c_driver ad714x_i2c_driver = {
|
||||
.pm = &ad714x_i2c_pm,
|
||||
},
|
||||
.probe = ad714x_i2c_probe,
|
||||
.remove = __devexit_p(ad714x_i2c_remove),
|
||||
.remove = ad714x_i2c_remove,
|
||||
.id_table = ad714x_id,
|
||||
};
|
||||
|
||||
|
@ -83,7 +83,7 @@ static int ad714x_spi_write(struct ad714x_chip *chip,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit ad714x_spi_probe(struct spi_device *spi)
|
||||
static int ad714x_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct ad714x_chip *chip;
|
||||
int err;
|
||||
@ -103,7 +103,7 @@ static int __devinit ad714x_spi_probe(struct spi_device *spi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit ad714x_spi_remove(struct spi_device *spi)
|
||||
static int ad714x_spi_remove(struct spi_device *spi)
|
||||
{
|
||||
struct ad714x_chip *chip = spi_get_drvdata(spi);
|
||||
|
||||
@ -120,7 +120,7 @@ static struct spi_driver ad714x_spi_driver = {
|
||||
.pm = &ad714x_spi_pm,
|
||||
},
|
||||
.probe = ad714x_spi_probe,
|
||||
.remove = __devexit_p(ad714x_spi_remove),
|
||||
.remove = ad714x_spi_remove,
|
||||
};
|
||||
|
||||
module_spi_driver(ad714x_spi_driver);
|
||||
|
@ -73,7 +73,7 @@ static const struct adxl34x_bus_ops adxl34x_i2c_bops = {
|
||||
.read_block = adxl34x_i2c_read_block,
|
||||
};
|
||||
|
||||
static int __devinit adxl34x_i2c_probe(struct i2c_client *client,
|
||||
static int adxl34x_i2c_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct adxl34x *ac;
|
||||
@ -98,7 +98,7 @@ static int __devinit adxl34x_i2c_probe(struct i2c_client *client,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit adxl34x_i2c_remove(struct i2c_client *client)
|
||||
static int adxl34x_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
struct adxl34x *ac = i2c_get_clientdata(client);
|
||||
|
||||
@ -144,7 +144,7 @@ static struct i2c_driver adxl34x_driver = {
|
||||
.pm = &adxl34x_i2c_pm,
|
||||
},
|
||||
.probe = adxl34x_i2c_probe,
|
||||
.remove = __devexit_p(adxl34x_i2c_remove),
|
||||
.remove = adxl34x_i2c_remove,
|
||||
.id_table = adxl34x_id,
|
||||
};
|
||||
|
||||
|
@ -65,7 +65,7 @@ static const struct adxl34x_bus_ops adxl34x_spi_bops = {
|
||||
.read_block = adxl34x_spi_read_block,
|
||||
};
|
||||
|
||||
static int __devinit adxl34x_spi_probe(struct spi_device *spi)
|
||||
static int adxl34x_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct adxl34x *ac;
|
||||
|
||||
@ -87,7 +87,7 @@ static int __devinit adxl34x_spi_probe(struct spi_device *spi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit adxl34x_spi_remove(struct spi_device *spi)
|
||||
static int adxl34x_spi_remove(struct spi_device *spi)
|
||||
{
|
||||
struct adxl34x *ac = dev_get_drvdata(&spi->dev);
|
||||
|
||||
@ -126,7 +126,7 @@ static struct spi_driver adxl34x_driver = {
|
||||
.pm = &adxl34x_spi_pm,
|
||||
},
|
||||
.probe = adxl34x_spi_probe,
|
||||
.remove = __devexit_p(adxl34x_spi_remove),
|
||||
.remove = adxl34x_spi_remove,
|
||||
};
|
||||
|
||||
module_spi_driver(adxl34x_driver);
|
||||
|
@ -90,7 +90,7 @@ static irqreturn_t bfin_rotary_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit bfin_rotary_probe(struct platform_device *pdev)
|
||||
static int bfin_rotary_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct bfin_rot *rotary;
|
||||
@ -196,7 +196,7 @@ out1:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit bfin_rotary_remove(struct platform_device *pdev)
|
||||
static int bfin_rotary_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct bfin_rot *rotary = platform_get_drvdata(pdev);
|
||||
|
||||
@ -255,7 +255,7 @@ static const struct dev_pm_ops bfin_rotary_pm_ops = {
|
||||
|
||||
static struct platform_driver bfin_rotary_device_driver = {
|
||||
.probe = bfin_rotary_probe,
|
||||
.remove = __devexit_p(bfin_rotary_remove),
|
||||
.remove = bfin_rotary_remove,
|
||||
.driver = {
|
||||
.name = "bfin-rotary",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -158,7 +158,7 @@ struct bma150_data {
|
||||
* are stated and verified by Bosch Sensortec where they are configured
|
||||
* to provide a generic sensitivity performance.
|
||||
*/
|
||||
static struct bma150_cfg default_cfg __devinitdata = {
|
||||
static struct bma150_cfg default_cfg = {
|
||||
.any_motion_int = 1,
|
||||
.hg_int = 1,
|
||||
.lg_int = 1,
|
||||
@ -224,7 +224,7 @@ static int bma150_set_mode(struct bma150_data *bma150, u8 mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit bma150_soft_reset(struct bma150_data *bma150)
|
||||
static int bma150_soft_reset(struct bma150_data *bma150)
|
||||
{
|
||||
int error;
|
||||
|
||||
@ -237,19 +237,19 @@ static int __devinit bma150_soft_reset(struct bma150_data *bma150)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit bma150_set_range(struct bma150_data *bma150, u8 range)
|
||||
static int bma150_set_range(struct bma150_data *bma150, u8 range)
|
||||
{
|
||||
return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS,
|
||||
BMA150_RANGE_MSK, BMA150_RANGE_REG);
|
||||
}
|
||||
|
||||
static int __devinit bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)
|
||||
static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)
|
||||
{
|
||||
return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS,
|
||||
BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG);
|
||||
}
|
||||
|
||||
static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150,
|
||||
static int bma150_set_low_g_interrupt(struct bma150_data *bma150,
|
||||
u8 enable, u8 hyst, u8 dur, u8 thres)
|
||||
{
|
||||
int error;
|
||||
@ -273,7 +273,7 @@ static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150,
|
||||
BMA150_LOW_G_EN_REG);
|
||||
}
|
||||
|
||||
static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150,
|
||||
static int bma150_set_high_g_interrupt(struct bma150_data *bma150,
|
||||
u8 enable, u8 hyst, u8 dur, u8 thres)
|
||||
{
|
||||
int error;
|
||||
@ -300,7 +300,7 @@ static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150,
|
||||
}
|
||||
|
||||
|
||||
static int __devinit bma150_set_any_motion_interrupt(struct bma150_data *bma150,
|
||||
static int bma150_set_any_motion_interrupt(struct bma150_data *bma150,
|
||||
u8 enable, u8 dur, u8 thres)
|
||||
{
|
||||
int error;
|
||||
@ -424,7 +424,7 @@ static void bma150_poll_close(struct input_polled_dev *ipoll_dev)
|
||||
bma150_close(bma150);
|
||||
}
|
||||
|
||||
static int __devinit bma150_initialize(struct bma150_data *bma150,
|
||||
static int bma150_initialize(struct bma150_data *bma150,
|
||||
const struct bma150_cfg *cfg)
|
||||
{
|
||||
int error;
|
||||
@ -465,7 +465,7 @@ static int __devinit bma150_initialize(struct bma150_data *bma150,
|
||||
return bma150_set_mode(bma150, BMA150_MODE_SLEEP);
|
||||
}
|
||||
|
||||
static void __devinit bma150_init_input_device(struct bma150_data *bma150,
|
||||
static void bma150_init_input_device(struct bma150_data *bma150,
|
||||
struct input_dev *idev)
|
||||
{
|
||||
idev->name = BMA150_DRIVER;
|
||||
@ -479,7 +479,7 @@ static void __devinit bma150_init_input_device(struct bma150_data *bma150,
|
||||
input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);
|
||||
}
|
||||
|
||||
static int __devinit bma150_register_input_device(struct bma150_data *bma150)
|
||||
static int bma150_register_input_device(struct bma150_data *bma150)
|
||||
{
|
||||
struct input_dev *idev;
|
||||
int error;
|
||||
@ -504,7 +504,7 @@ static int __devinit bma150_register_input_device(struct bma150_data *bma150)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit bma150_register_polled_device(struct bma150_data *bma150)
|
||||
static int bma150_register_polled_device(struct bma150_data *bma150)
|
||||
{
|
||||
struct input_polled_dev *ipoll_dev;
|
||||
int error;
|
||||
@ -535,7 +535,7 @@ static int __devinit bma150_register_polled_device(struct bma150_data *bma150)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit bma150_probe(struct i2c_client *client,
|
||||
static int bma150_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct bma150_platform_data *pdata = client->dev.platform_data;
|
||||
@ -613,7 +613,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit bma150_remove(struct i2c_client *client)
|
||||
static int bma150_remove(struct i2c_client *client)
|
||||
{
|
||||
struct bma150_data *bma150 = i2c_get_clientdata(client);
|
||||
|
||||
@ -670,7 +670,7 @@ static struct i2c_driver bma150_driver = {
|
||||
.class = I2C_CLASS_HWMON,
|
||||
.id_table = bma150_id,
|
||||
.probe = bma150_probe,
|
||||
.remove = __devexit_p(bma150_remove),
|
||||
.remove = bma150_remove,
|
||||
};
|
||||
|
||||
module_i2c_driver(bma150_driver);
|
||||
|
@ -55,7 +55,7 @@ static const struct cma3000_bus_ops cma3000_i2c_bops = {
|
||||
.write = cma3000_i2c_set,
|
||||
};
|
||||
|
||||
static int __devinit cma3000_i2c_probe(struct i2c_client *client,
|
||||
static int cma3000_i2c_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct cma3000_accl_data *data;
|
||||
@ -69,7 +69,7 @@ static int __devinit cma3000_i2c_probe(struct i2c_client *client,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit cma3000_i2c_remove(struct i2c_client *client)
|
||||
static int cma3000_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
struct cma3000_accl_data *data = i2c_get_clientdata(client);
|
||||
|
||||
@ -114,7 +114,7 @@ MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id);
|
||||
|
||||
static struct i2c_driver cma3000_i2c_driver = {
|
||||
.probe = cma3000_i2c_probe,
|
||||
.remove = __devexit_p(cma3000_i2c_remove),
|
||||
.remove = cma3000_i2c_remove,
|
||||
.id_table = cma3000_i2c_id,
|
||||
.driver = {
|
||||
.name = "cma3000_i2c_accl",
|
||||
|
@ -73,7 +73,7 @@ static void handle_buttons(struct input_polled_dev *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit cobalt_buttons_probe(struct platform_device *pdev)
|
||||
static int cobalt_buttons_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct buttons_dev *bdev;
|
||||
struct input_polled_dev *poll_dev;
|
||||
@ -135,7 +135,7 @@ static int __devinit cobalt_buttons_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit cobalt_buttons_remove(struct platform_device *pdev)
|
||||
static int cobalt_buttons_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct buttons_dev *bdev = dev_get_drvdata(dev);
|
||||
@ -157,7 +157,7 @@ MODULE_ALIAS("platform:Cobalt buttons");
|
||||
|
||||
static struct platform_driver cobalt_buttons_driver = {
|
||||
.probe = cobalt_buttons_probe,
|
||||
.remove = __devexit_p(cobalt_buttons_remove),
|
||||
.remove = cobalt_buttons_remove,
|
||||
.driver = {
|
||||
.name = "Cobalt buttons",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -70,7 +70,7 @@ static irqreturn_t da9052_onkey_irq(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit da9052_onkey_probe(struct platform_device *pdev)
|
||||
static int da9052_onkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent);
|
||||
struct da9052_onkey *onkey;
|
||||
@ -129,7 +129,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit da9052_onkey_remove(struct platform_device *pdev)
|
||||
static int da9052_onkey_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct da9052_onkey *onkey = platform_get_drvdata(pdev);
|
||||
|
||||
@ -144,7 +144,7 @@ static int __devexit da9052_onkey_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver da9052_onkey_driver = {
|
||||
.probe = da9052_onkey_probe,
|
||||
.remove = __devexit_p(da9052_onkey_remove),
|
||||
.remove = da9052_onkey_remove,
|
||||
.driver = {
|
||||
.name = "da9052-onkey",
|
||||
.owner = THIS_MODULE,
|
||||
|
171
drivers/input/misc/da9055_onkey.c
Normal file
171
drivers/input/misc/da9055_onkey.c
Normal 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");
|
@ -173,7 +173,7 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys)
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
static int __devinit dm355evm_keys_probe(struct platform_device *pdev)
|
||||
static int dm355evm_keys_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct dm355evm_keys *keys;
|
||||
struct input_dev *input;
|
||||
@ -239,7 +239,7 @@ fail1:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int __devexit dm355evm_keys_remove(struct platform_device *pdev)
|
||||
static int dm355evm_keys_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct dm355evm_keys *keys = platform_get_drvdata(pdev);
|
||||
|
||||
@ -262,7 +262,7 @@ static int __devexit dm355evm_keys_remove(struct platform_device *pdev)
|
||||
*/
|
||||
static struct platform_driver dm355evm_keys_driver = {
|
||||
.probe = dm355evm_keys_probe,
|
||||
.remove = __devexit_p(dm355evm_keys_remove),
|
||||
.remove = dm355evm_keys_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "dm355evm_keys",
|
||||
|
@ -98,7 +98,7 @@ static void gp2a_device_close(struct input_dev *dev)
|
||||
"unable to deactivate, err %d\n", error);
|
||||
}
|
||||
|
||||
static int __devinit gp2a_initialize(struct gp2a_data *dt)
|
||||
static int gp2a_initialize(struct gp2a_data *dt)
|
||||
{
|
||||
int error;
|
||||
|
||||
@ -122,7 +122,7 @@ static int __devinit gp2a_initialize(struct gp2a_data *dt)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devinit gp2a_probe(struct i2c_client *client,
|
||||
static int gp2a_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct gp2a_platform_data *pdata = client->dev.platform_data;
|
||||
@ -205,7 +205,7 @@ err_hw_shutdown:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gp2a_remove(struct i2c_client *client)
|
||||
static int gp2a_remove(struct i2c_client *client)
|
||||
{
|
||||
struct gp2a_data *dt = i2c_get_clientdata(client);
|
||||
const struct gp2a_platform_data *pdata = dt->pdata;
|
||||
@ -277,7 +277,7 @@ static struct i2c_driver gp2a_i2c_driver = {
|
||||
.pm = &gp2a_pm,
|
||||
},
|
||||
.probe = gp2a_probe,
|
||||
.remove = __devexit_p(gp2a_remove),
|
||||
.remove = gp2a_remove,
|
||||
.id_table = gp2a_i2c_id,
|
||||
};
|
||||
|
||||
|
@ -96,7 +96,7 @@ static void gpio_tilt_polled_close(struct input_polled_dev *dev)
|
||||
pdata->disable(tdev->dev);
|
||||
}
|
||||
|
||||
static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev)
|
||||
static int gpio_tilt_polled_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct device *dev = &pdev->dev;
|
||||
@ -179,7 +179,7 @@ err_free_tdev:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
|
||||
static int gpio_tilt_polled_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev);
|
||||
const struct gpio_tilt_platform_data *pdata = tdev->pdata;
|
||||
@ -198,7 +198,7 @@ static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver gpio_tilt_polled_driver = {
|
||||
.probe = gpio_tilt_polled_probe,
|
||||
.remove = __devexit_p(gpio_tilt_polled_remove),
|
||||
.remove = gpio_tilt_polled_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -87,7 +87,7 @@ static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit ixp4xx_spkr_probe(struct platform_device *dev)
|
||||
static int ixp4xx_spkr_probe(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev;
|
||||
int err;
|
||||
@ -132,7 +132,7 @@ static int __devinit ixp4xx_spkr_probe(struct platform_device *dev)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit ixp4xx_spkr_remove(struct platform_device *dev)
|
||||
static int ixp4xx_spkr_remove(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev = platform_get_drvdata(dev);
|
||||
unsigned int pin = (unsigned int) input_get_drvdata(input_dev);
|
||||
@ -165,7 +165,7 @@ static struct platform_driver ixp4xx_spkr_platform_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = ixp4xx_spkr_probe,
|
||||
.remove = __devexit_p(ixp4xx_spkr_remove),
|
||||
.remove = ixp4xx_spkr_remove,
|
||||
.shutdown = ixp4xx_spkr_shutdown,
|
||||
};
|
||||
module_platform_driver(ixp4xx_spkr_platform_driver);
|
||||
|
@ -295,7 +295,7 @@ static void kxtj9_input_close(struct input_dev *dev)
|
||||
kxtj9_disable(tj9);
|
||||
}
|
||||
|
||||
static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9,
|
||||
static void kxtj9_init_input_device(struct kxtj9_data *tj9,
|
||||
struct input_dev *input_dev)
|
||||
{
|
||||
__set_bit(EV_ABS, input_dev->evbit);
|
||||
@ -308,7 +308,7 @@ static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9,
|
||||
input_dev->dev.parent = &tj9->client->dev;
|
||||
}
|
||||
|
||||
static int __devinit kxtj9_setup_input_device(struct kxtj9_data *tj9)
|
||||
static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
|
||||
{
|
||||
struct input_dev *input_dev;
|
||||
int err;
|
||||
@ -433,7 +433,7 @@ static void kxtj9_polled_input_close(struct input_polled_dev *dev)
|
||||
kxtj9_disable(tj9);
|
||||
}
|
||||
|
||||
static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9)
|
||||
static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
|
||||
{
|
||||
int err;
|
||||
struct input_polled_dev *poll_dev;
|
||||
@ -466,7 +466,7 @@ static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __devexit kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
|
||||
static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
|
||||
{
|
||||
input_unregister_polled_device(tj9->poll_dev);
|
||||
input_free_polled_device(tj9->poll_dev);
|
||||
@ -485,7 +485,7 @@ static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
|
||||
|
||||
#endif
|
||||
|
||||
static int __devinit kxtj9_verify(struct kxtj9_data *tj9)
|
||||
static int kxtj9_verify(struct kxtj9_data *tj9)
|
||||
{
|
||||
int retval;
|
||||
|
||||
@ -506,7 +506,7 @@ out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int __devinit kxtj9_probe(struct i2c_client *client,
|
||||
static int kxtj9_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct kxtj9_platform_data *pdata = client->dev.platform_data;
|
||||
@ -594,7 +594,7 @@ err_free_mem:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit kxtj9_remove(struct i2c_client *client)
|
||||
static int kxtj9_remove(struct i2c_client *client)
|
||||
{
|
||||
struct kxtj9_data *tj9 = i2c_get_clientdata(client);
|
||||
|
||||
@ -663,7 +663,7 @@ static struct i2c_driver kxtj9_driver = {
|
||||
.pm = &kxtj9_pm_ops,
|
||||
},
|
||||
.probe = kxtj9_probe,
|
||||
.remove = __devexit_p(kxtj9_remove),
|
||||
.remove = kxtj9_remove,
|
||||
.id_table = kxtj9_id,
|
||||
};
|
||||
|
||||
|
@ -48,7 +48,7 @@ static int m68kspkr_event(struct input_dev *dev, unsigned int type, unsigned int
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit m68kspkr_probe(struct platform_device *dev)
|
||||
static int m68kspkr_probe(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev;
|
||||
int err;
|
||||
@ -80,7 +80,7 @@ static int __devinit m68kspkr_probe(struct platform_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit m68kspkr_remove(struct platform_device *dev)
|
||||
static int m68kspkr_remove(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev = platform_get_drvdata(dev);
|
||||
|
||||
@ -104,7 +104,7 @@ static struct platform_driver m68kspkr_platform_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = m68kspkr_probe,
|
||||
.remove = __devexit_p(m68kspkr_remove),
|
||||
.remove = m68kspkr_remove,
|
||||
.shutdown = m68kspkr_shutdown,
|
||||
};
|
||||
|
||||
|
@ -62,7 +62,7 @@ static irqreturn_t max8925_onkey_handler(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit max8925_onkey_probe(struct platform_device *pdev)
|
||||
static int max8925_onkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
struct max8925_onkey_info *info;
|
||||
@ -141,7 +141,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit max8925_onkey_remove(struct platform_device *pdev)
|
||||
static int max8925_onkey_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct max8925_onkey_info *info = platform_get_drvdata(pdev);
|
||||
struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
@ -195,7 +195,7 @@ static struct platform_driver max8925_onkey_driver = {
|
||||
.pm = &max8925_onkey_pm_ops,
|
||||
},
|
||||
.probe = max8925_onkey_probe,
|
||||
.remove = __devexit_p(max8925_onkey_remove),
|
||||
.remove = max8925_onkey_remove,
|
||||
};
|
||||
module_platform_driver(max8925_onkey_driver);
|
||||
|
||||
|
@ -241,7 +241,7 @@ static void max8997_haptic_close(struct input_dev *dev)
|
||||
max8997_haptic_disable(chip);
|
||||
}
|
||||
|
||||
static int __devinit max8997_haptic_probe(struct platform_device *pdev)
|
||||
static int max8997_haptic_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
|
||||
const struct max8997_platform_data *pdata =
|
||||
@ -354,7 +354,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit max8997_haptic_remove(struct platform_device *pdev)
|
||||
static int max8997_haptic_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct max8997_haptic *chip = platform_get_drvdata(pdev);
|
||||
|
||||
@ -396,7 +396,7 @@ static struct platform_driver max8997_haptic_driver = {
|
||||
.pm = &max8997_haptic_pm_ops,
|
||||
},
|
||||
.probe = max8997_haptic_probe,
|
||||
.remove = __devexit_p(max8997_haptic_remove),
|
||||
.remove = max8997_haptic_remove,
|
||||
.id_table = max8997_haptic_id,
|
||||
};
|
||||
module_platform_driver(max8997_haptic_driver);
|
||||
|
@ -89,7 +89,7 @@ static irqreturn_t button_irq(int irq, void *_priv)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit mc13783_pwrbutton_probe(struct platform_device *pdev)
|
||||
static int mc13783_pwrbutton_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct mc13xxx_buttons_platform_data *pdata;
|
||||
struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
|
||||
@ -230,7 +230,7 @@ free_input_dev:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
|
||||
static int mc13783_pwrbutton_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mc13783_pwrb *priv = platform_get_drvdata(pdev);
|
||||
const struct mc13xxx_buttons_platform_data *pdata;
|
||||
@ -257,7 +257,7 @@ static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver mc13783_pwrbutton_driver = {
|
||||
.probe = mc13783_pwrbutton_probe,
|
||||
.remove = __devexit_p(mc13783_pwrbutton_remove),
|
||||
.remove = mc13783_pwrbutton_remove,
|
||||
.driver = {
|
||||
.name = "mc13783-pwrbutton",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -167,7 +167,7 @@ static void mma8450_close(struct input_polled_dev *dev)
|
||||
/*
|
||||
* I2C init/probing/exit functions
|
||||
*/
|
||||
static int __devinit mma8450_probe(struct i2c_client *c,
|
||||
static int mma8450_probe(struct i2c_client *c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct input_polled_dev *idev;
|
||||
@ -212,7 +212,7 @@ err_free_mem:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit mma8450_remove(struct i2c_client *c)
|
||||
static int mma8450_remove(struct i2c_client *c)
|
||||
{
|
||||
struct mma8450 *m = i2c_get_clientdata(c);
|
||||
struct input_polled_dev *idev = m->idev;
|
||||
@ -243,7 +243,7 @@ static struct i2c_driver mma8450_driver = {
|
||||
.of_match_table = mma8450_dt_ids,
|
||||
},
|
||||
.probe = mma8450_probe,
|
||||
.remove = __devexit_p(mma8450_remove),
|
||||
.remove = mma8450_remove,
|
||||
.id_table = mma8450_id,
|
||||
};
|
||||
|
||||
|
@ -257,7 +257,7 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data)
|
||||
*
|
||||
* Called during device probe; configures the sampling method.
|
||||
*/
|
||||
static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
|
||||
static int mpu3050_hw_init(struct mpu3050_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = sensor->client;
|
||||
int ret;
|
||||
@ -306,7 +306,7 @@ static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
|
||||
*
|
||||
* If present install the relevant sysfs interfaces and input device.
|
||||
*/
|
||||
static int __devinit mpu3050_probe(struct i2c_client *client,
|
||||
static int mpu3050_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct mpu3050_sensor *sensor;
|
||||
@ -402,7 +402,7 @@ err_free_mem:
|
||||
*
|
||||
* Our sensor is going away, clean up the resources.
|
||||
*/
|
||||
static int __devexit mpu3050_remove(struct i2c_client *client)
|
||||
static int mpu3050_remove(struct i2c_client *client)
|
||||
{
|
||||
struct mpu3050_sensor *sensor = i2c_get_clientdata(client);
|
||||
|
||||
@ -471,7 +471,7 @@ static struct i2c_driver mpu3050_i2c_driver = {
|
||||
.of_match_table = mpu3050_of_match,
|
||||
},
|
||||
.probe = mpu3050_probe,
|
||||
.remove = __devexit_p(mpu3050_remove),
|
||||
.remove = mpu3050_remove,
|
||||
.id_table = mpu3050_ids,
|
||||
};
|
||||
|
||||
|
@ -48,7 +48,7 @@ static irqreturn_t pcap_keys_handler(int irq, void *_pcap_keys)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit pcap_keys_probe(struct platform_device *pdev)
|
||||
static int pcap_keys_probe(struct platform_device *pdev)
|
||||
{
|
||||
int err = -ENOMEM;
|
||||
struct pcap_keys *pcap_keys;
|
||||
@ -104,7 +104,7 @@ fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit pcap_keys_remove(struct platform_device *pdev)
|
||||
static int pcap_keys_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pcap_keys *pcap_keys = platform_get_drvdata(pdev);
|
||||
|
||||
@ -119,7 +119,7 @@ static int __devexit pcap_keys_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver pcap_keys_device_driver = {
|
||||
.probe = pcap_keys_probe,
|
||||
.remove = __devexit_p(pcap_keys_remove),
|
||||
.remove = pcap_keys_remove,
|
||||
.driver = {
|
||||
.name = "pcap-keys",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -53,7 +53,7 @@ pcf50633_input_irq(int irq, void *data)
|
||||
input_sync(input->input_dev);
|
||||
}
|
||||
|
||||
static int __devinit pcf50633_input_probe(struct platform_device *pdev)
|
||||
static int pcf50633_input_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pcf50633_input *input;
|
||||
struct input_dev *input_dev;
|
||||
@ -93,7 +93,7 @@ static int __devinit pcf50633_input_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit pcf50633_input_remove(struct platform_device *pdev)
|
||||
static int pcf50633_input_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pcf50633_input *input = platform_get_drvdata(pdev);
|
||||
|
||||
@ -111,7 +111,7 @@ static struct platform_driver pcf50633_input_driver = {
|
||||
.name = "pcf50633-input",
|
||||
},
|
||||
.probe = pcf50633_input_probe,
|
||||
.remove = __devexit_p(pcf50633_input_remove),
|
||||
.remove = pcf50633_input_remove,
|
||||
};
|
||||
module_platform_driver(pcf50633_input_driver);
|
||||
|
||||
|
@ -82,7 +82,7 @@ static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
{
|
||||
int i, ret;
|
||||
struct input_dev *idev;
|
||||
@ -156,7 +156,7 @@ static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit pcf8574_kp_remove(struct i2c_client *client)
|
||||
static int pcf8574_kp_remove(struct i2c_client *client)
|
||||
{
|
||||
struct kp_data *lp = i2c_get_clientdata(client);
|
||||
|
||||
@ -212,7 +212,7 @@ static struct i2c_driver pcf8574_kp_driver = {
|
||||
#endif
|
||||
},
|
||||
.probe = pcf8574_kp_probe,
|
||||
.remove = __devexit_p(pcf8574_kp_remove),
|
||||
.remove = pcf8574_kp_remove,
|
||||
.id_table = pcf8574_kp_id,
|
||||
};
|
||||
|
||||
|
@ -63,7 +63,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit pcspkr_probe(struct platform_device *dev)
|
||||
static int pcspkr_probe(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *pcspkr_dev;
|
||||
int err;
|
||||
@ -95,7 +95,7 @@ static int __devinit pcspkr_probe(struct platform_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit pcspkr_remove(struct platform_device *dev)
|
||||
static int pcspkr_remove(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *pcspkr_dev = platform_get_drvdata(dev);
|
||||
|
||||
@ -131,7 +131,7 @@ static struct platform_driver pcspkr_platform_driver = {
|
||||
.pm = &pcspkr_pm_ops,
|
||||
},
|
||||
.probe = pcspkr_probe,
|
||||
.remove = __devexit_p(pcspkr_remove),
|
||||
.remove = pcspkr_remove,
|
||||
.shutdown = pcspkr_shutdown,
|
||||
};
|
||||
module_platform_driver(pcspkr_platform_driver);
|
||||
|
@ -178,7 +178,7 @@ static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit pm8xxx_vib_probe(struct platform_device *pdev)
|
||||
static int pm8xxx_vib_probe(struct platform_device *pdev)
|
||||
|
||||
{
|
||||
struct pm8xxx_vib *vib;
|
||||
@ -242,7 +242,7 @@ err_free_mem:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit pm8xxx_vib_remove(struct platform_device *pdev)
|
||||
static int pm8xxx_vib_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pm8xxx_vib *vib = platform_get_drvdata(pdev);
|
||||
|
||||
@ -270,7 +270,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);
|
||||
|
||||
static struct platform_driver pm8xxx_vib_driver = {
|
||||
.probe = pm8xxx_vib_probe,
|
||||
.remove = __devexit_p(pm8xxx_vib_remove),
|
||||
.remove = pm8xxx_vib_remove,
|
||||
.driver = {
|
||||
.name = "pm8xxx-vib",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -81,7 +81,7 @@ static int pmic8xxx_pwrkey_resume(struct device *dev)
|
||||
static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops,
|
||||
pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume);
|
||||
|
||||
static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev)
|
||||
static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct input_dev *pwr;
|
||||
int key_release_irq = platform_get_irq(pdev, 0);
|
||||
@ -187,7 +187,7 @@ free_pwrkey:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev)
|
||||
static int pmic8xxx_pwrkey_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev);
|
||||
int key_release_irq = platform_get_irq(pdev, 0);
|
||||
@ -206,7 +206,7 @@ static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver pmic8xxx_pwrkey_driver = {
|
||||
.probe = pmic8xxx_pwrkey_probe,
|
||||
.remove = __devexit_p(pmic8xxx_pwrkey_remove),
|
||||
.remove = pmic8xxx_pwrkey_remove,
|
||||
.driver = {
|
||||
.name = PM8XXX_PWRKEY_DEV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -65,7 +65,7 @@ static int pwm_beeper_event(struct input_dev *input,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit pwm_beeper_probe(struct platform_device *pdev)
|
||||
static int pwm_beeper_probe(struct platform_device *pdev)
|
||||
{
|
||||
unsigned long pwm_id = (unsigned long)pdev->dev.platform_data;
|
||||
struct pwm_beeper *beeper;
|
||||
@ -75,7 +75,11 @@ static int __devinit pwm_beeper_probe(struct platform_device *pdev)
|
||||
if (!beeper)
|
||||
return -ENOMEM;
|
||||
|
||||
beeper->pwm = pwm_request(pwm_id, "pwm beeper");
|
||||
beeper->pwm = pwm_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(beeper->pwm)) {
|
||||
dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n");
|
||||
beeper->pwm = pwm_request(pwm_id, "pwm beeper");
|
||||
}
|
||||
|
||||
if (IS_ERR(beeper->pwm)) {
|
||||
error = PTR_ERR(beeper->pwm);
|
||||
@ -125,7 +129,7 @@ err_free:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit pwm_beeper_remove(struct platform_device *pdev)
|
||||
static int pwm_beeper_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pwm_beeper *beeper = platform_get_drvdata(pdev);
|
||||
|
||||
@ -171,13 +175,21 @@ static SIMPLE_DEV_PM_OPS(pwm_beeper_pm_ops,
|
||||
#define PWM_BEEPER_PM_OPS NULL
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id pwm_beeper_match[] = {
|
||||
{ .compatible = "pwm-beeper", },
|
||||
{ },
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct platform_driver pwm_beeper_driver = {
|
||||
.probe = pwm_beeper_probe,
|
||||
.remove = __devexit_p(pwm_beeper_remove),
|
||||
.remove = pwm_beeper_remove,
|
||||
.driver = {
|
||||
.name = "pwm-beeper",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = PWM_BEEPER_PM_OPS,
|
||||
.of_match_table = of_match_ptr(pwm_beeper_match),
|
||||
},
|
||||
};
|
||||
module_platform_driver(pwm_beeper_driver);
|
||||
|
@ -51,7 +51,7 @@ static void rb532_button_poll(struct input_polled_dev *poll_dev)
|
||||
input_sync(poll_dev->input);
|
||||
}
|
||||
|
||||
static int __devinit rb532_button_probe(struct platform_device *pdev)
|
||||
static int rb532_button_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct input_polled_dev *poll_dev;
|
||||
int error;
|
||||
@ -81,7 +81,7 @@ static int __devinit rb532_button_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit rb532_button_remove(struct platform_device *pdev)
|
||||
static int rb532_button_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
@ -94,7 +94,7 @@ static int __devexit rb532_button_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver rb532_button_driver = {
|
||||
.probe = rb532_button_probe,
|
||||
.remove = __devexit_p(rb532_button_remove),
|
||||
.remove = rb532_button_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
99
drivers/input/misc/retu-pwrbutton.c
Normal file
99
drivers/input/misc/retu-pwrbutton.c
Normal 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");
|
@ -149,8 +149,7 @@ static struct of_device_id rotary_encoder_of_match[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rotary_encoder_of_match);
|
||||
|
||||
static struct rotary_encoder_platform_data * __devinit
|
||||
rotary_encoder_parse_dt(struct device *dev)
|
||||
static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev)
|
||||
{
|
||||
const struct of_device_id *of_id =
|
||||
of_match_device(rotary_encoder_of_match, dev);
|
||||
@ -192,7 +191,7 @@ rotary_encoder_parse_dt(struct device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit rotary_encoder_probe(struct platform_device *pdev)
|
||||
static int rotary_encoder_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev);
|
||||
@ -302,7 +301,7 @@ exit_free_mem:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit rotary_encoder_remove(struct platform_device *pdev)
|
||||
static int rotary_encoder_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct rotary_encoder *encoder = platform_get_drvdata(pdev);
|
||||
const struct rotary_encoder_platform_data *pdata = encoder->pdata;
|
||||
@ -325,7 +324,7 @@ static int __devexit rotary_encoder_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver rotary_encoder_driver = {
|
||||
.probe = rotary_encoder_probe,
|
||||
.remove = __devexit_p(rotary_encoder_remove),
|
||||
.remove = rotary_encoder_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -91,7 +91,7 @@ static void handle_buttons(struct input_polled_dev *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit sgi_buttons_probe(struct platform_device *pdev)
|
||||
static int sgi_buttons_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct buttons_dev *bdev;
|
||||
struct input_polled_dev *poll_dev;
|
||||
@ -143,7 +143,7 @@ static int __devinit sgi_buttons_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit sgi_buttons_remove(struct platform_device *pdev)
|
||||
static int sgi_buttons_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct buttons_dev *bdev = dev_get_drvdata(dev);
|
||||
@ -158,7 +158,7 @@ static int __devexit sgi_buttons_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver sgi_buttons_driver = {
|
||||
.probe = sgi_buttons_probe,
|
||||
.remove = __devexit_p(sgi_buttons_remove),
|
||||
.remove = sgi_buttons_remove,
|
||||
.driver = {
|
||||
.name = "sgibtns",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -139,7 +139,7 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit sparcspkr_probe(struct device *dev)
|
||||
static int sparcspkr_probe(struct device *dev)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(dev);
|
||||
struct input_dev *input_dev;
|
||||
@ -182,7 +182,7 @@ static void sparcspkr_shutdown(struct platform_device *dev)
|
||||
state->event(input_dev, EV_SND, SND_BELL, 0);
|
||||
}
|
||||
|
||||
static int __devinit bbc_beep_probe(struct platform_device *op)
|
||||
static int bbc_beep_probe(struct platform_device *op)
|
||||
{
|
||||
struct sparcspkr_state *state;
|
||||
struct bbc_beep_info *info;
|
||||
@ -229,7 +229,7 @@ out_err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit bbc_remove(struct platform_device *op)
|
||||
static int bbc_remove(struct platform_device *op)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
|
||||
struct input_dev *input_dev = state->input_dev;
|
||||
@ -263,11 +263,11 @@ static struct platform_driver bbc_beep_driver = {
|
||||
.of_match_table = bbc_beep_match,
|
||||
},
|
||||
.probe = bbc_beep_probe,
|
||||
.remove = __devexit_p(bbc_remove),
|
||||
.remove = bbc_remove,
|
||||
.shutdown = sparcspkr_shutdown,
|
||||
};
|
||||
|
||||
static int __devinit grover_beep_probe(struct platform_device *op)
|
||||
static int grover_beep_probe(struct platform_device *op)
|
||||
{
|
||||
struct sparcspkr_state *state;
|
||||
struct grover_beep_info *info;
|
||||
@ -310,7 +310,7 @@ out_err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit grover_remove(struct platform_device *op)
|
||||
static int grover_remove(struct platform_device *op)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
|
||||
struct grover_beep_info *info = &state->u.grover;
|
||||
@ -345,7 +345,7 @@ static struct platform_driver grover_beep_driver = {
|
||||
.of_match_table = grover_beep_match,
|
||||
},
|
||||
.probe = grover_beep_probe,
|
||||
.remove = __devexit_p(grover_remove),
|
||||
.remove = grover_remove,
|
||||
.shutdown = sparcspkr_shutdown,
|
||||
};
|
||||
|
||||
|
@ -39,8 +39,7 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr)
|
||||
int err;
|
||||
u8 value;
|
||||
|
||||
err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value,
|
||||
STS_HW_CONDITIONS);
|
||||
err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS);
|
||||
if (!err) {
|
||||
pm_wakeup_event(pwr->dev.parent, 0);
|
||||
input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ);
|
||||
|
@ -207,7 +207,7 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata,
|
||||
return false;
|
||||
}
|
||||
|
||||
static int __devinit twl4030_vibra_probe(struct platform_device *pdev)
|
||||
static int twl4030_vibra_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct twl4030_vibra_data *pdata = pdev->dev.platform_data;
|
||||
struct device_node *twl4030_core_node = pdev->dev.parent->of_node;
|
||||
@ -269,7 +269,7 @@ err_kzalloc:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit twl4030_vibra_remove(struct platform_device *pdev)
|
||||
static int twl4030_vibra_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct vibra_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
@ -283,7 +283,7 @@ static int __devexit twl4030_vibra_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver twl4030_vibra_driver = {
|
||||
.probe = twl4030_vibra_probe,
|
||||
.remove = __devexit_p(twl4030_vibra_remove),
|
||||
.remove = twl4030_vibra_remove,
|
||||
.driver = {
|
||||
.name = "twl4030-vibra",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -255,7 +255,7 @@ static int twl6040_vibra_suspend(struct device *dev)
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL);
|
||||
|
||||
static int __devinit twl6040_vibra_probe(struct platform_device *pdev)
|
||||
static int twl6040_vibra_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct twl6040_vibra_data *pdata = pdev->dev.platform_data;
|
||||
struct device *twl6040_core_dev = pdev->dev.parent;
|
||||
@ -418,7 +418,7 @@ err_kzalloc:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit twl6040_vibra_remove(struct platform_device *pdev)
|
||||
static int twl6040_vibra_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct vibra_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
@ -433,7 +433,7 @@ static int __devexit twl6040_vibra_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver twl6040_vibra_driver = {
|
||||
.probe = twl6040_vibra_probe,
|
||||
.remove = __devexit_p(twl6040_vibra_remove),
|
||||
.remove = twl6040_vibra_remove,
|
||||
.driver = {
|
||||
.name = "twl6040-vibra",
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -170,7 +170,7 @@ static u16 bios_pop_queue(void)
|
||||
return regs.eax;
|
||||
}
|
||||
|
||||
static void __devinit bios_attach(void)
|
||||
static void bios_attach(void)
|
||||
{
|
||||
struct regs regs;
|
||||
|
||||
@ -190,7 +190,7 @@ static void bios_detach(void)
|
||||
call_bios(®s);
|
||||
}
|
||||
|
||||
static u8 __devinit bios_get_cmos_address(void)
|
||||
static u8 bios_get_cmos_address(void)
|
||||
{
|
||||
struct regs regs;
|
||||
|
||||
@ -202,7 +202,7 @@ static u8 __devinit bios_get_cmos_address(void)
|
||||
return regs.ecx;
|
||||
}
|
||||
|
||||
static u16 __devinit bios_get_default_setting(u8 subsys)
|
||||
static u16 bios_get_default_setting(u8 subsys)
|
||||
{
|
||||
struct regs regs;
|
||||
|
||||
@ -1052,7 +1052,7 @@ static struct led_classdev wistron_wifi_led = {
|
||||
.brightness_set = wistron_wifi_led_set,
|
||||
};
|
||||
|
||||
static void __devinit wistron_led_init(struct device *parent)
|
||||
static void wistron_led_init(struct device *parent)
|
||||
{
|
||||
if (leds_present & FE_WIFI_LED) {
|
||||
u16 wifi = bios_get_default_setting(WIFI);
|
||||
@ -1077,7 +1077,7 @@ static void __devinit wistron_led_init(struct device *parent)
|
||||
}
|
||||
}
|
||||
|
||||
static void __devexit wistron_led_remove(void)
|
||||
static void wistron_led_remove(void)
|
||||
{
|
||||
if (leds_present & FE_MAIL_LED)
|
||||
led_classdev_unregister(&wistron_mail_led);
|
||||
@ -1168,7 +1168,7 @@ static void wistron_poll(struct input_polled_dev *dev)
|
||||
dev->poll_interval = POLL_INTERVAL_DEFAULT;
|
||||
}
|
||||
|
||||
static int __devinit wistron_setup_keymap(struct input_dev *dev,
|
||||
static int wistron_setup_keymap(struct input_dev *dev,
|
||||
struct key_entry *entry)
|
||||
{
|
||||
switch (entry->type) {
|
||||
@ -1199,7 +1199,7 @@ static int __devinit wistron_setup_keymap(struct input_dev *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit setup_input_dev(void)
|
||||
static int setup_input_dev(void)
|
||||
{
|
||||
struct input_dev *input_dev;
|
||||
int error;
|
||||
@ -1237,7 +1237,7 @@ static int __devinit setup_input_dev(void)
|
||||
|
||||
/* Driver core */
|
||||
|
||||
static int __devinit wistron_probe(struct platform_device *dev)
|
||||
static int wistron_probe(struct platform_device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
@ -1277,7 +1277,7 @@ static int __devinit wistron_probe(struct platform_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit wistron_remove(struct platform_device *dev)
|
||||
static int wistron_remove(struct platform_device *dev)
|
||||
{
|
||||
wistron_led_remove();
|
||||
input_unregister_polled_device(wistron_idev);
|
||||
@ -1334,7 +1334,7 @@ static struct platform_driver wistron_driver = {
|
||||
#endif
|
||||
},
|
||||
.probe = wistron_probe,
|
||||
.remove = __devexit_p(wistron_remove),
|
||||
.remove = wistron_remove,
|
||||
};
|
||||
|
||||
static int __init wb_module_init(void)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user