hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/input/keyboard/gpio_keys_polled.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Driver for buttons on GPIO lines not capable of generating interrupts
34 *
....@@ -9,17 +10,12 @@
910 *
1011 * also was based on: /drivers/input/keyboard/gpio_keys.c
1112 * Copyright 2005 Phil Blundell
12
- *
13
- * This program is free software; you can redistribute it and/or modify
14
- * it under the terms of the GNU General Public License version 2 as
15
- * published by the Free Software Foundation.
1613 */
1714
1815 #include <linux/kernel.h>
1916 #include <linux/module.h>
2017 #include <linux/slab.h>
2118 #include <linux/input.h>
22
-#include <linux/input-polldev.h>
2319 #include <linux/ioport.h>
2420 #include <linux/platform_device.h>
2521 #include <linux/gpio.h>
....@@ -37,20 +33,19 @@
3733 };
3834
3935 struct gpio_keys_polled_dev {
40
- struct input_polled_dev *poll_dev;
36
+ struct input_dev *input;
4137 struct device *dev;
4238 const struct gpio_keys_platform_data *pdata;
4339 unsigned long rel_axis_seen[BITS_TO_LONGS(REL_CNT)];
4440 unsigned long abs_axis_seen[BITS_TO_LONGS(ABS_CNT)];
45
- struct gpio_keys_button_data data[0];
41
+ struct gpio_keys_button_data data[];
4642 };
4743
48
-static void gpio_keys_button_event(struct input_polled_dev *dev,
44
+static void gpio_keys_button_event(struct input_dev *input,
4945 const struct gpio_keys_button *button,
5046 int state)
5147 {
52
- struct gpio_keys_polled_dev *bdev = dev->private;
53
- struct input_dev *input = dev->input;
48
+ struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
5449 unsigned int type = button->type ?: EV_KEY;
5550
5651 if (type == EV_REL) {
....@@ -69,7 +64,7 @@
6964 }
7065 }
7166
72
-static void gpio_keys_polled_check_state(struct input_polled_dev *dev,
67
+static void gpio_keys_polled_check_state(struct input_dev *input,
7368 const struct gpio_keys_button *button,
7469 struct gpio_keys_button_data *bdata)
7570 {
....@@ -77,10 +72,10 @@
7772
7873 state = gpiod_get_value_cansleep(bdata->gpiod);
7974 if (state < 0) {
80
- dev_err(dev->input->dev.parent,
75
+ dev_err(input->dev.parent,
8176 "failed to get gpio state: %d\n", state);
8277 } else {
83
- gpio_keys_button_event(dev, button, state);
78
+ gpio_keys_button_event(input, button, state);
8479
8580 if (state != bdata->last_state) {
8681 bdata->count = 0;
....@@ -89,11 +84,10 @@
8984 }
9085 }
9186
92
-static void gpio_keys_polled_poll(struct input_polled_dev *dev)
87
+static void gpio_keys_polled_poll(struct input_dev *input)
9388 {
94
- struct gpio_keys_polled_dev *bdev = dev->private;
89
+ struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
9590 const struct gpio_keys_platform_data *pdata = bdev->pdata;
96
- struct input_dev *input = dev->input;
9791 int i;
9892
9993 memset(bdev->rel_axis_seen, 0, sizeof(bdev->rel_axis_seen));
....@@ -104,10 +98,10 @@
10498
10599 if (bdata->count < bdata->threshold) {
106100 bdata->count++;
107
- gpio_keys_button_event(dev, &pdata->buttons[i],
101
+ gpio_keys_button_event(input, &pdata->buttons[i],
108102 bdata->last_state);
109103 } else {
110
- gpio_keys_polled_check_state(dev, &pdata->buttons[i],
104
+ gpio_keys_polled_check_state(input, &pdata->buttons[i],
111105 bdata);
112106 }
113107 }
....@@ -125,18 +119,20 @@
125119 input_sync(input);
126120 }
127121
128
-static void gpio_keys_polled_open(struct input_polled_dev *dev)
122
+static int gpio_keys_polled_open(struct input_dev *input)
129123 {
130
- struct gpio_keys_polled_dev *bdev = dev->private;
124
+ struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
131125 const struct gpio_keys_platform_data *pdata = bdev->pdata;
132126
133127 if (pdata->enable)
134128 pdata->enable(bdev->dev);
129
+
130
+ return 0;
135131 }
136132
137
-static void gpio_keys_polled_close(struct input_polled_dev *dev)
133
+static void gpio_keys_polled_close(struct input_dev *input)
138134 {
139
- struct gpio_keys_polled_dev *bdev = dev->private;
135
+ struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
140136 const struct gpio_keys_platform_data *pdata = bdev->pdata;
141137
142138 if (pdata->disable)
....@@ -167,6 +163,8 @@
167163
168164 pdata->rep = device_property_present(dev, "autorepeat");
169165 device_property_read_u32(dev, "poll-interval", &pdata->poll_interval);
166
+
167
+ device_property_read_string(dev, "label", &pdata->name);
170168
171169 device_for_each_child_node(dev, child) {
172170 if (fwnode_property_read_u32(child, "linux,code",
....@@ -233,9 +231,7 @@
233231 struct fwnode_handle *child = NULL;
234232 const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
235233 struct gpio_keys_polled_dev *bdev;
236
- struct input_polled_dev *poll_dev;
237234 struct input_dev *input;
238
- size_t size;
239235 int error;
240236 int i;
241237
....@@ -250,35 +246,31 @@
250246 return -EINVAL;
251247 }
252248
253
- size = sizeof(struct gpio_keys_polled_dev) +
254
- pdata->nbuttons * sizeof(struct gpio_keys_button_data);
255
- bdev = devm_kzalloc(dev, size, GFP_KERNEL);
249
+ bdev = devm_kzalloc(dev, struct_size(bdev, data, pdata->nbuttons),
250
+ GFP_KERNEL);
256251 if (!bdev) {
257252 dev_err(dev, "no memory for private data\n");
258253 return -ENOMEM;
259254 }
260255
261
- poll_dev = devm_input_allocate_polled_device(dev);
262
- if (!poll_dev) {
263
- dev_err(dev, "no memory for polled device\n");
256
+ input = devm_input_allocate_device(dev);
257
+ if (!input) {
258
+ dev_err(dev, "no memory for input device\n");
264259 return -ENOMEM;
265260 }
266261
267
- poll_dev->private = bdev;
268
- poll_dev->poll = gpio_keys_polled_poll;
269
- poll_dev->poll_interval = pdata->poll_interval;
270
- poll_dev->open = gpio_keys_polled_open;
271
- poll_dev->close = gpio_keys_polled_close;
262
+ input_set_drvdata(input, bdev);
272263
273
- input = poll_dev->input;
274
-
275
- input->name = pdev->name;
264
+ input->name = pdata->name ?: pdev->name;
276265 input->phys = DRV_NAME"/input0";
277266
278267 input->id.bustype = BUS_HOST;
279268 input->id.vendor = 0x0001;
280269 input->id.product = 0x0001;
281270 input->id.version = 0x0100;
271
+
272
+ input->open = gpio_keys_polled_open;
273
+ input->close = gpio_keys_polled_close;
282274
283275 __set_bit(EV_KEY, input->evbit);
284276 if (pdata->rep)
....@@ -303,10 +295,9 @@
303295 return -EINVAL;
304296 }
305297
306
- bdata->gpiod = devm_fwnode_get_gpiod_from_child(dev,
307
- NULL, child,
308
- GPIOD_IN,
309
- button->desc);
298
+ bdata->gpiod = devm_fwnode_gpiod_get(dev, child,
299
+ NULL, GPIOD_IN,
300
+ button->desc);
310301 if (IS_ERR(bdata->gpiod)) {
311302 error = PTR_ERR(bdata->gpiod);
312303 if (error != -EPROBE_DEFER)
....@@ -356,11 +347,19 @@
356347
357348 fwnode_handle_put(child);
358349
359
- bdev->poll_dev = poll_dev;
350
+ bdev->input = input;
360351 bdev->dev = dev;
361352 bdev->pdata = pdata;
362353
363
- error = input_register_polled_device(poll_dev);
354
+ error = input_setup_polling(input, gpio_keys_polled_poll);
355
+ if (error) {
356
+ dev_err(dev, "unable to set up polling, err=%d\n", error);
357
+ return error;
358
+ }
359
+
360
+ input_set_poll_interval(input, pdata->poll_interval);
361
+
362
+ error = input_register_device(input);
364363 if (error) {
365364 dev_err(dev, "unable to register polled device, err=%d\n",
366365 error);
....@@ -369,7 +368,7 @@
369368
370369 /* report initial state of the buttons */
371370 for (i = 0; i < pdata->nbuttons; i++)
372
- gpio_keys_polled_check_state(poll_dev, &pdata->buttons[i],
371
+ gpio_keys_polled_check_state(input, &pdata->buttons[i],
373372 &bdev->data[i]);
374373
375374 input_sync(input);