Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[linux-2.6-block.git] / drivers / input / keyboard / gpio_keys_polled.c
CommitLineData
0e7d0c86
GJ
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>
0e7d0c86
GJ
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>
633a21d8 26#include <linux/gpio/consumer.h>
0e7d0c86 27#include <linux/gpio_keys.h>
b26d4e22 28#include <linux/property.h>
0e7d0c86
GJ
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;
2976f247 42 const struct gpio_keys_platform_data *pdata;
0e7d0c86
GJ
43 struct gpio_keys_button_data data[0];
44};
45
46static void gpio_keys_polled_check_state(struct input_dev *input,
47 struct gpio_keys_button *button,
48 struct gpio_keys_button_data *bdata)
49{
50 int state;
51
52 if (bdata->can_sleep)
633a21d8 53 state = !!gpiod_get_value_cansleep(button->gpiod);
0e7d0c86 54 else
633a21d8 55 state = !!gpiod_get_value(button->gpiod);
0e7d0c86
GJ
56
57 if (state != bdata->last_state) {
58 unsigned int type = button->type ?: EV_KEY;
59
633a21d8 60 input_event(input, type, button->code, state);
0e7d0c86
GJ
61 input_sync(input);
62 bdata->count = 0;
63 bdata->last_state = state;
64 }
65}
66
67static void gpio_keys_polled_poll(struct input_polled_dev *dev)
68{
69 struct gpio_keys_polled_dev *bdev = dev->private;
2976f247 70 const struct gpio_keys_platform_data *pdata = bdev->pdata;
0e7d0c86
GJ
71 struct input_dev *input = dev->input;
72 int i;
73
2976f247 74 for (i = 0; i < pdata->nbuttons; i++) {
0e7d0c86
GJ
75 struct gpio_keys_button_data *bdata = &bdev->data[i];
76
77 if (bdata->count < bdata->threshold)
78 bdata->count++;
79 else
80 gpio_keys_polled_check_state(input, &pdata->buttons[i],
81 bdata);
82 }
83}
84
85static void gpio_keys_polled_open(struct input_polled_dev *dev)
86{
87 struct gpio_keys_polled_dev *bdev = dev->private;
2976f247 88 const struct gpio_keys_platform_data *pdata = bdev->pdata;
0e7d0c86
GJ
89
90 if (pdata->enable)
91 pdata->enable(bdev->dev);
92}
93
94static void gpio_keys_polled_close(struct input_polled_dev *dev)
95{
96 struct gpio_keys_polled_dev *bdev = dev->private;
2976f247 97 const struct gpio_keys_platform_data *pdata = bdev->pdata;
0e7d0c86
GJ
98
99 if (pdata->disable)
100 pdata->disable(bdev->dev);
101}
102
5298cc4c 103static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)
a2f25245 104{
a2f25245
APS
105 struct gpio_keys_platform_data *pdata;
106 struct gpio_keys_button *button;
b26d4e22 107 struct fwnode_handle *child;
a2f25245
APS
108 int error;
109 int nbuttons;
a2f25245 110
b26d4e22 111 nbuttons = device_get_child_node_count(dev);
a2f25245
APS
112 if (nbuttons == 0)
113 return NULL;
114
68252638
AS
115 pdata = devm_kzalloc(dev, sizeof(*pdata) + nbuttons * sizeof(*button),
116 GFP_KERNEL);
117 if (!pdata)
118 return ERR_PTR(-ENOMEM);
a2f25245
APS
119
120 pdata->buttons = (struct gpio_keys_button *)(pdata + 1);
121
b26d4e22
AL
122 pdata->rep = device_property_present(dev, "autorepeat");
123 device_property_read_u32(dev, "poll-interval", &pdata->poll_interval);
a2f25245 124
b26d4e22
AL
125 device_for_each_child_node(dev, child) {
126 struct gpio_desc *desc;
a2f25245 127
1feb57a2 128 desc = devm_get_gpiod_from_child(dev, NULL, child);
b26d4e22
AL
129 if (IS_ERR(desc)) {
130 error = PTR_ERR(desc);
d46329a7
GJ
131 if (error != -EPROBE_DEFER)
132 dev_err(dev,
133 "Failed to get gpio flags, error: %d\n",
134 error);
b26d4e22 135 fwnode_handle_put(child);
68252638 136 return ERR_PTR(error);
d46329a7
GJ
137 }
138
b26d4e22
AL
139 button = &pdata->buttons[pdata->nbuttons++];
140 button->gpiod = desc;
a2f25245 141
b26d4e22
AL
142 if (fwnode_property_read_u32(child, "linux,code", &button->code)) {
143 dev_err(dev, "Button without keycode: %d\n",
144 pdata->nbuttons - 1);
145 fwnode_handle_put(child);
68252638 146 return ERR_PTR(-EINVAL);
a2f25245
APS
147 }
148
b26d4e22 149 fwnode_property_read_string(child, "label", &button->desc);
a2f25245 150
b26d4e22
AL
151 if (fwnode_property_read_u32(child, "linux,input-type",
152 &button->type))
a2f25245
APS
153 button->type = EV_KEY;
154
b26d4e22 155 button->wakeup = fwnode_property_present(child, "gpio-key,wakeup");
a2f25245 156
b26d4e22
AL
157 if (fwnode_property_read_u32(child, "debounce-interval",
158 &button->debounce_interval))
a2f25245
APS
159 button->debounce_interval = 5;
160 }
161
68252638
AS
162 if (pdata->nbuttons == 0)
163 return ERR_PTR(-EINVAL);
a2f25245
APS
164
165 return pdata;
a2f25245
APS
166}
167
90c98ef5 168static const struct of_device_id gpio_keys_polled_of_match[] = {
a2f25245
APS
169 { .compatible = "gpio-keys-polled", },
170 { },
171};
172MODULE_DEVICE_TABLE(of, gpio_keys_polled_of_match);
173
5298cc4c 174static int gpio_keys_polled_probe(struct platform_device *pdev)
0e7d0c86 175{
0e7d0c86 176 struct device *dev = &pdev->dev;
2976f247 177 const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
0e7d0c86
GJ
178 struct gpio_keys_polled_dev *bdev;
179 struct input_polled_dev *poll_dev;
180 struct input_dev *input;
68252638 181 size_t size;
0e7d0c86
GJ
182 int error;
183 int i;
184
a2f25245
APS
185 if (!pdata) {
186 pdata = gpio_keys_polled_get_devtree_pdata(dev);
187 if (IS_ERR(pdata))
188 return PTR_ERR(pdata);
189 if (!pdata) {
190 dev_err(dev, "missing platform data\n");
191 return -EINVAL;
192 }
193 }
194
195 if (!pdata->poll_interval) {
196 dev_err(dev, "missing poll_interval value\n");
68252638 197 return -EINVAL;
a2f25245 198 }
0e7d0c86 199
68252638
AS
200 size = sizeof(struct gpio_keys_polled_dev) +
201 pdata->nbuttons * sizeof(struct gpio_keys_button_data);
202 bdev = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
0e7d0c86
GJ
203 if (!bdev) {
204 dev_err(dev, "no memory for private data\n");
68252638 205 return -ENOMEM;
0e7d0c86
GJ
206 }
207
68252638 208 poll_dev = devm_input_allocate_polled_device(&pdev->dev);
0e7d0c86
GJ
209 if (!poll_dev) {
210 dev_err(dev, "no memory for polled device\n");
68252638 211 return -ENOMEM;
0e7d0c86
GJ
212 }
213
214 poll_dev->private = bdev;
215 poll_dev->poll = gpio_keys_polled_poll;
216 poll_dev->poll_interval = pdata->poll_interval;
217 poll_dev->open = gpio_keys_polled_open;
218 poll_dev->close = gpio_keys_polled_close;
219
220 input = poll_dev->input;
221
0e7d0c86
GJ
222 input->name = pdev->name;
223 input->phys = DRV_NAME"/input0";
0e7d0c86
GJ
224
225 input->id.bustype = BUS_HOST;
226 input->id.vendor = 0x0001;
227 input->id.product = 0x0001;
228 input->id.version = 0x0100;
229
1a22e16f
AS
230 __set_bit(EV_KEY, input->evbit);
231 if (pdata->rep)
232 __set_bit(EV_REP, input->evbit);
233
0e7d0c86
GJ
234 for (i = 0; i < pdata->nbuttons; i++) {
235 struct gpio_keys_button *button = &pdata->buttons[i];
236 struct gpio_keys_button_data *bdata = &bdev->data[i];
0e7d0c86
GJ
237 unsigned int type = button->type ?: EV_KEY;
238
239 if (button->wakeup) {
240 dev_err(dev, DRV_NAME " does not support wakeup\n");
68252638 241 return -EINVAL;
0e7d0c86
GJ
242 }
243
633a21d8
AL
244 /*
245 * Legacy GPIO number so request the GPIO here and
246 * convert it to descriptor.
247 */
248 if (!button->gpiod && gpio_is_valid(button->gpio)) {
249 unsigned flags = 0;
250
251 if (button->active_low)
252 flags |= GPIOF_ACTIVE_LOW;
253
254 error = devm_gpio_request_one(&pdev->dev, button->gpio,
255 flags, button->desc ? : DRV_NAME);
256 if (error) {
257 dev_err(dev, "unable to claim gpio %u, err=%d\n",
258 button->gpio, error);
259 return error;
260 }
261
262 button->gpiod = gpio_to_desc(button->gpio);
0e7d0c86 263 }
0e7d0c86 264
633a21d8
AL
265 if (IS_ERR(button->gpiod))
266 return PTR_ERR(button->gpiod);
267
268 bdata->can_sleep = gpiod_cansleep(button->gpiod);
0e7d0c86
GJ
269 bdata->last_state = -1;
270 bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
271 pdata->poll_interval);
272
273 input_set_capability(input, type, button->code);
274 }
275
276 bdev->poll_dev = poll_dev;
277 bdev->dev = dev;
278 bdev->pdata = pdata;
279 platform_set_drvdata(pdev, bdev);
280
281 error = input_register_polled_device(poll_dev);
282 if (error) {
283 dev_err(dev, "unable to register polled device, err=%d\n",
284 error);
68252638 285 return error;
0e7d0c86
GJ
286 }
287
288 /* report initial state of the buttons */
289 for (i = 0; i < pdata->nbuttons; i++)
290 gpio_keys_polled_check_state(input, &pdata->buttons[i],
a2f25245 291 &bdev->data[i]);
0e7d0c86
GJ
292
293 return 0;
0e7d0c86
GJ
294}
295
296static struct platform_driver gpio_keys_polled_driver = {
297 .probe = gpio_keys_polled_probe,
0e7d0c86
GJ
298 .driver = {
299 .name = DRV_NAME,
b26d4e22 300 .of_match_table = gpio_keys_polled_of_match,
0e7d0c86
GJ
301 },
302};
5146c84f 303module_platform_driver(gpio_keys_polled_driver);
0e7d0c86
GJ
304
305MODULE_LICENSE("GPL v2");
306MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
307MODULE_DESCRIPTION("Polled GPIO Buttons driver");
308MODULE_ALIAS("platform:" DRV_NAME);