gpio_matrix.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /* drivers/input/misc/gpio_matrix.c
  2. *
  3. * Copyright (C) 2007 Google, Inc.
  4. *
  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.
  8. *
  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.
  13. *
  14. */
  15. #include <linux/kernel.h>
  16. #include <linux/gpio.h>
  17. #include <linux/gpio_event.h>
  18. #include <linux/hrtimer.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/slab.h>
  21. #include <linux/wakelock.h>
  22. struct gpio_kp {
  23. struct gpio_event_input_devs *input_devs;
  24. struct gpio_event_matrix_info *keypad_info;
  25. struct hrtimer timer;
  26. struct wake_lock wake_lock;
  27. int current_output;
  28. unsigned int use_irq:1;
  29. unsigned int key_state_changed:1;
  30. unsigned int last_key_state_changed:1;
  31. unsigned int some_keys_pressed:2;
  32. unsigned int disabled_irq:1;
  33. unsigned long keys_pressed[0];
  34. };
  35. static void clear_phantom_key(struct gpio_kp *kp, int out, int in)
  36. {
  37. struct gpio_event_matrix_info *mi = kp->keypad_info;
  38. int key_index = out * mi->ninputs + in;
  39. unsigned short keyentry = mi->keymap[key_index];
  40. unsigned short keycode = keyentry & MATRIX_KEY_MASK;
  41. unsigned short dev = keyentry >> MATRIX_CODE_BITS;
  42. if (!test_bit(keycode, kp->input_devs->dev[dev]->key)) {
  43. if (mi->flags & GPIOKPF_PRINT_PHANTOM_KEYS)
  44. pr_info("gpiomatrix: phantom key %x, %d-%d (%d-%d) "
  45. "cleared\n", keycode, out, in,
  46. mi->output_gpios[out], mi->input_gpios[in]);
  47. __clear_bit(key_index, kp->keys_pressed);
  48. } else {
  49. if (mi->flags & GPIOKPF_PRINT_PHANTOM_KEYS)
  50. pr_info("gpiomatrix: phantom key %x, %d-%d (%d-%d) "
  51. "not cleared\n", keycode, out, in,
  52. mi->output_gpios[out], mi->input_gpios[in]);
  53. }
  54. }
  55. static int restore_keys_for_input(struct gpio_kp *kp, int out, int in)
  56. {
  57. int rv = 0;
  58. int key_index;
  59. key_index = out * kp->keypad_info->ninputs + in;
  60. while (out < kp->keypad_info->noutputs) {
  61. if (test_bit(key_index, kp->keys_pressed)) {
  62. rv = 1;
  63. clear_phantom_key(kp, out, in);
  64. }
  65. key_index += kp->keypad_info->ninputs;
  66. out++;
  67. }
  68. return rv;
  69. }
  70. static void remove_phantom_keys(struct gpio_kp *kp)
  71. {
  72. int out, in, inp;
  73. int key_index;
  74. if (kp->some_keys_pressed < 3)
  75. return;
  76. for (out = 0; out < kp->keypad_info->noutputs; out++) {
  77. inp = -1;
  78. key_index = out * kp->keypad_info->ninputs;
  79. for (in = 0; in < kp->keypad_info->ninputs; in++, key_index++) {
  80. if (test_bit(key_index, kp->keys_pressed)) {
  81. if (inp == -1) {
  82. inp = in;
  83. continue;
  84. }
  85. if (inp >= 0) {
  86. if (!restore_keys_for_input(kp, out + 1,
  87. inp))
  88. break;
  89. clear_phantom_key(kp, out, inp);
  90. inp = -2;
  91. }
  92. restore_keys_for_input(kp, out, in);
  93. }
  94. }
  95. }
  96. }
  97. static void report_key(struct gpio_kp *kp, int key_index, int out, int in)
  98. {
  99. struct gpio_event_matrix_info *mi = kp->keypad_info;
  100. int pressed = test_bit(key_index, kp->keys_pressed);
  101. unsigned short keyentry = mi->keymap[key_index];
  102. unsigned short keycode = keyentry & MATRIX_KEY_MASK;
  103. unsigned short dev = keyentry >> MATRIX_CODE_BITS;
  104. if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) {
  105. if (keycode == KEY_RESERVED) {
  106. if (mi->flags & GPIOKPF_PRINT_UNMAPPED_KEYS)
  107. pr_info("gpiomatrix: unmapped key, %d-%d "
  108. "(%d-%d) changed to %d\n",
  109. out, in, mi->output_gpios[out],
  110. mi->input_gpios[in], pressed);
  111. } else {
  112. if (mi->flags & GPIOKPF_PRINT_MAPPED_KEYS)
  113. pr_info("gpiomatrix: key %x, %d-%d (%d-%d) "
  114. "changed to %d\n", keycode,
  115. out, in, mi->output_gpios[out],
  116. mi->input_gpios[in], pressed);
  117. input_report_key(kp->input_devs->dev[dev], keycode, pressed);
  118. }
  119. }
  120. }
  121. static void report_sync(struct gpio_kp *kp)
  122. {
  123. int i;
  124. for (i = 0; i < kp->input_devs->count; i++)
  125. input_sync(kp->input_devs->dev[i]);
  126. }
  127. static enum hrtimer_restart gpio_keypad_timer_func(struct hrtimer *timer)
  128. {
  129. int out, in;
  130. int key_index;
  131. int gpio;
  132. struct gpio_kp *kp = container_of(timer, struct gpio_kp, timer);
  133. struct gpio_event_matrix_info *mi = kp->keypad_info;
  134. unsigned gpio_keypad_flags = mi->flags;
  135. unsigned polarity = !!(gpio_keypad_flags & GPIOKPF_ACTIVE_HIGH);
  136. out = kp->current_output;
  137. if (out == mi->noutputs) {
  138. out = 0;
  139. kp->last_key_state_changed = kp->key_state_changed;
  140. kp->key_state_changed = 0;
  141. kp->some_keys_pressed = 0;
  142. } else {
  143. key_index = out * mi->ninputs;
  144. for (in = 0; in < mi->ninputs; in++, key_index++) {
  145. gpio = mi->input_gpios[in];
  146. if (gpio_get_value(gpio) ^ !polarity) {
  147. if (kp->some_keys_pressed < 3)
  148. kp->some_keys_pressed++;
  149. kp->key_state_changed |= !__test_and_set_bit(
  150. key_index, kp->keys_pressed);
  151. } else
  152. kp->key_state_changed |= __test_and_clear_bit(
  153. key_index, kp->keys_pressed);
  154. }
  155. gpio = mi->output_gpios[out];
  156. if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
  157. gpio_set_value(gpio, !polarity);
  158. else
  159. gpio_direction_input(gpio);
  160. out++;
  161. }
  162. kp->current_output = out;
  163. if (out < mi->noutputs) {
  164. gpio = mi->output_gpios[out];
  165. if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
  166. gpio_set_value(gpio, polarity);
  167. else
  168. gpio_direction_output(gpio, polarity);
  169. hrtimer_start(timer, mi->settle_time, HRTIMER_MODE_REL);
  170. return HRTIMER_NORESTART;
  171. }
  172. if (gpio_keypad_flags & GPIOKPF_DEBOUNCE) {
  173. if (kp->key_state_changed) {
  174. hrtimer_start(&kp->timer, mi->debounce_delay,
  175. HRTIMER_MODE_REL);
  176. return HRTIMER_NORESTART;
  177. }
  178. kp->key_state_changed = kp->last_key_state_changed;
  179. }
  180. if (kp->key_state_changed) {
  181. if (gpio_keypad_flags & GPIOKPF_REMOVE_SOME_PHANTOM_KEYS)
  182. remove_phantom_keys(kp);
  183. key_index = 0;
  184. for (out = 0; out < mi->noutputs; out++)
  185. for (in = 0; in < mi->ninputs; in++, key_index++)
  186. report_key(kp, key_index, out, in);
  187. report_sync(kp);
  188. }
  189. if (!kp->use_irq || kp->some_keys_pressed) {
  190. hrtimer_start(timer, mi->poll_time, HRTIMER_MODE_REL);
  191. return HRTIMER_NORESTART;
  192. }
  193. /* No keys are pressed, reenable interrupt */
  194. for (out = 0; out < mi->noutputs; out++) {
  195. if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
  196. gpio_set_value(mi->output_gpios[out], polarity);
  197. else
  198. gpio_direction_output(mi->output_gpios[out], polarity);
  199. }
  200. for (in = 0; in < mi->ninputs; in++)
  201. enable_irq(gpio_to_irq(mi->input_gpios[in]));
  202. wake_unlock(&kp->wake_lock);
  203. return HRTIMER_NORESTART;
  204. }
  205. static irqreturn_t gpio_keypad_irq_handler(int irq_in, void *dev_id)
  206. {
  207. int i;
  208. struct gpio_kp *kp = dev_id;
  209. struct gpio_event_matrix_info *mi = kp->keypad_info;
  210. unsigned gpio_keypad_flags = mi->flags;
  211. if (!kp->use_irq) {
  212. /* ignore interrupt while registering the handler */
  213. kp->disabled_irq = 1;
  214. disable_irq_nosync(irq_in);
  215. return IRQ_HANDLED;
  216. }
  217. for (i = 0; i < mi->ninputs; i++)
  218. disable_irq_nosync(gpio_to_irq(mi->input_gpios[i]));
  219. for (i = 0; i < mi->noutputs; i++) {
  220. if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE)
  221. gpio_set_value(mi->output_gpios[i],
  222. !(gpio_keypad_flags & GPIOKPF_ACTIVE_HIGH));
  223. else
  224. gpio_direction_input(mi->output_gpios[i]);
  225. }
  226. wake_lock(&kp->wake_lock);
  227. hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
  228. return IRQ_HANDLED;
  229. }
  230. static int gpio_keypad_request_irqs(struct gpio_kp *kp)
  231. {
  232. int i;
  233. int err;
  234. unsigned int irq;
  235. unsigned long request_flags;
  236. struct gpio_event_matrix_info *mi = kp->keypad_info;
  237. switch (mi->flags & (GPIOKPF_ACTIVE_HIGH|GPIOKPF_LEVEL_TRIGGERED_IRQ)) {
  238. default:
  239. request_flags = IRQF_TRIGGER_FALLING;
  240. break;
  241. case GPIOKPF_ACTIVE_HIGH:
  242. request_flags = IRQF_TRIGGER_RISING;
  243. break;
  244. case GPIOKPF_LEVEL_TRIGGERED_IRQ:
  245. request_flags = IRQF_TRIGGER_LOW;
  246. break;
  247. case GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_ACTIVE_HIGH:
  248. request_flags = IRQF_TRIGGER_HIGH;
  249. break;
  250. }
  251. for (i = 0; i < mi->ninputs; i++) {
  252. err = irq = gpio_to_irq(mi->input_gpios[i]);
  253. if (err < 0)
  254. goto err_gpio_get_irq_num_failed;
  255. err = request_irq(irq, gpio_keypad_irq_handler, request_flags,
  256. "gpio_kp", kp);
  257. if (err) {
  258. pr_err("gpiomatrix: request_irq failed for input %d, "
  259. "irq %d\n", mi->input_gpios[i], irq);
  260. goto err_request_irq_failed;
  261. }
  262. err = enable_irq_wake(irq);
  263. if (err) {
  264. pr_err("gpiomatrix: set_irq_wake failed for input %d, "
  265. "irq %d\n", mi->input_gpios[i], irq);
  266. }
  267. disable_irq(irq);
  268. if (kp->disabled_irq) {
  269. kp->disabled_irq = 0;
  270. enable_irq(irq);
  271. }
  272. }
  273. return 0;
  274. for (i = mi->noutputs - 1; i >= 0; i--) {
  275. free_irq(gpio_to_irq(mi->input_gpios[i]), kp);
  276. err_request_irq_failed:
  277. err_gpio_get_irq_num_failed:
  278. ;
  279. }
  280. return err;
  281. }
  282. int gpio_event_matrix_func(struct gpio_event_input_devs *input_devs,
  283. struct gpio_event_info *info, void **data, int func)
  284. {
  285. int i;
  286. int err;
  287. int key_count;
  288. struct gpio_kp *kp;
  289. struct gpio_event_matrix_info *mi;
  290. mi = container_of(info, struct gpio_event_matrix_info, info);
  291. if (func == GPIO_EVENT_FUNC_SUSPEND || func == GPIO_EVENT_FUNC_RESUME) {
  292. /* TODO: disable scanning */
  293. return 0;
  294. }
  295. if (func == GPIO_EVENT_FUNC_INIT) {
  296. if (mi->keymap == NULL ||
  297. mi->input_gpios == NULL ||
  298. mi->output_gpios == NULL) {
  299. err = -ENODEV;
  300. pr_err("gpiomatrix: Incomplete pdata\n");
  301. goto err_invalid_platform_data;
  302. }
  303. key_count = mi->ninputs * mi->noutputs;
  304. *data = kp = kzalloc(sizeof(*kp) + sizeof(kp->keys_pressed[0]) *
  305. BITS_TO_LONGS(key_count), GFP_KERNEL);
  306. if (kp == NULL) {
  307. err = -ENOMEM;
  308. pr_err("gpiomatrix: Failed to allocate private data\n");
  309. goto err_kp_alloc_failed;
  310. }
  311. kp->input_devs = input_devs;
  312. kp->keypad_info = mi;
  313. for (i = 0; i < key_count; i++) {
  314. unsigned short keyentry = mi->keymap[i];
  315. unsigned short keycode = keyentry & MATRIX_KEY_MASK;
  316. unsigned short dev = keyentry >> MATRIX_CODE_BITS;
  317. if (dev >= input_devs->count) {
  318. pr_err("gpiomatrix: bad device index %d >= "
  319. "%d for key code %d\n",
  320. dev, input_devs->count, keycode);
  321. err = -EINVAL;
  322. goto err_bad_keymap;
  323. }
  324. if (keycode && keycode <= KEY_MAX)
  325. input_set_capability(input_devs->dev[dev],
  326. EV_KEY, keycode);
  327. }
  328. for (i = 0; i < mi->noutputs; i++) {
  329. err = gpio_request(mi->output_gpios[i], "gpio_kp_out");
  330. if (err) {
  331. pr_err("gpiomatrix: gpio_request failed for "
  332. "output %d\n", mi->output_gpios[i]);
  333. goto err_request_output_gpio_failed;
  334. }
  335. if (gpio_cansleep(mi->output_gpios[i])) {
  336. pr_err("gpiomatrix: unsupported output gpio %d,"
  337. " can sleep\n", mi->output_gpios[i]);
  338. err = -EINVAL;
  339. goto err_output_gpio_configure_failed;
  340. }
  341. if (mi->flags & GPIOKPF_DRIVE_INACTIVE)
  342. err = gpio_direction_output(mi->output_gpios[i],
  343. !(mi->flags & GPIOKPF_ACTIVE_HIGH));
  344. else
  345. err = gpio_direction_input(mi->output_gpios[i]);
  346. if (err) {
  347. pr_err("gpiomatrix: gpio_configure failed for "
  348. "output %d\n", mi->output_gpios[i]);
  349. goto err_output_gpio_configure_failed;
  350. }
  351. }
  352. for (i = 0; i < mi->ninputs; i++) {
  353. err = gpio_request(mi->input_gpios[i], "gpio_kp_in");
  354. if (err) {
  355. pr_err("gpiomatrix: gpio_request failed for "
  356. "input %d\n", mi->input_gpios[i]);
  357. goto err_request_input_gpio_failed;
  358. }
  359. err = gpio_direction_input(mi->input_gpios[i]);
  360. if (err) {
  361. pr_err("gpiomatrix: gpio_direction_input failed"
  362. " for input %d\n", mi->input_gpios[i]);
  363. goto err_gpio_direction_input_failed;
  364. }
  365. }
  366. kp->current_output = mi->noutputs;
  367. kp->key_state_changed = 1;
  368. hrtimer_init(&kp->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  369. kp->timer.function = gpio_keypad_timer_func;
  370. wake_lock_init(&kp->wake_lock, WAKE_LOCK_SUSPEND, "gpio_kp");
  371. err = gpio_keypad_request_irqs(kp);
  372. kp->use_irq = err == 0;
  373. pr_info("GPIO Matrix Keypad Driver: Start keypad matrix for "
  374. "%s%s in %s mode\n", input_devs->dev[0]->name,
  375. (input_devs->count > 1) ? "..." : "",
  376. kp->use_irq ? "interrupt" : "polling");
  377. if (kp->use_irq)
  378. wake_lock(&kp->wake_lock);
  379. hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
  380. return 0;
  381. }
  382. err = 0;
  383. kp = *data;
  384. if (kp->use_irq)
  385. for (i = mi->noutputs - 1; i >= 0; i--)
  386. free_irq(gpio_to_irq(mi->input_gpios[i]), kp);
  387. hrtimer_cancel(&kp->timer);
  388. wake_lock_destroy(&kp->wake_lock);
  389. for (i = mi->noutputs - 1; i >= 0; i--) {
  390. err_gpio_direction_input_failed:
  391. gpio_free(mi->input_gpios[i]);
  392. err_request_input_gpio_failed:
  393. ;
  394. }
  395. for (i = mi->noutputs - 1; i >= 0; i--) {
  396. err_output_gpio_configure_failed:
  397. gpio_free(mi->output_gpios[i]);
  398. err_request_output_gpio_failed:
  399. ;
  400. }
  401. err_bad_keymap:
  402. kfree(kp);
  403. err_kp_alloc_failed:
  404. err_invalid_platform_data:
  405. return err;
  406. }