]> git.ipfire.org Git - thirdparty/openwrt.git/blob
d9a7a10cd445c29ebd17d613ae6ff4f48da814c3
[thirdparty/openwrt.git] /
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
5 GPIO to IRQ
6
7 commit a96fb711c6be76bcfbcf594a865002fa7c0eb525 upstream.
8
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
12 interrupt line.
13
14 Link: https://lore.kernel.org/r/20240121053232.276968-1-dmitry.torokhov@gmail.com
15 Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
16 ---
17 drivers/input/keyboard/matrix_keypad.c | 48 ++++++++++++++------------
18 1 file changed, 25 insertions(+), 23 deletions(-)
19
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];
27
28 DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS);
29
30 @@ -92,7 +93,7 @@ static void enable_row_irqs(struct matri
31 enable_irq(pdata->clustered_irq);
32 else {
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]);
36 }
37 }
38
39 @@ -105,7 +106,7 @@ static void disable_row_irqs(struct matr
40 disable_irq_nosync(pdata->clustered_irq);
41 else {
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]);
45 }
46 }
47
48 @@ -233,7 +234,6 @@ static void matrix_keypad_stop(struct in
49 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
50 {
51 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
52 - unsigned int gpio;
53 int i;
54
55 if (pdata->clustered_irq > 0) {
56 @@ -241,21 +241,16 @@ static void matrix_keypad_enable_wakeup(
57 keypad->gpio_all_disabled = true;
58 } else {
59
60 - for (i = 0; i < pdata->num_row_gpios; i++) {
61 - if (!test_bit(i, keypad->disabled_gpios)) {
62 - gpio = pdata->row_gpios[i];
63 -
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);
69 - }
70 - }
71 }
72 }
73
74 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
75 {
76 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
77 - unsigned int gpio;
78 int i;
79
80 if (pdata->clustered_irq > 0) {
81 @@ -264,12 +259,9 @@ static void matrix_keypad_disable_wakeup
82 keypad->gpio_all_disabled = false;
83 }
84 } else {
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));
89 - }
90 - }
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]);
94 }
95 }
96
97 @@ -306,7 +298,7 @@ static int matrix_keypad_init_gpio(struc
98 struct matrix_keypad *keypad)
99 {
100 const struct matrix_keypad_platform_data *pdata = keypad->pdata;
101 - int i, err;
102 + int i, irq, err;
103
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
107 }
108 } else {
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]);
113 + if (irq < 0) {
114 + err = irq;
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;
119 + }
120 +
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);
127 if (err < 0) {
128 dev_err(&pdev->dev,
129 @@ -357,6 +357,8 @@ static int matrix_keypad_init_gpio(struc
130 pdata->row_gpios[i]);
131 goto err_free_irqs;
132 }
133 +
134 + keypad->row_irqs[i] = irq;
135 }
136 }
137
138 @@ -366,7 +368,7 @@ static int matrix_keypad_init_gpio(struc
139
140 err_free_irqs:
141 while (--i >= 0)
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;
145 err_free_rows:
146 while (--i >= 0)
147 @@ -388,7 +390,7 @@ static void matrix_keypad_free_gpio(stru
148 free_irq(pdata->clustered_irq, keypad);
149 } else {
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);
153 }
154
155 for (i = 0; i < pdata->num_row_gpios; i++)