diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-17 13:06:02 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-17 13:06:02 -0500 |
commit | d797da41b2aceed5daa8cd2eee92cd74b2a0c652 (patch) | |
tree | f4de7daf5a81f425c057dd5a65a0e1b8056de5a9 /drivers/input/serio | |
parent | d6666be6f0c43efb9475d1d35fbef9f8be61b7b1 (diff) | |
parent | f20c86cd75f1c8c728dafd0218645ff3c5e8545d (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input subsystem updates from Dmitry Torokhov:
"Two new drivers for Elan hardware (for I2C touchpad and touchscreen
found in several Chromebooks and other devices), a driver for Goodix
touch panel, and small fixes to Cypress I2C trackpad and other input
drivers.
Also we switched to use __maybe_unused instead of gating suspend/
resume code with #ifdef guards to get better compile coverage"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (27 commits)
Input: gpio_keys - fix warning regarding uninitialized 'button' variable
Input: add support for Elan eKTH I2C touchscreens
Input: gpio_keys - fix warning regarding uninitialized 'irq' variable
Input: cyapa - use 'error' for error codes
Input: cyapa - fix resuming the device
Input: gpio_keys - add device tree support for interrupt only keys
Input: amikbd - allocate temporary keymap buffer on the stack
Input: amikbd - fix build if !CONFIG_HW_CONSOLE
Input: lm8323 - missing error check in lm8323_set_disable()
Input: initialize device counter variables with -1
Input: initialize input_no to -1 to avoid subtraction
Input: i8042 - do not try to load on Intel NUC D54250WYK
Input: atkbd - correct MSC_SCAN events for force_release keys
Input: cyapa - switch to using managed resources
Input: lifebook - use "static inline" instead of "inline" in lifebook.h
Input: touchscreen - use __maybe_unused instead of ifdef around suspend/resume
Input: mouse - use __maybe_unused instead of ifdef around suspend/resume
Input: misc - use __maybe_unused instead of ifdef around suspend/resume
Input: cap11xx - support for irq-active-high option
Input: cap11xx - add support for various cap11xx devices
...
Diffstat (limited to 'drivers/input/serio')
-rw-r--r-- | drivers/input/serio/altera_ps2.c | 81 | ||||
-rw-r--r-- | drivers/input/serio/i8042-x86ia64io.h | 10 | ||||
-rw-r--r-- | drivers/input/serio/serio.c | 4 | ||||
-rw-r--r-- | drivers/input/serio/serio_raw.c | 4 |
4 files changed, 38 insertions, 61 deletions
diff --git a/drivers/input/serio/altera_ps2.c b/drivers/input/serio/altera_ps2.c index 8921c96589be..131d7826dc6b 100644 --- a/drivers/input/serio/altera_ps2.c +++ b/drivers/input/serio/altera_ps2.c | |||
@@ -24,9 +24,7 @@ | |||
24 | 24 | ||
25 | struct ps2if { | 25 | struct ps2if { |
26 | struct serio *io; | 26 | struct serio *io; |
27 | struct resource *iomem_res; | ||
28 | void __iomem *base; | 27 | void __iomem *base; |
29 | unsigned irq; | ||
30 | }; | 28 | }; |
31 | 29 | ||
32 | /* | 30 | /* |
@@ -83,16 +81,34 @@ static void altera_ps2_close(struct serio *io) | |||
83 | static int altera_ps2_probe(struct platform_device *pdev) | 81 | static int altera_ps2_probe(struct platform_device *pdev) |
84 | { | 82 | { |
85 | struct ps2if *ps2if; | 83 | struct ps2if *ps2if; |
84 | struct resource *res; | ||
86 | struct serio *serio; | 85 | struct serio *serio; |
87 | int error, irq; | 86 | int error, irq; |
88 | 87 | ||
89 | ps2if = kzalloc(sizeof(struct ps2if), GFP_KERNEL); | 88 | ps2if = devm_kzalloc(&pdev->dev, sizeof(struct ps2if), GFP_KERNEL); |
90 | serio = kzalloc(sizeof(struct serio), GFP_KERNEL); | 89 | if (!ps2if) |
91 | if (!ps2if || !serio) { | 90 | return -ENOMEM; |
92 | error = -ENOMEM; | 91 | |
93 | goto err_free_mem; | 92 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
93 | ps2if->base = devm_ioremap_resource(&pdev->dev, res); | ||
94 | if (IS_ERR(ps2if->base)) | ||
95 | return PTR_ERR(ps2if->base); | ||
96 | |||
97 | irq = platform_get_irq(pdev, 0); | ||
98 | if (irq < 0) | ||
99 | return -ENXIO; | ||
100 | |||
101 | error = devm_request_irq(&pdev->dev, irq, altera_ps2_rxint, 0, | ||
102 | pdev->name, ps2if); | ||
103 | if (error) { | ||
104 | dev_err(&pdev->dev, "could not request IRQ %d\n", irq); | ||
105 | return error; | ||
94 | } | 106 | } |
95 | 107 | ||
108 | serio = kzalloc(sizeof(struct serio), GFP_KERNEL); | ||
109 | if (!serio) | ||
110 | return -ENOMEM; | ||
111 | |||
96 | serio->id.type = SERIO_8042; | 112 | serio->id.type = SERIO_8042; |
97 | serio->write = altera_ps2_write; | 113 | serio->write = altera_ps2_write; |
98 | serio->open = altera_ps2_open; | 114 | serio->open = altera_ps2_open; |
@@ -103,56 +119,12 @@ static int altera_ps2_probe(struct platform_device *pdev) | |||
103 | serio->dev.parent = &pdev->dev; | 119 | serio->dev.parent = &pdev->dev; |
104 | ps2if->io = serio; | 120 | ps2if->io = serio; |
105 | 121 | ||
106 | ps2if->iomem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 122 | dev_info(&pdev->dev, "base %p, irq %d\n", ps2if->base, irq); |
107 | if (ps2if->iomem_res == NULL) { | ||
108 | error = -ENOENT; | ||
109 | goto err_free_mem; | ||
110 | } | ||
111 | |||
112 | |||
113 | irq = platform_get_irq(pdev, 0); | ||
114 | if (irq < 0) { | ||
115 | error = -ENXIO; | ||
116 | goto err_free_mem; | ||
117 | } | ||
118 | ps2if->irq = irq; | ||
119 | |||
120 | if (!request_mem_region(ps2if->iomem_res->start, | ||
121 | resource_size(ps2if->iomem_res), pdev->name)) { | ||
122 | error = -EBUSY; | ||
123 | goto err_free_mem; | ||
124 | } | ||
125 | |||
126 | ps2if->base = ioremap(ps2if->iomem_res->start, | ||
127 | resource_size(ps2if->iomem_res)); | ||
128 | if (!ps2if->base) { | ||
129 | error = -ENOMEM; | ||
130 | goto err_free_res; | ||
131 | } | ||
132 | |||
133 | error = request_irq(ps2if->irq, altera_ps2_rxint, 0, pdev->name, ps2if); | ||
134 | if (error) { | ||
135 | dev_err(&pdev->dev, "could not allocate IRQ %d: %d\n", | ||
136 | ps2if->irq, error); | ||
137 | goto err_unmap; | ||
138 | } | ||
139 | |||
140 | dev_info(&pdev->dev, "base %p, irq %d\n", ps2if->base, ps2if->irq); | ||
141 | 123 | ||
142 | serio_register_port(ps2if->io); | 124 | serio_register_port(ps2if->io); |
143 | platform_set_drvdata(pdev, ps2if); | 125 | platform_set_drvdata(pdev, ps2if); |
144 | 126 | ||
145 | return 0; | 127 | return 0; |
146 | |||
147 | err_unmap: | ||
148 | iounmap(ps2if->base); | ||
149 | err_free_res: | ||
150 | release_mem_region(ps2if->iomem_res->start, | ||
151 | resource_size(ps2if->iomem_res)); | ||
152 | err_free_mem: | ||
153 | kfree(ps2if); | ||
154 | kfree(serio); | ||
155 | return error; | ||
156 | } | 128 | } |
157 | 129 | ||
158 | /* | 130 | /* |
@@ -163,11 +135,6 @@ static int altera_ps2_remove(struct platform_device *pdev) | |||
163 | struct ps2if *ps2if = platform_get_drvdata(pdev); | 135 | struct ps2if *ps2if = platform_get_drvdata(pdev); |
164 | 136 | ||
165 | serio_unregister_port(ps2if->io); | 137 | serio_unregister_port(ps2if->io); |
166 | free_irq(ps2if->irq, ps2if); | ||
167 | iounmap(ps2if->base); | ||
168 | release_mem_region(ps2if->iomem_res->start, | ||
169 | resource_size(ps2if->iomem_res)); | ||
170 | kfree(ps2if); | ||
171 | 138 | ||
172 | return 0; | 139 | return 0; |
173 | } | 140 | } |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index faeeb1372462..c66d1b53843e 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -579,6 +579,16 @@ static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = { | |||
579 | }, | 579 | }, |
580 | }, | 580 | }, |
581 | { | 581 | { |
582 | /* | ||
583 | * Intel NUC D54250WYK - does not have i8042 controller but | ||
584 | * declares PS/2 devices in DSDT. | ||
585 | */ | ||
586 | .matches = { | ||
587 | DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"), | ||
588 | DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), | ||
589 | }, | ||
590 | }, | ||
591 | { | ||
582 | /* MSI Wind U-100 */ | 592 | /* MSI Wind U-100 */ |
583 | .matches = { | 593 | .matches = { |
584 | DMI_MATCH(DMI_BOARD_NAME, "U-100"), | 594 | DMI_MATCH(DMI_BOARD_NAME, "U-100"), |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index d399b8b0f000..a05a5179da32 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -514,7 +514,7 @@ static void serio_release_port(struct device *dev) | |||
514 | */ | 514 | */ |
515 | static void serio_init_port(struct serio *serio) | 515 | static void serio_init_port(struct serio *serio) |
516 | { | 516 | { |
517 | static atomic_t serio_no = ATOMIC_INIT(0); | 517 | static atomic_t serio_no = ATOMIC_INIT(-1); |
518 | 518 | ||
519 | __module_get(THIS_MODULE); | 519 | __module_get(THIS_MODULE); |
520 | 520 | ||
@@ -525,7 +525,7 @@ static void serio_init_port(struct serio *serio) | |||
525 | mutex_init(&serio->drv_mutex); | 525 | mutex_init(&serio->drv_mutex); |
526 | device_initialize(&serio->dev); | 526 | device_initialize(&serio->dev); |
527 | dev_set_name(&serio->dev, "serio%lu", | 527 | dev_set_name(&serio->dev, "serio%lu", |
528 | (unsigned long)atomic_inc_return(&serio_no) - 1); | 528 | (unsigned long)atomic_inc_return(&serio_no)); |
529 | serio->dev.bus = &serio_bus; | 529 | serio->dev.bus = &serio_bus; |
530 | serio->dev.release = serio_release_port; | 530 | serio->dev.release = serio_release_port; |
531 | serio->dev.groups = serio_device_attr_groups; | 531 | serio->dev.groups = serio_device_attr_groups; |
diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index c9a02fe57576..71ef5d65a0c6 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c | |||
@@ -292,7 +292,7 @@ static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data, | |||
292 | 292 | ||
293 | static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) | 293 | static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) |
294 | { | 294 | { |
295 | static atomic_t serio_raw_no = ATOMIC_INIT(0); | 295 | static atomic_t serio_raw_no = ATOMIC_INIT(-1); |
296 | struct serio_raw *serio_raw; | 296 | struct serio_raw *serio_raw; |
297 | int err; | 297 | int err; |
298 | 298 | ||
@@ -303,7 +303,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) | |||
303 | } | 303 | } |
304 | 304 | ||
305 | snprintf(serio_raw->name, sizeof(serio_raw->name), | 305 | snprintf(serio_raw->name, sizeof(serio_raw->name), |
306 | "serio_raw%ld", (long)atomic_inc_return(&serio_raw_no) - 1); | 306 | "serio_raw%ld", (long)atomic_inc_return(&serio_raw_no)); |
307 | kref_init(&serio_raw->kref); | 307 | kref_init(&serio_raw->kref); |
308 | INIT_LIST_HEAD(&serio_raw->client_list); | 308 | INIT_LIST_HEAD(&serio_raw->client_list); |
309 | init_waitqueue_head(&serio_raw->wait); | 309 | init_waitqueue_head(&serio_raw->wait); |