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); |
