@@ -27,6 +27,7 @@ struct matrix_keypad {
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
@@ -92,7 +93,7 @@ static void enable_row_irqs(struct matrix_keypad *keypad)
92
93
enable_irq (pdata -> clustered_irq );
93
94
else {
94
95
for (i = 0 ; i < pdata -> num_row_gpios ; i ++ )
95
- enable_irq (gpio_to_irq ( pdata -> row_gpios [i ]) );
96
+ enable_irq (keypad -> row_irqs [i ]);
96
97
}
97
98
}
98
99
@@ -105,7 +106,7 @@ static void disable_row_irqs(struct matrix_keypad *keypad)
105
106
disable_irq_nosync (pdata -> clustered_irq );
106
107
else {
107
108
for (i = 0 ; i < pdata -> num_row_gpios ; i ++ )
108
- disable_irq_nosync (gpio_to_irq ( pdata -> row_gpios [i ]) );
109
+ disable_irq_nosync (keypad -> row_irqs [i ]);
109
110
}
110
111
}
111
112
@@ -233,29 +234,23 @@ static void matrix_keypad_stop(struct input_dev *dev)
233
234
static void matrix_keypad_enable_wakeup (struct matrix_keypad * keypad )
234
235
{
235
236
const struct matrix_keypad_platform_data * pdata = keypad -> pdata ;
236
- unsigned int gpio ;
237
237
int i ;
238
238
239
239
if (pdata -> clustered_irq > 0 ) {
240
240
if (enable_irq_wake (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 ) {
@@ -264,12 +259,9 @@ static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
264
259
keypad -> gpio_all_disabled = false;
265
260
}
266
261
} else {
267
- for (i = 0 ; i < pdata -> num_row_gpios ; i ++ ) {
268
- if (test_and_clear_bit (i , keypad -> disabled_gpios )) {
269
- gpio = pdata -> row_gpios [i ];
270
- disable_irq_wake (gpio_to_irq (gpio ));
271
- }
272
- }
262
+ for (i = 0 ; i < pdata -> num_row_gpios ; i ++ )
263
+ if (test_and_clear_bit (i , keypad -> disabled_gpios ))
264
+ disable_irq_wake (keypad -> row_irqs [i ]);
273
265
}
274
266
}
275
267
@@ -306,7 +298,7 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
306
298
struct matrix_keypad * keypad )
307
299
{
308
300
const struct matrix_keypad_platform_data * pdata = keypad -> pdata ;
309
- int i , err ;
301
+ int i , irq , err ;
310
302
311
303
/* initialized strobe lines as outputs, activated */
312
304
for (i = 0 ; i < pdata -> num_col_gpios ; i ++ ) {
@@ -345,18 +337,28 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
345
337
}
346
338
} else {
347
339
for (i = 0 ; i < pdata -> num_row_gpios ; i ++ ) {
348
- err = request_any_context_irq (
349
- gpio_to_irq (pdata -> row_gpios [i ]),
340
+ irq = gpio_to_irq (pdata -> row_gpios [i ]);
341
+ if (irq < 0 ) {
342
+ err = irq ;
343
+ dev_err (& pdev -> dev ,
344
+ "Unable to convert GPIO line %i to irq: %d\n" ,
345
+ pdata -> row_gpios [i ], err );
346
+ goto err_free_irqs ;
347
+ }
348
+
349
+ err = request_any_context_irq (irq ,
350
350
matrix_keypad_interrupt ,
351
351
IRQF_TRIGGER_RISING |
352
- IRQF_TRIGGER_FALLING ,
352
+ IRQF_TRIGGER_FALLING ,
353
353
"matrix-keypad" , keypad );
354
354
if (err < 0 ) {
355
355
dev_err (& pdev -> dev ,
356
356
"Unable to acquire interrupt for GPIO line %i\n" ,
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
@@ -366,7 +368,7 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
366
368
367
369
err_free_irqs :
368
370
while (-- i >= 0 )
369
- free_irq (gpio_to_irq ( pdata -> row_gpios [i ]) , keypad );
371
+ free_irq (keypad -> row_irqs [i ], keypad );
370
372
i = pdata -> num_row_gpios ;
371
373
err_free_rows :
372
374
while (-- i >= 0 )
@@ -388,7 +390,7 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
388
390
free_irq (pdata -> clustered_irq , keypad );
389
391
} else {
390
392
for (i = 0 ; i < pdata -> num_row_gpios ; i ++ )
391
- free_irq (gpio_to_irq ( pdata -> row_gpios [i ]) , keypad );
393
+ free_irq (keypad -> row_irqs [i ], keypad );
392
394
}
393
395
394
396
for (i = 0 ; i < pdata -> num_row_gpios ; i ++ )
0 commit comments