mpr121_touchkey.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /*
  2. * Touchkey driver for Freescale MPR121 Controllor
  3. *
  4. * Copyright (C) 2011 Freescale Semiconductor, Inc.
  5. * Author: Zhang Jiejing <jiejing.zhang@freescale.com>
  6. *
  7. * Based on mcs_touchkey.c
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. *
  13. */
  14. #include <linux/module.h>
  15. #include <linux/input.h>
  16. #include <linux/i2c.h>
  17. #include <linux/slab.h>
  18. #include <linux/delay.h>
  19. #include <linux/bitops.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/i2c/mpr121_touchkey.h>
  22. /* Register definitions */
  23. #define ELE_TOUCH_STATUS_0_ADDR 0x0
  24. #define ELE_TOUCH_STATUS_1_ADDR 0X1
  25. #define MHD_RISING_ADDR 0x2b
  26. #define NHD_RISING_ADDR 0x2c
  27. #define NCL_RISING_ADDR 0x2d
  28. #define FDL_RISING_ADDR 0x2e
  29. #define MHD_FALLING_ADDR 0x2f
  30. #define NHD_FALLING_ADDR 0x30
  31. #define NCL_FALLING_ADDR 0x31
  32. #define FDL_FALLING_ADDR 0x32
  33. #define ELE0_TOUCH_THRESHOLD_ADDR 0x41
  34. #define ELE0_RELEASE_THRESHOLD_ADDR 0x42
  35. #define AFE_CONF_ADDR 0x5c
  36. #define FILTER_CONF_ADDR 0x5d
  37. /*
  38. * ELECTRODE_CONF_ADDR: This register configures the number of
  39. * enabled capacitance sensing inputs and its run/suspend mode.
  40. */
  41. #define ELECTRODE_CONF_ADDR 0x5e
  42. #define ELECTRODE_CONF_QUICK_CHARGE 0x80
  43. #define AUTO_CONFIG_CTRL_ADDR 0x7b
  44. #define AUTO_CONFIG_USL_ADDR 0x7d
  45. #define AUTO_CONFIG_LSL_ADDR 0x7e
  46. #define AUTO_CONFIG_TL_ADDR 0x7f
  47. /* Threshold of touch/release trigger */
  48. #define TOUCH_THRESHOLD 0x08
  49. #define RELEASE_THRESHOLD 0x05
  50. /* Masks for touch and release triggers */
  51. #define TOUCH_STATUS_MASK 0xfff
  52. /* MPR121 has 12 keys */
  53. #define MPR121_MAX_KEY_COUNT 12
  54. struct mpr121_touchkey {
  55. struct i2c_client *client;
  56. struct input_dev *input_dev;
  57. unsigned int key_val;
  58. unsigned int statusbits;
  59. unsigned int keycount;
  60. u16 keycodes[MPR121_MAX_KEY_COUNT];
  61. };
  62. struct mpr121_init_register {
  63. int addr;
  64. u8 val;
  65. };
  66. static const struct mpr121_init_register init_reg_table[] = {
  67. { MHD_RISING_ADDR, 0x1 },
  68. { NHD_RISING_ADDR, 0x1 },
  69. { MHD_FALLING_ADDR, 0x1 },
  70. { NHD_FALLING_ADDR, 0x1 },
  71. { NCL_FALLING_ADDR, 0xff },
  72. { FDL_FALLING_ADDR, 0x02 },
  73. { FILTER_CONF_ADDR, 0x04 },
  74. { AFE_CONF_ADDR, 0x0b },
  75. { AUTO_CONFIG_CTRL_ADDR, 0x0b },
  76. };
  77. static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id)
  78. {
  79. struct mpr121_touchkey *mpr121 = dev_id;
  80. struct i2c_client *client = mpr121->client;
  81. struct input_dev *input = mpr121->input_dev;
  82. unsigned long bit_changed;
  83. unsigned int key_num;
  84. int reg;
  85. reg = i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_1_ADDR);
  86. if (reg < 0) {
  87. dev_err(&client->dev, "i2c read error [%d]\n", reg);
  88. goto out;
  89. }
  90. reg <<= 8;
  91. reg |= i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_0_ADDR);
  92. if (reg < 0) {
  93. dev_err(&client->dev, "i2c read error [%d]\n", reg);
  94. goto out;
  95. }
  96. reg &= TOUCH_STATUS_MASK;
  97. /* use old press bit to figure out which bit changed */
  98. bit_changed = reg ^ mpr121->statusbits;
  99. mpr121->statusbits = reg;
  100. for_each_set_bit(key_num, &bit_changed, mpr121->keycount) {
  101. unsigned int key_val, pressed;
  102. pressed = reg & BIT(key_num);
  103. key_val = mpr121->keycodes[key_num];
  104. input_event(input, EV_MSC, MSC_SCAN, key_num);
  105. input_report_key(input, key_val, pressed);
  106. dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val,
  107. pressed ? "pressed" : "released");
  108. }
  109. input_sync(input);
  110. out:
  111. return IRQ_HANDLED;
  112. }
  113. static int mpr121_phys_init(const struct mpr121_platform_data *pdata,
  114. struct mpr121_touchkey *mpr121,
  115. struct i2c_client *client)
  116. {
  117. const struct mpr121_init_register *reg;
  118. unsigned char usl, lsl, tl, eleconf;
  119. int i, t, vdd, ret;
  120. /* Set up touch/release threshold for ele0-ele11 */
  121. for (i = 0; i <= MPR121_MAX_KEY_COUNT; i++) {
  122. t = ELE0_TOUCH_THRESHOLD_ADDR + (i * 2);
  123. ret = i2c_smbus_write_byte_data(client, t, TOUCH_THRESHOLD);
  124. if (ret < 0)
  125. goto err_i2c_write;
  126. ret = i2c_smbus_write_byte_data(client, t + 1,
  127. RELEASE_THRESHOLD);
  128. if (ret < 0)
  129. goto err_i2c_write;
  130. }
  131. /* Set up init register */
  132. for (i = 0; i < ARRAY_SIZE(init_reg_table); i++) {
  133. reg = &init_reg_table[i];
  134. ret = i2c_smbus_write_byte_data(client, reg->addr, reg->val);
  135. if (ret < 0)
  136. goto err_i2c_write;
  137. }
  138. /*
  139. * Capacitance on sensing input varies and needs to be compensated.
  140. * The internal MPR121-auto-configuration can do this if it's
  141. * registers are set properly (based on pdata->vdd_uv).
  142. */
  143. vdd = pdata->vdd_uv / 1000;
  144. usl = ((vdd - 700) * 256) / vdd;
  145. lsl = (usl * 65) / 100;
  146. tl = (usl * 90) / 100;
  147. ret = i2c_smbus_write_byte_data(client, AUTO_CONFIG_USL_ADDR, usl);
  148. ret |= i2c_smbus_write_byte_data(client, AUTO_CONFIG_LSL_ADDR, lsl);
  149. ret |= i2c_smbus_write_byte_data(client, AUTO_CONFIG_TL_ADDR, tl);
  150. /*
  151. * Quick charge bit will let the capacitive charge to ready
  152. * state quickly, or the buttons may not function after system
  153. * boot.
  154. */
  155. eleconf = mpr121->keycount | ELECTRODE_CONF_QUICK_CHARGE;
  156. ret |= i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR,
  157. eleconf);
  158. if (ret != 0)
  159. goto err_i2c_write;
  160. dev_dbg(&client->dev, "set up with %x keys.\n", mpr121->keycount);
  161. return 0;
  162. err_i2c_write:
  163. dev_err(&client->dev, "i2c write error: %d\n", ret);
  164. return ret;
  165. }
  166. static int mpr_touchkey_probe(struct i2c_client *client,
  167. const struct i2c_device_id *id)
  168. {
  169. const struct mpr121_platform_data *pdata =
  170. dev_get_platdata(&client->dev);
  171. struct mpr121_touchkey *mpr121;
  172. struct input_dev *input_dev;
  173. int error;
  174. int i;
  175. if (!pdata) {
  176. dev_err(&client->dev, "no platform data defined\n");
  177. return -EINVAL;
  178. }
  179. if (!pdata->keymap || !pdata->keymap_size) {
  180. dev_err(&client->dev, "missing keymap data\n");
  181. return -EINVAL;
  182. }
  183. if (pdata->keymap_size > MPR121_MAX_KEY_COUNT) {
  184. dev_err(&client->dev, "too many keys defined\n");
  185. return -EINVAL;
  186. }
  187. if (!client->irq) {
  188. dev_err(&client->dev, "irq number should not be zero\n");
  189. return -EINVAL;
  190. }
  191. mpr121 = devm_kzalloc(&client->dev, sizeof(*mpr121),
  192. GFP_KERNEL);
  193. if (!mpr121)
  194. return -ENOMEM;
  195. input_dev = devm_input_allocate_device(&client->dev);
  196. if (!input_dev)
  197. return -ENOMEM;
  198. mpr121->client = client;
  199. mpr121->input_dev = input_dev;
  200. mpr121->keycount = pdata->keymap_size;
  201. input_dev->name = "Freescale MPR121 Touchkey";
  202. input_dev->id.bustype = BUS_I2C;
  203. input_dev->dev.parent = &client->dev;
  204. input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
  205. input_set_capability(input_dev, EV_MSC, MSC_SCAN);
  206. input_dev->keycode = mpr121->keycodes;
  207. input_dev->keycodesize = sizeof(mpr121->keycodes[0]);
  208. input_dev->keycodemax = mpr121->keycount;
  209. for (i = 0; i < pdata->keymap_size; i++) {
  210. input_set_capability(input_dev, EV_KEY, pdata->keymap[i]);
  211. mpr121->keycodes[i] = pdata->keymap[i];
  212. }
  213. error = mpr121_phys_init(pdata, mpr121, client);
  214. if (error) {
  215. dev_err(&client->dev, "Failed to init register\n");
  216. return error;
  217. }
  218. error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
  219. mpr_touchkey_interrupt,
  220. IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
  221. client->dev.driver->name, mpr121);
  222. if (error) {
  223. dev_err(&client->dev, "Failed to register interrupt\n");
  224. return error;
  225. }
  226. error = input_register_device(input_dev);
  227. if (error)
  228. return error;
  229. i2c_set_clientdata(client, mpr121);
  230. device_init_wakeup(&client->dev, pdata->wakeup);
  231. return 0;
  232. }
  233. #ifdef CONFIG_PM_SLEEP
  234. static int mpr_suspend(struct device *dev)
  235. {
  236. struct i2c_client *client = to_i2c_client(dev);
  237. if (device_may_wakeup(&client->dev))
  238. enable_irq_wake(client->irq);
  239. i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, 0x00);
  240. return 0;
  241. }
  242. static int mpr_resume(struct device *dev)
  243. {
  244. struct i2c_client *client = to_i2c_client(dev);
  245. struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client);
  246. if (device_may_wakeup(&client->dev))
  247. disable_irq_wake(client->irq);
  248. i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR,
  249. mpr121->keycount);
  250. return 0;
  251. }
  252. #endif
  253. static SIMPLE_DEV_PM_OPS(mpr121_touchkey_pm_ops, mpr_suspend, mpr_resume);
  254. static const struct i2c_device_id mpr121_id[] = {
  255. { "mpr121_touchkey", 0 },
  256. { }
  257. };
  258. MODULE_DEVICE_TABLE(i2c, mpr121_id);
  259. static struct i2c_driver mpr_touchkey_driver = {
  260. .driver = {
  261. .name = "mpr121",
  262. .pm = &mpr121_touchkey_pm_ops,
  263. },
  264. .id_table = mpr121_id,
  265. .probe = mpr_touchkey_probe,
  266. };
  267. module_i2c_driver(mpr_touchkey_driver);
  268. MODULE_LICENSE("GPL");
  269. MODULE_AUTHOR("Zhang Jiejing <jiejing.zhang@freescale.com>");
  270. MODULE_DESCRIPTION("Touch Key driver for Freescale MPR121 Chip");