qt2160.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * qt2160.c - Atmel AT42QT2160 Touch Sense Controller
  4. *
  5. * Copyright (C) 2009 Raphael Derosso Pereira <[email protected]>
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/leds.h>
  9. #include <linux/module.h>
  10. #include <linux/slab.h>
  11. #include <linux/jiffies.h>
  12. #include <linux/i2c.h>
  13. #include <linux/irq.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/input.h>
  16. #define QT2160_VALID_CHIPID 0x11
  17. #define QT2160_CMD_CHIPID 0
  18. #define QT2160_CMD_CODEVER 1
  19. #define QT2160_CMD_GSTAT 2
  20. #define QT2160_CMD_KEYS3 3
  21. #define QT2160_CMD_KEYS4 4
  22. #define QT2160_CMD_SLIDE 5
  23. #define QT2160_CMD_GPIOS 6
  24. #define QT2160_CMD_SUBVER 7
  25. #define QT2160_CMD_CALIBRATE 10
  26. #define QT2160_CMD_DRIVE_X 70
  27. #define QT2160_CMD_PWMEN_X 74
  28. #define QT2160_CMD_PWM_DUTY 76
  29. #define QT2160_NUM_LEDS_X 8
  30. #define QT2160_CYCLE_INTERVAL (2*HZ)
  31. static unsigned char qt2160_key2code[] = {
  32. KEY_0, KEY_1, KEY_2, KEY_3,
  33. KEY_4, KEY_5, KEY_6, KEY_7,
  34. KEY_8, KEY_9, KEY_A, KEY_B,
  35. KEY_C, KEY_D, KEY_E, KEY_F,
  36. };
  37. #ifdef CONFIG_LEDS_CLASS
  38. struct qt2160_led {
  39. struct qt2160_data *qt2160;
  40. struct led_classdev cdev;
  41. char name[32];
  42. int id;
  43. enum led_brightness brightness;
  44. };
  45. #endif
  46. struct qt2160_data {
  47. struct i2c_client *client;
  48. struct input_dev *input;
  49. struct delayed_work dwork;
  50. unsigned short keycodes[ARRAY_SIZE(qt2160_key2code)];
  51. u16 key_matrix;
  52. #ifdef CONFIG_LEDS_CLASS
  53. struct qt2160_led leds[QT2160_NUM_LEDS_X];
  54. #endif
  55. };
  56. static int qt2160_read(struct i2c_client *client, u8 reg);
  57. static int qt2160_write(struct i2c_client *client, u8 reg, u8 data);
  58. #ifdef CONFIG_LEDS_CLASS
  59. static int qt2160_led_set(struct led_classdev *cdev,
  60. enum led_brightness value)
  61. {
  62. struct qt2160_led *led = container_of(cdev, struct qt2160_led, cdev);
  63. struct qt2160_data *qt2160 = led->qt2160;
  64. struct i2c_client *client = qt2160->client;
  65. u32 drive, pwmen;
  66. if (value != led->brightness) {
  67. drive = qt2160_read(client, QT2160_CMD_DRIVE_X);
  68. pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X);
  69. if (value != LED_OFF) {
  70. drive |= BIT(led->id);
  71. pwmen |= BIT(led->id);
  72. } else {
  73. drive &= ~BIT(led->id);
  74. pwmen &= ~BIT(led->id);
  75. }
  76. qt2160_write(client, QT2160_CMD_DRIVE_X, drive);
  77. qt2160_write(client, QT2160_CMD_PWMEN_X, pwmen);
  78. /*
  79. * Changing this register will change the brightness
  80. * of every LED in the qt2160. It's a HW limitation.
  81. */
  82. if (value != LED_OFF)
  83. qt2160_write(client, QT2160_CMD_PWM_DUTY, value);
  84. led->brightness = value;
  85. }
  86. return 0;
  87. }
  88. #endif /* CONFIG_LEDS_CLASS */
  89. static int qt2160_read_block(struct i2c_client *client,
  90. u8 inireg, u8 *buffer, unsigned int count)
  91. {
  92. int error, idx = 0;
  93. /*
  94. * Can't use SMBus block data read. Check for I2C functionality to speed
  95. * things up whenever possible. Otherwise we will be forced to read
  96. * sequentially.
  97. */
  98. if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  99. error = i2c_smbus_write_byte(client, inireg + idx);
  100. if (error) {
  101. dev_err(&client->dev,
  102. "couldn't send request. Returned %d\n", error);
  103. return error;
  104. }
  105. error = i2c_master_recv(client, buffer, count);
  106. if (error != count) {
  107. dev_err(&client->dev,
  108. "couldn't read registers. Returned %d bytes\n", error);
  109. return error;
  110. }
  111. } else {
  112. while (count--) {
  113. int data;
  114. error = i2c_smbus_write_byte(client, inireg + idx);
  115. if (error) {
  116. dev_err(&client->dev,
  117. "couldn't send request. Returned %d\n", error);
  118. return error;
  119. }
  120. data = i2c_smbus_read_byte(client);
  121. if (data < 0) {
  122. dev_err(&client->dev,
  123. "couldn't read register. Returned %d\n", data);
  124. return data;
  125. }
  126. buffer[idx++] = data;
  127. }
  128. }
  129. return 0;
  130. }
  131. static int qt2160_get_key_matrix(struct qt2160_data *qt2160)
  132. {
  133. struct i2c_client *client = qt2160->client;
  134. struct input_dev *input = qt2160->input;
  135. u8 regs[6];
  136. u16 old_matrix, new_matrix;
  137. int ret, i, mask;
  138. dev_dbg(&client->dev, "requesting keys...\n");
  139. /*
  140. * Read all registers from General Status Register
  141. * to GPIOs register
  142. */
  143. ret = qt2160_read_block(client, QT2160_CMD_GSTAT, regs, 6);
  144. if (ret) {
  145. dev_err(&client->dev,
  146. "could not perform chip read.\n");
  147. return ret;
  148. }
  149. old_matrix = qt2160->key_matrix;
  150. qt2160->key_matrix = new_matrix = (regs[2] << 8) | regs[1];
  151. mask = 0x01;
  152. for (i = 0; i < 16; ++i, mask <<= 1) {
  153. int keyval = new_matrix & mask;
  154. if ((old_matrix & mask) != keyval) {
  155. input_report_key(input, qt2160->keycodes[i], keyval);
  156. dev_dbg(&client->dev, "key %d %s\n",
  157. i, keyval ? "pressed" : "released");
  158. }
  159. }
  160. input_sync(input);
  161. return 0;
  162. }
  163. static irqreturn_t qt2160_irq(int irq, void *_qt2160)
  164. {
  165. struct qt2160_data *qt2160 = _qt2160;
  166. mod_delayed_work(system_wq, &qt2160->dwork, 0);
  167. return IRQ_HANDLED;
  168. }
  169. static void qt2160_schedule_read(struct qt2160_data *qt2160)
  170. {
  171. schedule_delayed_work(&qt2160->dwork, QT2160_CYCLE_INTERVAL);
  172. }
  173. static void qt2160_worker(struct work_struct *work)
  174. {
  175. struct qt2160_data *qt2160 =
  176. container_of(work, struct qt2160_data, dwork.work);
  177. dev_dbg(&qt2160->client->dev, "worker\n");
  178. qt2160_get_key_matrix(qt2160);
  179. /* Avoid device lock up by checking every so often */
  180. qt2160_schedule_read(qt2160);
  181. }
  182. static int qt2160_read(struct i2c_client *client, u8 reg)
  183. {
  184. int ret;
  185. ret = i2c_smbus_write_byte(client, reg);
  186. if (ret) {
  187. dev_err(&client->dev,
  188. "couldn't send request. Returned %d\n", ret);
  189. return ret;
  190. }
  191. ret = i2c_smbus_read_byte(client);
  192. if (ret < 0) {
  193. dev_err(&client->dev,
  194. "couldn't read register. Returned %d\n", ret);
  195. return ret;
  196. }
  197. return ret;
  198. }
  199. static int qt2160_write(struct i2c_client *client, u8 reg, u8 data)
  200. {
  201. int ret;
  202. ret = i2c_smbus_write_byte_data(client, reg, data);
  203. if (ret < 0)
  204. dev_err(&client->dev,
  205. "couldn't write data. Returned %d\n", ret);
  206. return ret;
  207. }
  208. #ifdef CONFIG_LEDS_CLASS
  209. static int qt2160_register_leds(struct qt2160_data *qt2160)
  210. {
  211. struct i2c_client *client = qt2160->client;
  212. int ret;
  213. int i;
  214. for (i = 0; i < QT2160_NUM_LEDS_X; i++) {
  215. struct qt2160_led *led = &qt2160->leds[i];
  216. snprintf(led->name, sizeof(led->name), "qt2160:x%d", i);
  217. led->cdev.name = led->name;
  218. led->cdev.brightness_set_blocking = qt2160_led_set;
  219. led->cdev.brightness = LED_OFF;
  220. led->id = i;
  221. led->qt2160 = qt2160;
  222. ret = led_classdev_register(&client->dev, &led->cdev);
  223. if (ret < 0)
  224. return ret;
  225. }
  226. /* Tur off LEDs */
  227. qt2160_write(client, QT2160_CMD_DRIVE_X, 0);
  228. qt2160_write(client, QT2160_CMD_PWMEN_X, 0);
  229. qt2160_write(client, QT2160_CMD_PWM_DUTY, 0);
  230. return 0;
  231. }
  232. static void qt2160_unregister_leds(struct qt2160_data *qt2160)
  233. {
  234. int i;
  235. for (i = 0; i < QT2160_NUM_LEDS_X; i++)
  236. led_classdev_unregister(&qt2160->leds[i].cdev);
  237. }
  238. #else
  239. static inline int qt2160_register_leds(struct qt2160_data *qt2160)
  240. {
  241. return 0;
  242. }
  243. static inline void qt2160_unregister_leds(struct qt2160_data *qt2160)
  244. {
  245. }
  246. #endif
  247. static bool qt2160_identify(struct i2c_client *client)
  248. {
  249. int id, ver, rev;
  250. /* Read Chid ID to check if chip is valid */
  251. id = qt2160_read(client, QT2160_CMD_CHIPID);
  252. if (id != QT2160_VALID_CHIPID) {
  253. dev_err(&client->dev, "ID %d not supported\n", id);
  254. return false;
  255. }
  256. /* Read chip firmware version */
  257. ver = qt2160_read(client, QT2160_CMD_CODEVER);
  258. if (ver < 0) {
  259. dev_err(&client->dev, "could not get firmware version\n");
  260. return false;
  261. }
  262. /* Read chip firmware revision */
  263. rev = qt2160_read(client, QT2160_CMD_SUBVER);
  264. if (rev < 0) {
  265. dev_err(&client->dev, "could not get firmware revision\n");
  266. return false;
  267. }
  268. dev_info(&client->dev, "AT42QT2160 firmware version %d.%d.%d\n",
  269. ver >> 4, ver & 0xf, rev);
  270. return true;
  271. }
  272. static int qt2160_probe(struct i2c_client *client,
  273. const struct i2c_device_id *id)
  274. {
  275. struct qt2160_data *qt2160;
  276. struct input_dev *input;
  277. int i;
  278. int error;
  279. /* Check functionality */
  280. error = i2c_check_functionality(client->adapter,
  281. I2C_FUNC_SMBUS_BYTE);
  282. if (!error) {
  283. dev_err(&client->dev, "%s adapter not supported\n",
  284. dev_driver_string(&client->adapter->dev));
  285. return -ENODEV;
  286. }
  287. if (!qt2160_identify(client))
  288. return -ENODEV;
  289. /* Chip is valid and active. Allocate structure */
  290. qt2160 = kzalloc(sizeof(struct qt2160_data), GFP_KERNEL);
  291. input = input_allocate_device();
  292. if (!qt2160 || !input) {
  293. dev_err(&client->dev, "insufficient memory\n");
  294. error = -ENOMEM;
  295. goto err_free_mem;
  296. }
  297. qt2160->client = client;
  298. qt2160->input = input;
  299. INIT_DELAYED_WORK(&qt2160->dwork, qt2160_worker);
  300. input->name = "AT42QT2160 Touch Sense Keyboard";
  301. input->id.bustype = BUS_I2C;
  302. input->keycode = qt2160->keycodes;
  303. input->keycodesize = sizeof(qt2160->keycodes[0]);
  304. input->keycodemax = ARRAY_SIZE(qt2160_key2code);
  305. __set_bit(EV_KEY, input->evbit);
  306. __clear_bit(EV_REP, input->evbit);
  307. for (i = 0; i < ARRAY_SIZE(qt2160_key2code); i++) {
  308. qt2160->keycodes[i] = qt2160_key2code[i];
  309. __set_bit(qt2160_key2code[i], input->keybit);
  310. }
  311. __clear_bit(KEY_RESERVED, input->keybit);
  312. /* Calibrate device */
  313. error = qt2160_write(client, QT2160_CMD_CALIBRATE, 1);
  314. if (error) {
  315. dev_err(&client->dev, "failed to calibrate device\n");
  316. goto err_free_mem;
  317. }
  318. if (client->irq) {
  319. error = request_irq(client->irq, qt2160_irq,
  320. IRQF_TRIGGER_FALLING, "qt2160", qt2160);
  321. if (error) {
  322. dev_err(&client->dev,
  323. "failed to allocate irq %d\n", client->irq);
  324. goto err_free_mem;
  325. }
  326. }
  327. error = qt2160_register_leds(qt2160);
  328. if (error) {
  329. dev_err(&client->dev, "Failed to register leds\n");
  330. goto err_free_irq;
  331. }
  332. error = input_register_device(qt2160->input);
  333. if (error) {
  334. dev_err(&client->dev,
  335. "Failed to register input device\n");
  336. goto err_unregister_leds;
  337. }
  338. i2c_set_clientdata(client, qt2160);
  339. qt2160_schedule_read(qt2160);
  340. return 0;
  341. err_unregister_leds:
  342. qt2160_unregister_leds(qt2160);
  343. err_free_irq:
  344. if (client->irq)
  345. free_irq(client->irq, qt2160);
  346. err_free_mem:
  347. input_free_device(input);
  348. kfree(qt2160);
  349. return error;
  350. }
  351. static void qt2160_remove(struct i2c_client *client)
  352. {
  353. struct qt2160_data *qt2160 = i2c_get_clientdata(client);
  354. qt2160_unregister_leds(qt2160);
  355. /* Release IRQ so no queue will be scheduled */
  356. if (client->irq)
  357. free_irq(client->irq, qt2160);
  358. cancel_delayed_work_sync(&qt2160->dwork);
  359. input_unregister_device(qt2160->input);
  360. kfree(qt2160);
  361. }
  362. static const struct i2c_device_id qt2160_idtable[] = {
  363. { "qt2160", 0, },
  364. { }
  365. };
  366. MODULE_DEVICE_TABLE(i2c, qt2160_idtable);
  367. static struct i2c_driver qt2160_driver = {
  368. .driver = {
  369. .name = "qt2160",
  370. },
  371. .id_table = qt2160_idtable,
  372. .probe = qt2160_probe,
  373. .remove = qt2160_remove,
  374. };
  375. module_i2c_driver(qt2160_driver);
  376. MODULE_AUTHOR("Raphael Derosso Pereira <[email protected]>");
  377. MODULE_DESCRIPTION("Driver for AT42QT2160 Touch Sensor");
  378. MODULE_LICENSE("GPL");