rotary_encoder.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. /*
  2. * rotary_encoder.c
  3. *
  4. * (c) 2009 Daniel Mack <daniel@caiaq.de>
  5. * Copyright (C) 2011 Johan Hovold <jhovold@gmail.com>
  6. *
  7. * state machine code inspired by code from Tim Ruetz
  8. *
  9. * A generic driver for rotary encoders connected to GPIO lines.
  10. * See file:Documentation/input/rotary-encoder.txt for more information
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License version 2 as
  14. * published by the Free Software Foundation.
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/module.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/input.h>
  20. #include <linux/device.h>
  21. #include <linux/platform_device.h>
  22. #include <linux/gpio.h>
  23. #include <linux/rotary_encoder.h>
  24. #include <linux/slab.h>
  25. #include <linux/of.h>
  26. #include <linux/of_platform.h>
  27. #include <linux/of_gpio.h>
  28. #include <linux/pm.h>
  29. #define DRV_NAME "rotary-encoder"
  30. struct rotary_encoder {
  31. struct input_dev *input;
  32. const struct rotary_encoder_platform_data *pdata;
  33. unsigned int axis;
  34. unsigned int pos;
  35. unsigned int irq_a;
  36. unsigned int irq_b;
  37. bool armed;
  38. unsigned char dir; /* 0 - clockwise, 1 - CCW */
  39. char last_stable;
  40. };
  41. static int rotary_encoder_get_state(const struct rotary_encoder_platform_data *pdata)
  42. {
  43. int a = !!gpio_get_value(pdata->gpio_a);
  44. int b = !!gpio_get_value(pdata->gpio_b);
  45. a ^= pdata->inverted_a;
  46. b ^= pdata->inverted_b;
  47. return ((a << 1) | b);
  48. }
  49. static void rotary_encoder_report_event(struct rotary_encoder *encoder)
  50. {
  51. const struct rotary_encoder_platform_data *pdata = encoder->pdata;
  52. if (pdata->relative_axis) {
  53. input_report_rel(encoder->input,
  54. pdata->axis, encoder->dir ? -1 : 1);
  55. } else {
  56. unsigned int pos = encoder->pos;
  57. if (encoder->dir) {
  58. /* turning counter-clockwise */
  59. if (pdata->rollover)
  60. pos += pdata->steps;
  61. if (pos)
  62. pos--;
  63. } else {
  64. /* turning clockwise */
  65. if (pdata->rollover || pos < pdata->steps)
  66. pos++;
  67. }
  68. if (pdata->rollover)
  69. pos %= pdata->steps;
  70. encoder->pos = pos;
  71. input_report_abs(encoder->input, pdata->axis, encoder->pos);
  72. }
  73. input_sync(encoder->input);
  74. }
  75. static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
  76. {
  77. struct rotary_encoder *encoder = dev_id;
  78. int state;
  79. state = rotary_encoder_get_state(encoder->pdata);
  80. switch (state) {
  81. case 0x0:
  82. if (encoder->armed) {
  83. rotary_encoder_report_event(encoder);
  84. encoder->armed = false;
  85. }
  86. break;
  87. case 0x1:
  88. case 0x2:
  89. if (encoder->armed)
  90. encoder->dir = state - 1;
  91. break;
  92. case 0x3:
  93. encoder->armed = true;
  94. break;
  95. }
  96. return IRQ_HANDLED;
  97. }
  98. static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
  99. {
  100. struct rotary_encoder *encoder = dev_id;
  101. int state;
  102. state = rotary_encoder_get_state(encoder->pdata);
  103. switch (state) {
  104. case 0x00:
  105. case 0x03:
  106. if (state != encoder->last_stable) {
  107. rotary_encoder_report_event(encoder);
  108. encoder->last_stable = state;
  109. }
  110. break;
  111. case 0x01:
  112. case 0x02:
  113. encoder->dir = (encoder->last_stable + state) & 0x01;
  114. break;
  115. }
  116. return IRQ_HANDLED;
  117. }
  118. static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
  119. {
  120. struct rotary_encoder *encoder = dev_id;
  121. unsigned char sum;
  122. int state;
  123. state = rotary_encoder_get_state(encoder->pdata);
  124. /*
  125. * We encode the previous and the current state using a byte.
  126. * The previous state in the MSB nibble, the current state in the LSB
  127. * nibble. Then use a table to decide the direction of the turn.
  128. */
  129. sum = (encoder->last_stable << 4) + state;
  130. switch (sum) {
  131. case 0x31:
  132. case 0x10:
  133. case 0x02:
  134. case 0x23:
  135. encoder->dir = 0; /* clockwise */
  136. break;
  137. case 0x13:
  138. case 0x01:
  139. case 0x20:
  140. case 0x32:
  141. encoder->dir = 1; /* counter-clockwise */
  142. break;
  143. default:
  144. /*
  145. * Ignore all other values. This covers the case when the
  146. * state didn't change (a spurious interrupt) and the
  147. * cases where the state changed by two steps, making it
  148. * impossible to tell the direction.
  149. *
  150. * In either case, don't report any event and save the
  151. * state for later.
  152. */
  153. goto out;
  154. }
  155. rotary_encoder_report_event(encoder);
  156. out:
  157. encoder->last_stable = state;
  158. return IRQ_HANDLED;
  159. }
  160. #ifdef CONFIG_OF
  161. static const struct of_device_id rotary_encoder_of_match[] = {
  162. { .compatible = "rotary-encoder", },
  163. { },
  164. };
  165. MODULE_DEVICE_TABLE(of, rotary_encoder_of_match);
  166. static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev)
  167. {
  168. const struct of_device_id *of_id =
  169. of_match_device(rotary_encoder_of_match, dev);
  170. struct device_node *np = dev->of_node;
  171. struct rotary_encoder_platform_data *pdata;
  172. enum of_gpio_flags flags;
  173. int error;
  174. if (!of_id || !np)
  175. return NULL;
  176. pdata = kzalloc(sizeof(struct rotary_encoder_platform_data),
  177. GFP_KERNEL);
  178. if (!pdata)
  179. return ERR_PTR(-ENOMEM);
  180. of_property_read_u32(np, "rotary-encoder,steps", &pdata->steps);
  181. of_property_read_u32(np, "linux,axis", &pdata->axis);
  182. pdata->gpio_a = of_get_gpio_flags(np, 0, &flags);
  183. pdata->inverted_a = flags & OF_GPIO_ACTIVE_LOW;
  184. pdata->gpio_b = of_get_gpio_flags(np, 1, &flags);
  185. pdata->inverted_b = flags & OF_GPIO_ACTIVE_LOW;
  186. pdata->relative_axis =
  187. of_property_read_bool(np, "rotary-encoder,relative-axis");
  188. pdata->rollover = of_property_read_bool(np, "rotary-encoder,rollover");
  189. error = of_property_read_u32(np, "rotary-encoder,steps-per-period",
  190. &pdata->steps_per_period);
  191. if (error) {
  192. /*
  193. * The 'half-period' property has been deprecated, you must use
  194. * 'steps-per-period' and set an appropriate value, but we still
  195. * need to parse it to maintain compatibility.
  196. */
  197. if (of_property_read_bool(np, "rotary-encoder,half-period")) {
  198. pdata->steps_per_period = 2;
  199. } else {
  200. /* Fallback to one step per period behavior */
  201. pdata->steps_per_period = 1;
  202. }
  203. }
  204. pdata->wakeup_source = of_property_read_bool(np, "wakeup-source");
  205. return pdata;
  206. }
  207. #else
  208. static inline struct rotary_encoder_platform_data *
  209. rotary_encoder_parse_dt(struct device *dev)
  210. {
  211. return NULL;
  212. }
  213. #endif
  214. static int rotary_encoder_probe(struct platform_device *pdev)
  215. {
  216. struct device *dev = &pdev->dev;
  217. const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev);
  218. struct rotary_encoder *encoder;
  219. struct input_dev *input;
  220. irq_handler_t handler;
  221. int err;
  222. if (!pdata) {
  223. pdata = rotary_encoder_parse_dt(dev);
  224. if (IS_ERR(pdata))
  225. return PTR_ERR(pdata);
  226. if (!pdata) {
  227. dev_err(dev, "missing platform data\n");
  228. return -EINVAL;
  229. }
  230. }
  231. encoder = kzalloc(sizeof(struct rotary_encoder), GFP_KERNEL);
  232. input = input_allocate_device();
  233. if (!encoder || !input) {
  234. err = -ENOMEM;
  235. goto exit_free_mem;
  236. }
  237. encoder->input = input;
  238. encoder->pdata = pdata;
  239. input->name = pdev->name;
  240. input->id.bustype = BUS_HOST;
  241. input->dev.parent = dev;
  242. if (pdata->relative_axis) {
  243. input->evbit[0] = BIT_MASK(EV_REL);
  244. input->relbit[0] = BIT_MASK(pdata->axis);
  245. } else {
  246. input->evbit[0] = BIT_MASK(EV_ABS);
  247. input_set_abs_params(encoder->input,
  248. pdata->axis, 0, pdata->steps, 0, 1);
  249. }
  250. /* request the GPIOs */
  251. err = gpio_request_one(pdata->gpio_a, GPIOF_IN, dev_name(dev));
  252. if (err) {
  253. dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_a);
  254. goto exit_free_mem;
  255. }
  256. err = gpio_request_one(pdata->gpio_b, GPIOF_IN, dev_name(dev));
  257. if (err) {
  258. dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_b);
  259. goto exit_free_gpio_a;
  260. }
  261. encoder->irq_a = gpio_to_irq(pdata->gpio_a);
  262. encoder->irq_b = gpio_to_irq(pdata->gpio_b);
  263. switch (pdata->steps_per_period) {
  264. case 4:
  265. handler = &rotary_encoder_quarter_period_irq;
  266. encoder->last_stable = rotary_encoder_get_state(pdata);
  267. break;
  268. case 2:
  269. handler = &rotary_encoder_half_period_irq;
  270. encoder->last_stable = rotary_encoder_get_state(pdata);
  271. break;
  272. case 1:
  273. handler = &rotary_encoder_irq;
  274. break;
  275. default:
  276. dev_err(dev, "'%d' is not a valid steps-per-period value\n",
  277. pdata->steps_per_period);
  278. err = -EINVAL;
  279. goto exit_free_gpio_b;
  280. }
  281. err = request_irq(encoder->irq_a, handler,
  282. IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
  283. DRV_NAME, encoder);
  284. if (err) {
  285. dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a);
  286. goto exit_free_gpio_b;
  287. }
  288. err = request_irq(encoder->irq_b, handler,
  289. IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
  290. DRV_NAME, encoder);
  291. if (err) {
  292. dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b);
  293. goto exit_free_irq_a;
  294. }
  295. err = input_register_device(input);
  296. if (err) {
  297. dev_err(dev, "failed to register input device\n");
  298. goto exit_free_irq_b;
  299. }
  300. device_init_wakeup(&pdev->dev, pdata->wakeup_source);
  301. platform_set_drvdata(pdev, encoder);
  302. return 0;
  303. exit_free_irq_b:
  304. free_irq(encoder->irq_b, encoder);
  305. exit_free_irq_a:
  306. free_irq(encoder->irq_a, encoder);
  307. exit_free_gpio_b:
  308. gpio_free(pdata->gpio_b);
  309. exit_free_gpio_a:
  310. gpio_free(pdata->gpio_a);
  311. exit_free_mem:
  312. input_free_device(input);
  313. kfree(encoder);
  314. if (!dev_get_platdata(&pdev->dev))
  315. kfree(pdata);
  316. return err;
  317. }
  318. static int rotary_encoder_remove(struct platform_device *pdev)
  319. {
  320. struct rotary_encoder *encoder = platform_get_drvdata(pdev);
  321. const struct rotary_encoder_platform_data *pdata = encoder->pdata;
  322. device_init_wakeup(&pdev->dev, false);
  323. free_irq(encoder->irq_a, encoder);
  324. free_irq(encoder->irq_b, encoder);
  325. gpio_free(pdata->gpio_a);
  326. gpio_free(pdata->gpio_b);
  327. input_unregister_device(encoder->input);
  328. kfree(encoder);
  329. if (!dev_get_platdata(&pdev->dev))
  330. kfree(pdata);
  331. return 0;
  332. }
  333. #ifdef CONFIG_PM_SLEEP
  334. static int rotary_encoder_suspend(struct device *dev)
  335. {
  336. struct rotary_encoder *encoder = dev_get_drvdata(dev);
  337. if (device_may_wakeup(dev)) {
  338. enable_irq_wake(encoder->irq_a);
  339. enable_irq_wake(encoder->irq_b);
  340. }
  341. return 0;
  342. }
  343. static int rotary_encoder_resume(struct device *dev)
  344. {
  345. struct rotary_encoder *encoder = dev_get_drvdata(dev);
  346. if (device_may_wakeup(dev)) {
  347. disable_irq_wake(encoder->irq_a);
  348. disable_irq_wake(encoder->irq_b);
  349. }
  350. return 0;
  351. }
  352. #endif
  353. static SIMPLE_DEV_PM_OPS(rotary_encoder_pm_ops,
  354. rotary_encoder_suspend, rotary_encoder_resume);
  355. static struct platform_driver rotary_encoder_driver = {
  356. .probe = rotary_encoder_probe,
  357. .remove = rotary_encoder_remove,
  358. .driver = {
  359. .name = DRV_NAME,
  360. .pm = &rotary_encoder_pm_ops,
  361. .of_match_table = of_match_ptr(rotary_encoder_of_match),
  362. }
  363. };
  364. module_platform_driver(rotary_encoder_driver);
  365. MODULE_ALIAS("platform:" DRV_NAME);
  366. MODULE_DESCRIPTION("GPIO rotary encoder driver");
  367. MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>, Johan Hovold");
  368. MODULE_LICENSE("GPL v2");