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

Configure Feed

Select the types of activity you want to include in your feed.

Input: matrix_keypad - avoid repeatedly converting GPIO to IRQ

There is no need to do conversion from GPIOs to interrupt numbers.
Convert row GPIOs to interrupt numbers once in probe() and use
this information when the driver needs to enable or disable given
interrupt line.

Link: https://lore.kernel.org/r/20240121053232.276968-1-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+25 -23
+25 -23
drivers/input/keyboard/matrix_keypad.c
··· 27 27 const struct matrix_keypad_platform_data *pdata; 28 28 struct input_dev *input_dev; 29 29 unsigned int row_shift; 30 + unsigned int row_irqs[MATRIX_MAX_ROWS]; 30 31 31 32 DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS); 32 33 ··· 93 92 enable_irq(pdata->clustered_irq); 94 93 else { 95 94 for (i = 0; i < pdata->num_row_gpios; i++) 96 - enable_irq(gpio_to_irq(pdata->row_gpios[i])); 95 + enable_irq(keypad->row_irqs[i]); 97 96 } 98 97 } 99 98 ··· 106 105 disable_irq_nosync(pdata->clustered_irq); 107 106 else { 108 107 for (i = 0; i < pdata->num_row_gpios; i++) 109 - disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i])); 108 + disable_irq_nosync(keypad->row_irqs[i]); 110 109 } 111 110 } 112 111 ··· 234 233 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad) 235 234 { 236 235 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 237 - unsigned int gpio; 238 236 int i; 239 237 240 238 if (pdata->clustered_irq > 0) { ··· 241 241 keypad->gpio_all_disabled = true; 242 242 } else { 243 243 244 - for (i = 0; i < pdata->num_row_gpios; i++) { 245 - if (!test_bit(i, keypad->disabled_gpios)) { 246 - gpio = pdata->row_gpios[i]; 247 - 248 - if (enable_irq_wake(gpio_to_irq(gpio)) == 0) 244 + for (i = 0; i < pdata->num_row_gpios; i++) 245 + if (!test_bit(i, keypad->disabled_gpios)) 246 + if (enable_irq_wake(keypad->row_irqs[i]) == 0) 249 247 __set_bit(i, keypad->disabled_gpios); 250 - } 251 - } 252 248 } 253 249 } 254 250 255 251 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad) 256 252 { 257 253 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 258 - unsigned int gpio; 259 254 int i; 260 255 261 256 if (pdata->clustered_irq > 0) { ··· 259 264 keypad->gpio_all_disabled = false; 260 265 } 261 266 } else { 262 - for (i = 0; i < pdata->num_row_gpios; i++) { 263 - if (test_and_clear_bit(i, keypad->disabled_gpios)) { 264 - gpio = pdata->row_gpios[i]; 265 - disable_irq_wake(gpio_to_irq(gpio)); 266 - } 267 - } 267 + for (i = 0; i < pdata->num_row_gpios; i++) 268 + if (test_and_clear_bit(i, keypad->disabled_gpios)) 269 + disable_irq_wake(keypad->row_irqs[i]); 268 270 } 269 271 } 270 272 ··· 298 306 struct matrix_keypad *keypad) 299 307 { 300 308 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 301 - int i, err; 309 + int i, irq, err; 302 310 303 311 /* initialized strobe lines as outputs, activated */ 304 312 for (i = 0; i < pdata->num_col_gpios; i++) { ··· 337 345 } 338 346 } else { 339 347 for (i = 0; i < pdata->num_row_gpios; i++) { 340 - err = request_any_context_irq( 341 - gpio_to_irq(pdata->row_gpios[i]), 348 + irq = gpio_to_irq(pdata->row_gpios[i]); 349 + if (irq < 0) { 350 + err = irq; 351 + dev_err(&pdev->dev, 352 + "Unable to convert GPIO line %i to irq: %d\n", 353 + pdata->row_gpios[i], err); 354 + goto err_free_irqs; 355 + } 356 + 357 + err = request_any_context_irq(irq, 342 358 matrix_keypad_interrupt, 343 359 IRQF_TRIGGER_RISING | 344 - IRQF_TRIGGER_FALLING, 360 + IRQF_TRIGGER_FALLING, 345 361 "matrix-keypad", keypad); 346 362 if (err < 0) { 347 363 dev_err(&pdev->dev, ··· 357 357 pdata->row_gpios[i]); 358 358 goto err_free_irqs; 359 359 } 360 + 361 + keypad->row_irqs[i] = irq; 360 362 } 361 363 } 362 364 ··· 368 366 369 367 err_free_irqs: 370 368 while (--i >= 0) 371 - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); 369 + free_irq(keypad->row_irqs[i], keypad); 372 370 i = pdata->num_row_gpios; 373 371 err_free_rows: 374 372 while (--i >= 0) ··· 390 388 free_irq(pdata->clustered_irq, keypad); 391 389 } else { 392 390 for (i = 0; i < pdata->num_row_gpios; i++) 393 - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); 391 + free_irq(keypad->row_irqs[i], keypad); 394 392 } 395 393 396 394 for (i = 0; i < pdata->num_row_gpios; i++)