gpio_input.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /* drivers/input/misc/gpio_input.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/input.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/slab.h>
  22. #include <linux/pm_wakeup.h>
  23. enum {
  24. DEBOUNCE_UNSTABLE = BIT(0), /* Got irq, while debouncing */
  25. DEBOUNCE_PRESSED = BIT(1),
  26. DEBOUNCE_NOTPRESSED = BIT(2),
  27. DEBOUNCE_WAIT_IRQ = BIT(3), /* Stable irq state */
  28. DEBOUNCE_POLL = BIT(4), /* Stable polling state */
  29. DEBOUNCE_UNKNOWN =
  30. DEBOUNCE_PRESSED | DEBOUNCE_NOTPRESSED,
  31. };
  32. struct gpio_key_state {
  33. struct gpio_input_state *ds;
  34. uint8_t debounce;
  35. };
  36. struct gpio_input_state {
  37. struct gpio_event_input_devs *input_devs;
  38. const struct gpio_event_input_info *info;
  39. struct hrtimer timer;
  40. int use_irq;
  41. int debounce_count;
  42. spinlock_t irq_lock;
  43. struct wakeup_source *ws;
  44. struct gpio_key_state key_state[0];
  45. };
  46. static enum hrtimer_restart gpio_event_input_timer_func(struct hrtimer *timer)
  47. {
  48. int i;
  49. int pressed;
  50. struct gpio_input_state *ds =
  51. container_of(timer, struct gpio_input_state, timer);
  52. unsigned gpio_flags = ds->info->flags;
  53. unsigned npolarity;
  54. int nkeys = ds->info->keymap_size;
  55. const struct gpio_event_direct_entry *key_entry;
  56. struct gpio_key_state *key_state;
  57. unsigned long irqflags;
  58. uint8_t debounce;
  59. bool sync_needed;
  60. #if 0
  61. key_entry = kp->keys_info->keymap;
  62. key_state = kp->key_state;
  63. for (i = 0; i < nkeys; i++, key_entry++, key_state++)
  64. pr_info("gpio_read_detect_status %d %d\n", key_entry->gpio,
  65. gpio_read_detect_status(key_entry->gpio));
  66. #endif
  67. key_entry = ds->info->keymap;
  68. key_state = ds->key_state;
  69. sync_needed = false;
  70. spin_lock_irqsave(&ds->irq_lock, irqflags);
  71. for (i = 0; i < nkeys; i++, key_entry++, key_state++) {
  72. debounce = key_state->debounce;
  73. if (debounce & DEBOUNCE_WAIT_IRQ)
  74. continue;
  75. if (key_state->debounce & DEBOUNCE_UNSTABLE) {
  76. debounce = key_state->debounce = DEBOUNCE_UNKNOWN;
  77. enable_irq(gpio_to_irq(key_entry->gpio));
  78. if (gpio_flags & GPIOEDF_PRINT_KEY_UNSTABLE)
  79. pr_info("gpio_keys_scan_keys: key %x-%x, %d "
  80. "(%d) continue debounce\n",
  81. ds->info->type, key_entry->code,
  82. i, key_entry->gpio);
  83. }
  84. npolarity = !(gpio_flags & GPIOEDF_ACTIVE_HIGH);
  85. pressed = gpio_get_value(key_entry->gpio) ^ npolarity;
  86. if (debounce & DEBOUNCE_POLL) {
  87. if (pressed == !(debounce & DEBOUNCE_PRESSED)) {
  88. ds->debounce_count++;
  89. key_state->debounce = DEBOUNCE_UNKNOWN;
  90. if (gpio_flags & GPIOEDF_PRINT_KEY_DEBOUNCE)
  91. pr_info("gpio_keys_scan_keys: key %x-"
  92. "%x, %d (%d) start debounce\n",
  93. ds->info->type, key_entry->code,
  94. i, key_entry->gpio);
  95. }
  96. continue;
  97. }
  98. if (pressed && (debounce & DEBOUNCE_NOTPRESSED)) {
  99. if (gpio_flags & GPIOEDF_PRINT_KEY_DEBOUNCE)
  100. pr_info("gpio_keys_scan_keys: key %x-%x, %d "
  101. "(%d) debounce pressed 1\n",
  102. ds->info->type, key_entry->code,
  103. i, key_entry->gpio);
  104. key_state->debounce = DEBOUNCE_PRESSED;
  105. continue;
  106. }
  107. if (!pressed && (debounce & DEBOUNCE_PRESSED)) {
  108. if (gpio_flags & GPIOEDF_PRINT_KEY_DEBOUNCE)
  109. pr_info("gpio_keys_scan_keys: key %x-%x, %d "
  110. "(%d) debounce pressed 0\n",
  111. ds->info->type, key_entry->code,
  112. i, key_entry->gpio);
  113. key_state->debounce = DEBOUNCE_NOTPRESSED;
  114. continue;
  115. }
  116. /* key is stable */
  117. ds->debounce_count--;
  118. if (ds->use_irq)
  119. key_state->debounce |= DEBOUNCE_WAIT_IRQ;
  120. else
  121. key_state->debounce |= DEBOUNCE_POLL;
  122. if (gpio_flags & GPIOEDF_PRINT_KEYS)
  123. pr_info("gpio_keys_scan_keys: key %x-%x, %d (%d) "
  124. "changed to %d\n", ds->info->type,
  125. key_entry->code, i, key_entry->gpio, pressed);
  126. input_event(ds->input_devs->dev[key_entry->dev], ds->info->type,
  127. key_entry->code, pressed);
  128. sync_needed = true;
  129. }
  130. if (sync_needed) {
  131. for (i = 0; i < ds->input_devs->count; i++)
  132. input_sync(ds->input_devs->dev[i]);
  133. }
  134. #if 0
  135. key_entry = kp->keys_info->keymap;
  136. key_state = kp->key_state;
  137. for (i = 0; i < nkeys; i++, key_entry++, key_state++) {
  138. pr_info("gpio_read_detect_status %d %d\n", key_entry->gpio,
  139. gpio_read_detect_status(key_entry->gpio));
  140. }
  141. #endif
  142. if (ds->debounce_count)
  143. hrtimer_start(timer, ds->info->debounce_time, HRTIMER_MODE_REL);
  144. else if (!ds->use_irq)
  145. hrtimer_start(timer, ds->info->poll_time, HRTIMER_MODE_REL);
  146. else
  147. __pm_relax(ds->ws);
  148. spin_unlock_irqrestore(&ds->irq_lock, irqflags);
  149. return HRTIMER_NORESTART;
  150. }
  151. static irqreturn_t gpio_event_input_irq_handler(int irq, void *dev_id)
  152. {
  153. struct gpio_key_state *ks = dev_id;
  154. struct gpio_input_state *ds = ks->ds;
  155. int keymap_index = ks - ds->key_state;
  156. const struct gpio_event_direct_entry *key_entry;
  157. unsigned long irqflags;
  158. int pressed;
  159. if (!ds->use_irq)
  160. return IRQ_HANDLED;
  161. key_entry = &ds->info->keymap[keymap_index];
  162. if (ds->info->debounce_time.tv64) {
  163. spin_lock_irqsave(&ds->irq_lock, irqflags);
  164. if (ks->debounce & DEBOUNCE_WAIT_IRQ) {
  165. ks->debounce = DEBOUNCE_UNKNOWN;
  166. if (ds->debounce_count++ == 0) {
  167. __pm_stay_awake(ds->ws);
  168. hrtimer_start(
  169. &ds->timer, ds->info->debounce_time,
  170. HRTIMER_MODE_REL);
  171. }
  172. if (ds->info->flags & GPIOEDF_PRINT_KEY_DEBOUNCE)
  173. pr_info("gpio_event_input_irq_handler: "
  174. "key %x-%x, %d (%d) start debounce\n",
  175. ds->info->type, key_entry->code,
  176. keymap_index, key_entry->gpio);
  177. } else {
  178. disable_irq_nosync(irq);
  179. ks->debounce = DEBOUNCE_UNSTABLE;
  180. }
  181. spin_unlock_irqrestore(&ds->irq_lock, irqflags);
  182. } else {
  183. pressed = gpio_get_value(key_entry->gpio) ^
  184. !(ds->info->flags & GPIOEDF_ACTIVE_HIGH);
  185. if (ds->info->flags & GPIOEDF_PRINT_KEYS)
  186. pr_info("gpio_event_input_irq_handler: key %x-%x, %d "
  187. "(%d) changed to %d\n",
  188. ds->info->type, key_entry->code, keymap_index,
  189. key_entry->gpio, pressed);
  190. input_event(ds->input_devs->dev[key_entry->dev], ds->info->type,
  191. key_entry->code, pressed);
  192. input_sync(ds->input_devs->dev[key_entry->dev]);
  193. }
  194. return IRQ_HANDLED;
  195. }
  196. static int gpio_event_input_request_irqs(struct gpio_input_state *ds)
  197. {
  198. int i;
  199. int err;
  200. unsigned int irq;
  201. unsigned long req_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
  202. for (i = 0; i < ds->info->keymap_size; i++) {
  203. err = irq = gpio_to_irq(ds->info->keymap[i].gpio);
  204. if (err < 0)
  205. goto err_gpio_get_irq_num_failed;
  206. err = request_irq(irq, gpio_event_input_irq_handler,
  207. req_flags, "gpio_keys", &ds->key_state[i]);
  208. if (err) {
  209. pr_err("gpio_event_input_request_irqs: request_irq "
  210. "failed for input %d, irq %d\n",
  211. ds->info->keymap[i].gpio, irq);
  212. goto err_request_irq_failed;
  213. }
  214. if (ds->info->info.no_suspend) {
  215. err = enable_irq_wake(irq);
  216. if (err) {
  217. pr_err("gpio_event_input_request_irqs: "
  218. "enable_irq_wake failed for input %d, "
  219. "irq %d\n",
  220. ds->info->keymap[i].gpio, irq);
  221. goto err_enable_irq_wake_failed;
  222. }
  223. }
  224. }
  225. return 0;
  226. for (i = ds->info->keymap_size - 1; i >= 0; i--) {
  227. irq = gpio_to_irq(ds->info->keymap[i].gpio);
  228. if (ds->info->info.no_suspend)
  229. disable_irq_wake(irq);
  230. err_enable_irq_wake_failed:
  231. free_irq(irq, &ds->key_state[i]);
  232. err_request_irq_failed:
  233. err_gpio_get_irq_num_failed:
  234. ;
  235. }
  236. return err;
  237. }
  238. int gpio_event_input_func(struct gpio_event_input_devs *input_devs,
  239. struct gpio_event_info *info, void **data, int func)
  240. {
  241. int ret;
  242. int i;
  243. unsigned long irqflags;
  244. struct gpio_event_input_info *di;
  245. struct gpio_input_state *ds = *data;
  246. char *wlname;
  247. di = container_of(info, struct gpio_event_input_info, info);
  248. if (func == GPIO_EVENT_FUNC_SUSPEND) {
  249. if (ds->use_irq)
  250. for (i = 0; i < di->keymap_size; i++)
  251. disable_irq(gpio_to_irq(di->keymap[i].gpio));
  252. hrtimer_cancel(&ds->timer);
  253. return 0;
  254. }
  255. if (func == GPIO_EVENT_FUNC_RESUME) {
  256. spin_lock_irqsave(&ds->irq_lock, irqflags);
  257. if (ds->use_irq)
  258. for (i = 0; i < di->keymap_size; i++)
  259. enable_irq(gpio_to_irq(di->keymap[i].gpio));
  260. hrtimer_start(&ds->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
  261. spin_unlock_irqrestore(&ds->irq_lock, irqflags);
  262. return 0;
  263. }
  264. if (func == GPIO_EVENT_FUNC_INIT) {
  265. if (ktime_to_ns(di->poll_time) <= 0)
  266. di->poll_time = ktime_set(0, 20 * NSEC_PER_MSEC);
  267. *data = ds = kzalloc(sizeof(*ds) + sizeof(ds->key_state[0]) *
  268. di->keymap_size, GFP_KERNEL);
  269. if (ds == NULL) {
  270. ret = -ENOMEM;
  271. pr_err("gpio_event_input_func: "
  272. "Failed to allocate private data\n");
  273. goto err_ds_alloc_failed;
  274. }
  275. ds->debounce_count = di->keymap_size;
  276. ds->input_devs = input_devs;
  277. ds->info = di;
  278. wlname = kasprintf(GFP_KERNEL, "gpio_input:%s%s",
  279. input_devs->dev[0]->name,
  280. (input_devs->count > 1) ? "..." : "");
  281. ds->ws = wakeup_source_register(wlname);
  282. kfree(wlname);
  283. if (!ds->ws) {
  284. ret = -ENOMEM;
  285. pr_err("gpio_event_input_func: "
  286. "Failed to allocate wakeup source\n");
  287. goto err_ws_failed;
  288. }
  289. spin_lock_init(&ds->irq_lock);
  290. for (i = 0; i < di->keymap_size; i++) {
  291. int dev = di->keymap[i].dev;
  292. if (dev >= input_devs->count) {
  293. pr_err("gpio_event_input_func: bad device "
  294. "index %d >= %d for key code %d\n",
  295. dev, input_devs->count,
  296. di->keymap[i].code);
  297. ret = -EINVAL;
  298. goto err_bad_keymap;
  299. }
  300. input_set_capability(input_devs->dev[dev], di->type,
  301. di->keymap[i].code);
  302. ds->key_state[i].ds = ds;
  303. ds->key_state[i].debounce = DEBOUNCE_UNKNOWN;
  304. }
  305. for (i = 0; i < di->keymap_size; i++) {
  306. ret = gpio_request(di->keymap[i].gpio, "gpio_kp_in");
  307. if (ret) {
  308. pr_err("gpio_event_input_func: gpio_request "
  309. "failed for %d\n", di->keymap[i].gpio);
  310. goto err_gpio_request_failed;
  311. }
  312. ret = gpio_direction_input(di->keymap[i].gpio);
  313. if (ret) {
  314. pr_err("gpio_event_input_func: "
  315. "gpio_direction_input failed for %d\n",
  316. di->keymap[i].gpio);
  317. goto err_gpio_configure_failed;
  318. }
  319. }
  320. ret = gpio_event_input_request_irqs(ds);
  321. spin_lock_irqsave(&ds->irq_lock, irqflags);
  322. ds->use_irq = ret == 0;
  323. pr_info("GPIO Input Driver: Start gpio inputs for %s%s in %s "
  324. "mode\n", input_devs->dev[0]->name,
  325. (input_devs->count > 1) ? "..." : "",
  326. ret == 0 ? "interrupt" : "polling");
  327. hrtimer_init(&ds->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  328. ds->timer.function = gpio_event_input_timer_func;
  329. hrtimer_start(&ds->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
  330. spin_unlock_irqrestore(&ds->irq_lock, irqflags);
  331. return 0;
  332. }
  333. ret = 0;
  334. spin_lock_irqsave(&ds->irq_lock, irqflags);
  335. hrtimer_cancel(&ds->timer);
  336. if (ds->use_irq) {
  337. for (i = di->keymap_size - 1; i >= 0; i--) {
  338. int irq = gpio_to_irq(di->keymap[i].gpio);
  339. if (ds->info->info.no_suspend)
  340. disable_irq_wake(irq);
  341. free_irq(irq, &ds->key_state[i]);
  342. }
  343. }
  344. spin_unlock_irqrestore(&ds->irq_lock, irqflags);
  345. for (i = di->keymap_size - 1; i >= 0; i--) {
  346. err_gpio_configure_failed:
  347. gpio_free(di->keymap[i].gpio);
  348. err_gpio_request_failed:
  349. ;
  350. }
  351. err_bad_keymap:
  352. wakeup_source_unregister(ds->ws);
  353. err_ws_failed:
  354. kfree(ds);
  355. err_ds_alloc_failed:
  356. return ret;
  357. }