1/*
2 *  Driver for buttons on GPIO lines not capable of generating interrupts
3 *
4 *  Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org>
5 *  Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com>
6 *
7 *  This file was based on: /drivers/input/misc/cobalt_btns.c
8 *	Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
9 *
10 *  also was based on: /drivers/input/keyboard/gpio_keys.c
11 *	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.
16 */
17
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/slab.h>
21#include <linux/input.h>
22#include <linux/input-polldev.h>
23#include <linux/ioport.h>
24#include <linux/platform_device.h>
25#include <linux/gpio.h>
26#include <linux/gpio/consumer.h>
27#include <linux/gpio_keys.h>
28#include <linux/property.h>
29
30#define DRV_NAME	"gpio-keys-polled"
31
32struct gpio_keys_button_data {
33	int last_state;
34	int count;
35	int threshold;
36	int can_sleep;
37};
38
39struct gpio_keys_polled_dev {
40	struct input_polled_dev *poll_dev;
41	struct device *dev;
42	const struct gpio_keys_platform_data *pdata;
43	unsigned long rel_axis_seen[BITS_TO_LONGS(REL_CNT)];
44	unsigned long abs_axis_seen[BITS_TO_LONGS(ABS_CNT)];
45	struct gpio_keys_button_data data[0];
46};
47
48static void gpio_keys_button_event(struct input_polled_dev *dev,
49				   struct gpio_keys_button *button,
50				   int state)
51{
52	struct gpio_keys_polled_dev *bdev = dev->private;
53	struct input_dev *input = dev->input;
54	unsigned int type = button->type ?: EV_KEY;
55
56	if (type == EV_REL) {
57		if (state) {
58			input_event(input, type, button->code, button->value);
59			__set_bit(button->code, bdev->rel_axis_seen);
60		}
61	} else if (type == EV_ABS) {
62		if (state) {
63			input_event(input, type, button->code, button->value);
64			__set_bit(button->code, bdev->abs_axis_seen);
65		}
66	} else {
67		input_event(input, type, button->code, state);
68		input_sync(input);
69	}
70}
71
72static void gpio_keys_polled_check_state(struct input_polled_dev *dev,
73					 struct gpio_keys_button *button,
74					 struct gpio_keys_button_data *bdata)
75{
76	int state;
77
78	if (bdata->can_sleep)
79		state = !!gpiod_get_value_cansleep(button->gpiod);
80	else
81		state = !!gpiod_get_value(button->gpiod);
82
83	gpio_keys_button_event(dev, button, state);
84
85	if (state != bdata->last_state) {
86		bdata->count = 0;
87		bdata->last_state = state;
88	}
89}
90
91static void gpio_keys_polled_poll(struct input_polled_dev *dev)
92{
93	struct gpio_keys_polled_dev *bdev = dev->private;
94	const struct gpio_keys_platform_data *pdata = bdev->pdata;
95	struct input_dev *input = dev->input;
96	int i;
97
98	memset(bdev->rel_axis_seen, 0, sizeof(bdev->rel_axis_seen));
99	memset(bdev->abs_axis_seen, 0, sizeof(bdev->abs_axis_seen));
100
101	for (i = 0; i < pdata->nbuttons; i++) {
102		struct gpio_keys_button_data *bdata = &bdev->data[i];
103
104		if (bdata->count < bdata->threshold) {
105			bdata->count++;
106			gpio_keys_button_event(dev, &pdata->buttons[i],
107					       bdata->last_state);
108		} else {
109			gpio_keys_polled_check_state(dev, &pdata->buttons[i],
110						     bdata);
111		}
112	}
113
114	for_each_set_bit(i, input->relbit, REL_CNT) {
115		if (!test_bit(i, bdev->rel_axis_seen))
116			input_event(input, EV_REL, i, 0);
117	}
118
119	for_each_set_bit(i, input->absbit, ABS_CNT) {
120		if (!test_bit(i, bdev->abs_axis_seen))
121			input_event(input, EV_ABS, i, 0);
122	}
123
124	input_sync(input);
125}
126
127static void gpio_keys_polled_open(struct input_polled_dev *dev)
128{
129	struct gpio_keys_polled_dev *bdev = dev->private;
130	const struct gpio_keys_platform_data *pdata = bdev->pdata;
131
132	if (pdata->enable)
133		pdata->enable(bdev->dev);
134}
135
136static void gpio_keys_polled_close(struct input_polled_dev *dev)
137{
138	struct gpio_keys_polled_dev *bdev = dev->private;
139	const struct gpio_keys_platform_data *pdata = bdev->pdata;
140
141	if (pdata->disable)
142		pdata->disable(bdev->dev);
143}
144
145static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)
146{
147	struct gpio_keys_platform_data *pdata;
148	struct gpio_keys_button *button;
149	struct fwnode_handle *child;
150	int error;
151	int nbuttons;
152
153	nbuttons = device_get_child_node_count(dev);
154	if (nbuttons == 0)
155		return NULL;
156
157	pdata = devm_kzalloc(dev, sizeof(*pdata) + nbuttons * sizeof(*button),
158			     GFP_KERNEL);
159	if (!pdata)
160		return ERR_PTR(-ENOMEM);
161
162	pdata->buttons = (struct gpio_keys_button *)(pdata + 1);
163
164	pdata->rep = device_property_present(dev, "autorepeat");
165	device_property_read_u32(dev, "poll-interval", &pdata->poll_interval);
166
167	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);
187			fwnode_handle_put(child);
188			return ERR_PTR(-EINVAL);
189		}
190
191		fwnode_property_read_string(child, "label", &button->desc);
192
193		if (fwnode_property_read_u32(child, "linux,input-type",
194					     &button->type))
195			button->type = EV_KEY;
196
197		if (fwnode_property_read_u32(child, "linux,input-value",
198					     (u32 *)&button->value))
199			button->value = 1;
200
201		button->wakeup =
202			fwnode_property_read_bool(child, "wakeup-source") ||
203			/* legacy name */
204			fwnode_property_read_bool(child, "gpio-key,wakeup");
205
206		if (fwnode_property_read_u32(child, "debounce-interval",
207					     &button->debounce_interval))
208			button->debounce_interval = 5;
209	}
210
211	if (pdata->nbuttons == 0)
212		return ERR_PTR(-EINVAL);
213
214	return pdata;
215}
216
217static void gpio_keys_polled_set_abs_params(struct input_dev *input,
218	const struct gpio_keys_platform_data *pdata, unsigned int code)
219{
220	int i, min = 0, max = 0;
221
222	for (i = 0; i < pdata->nbuttons; i++) {
223		struct gpio_keys_button *button = &pdata->buttons[i];
224
225		if (button->type != EV_ABS || button->code != code)
226			continue;
227
228		if (button->value < min)
229			min = button->value;
230		if (button->value > max)
231			max = button->value;
232	}
233	input_set_abs_params(input, code, min, max, 0, 0);
234}
235
236static const struct of_device_id gpio_keys_polled_of_match[] = {
237	{ .compatible = "gpio-keys-polled", },
238	{ },
239};
240MODULE_DEVICE_TABLE(of, gpio_keys_polled_of_match);
241
242static int gpio_keys_polled_probe(struct platform_device *pdev)
243{
244	struct device *dev = &pdev->dev;
245	const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
246	struct gpio_keys_polled_dev *bdev;
247	struct input_polled_dev *poll_dev;
248	struct input_dev *input;
249	size_t size;
250	int error;
251	int i;
252
253	if (!pdata) {
254		pdata = gpio_keys_polled_get_devtree_pdata(dev);
255		if (IS_ERR(pdata))
256			return PTR_ERR(pdata);
257		if (!pdata) {
258			dev_err(dev, "missing platform data\n");
259			return -EINVAL;
260		}
261	}
262
263	if (!pdata->poll_interval) {
264		dev_err(dev, "missing poll_interval value\n");
265		return -EINVAL;
266	}
267
268	size = sizeof(struct gpio_keys_polled_dev) +
269			pdata->nbuttons * sizeof(struct gpio_keys_button_data);
270	bdev = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
271	if (!bdev) {
272		dev_err(dev, "no memory for private data\n");
273		return -ENOMEM;
274	}
275
276	poll_dev = devm_input_allocate_polled_device(&pdev->dev);
277	if (!poll_dev) {
278		dev_err(dev, "no memory for polled device\n");
279		return -ENOMEM;
280	}
281
282	poll_dev->private = bdev;
283	poll_dev->poll = gpio_keys_polled_poll;
284	poll_dev->poll_interval = pdata->poll_interval;
285	poll_dev->open = gpio_keys_polled_open;
286	poll_dev->close = gpio_keys_polled_close;
287
288	input = poll_dev->input;
289
290	input->name = pdev->name;
291	input->phys = DRV_NAME"/input0";
292
293	input->id.bustype = BUS_HOST;
294	input->id.vendor = 0x0001;
295	input->id.product = 0x0001;
296	input->id.version = 0x0100;
297
298	__set_bit(EV_KEY, input->evbit);
299	if (pdata->rep)
300		__set_bit(EV_REP, input->evbit);
301
302	for (i = 0; i < pdata->nbuttons; i++) {
303		struct gpio_keys_button *button = &pdata->buttons[i];
304		struct gpio_keys_button_data *bdata = &bdev->data[i];
305		unsigned int type = button->type ?: EV_KEY;
306
307		if (button->wakeup) {
308			dev_err(dev, DRV_NAME " does not support wakeup\n");
309			return -EINVAL;
310		}
311
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)) {
317			unsigned flags = GPIOF_IN;
318
319			if (button->active_low)
320				flags |= GPIOF_ACTIVE_LOW;
321
322			error = devm_gpio_request_one(&pdev->dev, button->gpio,
323					flags, button->desc ? : DRV_NAME);
324			if (error) {
325				dev_err(dev, "unable to claim gpio %u, err=%d\n",
326					button->gpio, error);
327				return error;
328			}
329
330			button->gpiod = gpio_to_desc(button->gpio);
331		}
332
333		if (IS_ERR(button->gpiod))
334			return PTR_ERR(button->gpiod);
335
336		bdata->can_sleep = gpiod_cansleep(button->gpiod);
337		bdata->last_state = -1;
338		bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
339						pdata->poll_interval);
340
341		input_set_capability(input, type, button->code);
342		if (type == EV_ABS)
343			gpio_keys_polled_set_abs_params(input, pdata,
344							button->code);
345	}
346
347	bdev->poll_dev = poll_dev;
348	bdev->dev = dev;
349	bdev->pdata = pdata;
350	platform_set_drvdata(pdev, bdev);
351
352	error = input_register_polled_device(poll_dev);
353	if (error) {
354		dev_err(dev, "unable to register polled device, err=%d\n",
355			error);
356		return error;
357	}
358
359	/* report initial state of the buttons */
360	for (i = 0; i < pdata->nbuttons; i++)
361		gpio_keys_polled_check_state(poll_dev, &pdata->buttons[i],
362					     &bdev->data[i]);
363
364	input_sync(input);
365
366	return 0;
367}
368
369static struct platform_driver gpio_keys_polled_driver = {
370	.probe	= gpio_keys_polled_probe,
371	.driver	= {
372		.name	= DRV_NAME,
373		.of_match_table = gpio_keys_polled_of_match,
374	},
375};
376module_platform_driver(gpio_keys_polled_driver);
377
378MODULE_LICENSE("GPL v2");
379MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
380MODULE_DESCRIPTION("Polled GPIO Buttons driver");
381MODULE_ALIAS("platform:" DRV_NAME);
382