You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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:
@@ -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>;
|
||||
};
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
|
||||
+153
-28
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user