30
30
#define DRV_NAME "gpio-keys-polled"
31
31
32
32
struct gpio_keys_button_data {
33
+ struct gpio_desc * gpiod ;
33
34
int last_state ;
34
35
int count ;
35
36
int threshold ;
@@ -46,7 +47,7 @@ struct gpio_keys_polled_dev {
46
47
};
47
48
48
49
static void gpio_keys_button_event (struct input_polled_dev * dev ,
49
- struct gpio_keys_button * button ,
50
+ const struct gpio_keys_button * button ,
50
51
int state )
51
52
{
52
53
struct gpio_keys_polled_dev * bdev = dev -> private ;
@@ -70,15 +71,15 @@ static void gpio_keys_button_event(struct input_polled_dev *dev,
70
71
}
71
72
72
73
static void gpio_keys_polled_check_state (struct input_polled_dev * dev ,
73
- struct gpio_keys_button * button ,
74
+ const struct gpio_keys_button * button ,
74
75
struct gpio_keys_button_data * bdata )
75
76
{
76
77
int state ;
77
78
78
79
if (bdata -> can_sleep )
79
- state = !!gpiod_get_value_cansleep (button -> gpiod );
80
+ state = !!gpiod_get_value_cansleep (bdata -> gpiod );
80
81
else
81
- state = !!gpiod_get_value (button -> gpiod );
82
+ state = !!gpiod_get_value (bdata -> gpiod );
82
83
83
84
gpio_keys_button_event (dev , button , state );
84
85
@@ -142,48 +143,35 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev)
142
143
pdata -> disable (bdev -> dev );
143
144
}
144
145
145
- static struct gpio_keys_platform_data * gpio_keys_polled_get_devtree_pdata (struct device * dev )
146
+ static struct gpio_keys_platform_data *
147
+ gpio_keys_polled_get_devtree_pdata (struct device * dev )
146
148
{
147
149
struct gpio_keys_platform_data * pdata ;
148
150
struct gpio_keys_button * button ;
149
151
struct fwnode_handle * child ;
150
- int error ;
151
152
int nbuttons ;
152
153
153
154
nbuttons = device_get_child_node_count (dev );
154
155
if (nbuttons == 0 )
155
- return NULL ;
156
+ return ERR_PTR ( - EINVAL ) ;
156
157
157
158
pdata = devm_kzalloc (dev , sizeof (* pdata ) + nbuttons * sizeof (* button ),
158
159
GFP_KERNEL );
159
160
if (!pdata )
160
161
return ERR_PTR (- ENOMEM );
161
162
162
- pdata -> buttons = (struct gpio_keys_button * )(pdata + 1 );
163
+ button = (struct gpio_keys_button * )(pdata + 1 );
164
+
165
+ pdata -> buttons = button ;
166
+ pdata -> nbuttons = nbuttons ;
163
167
164
168
pdata -> rep = device_property_present (dev , "autorepeat" );
165
169
device_property_read_u32 (dev , "poll-interval" , & pdata -> poll_interval );
166
170
167
171
device_for_each_child_node (dev , child ) {
168
- struct gpio_desc * desc ;
169
-
170
- desc = devm_get_gpiod_from_child (dev , NULL , child );
171
- if (IS_ERR (desc )) {
172
- error = PTR_ERR (desc );
173
- if (error != - EPROBE_DEFER )
174
- dev_err (dev ,
175
- "Failed to get gpio flags, error: %d\n" ,
176
- error );
177
- fwnode_handle_put (child );
178
- return ERR_PTR (error );
179
- }
180
-
181
- button = & pdata -> buttons [pdata -> nbuttons ++ ];
182
- button -> gpiod = desc ;
183
-
184
- if (fwnode_property_read_u32 (child , "linux,code" , & button -> code )) {
185
- dev_err (dev , "Button without keycode: %d\n" ,
186
- pdata -> nbuttons - 1 );
172
+ if (fwnode_property_read_u32 (child , "linux,code" ,
173
+ & button -> code )) {
174
+ dev_err (dev , "button without keycode\n" );
187
175
fwnode_handle_put (child );
188
176
return ERR_PTR (- EINVAL );
189
177
}
@@ -206,10 +194,9 @@ static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct
206
194
if (fwnode_property_read_u32 (child , "debounce-interval" ,
207
195
& button -> debounce_interval ))
208
196
button -> debounce_interval = 5 ;
209
- }
210
197
211
- if ( pdata -> nbuttons == 0 )
212
- return ERR_PTR ( - EINVAL );
198
+ button ++ ;
199
+ }
213
200
214
201
return pdata ;
215
202
}
@@ -220,7 +207,7 @@ static void gpio_keys_polled_set_abs_params(struct input_dev *input,
220
207
int i , min = 0 , max = 0 ;
221
208
222
209
for (i = 0 ; i < pdata -> nbuttons ; i ++ ) {
223
- struct gpio_keys_button * button = & pdata -> buttons [i ];
210
+ const struct gpio_keys_button * button = & pdata -> buttons [i ];
224
211
225
212
if (button -> type != EV_ABS || button -> code != code )
226
213
continue ;
@@ -230,6 +217,7 @@ static void gpio_keys_polled_set_abs_params(struct input_dev *input,
230
217
if (button -> value > max )
231
218
max = button -> value ;
232
219
}
220
+
233
221
input_set_abs_params (input , code , min , max , 0 , 0 );
234
222
}
235
223
@@ -242,6 +230,7 @@ MODULE_DEVICE_TABLE(of, gpio_keys_polled_of_match);
242
230
static int gpio_keys_polled_probe (struct platform_device * pdev )
243
231
{
244
232
struct device * dev = & pdev -> dev ;
233
+ struct fwnode_handle * child = NULL ;
245
234
const struct gpio_keys_platform_data * pdata = dev_get_platdata (dev );
246
235
struct gpio_keys_polled_dev * bdev ;
247
236
struct input_polled_dev * poll_dev ;
@@ -254,10 +243,6 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
254
243
pdata = gpio_keys_polled_get_devtree_pdata (dev );
255
244
if (IS_ERR (pdata ))
256
245
return PTR_ERR (pdata );
257
- if (!pdata ) {
258
- dev_err (dev , "missing platform data\n" );
259
- return - EINVAL ;
260
- }
261
246
}
262
247
263
248
if (!pdata -> poll_interval ) {
@@ -300,20 +285,40 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
300
285
__set_bit (EV_REP , input -> evbit );
301
286
302
287
for (i = 0 ; i < pdata -> nbuttons ; i ++ ) {
303
- struct gpio_keys_button * button = & pdata -> buttons [i ];
288
+ const struct gpio_keys_button * button = & pdata -> buttons [i ];
304
289
struct gpio_keys_button_data * bdata = & bdev -> data [i ];
305
290
unsigned int type = button -> type ?: EV_KEY ;
306
291
307
292
if (button -> wakeup ) {
308
293
dev_err (dev , DRV_NAME " does not support wakeup\n" );
294
+ fwnode_handle_put (child );
309
295
return - EINVAL ;
310
296
}
311
297
312
- /*
313
- * Legacy GPIO number so request the GPIO here and
314
- * convert it to descriptor.
315
- */
316
- if (!button -> gpiod && gpio_is_valid (button -> gpio )) {
298
+ if (!dev_get_platdata (dev )) {
299
+ /* No legacy static platform data */
300
+ child = device_get_next_child_node (dev , child );
301
+ if (!child ) {
302
+ dev_err (dev , "missing child device node\n" );
303
+ return - EINVAL ;
304
+ }
305
+
306
+ bdata -> gpiod = devm_get_gpiod_from_child (dev , NULL ,
307
+ child );
308
+ if (IS_ERR (bdata -> gpiod )) {
309
+ error = PTR_ERR (bdata -> gpiod );
310
+ if (error != - EPROBE_DEFER )
311
+ dev_err (dev ,
312
+ "failed to get gpio: %d\n" ,
313
+ error );
314
+ fwnode_handle_put (child );
315
+ return error ;
316
+ }
317
+ } else if (gpio_is_valid (button -> gpio )) {
318
+ /*
319
+ * Legacy GPIO number so request the GPIO here and
320
+ * convert it to descriptor.
321
+ */
317
322
unsigned flags = GPIOF_IN ;
318
323
319
324
if (button -> active_low )
@@ -322,18 +327,22 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
322
327
error = devm_gpio_request_one (& pdev -> dev , button -> gpio ,
323
328
flags , button -> desc ? : DRV_NAME );
324
329
if (error ) {
325
- dev_err (dev , "unable to claim gpio %u, err=%d\n" ,
330
+ dev_err (dev ,
331
+ "unable to claim gpio %u, err=%d\n" ,
326
332
button -> gpio , error );
327
333
return error ;
328
334
}
329
335
330
- button -> gpiod = gpio_to_desc (button -> gpio );
336
+ bdata -> gpiod = gpio_to_desc (button -> gpio );
337
+ if (!bdata -> gpiod ) {
338
+ dev_err (dev ,
339
+ "unable to convert gpio %u to descriptor\n" ,
340
+ button -> gpio );
341
+ return - EINVAL ;
342
+ }
331
343
}
332
344
333
- if (IS_ERR (button -> gpiod ))
334
- return PTR_ERR (button -> gpiod );
335
-
336
- bdata -> can_sleep = gpiod_cansleep (button -> gpiod );
345
+ bdata -> can_sleep = gpiod_cansleep (bdata -> gpiod );
337
346
bdata -> last_state = -1 ;
338
347
bdata -> threshold = DIV_ROUND_UP (button -> debounce_interval ,
339
348
pdata -> poll_interval );
@@ -344,6 +353,8 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
344
353
button -> code );
345
354
}
346
355
356
+ fwnode_handle_put (child );
357
+
347
358
bdev -> poll_dev = poll_dev ;
348
359
bdev -> dev = dev ;
349
360
bdev -> pdata = pdata ;
0 commit comments