6
6
*
7
7
* Based on the pxa27x matrix keypad controller by Rodolfo Giometti.
8
8
*
9
- * NOTE:
10
- *
11
- * The 3-key reset is triggered by pressing the 3 keys in
12
- * Row 0, Columns 2, 4, and 7 at the same time. This action can
13
- * be disabled by setting the EP93XX_KEYPAD_DISABLE_3_KEY flag.
14
- *
15
- * Normal operation for the matrix does not autorepeat the key press.
16
- * This action can be enabled by setting the EP93XX_KEYPAD_AUTOREPEAT
17
- * flag.
18
9
*/
19
10
20
11
#include <linux/bits.h>
12
+ #include <linux/mod_devicetable.h>
21
13
#include <linux/module.h>
22
14
#include <linux/platform_device.h>
15
+ #include <linux/property.h>
23
16
#include <linux/interrupt.h>
24
17
#include <linux/clk.h>
25
18
#include <linux/io.h>
26
19
#include <linux/input.h>
27
20
#include <linux/input/matrix_keypad.h>
28
21
#include <linux/slab.h>
29
22
#include <linux/soc/cirrus/ep93xx.h>
30
- #include <linux/platform_data/keypad-ep93xx.h>
31
23
#include <linux/pm_wakeirq.h>
32
24
33
25
/*
61
53
#define KEY_REG_KEY1_MASK GENMASK(5, 0)
62
54
#define KEY_REG_KEY1_SHIFT 0
63
55
56
+ #define EP93XX_MATRIX_ROWS (8)
57
+ #define EP93XX_MATRIX_COLS (8)
58
+
64
59
#define EP93XX_MATRIX_SIZE (EP93XX_MATRIX_ROWS * EP93XX_MATRIX_COLS)
65
60
66
61
struct ep93xx_keypad {
67
- struct ep93xx_keypad_platform_data * pdata ;
68
62
struct input_dev * input_dev ;
69
63
struct clk * clk ;
64
+ unsigned int debounce ;
65
+ u16 prescale ;
70
66
71
67
void __iomem * mmio_base ;
72
68
@@ -133,23 +129,11 @@ static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id)
133
129
134
130
static void ep93xx_keypad_config (struct ep93xx_keypad * keypad )
135
131
{
136
- struct ep93xx_keypad_platform_data * pdata = keypad -> pdata ;
137
132
unsigned int val = 0 ;
138
133
139
- clk_set_rate (keypad -> clk , pdata -> clk_rate );
140
-
141
- if (pdata -> flags & EP93XX_KEYPAD_DISABLE_3_KEY )
142
- val |= KEY_INIT_DIS3KY ;
143
- if (pdata -> flags & EP93XX_KEYPAD_DIAG_MODE )
144
- val |= KEY_INIT_DIAG ;
145
- if (pdata -> flags & EP93XX_KEYPAD_BACK_DRIVE )
146
- val |= KEY_INIT_BACK ;
147
- if (pdata -> flags & EP93XX_KEYPAD_TEST_MODE )
148
- val |= KEY_INIT_T2 ;
149
-
150
- val |= ((pdata -> debounce << KEY_INIT_DBNC_SHIFT ) & KEY_INIT_DBNC_MASK );
134
+ val |= (keypad -> debounce << KEY_INIT_DBNC_SHIFT ) & KEY_INIT_DBNC_MASK ;
151
135
152
- val |= (( pdata -> prescale << KEY_INIT_PRSCL_SHIFT ) & KEY_INIT_PRSCL_MASK ) ;
136
+ val |= (keypad -> prescale << KEY_INIT_PRSCL_SHIFT ) & KEY_INIT_PRSCL_MASK ;
153
137
154
138
__raw_writel (val , keypad -> mmio_base + KEY_INIT );
155
139
}
@@ -220,32 +204,17 @@ static int ep93xx_keypad_resume(struct device *dev)
220
204
static DEFINE_SIMPLE_DEV_PM_OPS (ep93xx_keypad_pm_ops ,
221
205
ep93xx_keypad_suspend , ep93xx_keypad_resume ) ;
222
206
223
- static void ep93xx_keypad_release_gpio_action (void * _pdev )
224
- {
225
- struct platform_device * pdev = _pdev ;
226
-
227
- ep93xx_keypad_release_gpio (pdev );
228
- }
229
-
230
207
static int ep93xx_keypad_probe (struct platform_device * pdev )
231
208
{
209
+ struct device * dev = & pdev -> dev ;
232
210
struct ep93xx_keypad * keypad ;
233
- const struct matrix_keymap_data * keymap_data ;
234
211
struct input_dev * input_dev ;
235
212
int err ;
236
213
237
214
keypad = devm_kzalloc (& pdev -> dev , sizeof (* keypad ), GFP_KERNEL );
238
215
if (!keypad )
239
216
return - ENOMEM ;
240
217
241
- keypad -> pdata = dev_get_platdata (& pdev -> dev );
242
- if (!keypad -> pdata )
243
- return - EINVAL ;
244
-
245
- keymap_data = keypad -> pdata -> keymap_data ;
246
- if (!keymap_data )
247
- return - EINVAL ;
248
-
249
218
keypad -> irq = platform_get_irq (pdev , 0 );
250
219
if (keypad -> irq < 0 )
251
220
return keypad -> irq ;
@@ -254,19 +223,13 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
254
223
if (IS_ERR (keypad -> mmio_base ))
255
224
return PTR_ERR (keypad -> mmio_base );
256
225
257
- err = ep93xx_keypad_acquire_gpio (pdev );
258
- if (err )
259
- return err ;
260
-
261
- err = devm_add_action_or_reset (& pdev -> dev ,
262
- ep93xx_keypad_release_gpio_action , pdev );
263
- if (err )
264
- return err ;
265
-
266
226
keypad -> clk = devm_clk_get (& pdev -> dev , NULL );
267
227
if (IS_ERR (keypad -> clk ))
268
228
return PTR_ERR (keypad -> clk );
269
229
230
+ device_property_read_u32 (dev , "debounce-delay-ms" , & keypad -> debounce );
231
+ device_property_read_u16 (dev , "cirrus,prescale" , & keypad -> prescale );
232
+
270
233
input_dev = devm_input_allocate_device (& pdev -> dev );
271
234
if (!input_dev )
272
235
return - ENOMEM ;
@@ -278,13 +241,13 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
278
241
input_dev -> open = ep93xx_keypad_open ;
279
242
input_dev -> close = ep93xx_keypad_close ;
280
243
281
- err = matrix_keypad_build_keymap (keymap_data , NULL ,
244
+ err = matrix_keypad_build_keymap (NULL , NULL ,
282
245
EP93XX_MATRIX_ROWS , EP93XX_MATRIX_COLS ,
283
246
keypad -> keycodes , input_dev );
284
247
if (err )
285
248
return err ;
286
249
287
- if (keypad -> pdata -> flags & EP93XX_KEYPAD_AUTOREPEAT )
250
+ if (device_property_read_bool ( & pdev -> dev , "autorepeat" ) )
288
251
__set_bit (EV_REP , input_dev -> evbit );
289
252
input_set_drvdata (input_dev , keypad );
290
253
@@ -313,10 +276,17 @@ static void ep93xx_keypad_remove(struct platform_device *pdev)
313
276
dev_pm_clear_wake_irq (& pdev -> dev );
314
277
}
315
278
279
+ static const struct of_device_id ep93xx_keypad_of_ids [] = {
280
+ { .compatible = "cirrus,ep9307-keypad" },
281
+ { /* sentinel */ }
282
+ };
283
+ MODULE_DEVICE_TABLE (of , ep93xx_keypad_of_ids );
284
+
316
285
static struct platform_driver ep93xx_keypad_driver = {
317
286
.driver = {
318
287
.name = "ep93xx-keypad" ,
319
288
.pm = pm_sleep_ptr (& ep93xx_keypad_pm_ops ),
289
+ .of_match_table = ep93xx_keypad_of_ids ,
320
290
},
321
291
.probe = ep93xx_keypad_probe ,
322
292
.remove_new = ep93xx_keypad_remove ,
0 commit comments