Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: synaptics-rmi4 - move IRQ handling to rmi_driver

The attn IRQ is related to the chip, rather than the transport, so move
all handling of interrupts to the core driver. This also makes sure that
there are no races between interrupts and availability of the resources
used by the core driver.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Bjorn Andersson and committed by
Dmitry Torokhov
3aeed5b5 8029a283

+83 -143
+69 -4
drivers/input/rmi4/rmi_driver.c
··· 17 17 #include <linux/bitmap.h> 18 18 #include <linux/delay.h> 19 19 #include <linux/fs.h> 20 + #include <linux/irq.h> 20 21 #include <linux/kconfig.h> 21 22 #include <linux/pm.h> 22 23 #include <linux/slab.h> ··· 137 136 } 138 137 } 139 138 140 - int rmi_process_interrupt_requests(struct rmi_device *rmi_dev) 139 + static int rmi_process_interrupt_requests(struct rmi_device *rmi_dev) 141 140 { 142 141 struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 143 142 struct device *dev = &rmi_dev->dev; ··· 182 181 183 182 return 0; 184 183 } 185 - EXPORT_SYMBOL_GPL(rmi_process_interrupt_requests); 184 + 185 + static irqreturn_t rmi_irq_fn(int irq, void *dev_id) 186 + { 187 + struct rmi_device *rmi_dev = dev_id; 188 + int ret; 189 + 190 + ret = rmi_process_interrupt_requests(rmi_dev); 191 + if (ret) 192 + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, 193 + "Failed to process interrupt request: %d\n", ret); 194 + 195 + return IRQ_HANDLED; 196 + } 197 + 198 + static int rmi_irq_init(struct rmi_device *rmi_dev) 199 + { 200 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 201 + int irq_flags = irq_get_trigger_type(pdata->irq); 202 + int ret; 203 + 204 + if (!irq_flags) 205 + irq_flags = IRQF_TRIGGER_LOW; 206 + 207 + ret = devm_request_threaded_irq(&rmi_dev->dev, pdata->irq, NULL, 208 + rmi_irq_fn, irq_flags | IRQF_ONESHOT, 209 + dev_name(rmi_dev->xport->dev), 210 + rmi_dev); 211 + if (ret < 0) { 212 + dev_err(&rmi_dev->dev, "Failed to register interrupt %d\n", 213 + pdata->irq); 214 + 215 + return ret; 216 + } 217 + 218 + return 0; 219 + } 186 220 187 221 static int suspend_one_function(struct rmi_function *fn) 188 222 { ··· 838 802 return error; 839 803 } 840 804 841 - int rmi_driver_suspend(struct rmi_device *rmi_dev) 805 + int rmi_driver_suspend(struct rmi_device *rmi_dev, bool enable_wake) 842 806 { 807 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 808 + int irq = pdata->irq; 843 809 int retval = 0; 844 810 845 811 retval = rmi_suspend_functions(rmi_dev); ··· 849 811 dev_warn(&rmi_dev->dev, "Failed to suspend functions: %d\n", 850 812 retval); 851 813 814 + disable_irq(irq); 815 + if (enable_wake && device_may_wakeup(rmi_dev->xport->dev)) { 816 + retval = enable_irq_wake(irq); 817 + if (!retval) 818 + dev_warn(&rmi_dev->dev, 819 + "Failed to enable irq for wake: %d\n", 820 + retval); 821 + } 852 822 return retval; 853 823 } 854 824 EXPORT_SYMBOL_GPL(rmi_driver_suspend); 855 825 856 - int rmi_driver_resume(struct rmi_device *rmi_dev) 826 + int rmi_driver_resume(struct rmi_device *rmi_dev, bool clear_wake) 857 827 { 828 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 829 + int irq = pdata->irq; 858 830 int retval; 831 + 832 + enable_irq(irq); 833 + if (clear_wake && device_may_wakeup(rmi_dev->xport->dev)) { 834 + retval = disable_irq_wake(irq); 835 + if (!retval) 836 + dev_warn(&rmi_dev->dev, 837 + "Failed to disable irq for wake: %d\n", 838 + retval); 839 + } 859 840 860 841 retval = rmi_resume_functions(rmi_dev); 861 842 if (retval) ··· 888 831 static int rmi_driver_remove(struct device *dev) 889 832 { 890 833 struct rmi_device *rmi_dev = to_rmi_device(dev); 834 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 835 + int irq = pdata->irq; 836 + 837 + disable_irq(irq); 891 838 892 839 rmi_free_function_list(rmi_dev); 893 840 ··· 1110 1049 } 1111 1050 } 1112 1051 } 1052 + 1053 + retval = rmi_irq_init(rmi_dev); 1054 + if (retval < 0) 1055 + goto err_destroy_functions; 1113 1056 1114 1057 if (data->f01_container->dev.driver) 1115 1058 /* Driver already bound, so enable ATTN now. */
+5 -69
drivers/input/rmi4/rmi_i2c.c
··· 9 9 10 10 #include <linux/i2c.h> 11 11 #include <linux/rmi.h> 12 - #include <linux/irq.h> 13 12 #include <linux/of.h> 14 13 #include <linux/delay.h> 15 14 #include <linux/regulator/consumer.h> ··· 33 34 34 35 struct mutex page_mutex; 35 36 int page; 36 - 37 - int irq; 38 37 39 38 u8 *tx_buf; 40 39 size_t tx_buf_size; ··· 174 177 .read_block = rmi_i2c_read_block, 175 178 }; 176 179 177 - static irqreturn_t rmi_i2c_irq(int irq, void *dev_id) 178 - { 179 - struct rmi_i2c_xport *rmi_i2c = dev_id; 180 - struct rmi_device *rmi_dev = rmi_i2c->xport.rmi_dev; 181 - int ret; 182 - 183 - ret = rmi_process_interrupt_requests(rmi_dev); 184 - if (ret) 185 - rmi_dbg(RMI_DEBUG_XPORT, &rmi_dev->dev, 186 - "Failed to process interrupt request: %d\n", ret); 187 - 188 - return IRQ_HANDLED; 189 - } 190 - 191 - static int rmi_i2c_init_irq(struct i2c_client *client) 192 - { 193 - struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); 194 - int irq_flags = irqd_get_trigger_type(irq_get_irq_data(rmi_i2c->irq)); 195 - int ret; 196 - 197 - if (!irq_flags) 198 - irq_flags = IRQF_TRIGGER_LOW; 199 - 200 - ret = devm_request_threaded_irq(&client->dev, rmi_i2c->irq, NULL, 201 - rmi_i2c_irq, irq_flags | IRQF_ONESHOT, client->name, 202 - rmi_i2c); 203 - if (ret < 0) { 204 - dev_warn(&client->dev, "Failed to register interrupt %d\n", 205 - rmi_i2c->irq); 206 - 207 - return ret; 208 - } 209 - 210 - return 0; 211 - } 212 - 213 180 #ifdef CONFIG_OF 214 181 static const struct of_device_id rmi_i2c_of_match[] = { 215 182 { .compatible = "syna,rmi4-i2c" }, ··· 201 240 if (!client->dev.of_node && client_pdata) 202 241 *pdata = *client_pdata; 203 242 204 - if (client->irq > 0) 205 - rmi_i2c->irq = client->irq; 243 + pdata->irq = client->irq; 206 244 207 245 rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Probing %s.\n", 208 246 dev_name(&client->dev)); ··· 255 295 return retval; 256 296 } 257 297 258 - retval = rmi_i2c_init_irq(client); 259 - if (retval < 0) 260 - return retval; 261 - 262 298 dev_info(&client->dev, "registered rmi i2c driver at %#04x.\n", 263 299 client->addr); 264 300 return 0; ··· 278 322 struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); 279 323 int ret; 280 324 281 - ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev); 325 + ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, true); 282 326 if (ret) 283 327 dev_warn(dev, "Failed to resume device: %d\n", ret); 284 - 285 - disable_irq(rmi_i2c->irq); 286 - if (device_may_wakeup(&client->dev)) { 287 - ret = enable_irq_wake(rmi_i2c->irq); 288 - if (!ret) 289 - dev_warn(dev, "Failed to enable irq for wake: %d\n", 290 - ret); 291 - } 292 328 293 329 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), 294 330 rmi_i2c->supplies); ··· 301 353 302 354 msleep(rmi_i2c->startup_delay); 303 355 304 - enable_irq(rmi_i2c->irq); 305 - if (device_may_wakeup(&client->dev)) { 306 - ret = disable_irq_wake(rmi_i2c->irq); 307 - if (!ret) 308 - dev_warn(dev, "Failed to disable irq for wake: %d\n", 309 - ret); 310 - } 311 - 312 - ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev); 356 + ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, true); 313 357 if (ret) 314 358 dev_warn(dev, "Failed to resume device: %d\n", ret); 315 359 ··· 316 376 struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); 317 377 int ret; 318 378 319 - ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev); 379 + ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, false); 320 380 if (ret) 321 381 dev_warn(dev, "Failed to resume device: %d\n", ret); 322 - 323 - disable_irq(rmi_i2c->irq); 324 382 325 383 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), 326 384 rmi_i2c->supplies); ··· 339 401 340 402 msleep(rmi_i2c->startup_delay); 341 403 342 - enable_irq(rmi_i2c->irq); 343 - 344 - ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev); 404 + ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, false); 345 405 if (ret) 346 406 dev_warn(dev, "Failed to resume device: %d\n", ret); 347 407
+5 -67
drivers/input/rmi4/rmi_spi.c
··· 12 12 #include <linux/rmi.h> 13 13 #include <linux/slab.h> 14 14 #include <linux/spi/spi.h> 15 - #include <linux/irq.h> 16 15 #include <linux/of.h> 17 16 #include "rmi_driver.h" 18 17 ··· 42 43 43 44 struct mutex page_mutex; 44 45 int page; 45 - 46 - int irq; 47 46 48 47 u8 *rx_buf; 49 48 u8 *tx_buf; ··· 323 326 .read_block = rmi_spi_read_block, 324 327 }; 325 328 326 - static irqreturn_t rmi_spi_irq(int irq, void *dev_id) 327 - { 328 - struct rmi_spi_xport *rmi_spi = dev_id; 329 - struct rmi_device *rmi_dev = rmi_spi->xport.rmi_dev; 330 - int ret; 331 - 332 - ret = rmi_process_interrupt_requests(rmi_dev); 333 - if (ret) 334 - rmi_dbg(RMI_DEBUG_XPORT, &rmi_dev->dev, 335 - "Failed to process interrupt request: %d\n", ret); 336 - 337 - return IRQ_HANDLED; 338 - } 339 - 340 - static int rmi_spi_init_irq(struct spi_device *spi) 341 - { 342 - struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 343 - int irq_flags = irqd_get_trigger_type(irq_get_irq_data(rmi_spi->irq)); 344 - int ret; 345 - 346 - if (!irq_flags) 347 - irq_flags = IRQF_TRIGGER_LOW; 348 - 349 - ret = devm_request_threaded_irq(&spi->dev, rmi_spi->irq, NULL, 350 - rmi_spi_irq, irq_flags | IRQF_ONESHOT, 351 - dev_name(&spi->dev), rmi_spi); 352 - if (ret < 0) { 353 - dev_warn(&spi->dev, "Failed to register interrupt %d\n", 354 - rmi_spi->irq); 355 - return ret; 356 - } 357 - 358 - return 0; 359 - } 360 - 361 329 #ifdef CONFIG_OF 362 330 static int rmi_spi_of_probe(struct spi_device *spi, 363 331 struct rmi_device_platform_data *pdata) ··· 395 433 return retval; 396 434 } 397 435 398 - if (spi->irq > 0) 399 - rmi_spi->irq = spi->irq; 436 + pdata->irq = spi->irq; 400 437 401 438 rmi_spi->spi = spi; 402 439 mutex_init(&rmi_spi->page_mutex); ··· 426 465 return retval; 427 466 } 428 467 429 - retval = rmi_spi_init_irq(spi); 430 - if (retval < 0) 431 - return retval; 432 - 433 468 dev_info(&spi->dev, "registered RMI SPI driver\n"); 434 469 return 0; 435 470 } ··· 446 489 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 447 490 int ret; 448 491 449 - ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev); 492 + ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev, true); 450 493 if (ret) 451 494 dev_warn(dev, "Failed to resume device: %d\n", ret); 452 495 453 - disable_irq(rmi_spi->irq); 454 - if (device_may_wakeup(&spi->dev)) { 455 - ret = enable_irq_wake(rmi_spi->irq); 456 - if (!ret) 457 - dev_warn(dev, "Failed to enable irq for wake: %d\n", 458 - ret); 459 - } 460 496 return ret; 461 497 } 462 498 ··· 459 509 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 460 510 int ret; 461 511 462 - enable_irq(rmi_spi->irq); 463 - if (device_may_wakeup(&spi->dev)) { 464 - ret = disable_irq_wake(rmi_spi->irq); 465 - if (!ret) 466 - dev_warn(dev, "Failed to disable irq for wake: %d\n", 467 - ret); 468 - } 469 - 470 - ret = rmi_driver_resume(rmi_spi->xport.rmi_dev); 512 + ret = rmi_driver_resume(rmi_spi->xport.rmi_dev, true); 471 513 if (ret) 472 514 dev_warn(dev, "Failed to resume device: %d\n", ret); 473 515 ··· 474 532 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 475 533 int ret; 476 534 477 - ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev); 535 + ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev, false); 478 536 if (ret) 479 537 dev_warn(dev, "Failed to resume device: %d\n", ret); 480 - 481 - disable_irq(rmi_spi->irq); 482 538 483 539 return 0; 484 540 } ··· 487 547 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 488 548 int ret; 489 549 490 - enable_irq(rmi_spi->irq); 491 - 492 - ret = rmi_driver_resume(rmi_spi->xport.rmi_dev); 550 + ret = rmi_driver_resume(rmi_spi->xport.rmi_dev, false); 493 551 if (ret) 494 552 dev_warn(dev, "Failed to resume device: %d\n", ret); 495 553
+4 -3
include/linux/rmi.h
··· 204 204 * @reset_delay_ms - after issuing a reset command to the touch sensor, the 205 205 * driver waits a few milliseconds to give the firmware a chance to 206 206 * to re-initialize. You can override the default wait period here. 207 + * @irq: irq associated with the attn gpio line, or negative 207 208 */ 208 209 struct rmi_device_platform_data { 209 210 int reset_delay_ms; 211 + int irq; 210 212 211 213 struct rmi_device_platform_data_spi spi_data; 212 214 ··· 354 352 355 353 int rmi_register_transport_device(struct rmi_transport_dev *xport); 356 354 void rmi_unregister_transport_device(struct rmi_transport_dev *xport); 357 - int rmi_process_interrupt_requests(struct rmi_device *rmi_dev); 358 355 359 - int rmi_driver_suspend(struct rmi_device *rmi_dev); 360 - int rmi_driver_resume(struct rmi_device *rmi_dev); 356 + int rmi_driver_suspend(struct rmi_device *rmi_dev, bool enable_wake); 357 + int rmi_driver_resume(struct rmi_device *rmi_dev, bool clear_wake); 361 358 #endif