1 From 25b2b36dea57fd86b63df2e253b376532d314a30 Mon Sep 17 00:00:00 2001
2 From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
3 Date: Sat, 20 Jan 2024 21:32:28 -0800
4 Subject: [PATCH 1337/1350] Input: matrix_keypad - avoid repeatedly converting
7 commit a96fb711c6be76bcfbcf594a865002fa7c0eb525 upstream.
9 There is no need to do conversion from GPIOs to interrupt numbers.
10 Convert row GPIOs to interrupt numbers once in probe() and use
11 this information when the driver needs to enable or disable given
14 Link: https://lore.kernel.org/r/20240121053232.276968-1-dmitry.torokhov@gmail.com
15 Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
17 drivers/input/keyboard/matrix_keypad.c | 48 ++++++++++++++------------
18 1 file changed, 25 insertions(+), 23 deletions(-)
20 --- a/drivers/input/keyboard/matrix_keypad.c
21 +++ b/drivers/input/keyboard/matrix_keypad.c
22 @@ -27,6 +27,7 @@ struct matrix_keypad {
23 const struct matrix_keypad_platform_data *pdata;
24 struct input_dev *input_dev;
25 unsigned int row_shift;
26 + unsigned int row_irqs[MATRIX_MAX_ROWS];
28 DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS);
30 @@ -92,7 +93,7 @@ static void enable_row_irqs(struct matri
31 enable_irq(pdata->clustered_irq);
33 for (i = 0; i < pdata->num_row_gpios; i++)
34 - enable_irq(gpio_to_irq(pdata->row_gpios[i]));
35 + enable_irq(keypad->row_irqs[i]);
39 @@ -105,7 +106,7 @@ static void disable_row_irqs(struct matr
40 disable_irq_nosync(pdata->clustered_irq);
42 for (i = 0; i < pdata->num_row_gpios; i++)
43 - disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i]));
44 + disable_irq_nosync(keypad->row_irqs[i]);
48 @@ -233,7 +234,6 @@ static void matrix_keypad_stop(struct in
49 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
51 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
55 if (pdata->clustered_irq > 0) {
56 @@ -241,21 +241,16 @@ static void matrix_keypad_enable_wakeup(
57 keypad->gpio_all_disabled = true;
60 - for (i = 0; i < pdata->num_row_gpios; i++) {
61 - if (!test_bit(i, keypad->disabled_gpios)) {
62 - gpio = pdata->row_gpios[i];
64 - if (enable_irq_wake(gpio_to_irq(gpio)) == 0)
65 + for (i = 0; i < pdata->num_row_gpios; i++)
66 + if (!test_bit(i, keypad->disabled_gpios))
67 + if (enable_irq_wake(keypad->row_irqs[i]) == 0)
68 __set_bit(i, keypad->disabled_gpios);
74 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
76 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
80 if (pdata->clustered_irq > 0) {
81 @@ -264,12 +259,9 @@ static void matrix_keypad_disable_wakeup
82 keypad->gpio_all_disabled = false;
85 - for (i = 0; i < pdata->num_row_gpios; i++) {
86 - if (test_and_clear_bit(i, keypad->disabled_gpios)) {
87 - gpio = pdata->row_gpios[i];
88 - disable_irq_wake(gpio_to_irq(gpio));
91 + for (i = 0; i < pdata->num_row_gpios; i++)
92 + if (test_and_clear_bit(i, keypad->disabled_gpios))
93 + disable_irq_wake(keypad->row_irqs[i]);
97 @@ -306,7 +298,7 @@ static int matrix_keypad_init_gpio(struc
98 struct matrix_keypad *keypad)
100 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
104 /* initialized strobe lines as outputs, activated */
105 for (i = 0; i < pdata->num_col_gpios; i++) {
106 @@ -345,11 +337,19 @@ static int matrix_keypad_init_gpio(struc
109 for (i = 0; i < pdata->num_row_gpios; i++) {
110 - err = request_any_context_irq(
111 - gpio_to_irq(pdata->row_gpios[i]),
112 + irq = gpio_to_irq(pdata->row_gpios[i]);
115 + dev_err(&pdev->dev,
116 + "Unable to convert GPIO line %i to irq: %d\n",
117 + pdata->row_gpios[i], err);
118 + goto err_free_irqs;
121 + err = request_any_context_irq(irq,
122 matrix_keypad_interrupt,
123 IRQF_TRIGGER_RISING |
124 - IRQF_TRIGGER_FALLING,
125 + IRQF_TRIGGER_FALLING,
126 "matrix-keypad", keypad);
129 @@ -357,6 +357,8 @@ static int matrix_keypad_init_gpio(struc
130 pdata->row_gpios[i]);
134 + keypad->row_irqs[i] = irq;
138 @@ -366,7 +368,7 @@ static int matrix_keypad_init_gpio(struc
142 - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
143 + free_irq(keypad->row_irqs[i], keypad);
144 i = pdata->num_row_gpios;
147 @@ -388,7 +390,7 @@ static void matrix_keypad_free_gpio(stru
148 free_irq(pdata->clustered_irq, keypad);
150 for (i = 0; i < pdata->num_row_gpios; i++)
151 - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
152 + free_irq(keypad->row_irqs[i], keypad);
155 for (i = 0; i < pdata->num_row_gpios; i++)