lm8333.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /*
  2. * LM8333 keypad driver
  3. * Copyright (C) 2012 Wolfram Sang, Pengutronix <kernel@pengutronix.de>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License.
  8. */
  9. #include <linux/module.h>
  10. #include <linux/slab.h>
  11. #include <linux/irq.h>
  12. #include <linux/i2c.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/input/matrix_keypad.h>
  15. #include <linux/input/lm8333.h>
  16. #define LM8333_FIFO_READ 0x20
  17. #define LM8333_DEBOUNCE 0x22
  18. #define LM8333_READ_INT 0xD0
  19. #define LM8333_ACTIVE 0xE4
  20. #define LM8333_READ_ERROR 0xF0
  21. #define LM8333_KEYPAD_IRQ (1 << 0)
  22. #define LM8333_ERROR_IRQ (1 << 3)
  23. #define LM8333_ERROR_KEYOVR 0x04
  24. #define LM8333_ERROR_FIFOOVR 0x40
  25. #define LM8333_FIFO_TRANSFER_SIZE 16
  26. #define LM8333_NUM_ROWS 8
  27. #define LM8333_NUM_COLS 16
  28. #define LM8333_ROW_SHIFT 4
  29. struct lm8333 {
  30. struct i2c_client *client;
  31. struct input_dev *input;
  32. unsigned short keycodes[LM8333_NUM_ROWS << LM8333_ROW_SHIFT];
  33. };
  34. /* The accessors try twice because the first access may be needed for wakeup */
  35. #define LM8333_READ_RETRIES 2
  36. int lm8333_read8(struct lm8333 *lm8333, u8 cmd)
  37. {
  38. int retries = 0, ret;
  39. do {
  40. ret = i2c_smbus_read_byte_data(lm8333->client, cmd);
  41. } while (ret < 0 && retries++ < LM8333_READ_RETRIES);
  42. return ret;
  43. }
  44. int lm8333_write8(struct lm8333 *lm8333, u8 cmd, u8 val)
  45. {
  46. int retries = 0, ret;
  47. do {
  48. ret = i2c_smbus_write_byte_data(lm8333->client, cmd, val);
  49. } while (ret < 0 && retries++ < LM8333_READ_RETRIES);
  50. return ret;
  51. }
  52. int lm8333_read_block(struct lm8333 *lm8333, u8 cmd, u8 len, u8 *buf)
  53. {
  54. int retries = 0, ret;
  55. do {
  56. ret = i2c_smbus_read_i2c_block_data(lm8333->client,
  57. cmd, len, buf);
  58. } while (ret < 0 && retries++ < LM8333_READ_RETRIES);
  59. return ret;
  60. }
  61. static void lm8333_key_handler(struct lm8333 *lm8333)
  62. {
  63. struct input_dev *input = lm8333->input;
  64. u8 keys[LM8333_FIFO_TRANSFER_SIZE];
  65. u8 code, pressed;
  66. int i, ret;
  67. ret = lm8333_read_block(lm8333, LM8333_FIFO_READ,
  68. LM8333_FIFO_TRANSFER_SIZE, keys);
  69. if (ret != LM8333_FIFO_TRANSFER_SIZE) {
  70. dev_err(&lm8333->client->dev,
  71. "Error %d while reading FIFO\n", ret);
  72. return;
  73. }
  74. for (i = 0; i < LM8333_FIFO_TRANSFER_SIZE && keys[i]; i++) {
  75. pressed = keys[i] & 0x80;
  76. code = keys[i] & 0x7f;
  77. input_event(input, EV_MSC, MSC_SCAN, code);
  78. input_report_key(input, lm8333->keycodes[code], pressed);
  79. }
  80. input_sync(input);
  81. }
  82. static irqreturn_t lm8333_irq_thread(int irq, void *data)
  83. {
  84. struct lm8333 *lm8333 = data;
  85. u8 status = lm8333_read8(lm8333, LM8333_READ_INT);
  86. if (!status)
  87. return IRQ_NONE;
  88. if (status & LM8333_ERROR_IRQ) {
  89. u8 err = lm8333_read8(lm8333, LM8333_READ_ERROR);
  90. if (err & (LM8333_ERROR_KEYOVR | LM8333_ERROR_FIFOOVR)) {
  91. u8 dummy[LM8333_FIFO_TRANSFER_SIZE];
  92. lm8333_read_block(lm8333, LM8333_FIFO_READ,
  93. LM8333_FIFO_TRANSFER_SIZE, dummy);
  94. }
  95. dev_err(&lm8333->client->dev, "Got error %02x\n", err);
  96. }
  97. if (status & LM8333_KEYPAD_IRQ)
  98. lm8333_key_handler(lm8333);
  99. return IRQ_HANDLED;
  100. }
  101. static int lm8333_probe(struct i2c_client *client,
  102. const struct i2c_device_id *id)
  103. {
  104. const struct lm8333_platform_data *pdata =
  105. dev_get_platdata(&client->dev);
  106. struct lm8333 *lm8333;
  107. struct input_dev *input;
  108. int err, active_time;
  109. if (!pdata)
  110. return -EINVAL;
  111. active_time = pdata->active_time ?: 500;
  112. if (active_time / 3 <= pdata->debounce_time / 3) {
  113. dev_err(&client->dev, "Active time not big enough!\n");
  114. return -EINVAL;
  115. }
  116. lm8333 = kzalloc(sizeof(*lm8333), GFP_KERNEL);
  117. input = input_allocate_device();
  118. if (!lm8333 || !input) {
  119. err = -ENOMEM;
  120. goto free_mem;
  121. }
  122. lm8333->client = client;
  123. lm8333->input = input;
  124. input->name = client->name;
  125. input->dev.parent = &client->dev;
  126. input->id.bustype = BUS_I2C;
  127. input_set_capability(input, EV_MSC, MSC_SCAN);
  128. err = matrix_keypad_build_keymap(pdata->matrix_data, NULL,
  129. LM8333_NUM_ROWS, LM8333_NUM_COLS,
  130. lm8333->keycodes, input);
  131. if (err)
  132. goto free_mem;
  133. if (pdata->debounce_time) {
  134. err = lm8333_write8(lm8333, LM8333_DEBOUNCE,
  135. pdata->debounce_time / 3);
  136. if (err)
  137. dev_warn(&client->dev, "Unable to set debounce time\n");
  138. }
  139. if (pdata->active_time) {
  140. err = lm8333_write8(lm8333, LM8333_ACTIVE,
  141. pdata->active_time / 3);
  142. if (err)
  143. dev_warn(&client->dev, "Unable to set active time\n");
  144. }
  145. err = request_threaded_irq(client->irq, NULL, lm8333_irq_thread,
  146. IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
  147. "lm8333", lm8333);
  148. if (err)
  149. goto free_mem;
  150. err = input_register_device(input);
  151. if (err)
  152. goto free_irq;
  153. i2c_set_clientdata(client, lm8333);
  154. return 0;
  155. free_irq:
  156. free_irq(client->irq, lm8333);
  157. free_mem:
  158. input_free_device(input);
  159. kfree(lm8333);
  160. return err;
  161. }
  162. static int lm8333_remove(struct i2c_client *client)
  163. {
  164. struct lm8333 *lm8333 = i2c_get_clientdata(client);
  165. free_irq(client->irq, lm8333);
  166. input_unregister_device(lm8333->input);
  167. kfree(lm8333);
  168. return 0;
  169. }
  170. static const struct i2c_device_id lm8333_id[] = {
  171. { "lm8333", 0 },
  172. { }
  173. };
  174. MODULE_DEVICE_TABLE(i2c, lm8333_id);
  175. static struct i2c_driver lm8333_driver = {
  176. .driver = {
  177. .name = "lm8333",
  178. },
  179. .probe = lm8333_probe,
  180. .remove = lm8333_remove,
  181. .id_table = lm8333_id,
  182. };
  183. module_i2c_driver(lm8333_driver);
  184. MODULE_AUTHOR("Wolfram Sang <kernel@pengutronix.de>");
  185. MODULE_DESCRIPTION("LM8333 keyboard driver");
  186. MODULE_LICENSE("GPL v2");