merged. Bruce
In message: [linux-yocto][linux-yocto v6.6/standard/preempt-rt/ti-sdk-6.6/ti-soc][PATCH 1/2] Input: matrix_keypad - avoid repeatedly converting GPIO to IRQ on 25/10/2024 Xulin Sun wrote: > From: Dmitry Torokhov <dmitry.torok...@gmail.com> > > commit a96fb711c6be76bcfbcf594a865002fa7c0eb525 upstream > > 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.torok...@gmail.com > Signed-off-by: Dmitry Torokhov <dmitry.torok...@gmail.com> > Signed-off-by: Xulin Sun <xulin....@windriver.com> > --- > drivers/input/keyboard/matrix_keypad.c | 48 ++++++++++++++------------ > 1 file changed, 25 insertions(+), 23 deletions(-) > > diff --git a/drivers/input/keyboard/matrix_keypad.c > b/drivers/input/keyboard/matrix_keypad.c > index a1b037891af2..a1cf56096156 100644 > --- a/drivers/input/keyboard/matrix_keypad.c > +++ b/drivers/input/keyboard/matrix_keypad.c > @@ -27,6 +27,7 @@ struct matrix_keypad { > const struct matrix_keypad_platform_data *pdata; > struct input_dev *input_dev; > unsigned int row_shift; > + unsigned int row_irqs[MATRIX_MAX_ROWS]; > > DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS); > > @@ -92,7 +93,7 @@ static void enable_row_irqs(struct matrix_keypad *keypad) > enable_irq(pdata->clustered_irq); > else { > for (i = 0; i < pdata->num_row_gpios; i++) > - enable_irq(gpio_to_irq(pdata->row_gpios[i])); > + enable_irq(keypad->row_irqs[i]); > } > } > > @@ -105,7 +106,7 @@ static void disable_row_irqs(struct matrix_keypad *keypad) > disable_irq_nosync(pdata->clustered_irq); > else { > for (i = 0; i < pdata->num_row_gpios; i++) > - disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i])); > + disable_irq_nosync(keypad->row_irqs[i]); > } > } > > @@ -233,7 +234,6 @@ static void matrix_keypad_stop(struct input_dev *dev) > static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad) > { > const struct matrix_keypad_platform_data *pdata = keypad->pdata; > - unsigned int gpio; > int i; > > if (pdata->clustered_irq > 0) { > @@ -241,21 +241,16 @@ static void matrix_keypad_enable_wakeup(struct > matrix_keypad *keypad) > keypad->gpio_all_disabled = true; > } else { > > - for (i = 0; i < pdata->num_row_gpios; i++) { > - if (!test_bit(i, keypad->disabled_gpios)) { > - gpio = pdata->row_gpios[i]; > - > - if (enable_irq_wake(gpio_to_irq(gpio)) == 0) > + for (i = 0; i < pdata->num_row_gpios; i++) > + if (!test_bit(i, keypad->disabled_gpios)) > + if (enable_irq_wake(keypad->row_irqs[i]) == 0) > __set_bit(i, keypad->disabled_gpios); > - } > - } > } > } > > static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad) > { > const struct matrix_keypad_platform_data *pdata = keypad->pdata; > - unsigned int gpio; > int i; > > if (pdata->clustered_irq > 0) { > @@ -264,12 +259,9 @@ static void matrix_keypad_disable_wakeup(struct > matrix_keypad *keypad) > keypad->gpio_all_disabled = false; > } > } else { > - for (i = 0; i < pdata->num_row_gpios; i++) { > - if (test_and_clear_bit(i, keypad->disabled_gpios)) { > - gpio = pdata->row_gpios[i]; > - disable_irq_wake(gpio_to_irq(gpio)); > - } > - } > + for (i = 0; i < pdata->num_row_gpios; i++) > + if (test_and_clear_bit(i, keypad->disabled_gpios)) > + disable_irq_wake(keypad->row_irqs[i]); > } > } > > @@ -306,7 +298,7 @@ static int matrix_keypad_init_gpio(struct platform_device > *pdev, > struct matrix_keypad *keypad) > { > const struct matrix_keypad_platform_data *pdata = keypad->pdata; > - int i, err; > + int i, irq, err; > > /* initialized strobe lines as outputs, activated */ > for (i = 0; i < pdata->num_col_gpios; i++) { > @@ -345,11 +337,19 @@ static int matrix_keypad_init_gpio(struct > platform_device *pdev, > } > } else { > for (i = 0; i < pdata->num_row_gpios; i++) { > - err = request_any_context_irq( > - gpio_to_irq(pdata->row_gpios[i]), > + irq = gpio_to_irq(pdata->row_gpios[i]); > + if (irq < 0) { > + err = irq; > + dev_err(&pdev->dev, > + "Unable to convert GPIO line %i to irq: > %d\n", > + pdata->row_gpios[i], err); > + goto err_free_irqs; > + } > + > + err = request_any_context_irq(irq, > matrix_keypad_interrupt, > IRQF_TRIGGER_RISING | > - IRQF_TRIGGER_FALLING, > + IRQF_TRIGGER_FALLING, > "matrix-keypad", keypad); > if (err < 0) { > dev_err(&pdev->dev, > @@ -357,6 +357,8 @@ static int matrix_keypad_init_gpio(struct platform_device > *pdev, > pdata->row_gpios[i]); > goto err_free_irqs; > } > + > + keypad->row_irqs[i] = irq; > } > } > > @@ -366,7 +368,7 @@ static int matrix_keypad_init_gpio(struct platform_device > *pdev, > > err_free_irqs: > while (--i >= 0) > - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); > + free_irq(keypad->row_irqs[i], keypad); > i = pdata->num_row_gpios; > err_free_rows: > while (--i >= 0) > @@ -388,7 +390,7 @@ static void matrix_keypad_free_gpio(struct matrix_keypad > *keypad) > free_irq(pdata->clustered_irq, keypad); > } else { > for (i = 0; i < pdata->num_row_gpios; i++) > - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); > + free_irq(keypad->row_irqs[i], keypad); > } > > for (i = 0; i < pdata->num_row_gpios; i++) > -- > 2.34.1 >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#14519): https://lists.yoctoproject.org/g/linux-yocto/message/14519 Mute This Topic: https://lists.yoctoproject.org/mt/109202322/21656 Group Owner: linux-yocto+ow...@lists.yoctoproject.org Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-