1 /* drivers/input/misc/gpio_matrix.c
3 * Copyright (C) 2007 Google, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <linux/kernel.h>
17 #include <linux/gpio.h>
18 #include <linux/gpio_event.h>
19 #include <linux/hrtimer.h>
20 #include <linux/interrupt.h>
21 #include <linux/wakelock.h>
24 struct gpio_event_input_devs *input_devs;
25 struct gpio_event_matrix_info *keypad_info;
27 struct wake_lock wake_lock;
29 unsigned int use_irq:1;
30 unsigned int key_state_changed:1;
31 unsigned int last_key_state_changed:1;
32 unsigned int some_keys_pressed:2;
33 unsigned long keys_pressed[0];
36 static void clear_phantom_key(struct gpio_kp *kp, int out, int in)
38 struct gpio_event_matrix_info *mi = kp->keypad_info;
39 int key_index = out * mi->ninputs + in;
40 unsigned short keyentry = mi->keymap[key_index];
41 unsigned short keycode = keyentry & MATRIX_KEY_MASK;
42 unsigned short dev = keyentry >> MATRIX_CODE_BITS;
44 if (!test_bit(keycode, kp->input_devs->dev[dev]->key)) {
45 if (mi->flags & GPIOKPF_PRINT_PHANTOM_KEYS)
46 pr_info("gpiomatrix: phantom key %x, %d-%d (%d-%d) "
47 "cleared\n", keycode, out, in,
48 mi->output_gpios[out], mi->input_gpios[in]);
49 __clear_bit(key_index, kp->keys_pressed);
51 if (mi->flags & GPIOKPF_PRINT_PHANTOM_KEYS)
52 pr_info("gpiomatrix: phantom key %x, %d-%d (%d-%d) "
53 "not cleared\n", keycode, out, in,
54 mi->output_gpios[out], mi->input_gpios[in]);
58 static int restore_keys_for_input(struct gpio_kp *kp, int out, int in)
63 key_index = out * kp->keypad_info->ninputs + in;
64 while (out < kp->keypad_info->noutputs) {
65 if (test_bit(key_index, kp->keys_pressed)) {
67 clear_phantom_key(kp, out, in);
69 key_index += kp->keypad_info->ninputs;
75 static void remove_phantom_keys(struct gpio_kp *kp)
80 if (kp->some_keys_pressed < 3)
83 for (out = 0; out < kp->keypad_info->noutputs; out++) {
85 key_index = out * kp->keypad_info->ninputs;
86 for (in = 0; in < kp->keypad_info->ninputs; in++, key_index++) {
87 if (test_bit(key_index, kp->keys_pressed)) {
93 if (!restore_keys_for_input(kp, out + 1,
96 clear_phantom_key(kp, out, inp);
99 restore_keys_for_input(kp, out, in);
105 static void report_key(struct gpio_kp *kp, int key_index, int out, int in)
107 struct gpio_event_matrix_info *mi = kp->keypad_info;
108 int pressed = test_bit(key_index, kp->keys_pressed);
109 unsigned short keyentry = mi->keymap[key_index];
110 unsigned short keycode = keyentry & MATRIX_KEY_MASK;
111 unsigned short dev = keyentry >> MATRIX_CODE_BITS;
113 if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) {
114 if (keycode == KEY_RESERVED) {
115 if (mi->flags & GPIOKPF_PRINT_UNMAPPED_KEYS)
116 pr_info("gpiomatrix: unmapped key, %d-%d "
117 "(%d-%d) changed to %d\n",
118 out, in, mi->output_gpios[out],
119 mi->input_gpios[in], pressed);
121 if (mi->flags & GPIOKPF_PRINT_MAPPED_KEYS)
122 pr_info("gpiomatrix: key %x, %d-%d (%d-%d) "
123 "changed to %d\n", keycode,
124 out, in, mi->output_gpios[out],
125 mi->input_gpios[in], pressed);
126 input_report_key(kp->input_devs->dev[dev], keycode, pressed);
131 static enum hrtimer_restart gpio_keypad_timer_func(struct hrtimer *timer)
136 struct gpio_kp *kp = container_of(timer, struct gpio_kp, timer);
137 struct gpio_event_matrix_info *mi = kp->keypad_info;
138 unsigned gpio_keypad_flags = mi->flags;
139 unsigned polarity = !!(gpio_keypad_flags & GPIOKPF_ACTIVE_HIGH);
141 out = kp->current_output;
142 if (out == mi->noutputs) {
144 kp->last_key_state_changed = kp->key_state_changed;
145 kp->key_state_changed = 0;
146 kp->some_keys_pressed = 0;
148 key_index = out * mi->ninputs;
149 for (in = 0; in < mi->ninputs; in++, key_index++) {
150 gpio = mi->input_gpios[in];
151 if (gpio_get_value(gpio) ^ !polarity) {
152 if (kp->some_keys_pressed < 3)
153 kp->some_keys_pressed++;
154 kp->key_state_changed |= !__test_and_set_bit(
155 key_index, kp->keys_pressed);
157 kp->key_state_changed |= __test_and_clear_bit(
158 key_index, kp->keys_pressed);
160 gpio = mi->output_gpios[out];
161 if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
162 gpio_set_value(gpio, !polarity);
164 gpio_direction_input(gpio);
167 kp->current_output = out;
168 if (out < mi->noutputs) {
169 gpio = mi->output_gpios[out];
170 if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
171 gpio_set_value(gpio, polarity);
173 gpio_direction_output(gpio, polarity);
174 hrtimer_start(timer, mi->settle_time, HRTIMER_MODE_REL);
175 return HRTIMER_NORESTART;
177 if (gpio_keypad_flags & GPIOKPF_DEBOUNCE) {
178 if (kp->key_state_changed) {
179 hrtimer_start(&kp->timer, mi->debounce_delay,
181 return HRTIMER_NORESTART;
183 kp->key_state_changed = kp->last_key_state_changed;
185 if (kp->key_state_changed) {
186 if (gpio_keypad_flags & GPIOKPF_REMOVE_SOME_PHANTOM_KEYS)
187 remove_phantom_keys(kp);
189 for (out = 0; out < mi->noutputs; out++)
190 for (in = 0; in < mi->ninputs; in++, key_index++)
191 report_key(kp, key_index, out, in);
193 if (!kp->use_irq || kp->some_keys_pressed) {
194 hrtimer_start(timer, mi->poll_time, HRTIMER_MODE_REL);
195 return HRTIMER_NORESTART;
198 /* No keys are pressed, reenable interrupt */
199 for (out = 0; out < mi->noutputs; out++) {
200 if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
201 gpio_set_value(mi->output_gpios[out], polarity);
203 gpio_direction_output(mi->output_gpios[out], polarity);
205 for (in = 0; in < mi->ninputs; in++)
206 enable_irq(gpio_to_irq(mi->input_gpios[in]));
207 wake_unlock(&kp->wake_lock);
208 return HRTIMER_NORESTART;
211 static irqreturn_t gpio_keypad_irq_handler(int irq_in, void *dev_id)
214 struct gpio_kp *kp = dev_id;
215 struct gpio_event_matrix_info *mi = kp->keypad_info;
216 unsigned gpio_keypad_flags = mi->flags;
218 if (!kp->use_irq) /* ignore interrupt while registering the handler */
221 for (i = 0; i < mi->ninputs; i++)
222 disable_irq(gpio_to_irq(mi->input_gpios[i]));
223 for (i = 0; i < mi->noutputs; i++) {
224 if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
225 gpio_set_value(mi->output_gpios[i],
226 !(gpio_keypad_flags & GPIOKPF_ACTIVE_HIGH));
228 gpio_direction_input(mi->output_gpios[i]);
230 wake_lock(&kp->wake_lock);
231 hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
235 static int gpio_keypad_request_irqs(struct gpio_kp *kp)
240 unsigned long request_flags;
241 struct gpio_event_matrix_info *mi = kp->keypad_info;
243 switch (mi->flags & (GPIOKPF_ACTIVE_HIGH|GPIOKPF_LEVEL_TRIGGERED_IRQ)) {
245 request_flags = IRQF_TRIGGER_FALLING;
247 case GPIOKPF_ACTIVE_HIGH:
248 request_flags = IRQF_TRIGGER_RISING;
250 case GPIOKPF_LEVEL_TRIGGERED_IRQ:
251 request_flags = IRQF_TRIGGER_LOW;
253 case GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_ACTIVE_HIGH:
254 request_flags = IRQF_TRIGGER_HIGH;
258 for (i = 0; i < mi->ninputs; i++) {
259 err = irq = gpio_to_irq(mi->input_gpios[i]);
261 goto err_gpio_get_irq_num_failed;
262 err = request_irq(irq, gpio_keypad_irq_handler, request_flags,
265 pr_err("gpiomatrix: request_irq failed for input %d, "
266 "irq %d\n", mi->input_gpios[i], irq);
267 goto err_request_irq_failed;
269 err = set_irq_wake(irq, 1);
271 pr_err("gpiomatrix: set_irq_wake failed for input %d, "
272 "irq %d\n", mi->input_gpios[i], irq);
278 for (i = mi->noutputs - 1; i >= 0; i--) {
279 free_irq(gpio_to_irq(mi->input_gpios[i]), kp);
280 err_request_irq_failed:
281 err_gpio_get_irq_num_failed:
287 int gpio_event_matrix_func(struct gpio_event_input_devs *input_devs,
288 struct gpio_event_info *info, void **data, int func)
294 struct gpio_event_matrix_info *mi;
296 mi = container_of(info, struct gpio_event_matrix_info, info);
297 if (func == GPIO_EVENT_FUNC_SUSPEND || func == GPIO_EVENT_FUNC_RESUME) {
298 /* TODO: disable scanning */
302 if (func == GPIO_EVENT_FUNC_INIT) {
303 if (mi->keymap == NULL ||
304 mi->input_gpios == NULL ||
305 mi->output_gpios == NULL) {
307 pr_err("gpiomatrix: Incomplete pdata\n");
308 goto err_invalid_platform_data;
310 key_count = mi->ninputs * mi->noutputs;
312 *data = kp = kzalloc(sizeof(*kp) + sizeof(kp->keys_pressed[0]) *
313 BITS_TO_LONGS(key_count), GFP_KERNEL);
316 pr_err("gpiomatrix: Failed to allocate private data\n");
317 goto err_kp_alloc_failed;
319 kp->input_devs = input_devs;
320 kp->keypad_info = mi;
321 for (i = 0; i < key_count; i++) {
322 unsigned short keyentry = mi->keymap[i];
323 unsigned short keycode = keyentry & MATRIX_KEY_MASK;
324 unsigned short dev = keyentry >> MATRIX_CODE_BITS;
325 if (dev >= input_devs->count) {
326 pr_err("gpiomatrix: bad device index %d >= "
327 "%d for key code %d\n",
328 dev, input_devs->count, keycode);
332 if (keycode && keycode <= KEY_MAX)
333 input_set_capability(input_devs->dev[dev],
337 for (i = 0; i < mi->noutputs; i++) {
338 if (gpio_cansleep(mi->output_gpios[i])) {
339 pr_err("gpiomatrix: unsupported output gpio %d,"
340 " can sleep\n", mi->output_gpios[i]);
342 goto err_request_output_gpio_failed;
344 err = gpio_request(mi->output_gpios[i], "gpio_kp_out");
346 pr_err("gpiomatrix: gpio_request failed for "
347 "output %d\n", mi->output_gpios[i]);
348 goto err_request_output_gpio_failed;
350 if (mi->flags & GPIOKPF_DRIVE_INACTIVE)
351 err = gpio_direction_output(mi->output_gpios[i],
352 !(mi->flags & GPIOKPF_ACTIVE_HIGH));
354 err = gpio_direction_input(mi->output_gpios[i]);
356 pr_err("gpiomatrix: gpio_configure failed for "
357 "output %d\n", mi->output_gpios[i]);
358 goto err_output_gpio_configure_failed;
361 for (i = 0; i < mi->ninputs; i++) {
362 err = gpio_request(mi->input_gpios[i], "gpio_kp_in");
364 pr_err("gpiomatrix: gpio_request failed for "
365 "input %d\n", mi->input_gpios[i]);
366 goto err_request_input_gpio_failed;
368 err = gpio_direction_input(mi->input_gpios[i]);
370 pr_err("gpiomatrix: gpio_direction_input failed"
371 " for input %d\n", mi->input_gpios[i]);
372 goto err_gpio_direction_input_failed;
375 kp->current_output = mi->noutputs;
376 kp->key_state_changed = 1;
378 hrtimer_init(&kp->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
379 kp->timer.function = gpio_keypad_timer_func;
380 wake_lock_init(&kp->wake_lock, WAKE_LOCK_SUSPEND, "gpio_kp");
381 err = gpio_keypad_request_irqs(kp);
382 kp->use_irq = err == 0;
384 pr_info("GPIO Matrix Keypad Driver: Start keypad matrix for "
385 "%s%s in %s mode\n", input_devs->dev[0]->name,
386 (input_devs->count > 1) ? "..." : "",
387 kp->use_irq ? "interrupt" : "polling");
390 wake_lock(&kp->wake_lock);
391 hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
400 for (i = mi->noutputs - 1; i >= 0; i--)
401 free_irq(gpio_to_irq(mi->input_gpios[i]), kp);
403 hrtimer_cancel(&kp->timer);
404 wake_lock_destroy(&kp->wake_lock);
405 for (i = mi->noutputs - 1; i >= 0; i--) {
406 err_gpio_direction_input_failed:
407 gpio_free(mi->input_gpios[i]);
408 err_request_input_gpio_failed:
411 for (i = mi->noutputs - 1; i >= 0; i--) {
412 err_output_gpio_configure_failed:
413 gpio_free(mi->output_gpios[i]);
414 err_request_output_gpio_failed:
420 err_invalid_platform_data: