pinephone-keyboard.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. //
  3. // Copyright (C) 2021-2022 Samuel Holland <[email protected]>
  4. #include <linux/crc8.h>
  5. #include <linux/delay.h>
  6. #include <linux/err.h>
  7. #include <linux/i2c.h>
  8. #include <linux/input.h>
  9. #include <linux/input/matrix_keypad.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/module.h>
  12. #include <linux/mod_devicetable.h>
  13. #include <linux/of.h>
  14. #include <linux/regulator/consumer.h>
  15. #include <linux/types.h>
  16. #define DRV_NAME "pinephone-keyboard"
  17. #define PPKB_CRC8_POLYNOMIAL 0x07
  18. #define PPKB_DEVICE_ID_HI 0x00
  19. #define PPKB_DEVICE_ID_HI_VALUE 'K'
  20. #define PPKB_DEVICE_ID_LO 0x01
  21. #define PPKB_DEVICE_ID_LO_VALUE 'B'
  22. #define PPKB_FW_REVISION 0x02
  23. #define PPKB_FW_FEATURES 0x03
  24. #define PPKB_MATRIX_SIZE 0x06
  25. #define PPKB_SCAN_CRC 0x07
  26. #define PPKB_SCAN_DATA 0x08
  27. #define PPKB_SYS_CONFIG 0x20
  28. #define PPKB_SYS_CONFIG_DISABLE_SCAN BIT(0)
  29. #define PPKB_SYS_SMBUS_COMMAND 0x21
  30. #define PPKB_SYS_SMBUS_DATA 0x22
  31. #define PPKB_SYS_COMMAND 0x23
  32. #define PPKB_SYS_COMMAND_SMBUS_READ 0x91
  33. #define PPKB_SYS_COMMAND_SMBUS_WRITE 0xa1
  34. #define PPKB_ROWS 6
  35. #define PPKB_COLS 12
  36. /* Size of the scan buffer, including the CRC byte at the beginning. */
  37. #define PPKB_BUF_LEN (1 + PPKB_COLS)
  38. static const uint32_t ppkb_keymap[] = {
  39. KEY(0, 0, KEY_ESC),
  40. KEY(0, 1, KEY_1),
  41. KEY(0, 2, KEY_2),
  42. KEY(0, 3, KEY_3),
  43. KEY(0, 4, KEY_4),
  44. KEY(0, 5, KEY_5),
  45. KEY(0, 6, KEY_6),
  46. KEY(0, 7, KEY_7),
  47. KEY(0, 8, KEY_8),
  48. KEY(0, 9, KEY_9),
  49. KEY(0, 10, KEY_0),
  50. KEY(0, 11, KEY_BACKSPACE),
  51. KEY(1, 0, KEY_TAB),
  52. KEY(1, 1, KEY_Q),
  53. KEY(1, 2, KEY_W),
  54. KEY(1, 3, KEY_E),
  55. KEY(1, 4, KEY_R),
  56. KEY(1, 5, KEY_T),
  57. KEY(1, 6, KEY_Y),
  58. KEY(1, 7, KEY_U),
  59. KEY(1, 8, KEY_I),
  60. KEY(1, 9, KEY_O),
  61. KEY(1, 10, KEY_P),
  62. KEY(1, 11, KEY_ENTER),
  63. KEY(2, 0, KEY_LEFTMETA),
  64. KEY(2, 1, KEY_A),
  65. KEY(2, 2, KEY_S),
  66. KEY(2, 3, KEY_D),
  67. KEY(2, 4, KEY_F),
  68. KEY(2, 5, KEY_G),
  69. KEY(2, 6, KEY_H),
  70. KEY(2, 7, KEY_J),
  71. KEY(2, 8, KEY_K),
  72. KEY(2, 9, KEY_L),
  73. KEY(2, 10, KEY_SEMICOLON),
  74. KEY(3, 0, KEY_LEFTSHIFT),
  75. KEY(3, 1, KEY_Z),
  76. KEY(3, 2, KEY_X),
  77. KEY(3, 3, KEY_C),
  78. KEY(3, 4, KEY_V),
  79. KEY(3, 5, KEY_B),
  80. KEY(3, 6, KEY_N),
  81. KEY(3, 7, KEY_M),
  82. KEY(3, 8, KEY_COMMA),
  83. KEY(3, 9, KEY_DOT),
  84. KEY(3, 10, KEY_SLASH),
  85. KEY(4, 1, KEY_LEFTCTRL),
  86. KEY(4, 4, KEY_SPACE),
  87. KEY(4, 6, KEY_APOSTROPHE),
  88. KEY(4, 8, KEY_RIGHTBRACE),
  89. KEY(4, 9, KEY_LEFTBRACE),
  90. KEY(5, 2, KEY_FN),
  91. KEY(5, 3, KEY_LEFTALT),
  92. KEY(5, 5, KEY_RIGHTALT),
  93. /* FN layer */
  94. KEY(PPKB_ROWS + 0, 0, KEY_FN_ESC),
  95. KEY(PPKB_ROWS + 0, 1, KEY_F1),
  96. KEY(PPKB_ROWS + 0, 2, KEY_F2),
  97. KEY(PPKB_ROWS + 0, 3, KEY_F3),
  98. KEY(PPKB_ROWS + 0, 4, KEY_F4),
  99. KEY(PPKB_ROWS + 0, 5, KEY_F5),
  100. KEY(PPKB_ROWS + 0, 6, KEY_F6),
  101. KEY(PPKB_ROWS + 0, 7, KEY_F7),
  102. KEY(PPKB_ROWS + 0, 8, KEY_F8),
  103. KEY(PPKB_ROWS + 0, 9, KEY_F9),
  104. KEY(PPKB_ROWS + 0, 10, KEY_F10),
  105. KEY(PPKB_ROWS + 0, 11, KEY_DELETE),
  106. KEY(PPKB_ROWS + 1, 10, KEY_PAGEUP),
  107. KEY(PPKB_ROWS + 2, 0, KEY_SYSRQ),
  108. KEY(PPKB_ROWS + 2, 9, KEY_PAGEDOWN),
  109. KEY(PPKB_ROWS + 2, 10, KEY_INSERT),
  110. KEY(PPKB_ROWS + 3, 0, KEY_LEFTSHIFT),
  111. KEY(PPKB_ROWS + 3, 8, KEY_HOME),
  112. KEY(PPKB_ROWS + 3, 9, KEY_UP),
  113. KEY(PPKB_ROWS + 3, 10, KEY_END),
  114. KEY(PPKB_ROWS + 4, 1, KEY_LEFTCTRL),
  115. KEY(PPKB_ROWS + 4, 6, KEY_LEFT),
  116. KEY(PPKB_ROWS + 4, 8, KEY_RIGHT),
  117. KEY(PPKB_ROWS + 4, 9, KEY_DOWN),
  118. KEY(PPKB_ROWS + 5, 3, KEY_LEFTALT),
  119. KEY(PPKB_ROWS + 5, 5, KEY_RIGHTALT),
  120. };
  121. static const struct matrix_keymap_data ppkb_keymap_data = {
  122. .keymap = ppkb_keymap,
  123. .keymap_size = ARRAY_SIZE(ppkb_keymap),
  124. };
  125. struct pinephone_keyboard {
  126. struct i2c_adapter adapter;
  127. struct input_dev *input;
  128. u8 buf[2][PPKB_BUF_LEN];
  129. u8 crc_table[CRC8_TABLE_SIZE];
  130. u8 fn_state[PPKB_COLS];
  131. bool buf_swap;
  132. bool fn_pressed;
  133. };
  134. static int ppkb_adap_smbus_xfer(struct i2c_adapter *adap, u16 addr,
  135. unsigned short flags, char read_write,
  136. u8 command, int size,
  137. union i2c_smbus_data *data)
  138. {
  139. struct i2c_client *client = adap->algo_data;
  140. u8 buf[3];
  141. int ret;
  142. buf[0] = command;
  143. buf[1] = data->byte;
  144. buf[2] = read_write == I2C_SMBUS_READ ? PPKB_SYS_COMMAND_SMBUS_READ
  145. : PPKB_SYS_COMMAND_SMBUS_WRITE;
  146. ret = i2c_smbus_write_i2c_block_data(client, PPKB_SYS_SMBUS_COMMAND,
  147. sizeof(buf), buf);
  148. if (ret)
  149. return ret;
  150. /* Read back the command status until it passes or fails. */
  151. do {
  152. usleep_range(300, 500);
  153. ret = i2c_smbus_read_byte_data(client, PPKB_SYS_COMMAND);
  154. } while (ret == buf[2]);
  155. if (ret < 0)
  156. return ret;
  157. /* Commands return 0x00 on success and 0xff on failure. */
  158. if (ret)
  159. return -EIO;
  160. if (read_write == I2C_SMBUS_READ) {
  161. ret = i2c_smbus_read_byte_data(client, PPKB_SYS_SMBUS_DATA);
  162. if (ret < 0)
  163. return ret;
  164. data->byte = ret;
  165. }
  166. return 0;
  167. }
  168. static u32 ppkg_adap_functionality(struct i2c_adapter *adap)
  169. {
  170. return I2C_FUNC_SMBUS_BYTE_DATA;
  171. }
  172. static const struct i2c_algorithm ppkb_adap_algo = {
  173. .smbus_xfer = ppkb_adap_smbus_xfer,
  174. .functionality = ppkg_adap_functionality,
  175. };
  176. static void ppkb_update(struct i2c_client *client)
  177. {
  178. struct pinephone_keyboard *ppkb = i2c_get_clientdata(client);
  179. unsigned short *keymap = ppkb->input->keycode;
  180. int row_shift = get_count_order(PPKB_COLS);
  181. u8 *old_buf = ppkb->buf[!ppkb->buf_swap];
  182. u8 *new_buf = ppkb->buf[ppkb->buf_swap];
  183. int col, crc, ret, row;
  184. struct device *dev = &client->dev;
  185. ret = i2c_smbus_read_i2c_block_data(client, PPKB_SCAN_CRC,
  186. PPKB_BUF_LEN, new_buf);
  187. if (ret != PPKB_BUF_LEN) {
  188. dev_err(dev, "Failed to read scan data: %d\n", ret);
  189. return;
  190. }
  191. crc = crc8(ppkb->crc_table, &new_buf[1], PPKB_COLS, CRC8_INIT_VALUE);
  192. if (crc != new_buf[0]) {
  193. dev_err(dev, "Bad scan data (%02x != %02x)\n", crc, new_buf[0]);
  194. return;
  195. }
  196. ppkb->buf_swap = !ppkb->buf_swap;
  197. for (col = 0; col < PPKB_COLS; ++col) {
  198. u8 old = old_buf[1 + col];
  199. u8 new = new_buf[1 + col];
  200. u8 changed = old ^ new;
  201. if (!changed)
  202. continue;
  203. for (row = 0; row < PPKB_ROWS; ++row) {
  204. u8 mask = BIT(row);
  205. u8 value = new & mask;
  206. unsigned short code;
  207. bool fn_state;
  208. if (!(changed & mask))
  209. continue;
  210. /*
  211. * Save off the FN key state when the key was pressed,
  212. * and use that to determine the code during a release.
  213. */
  214. fn_state = value ? ppkb->fn_pressed : ppkb->fn_state[col] & mask;
  215. if (fn_state)
  216. ppkb->fn_state[col] ^= mask;
  217. /* The FN layer is a second set of rows. */
  218. code = MATRIX_SCAN_CODE(fn_state ? PPKB_ROWS + row : row,
  219. col, row_shift);
  220. input_event(ppkb->input, EV_MSC, MSC_SCAN, code);
  221. input_report_key(ppkb->input, keymap[code], value);
  222. if (keymap[code] == KEY_FN)
  223. ppkb->fn_pressed = value;
  224. }
  225. }
  226. input_sync(ppkb->input);
  227. }
  228. static irqreturn_t ppkb_irq_thread(int irq, void *data)
  229. {
  230. struct i2c_client *client = data;
  231. ppkb_update(client);
  232. return IRQ_HANDLED;
  233. }
  234. static int ppkb_set_scan(struct i2c_client *client, bool enable)
  235. {
  236. struct device *dev = &client->dev;
  237. int ret, val;
  238. ret = i2c_smbus_read_byte_data(client, PPKB_SYS_CONFIG);
  239. if (ret < 0) {
  240. dev_err(dev, "Failed to read config: %d\n", ret);
  241. return ret;
  242. }
  243. if (enable)
  244. val = ret & ~PPKB_SYS_CONFIG_DISABLE_SCAN;
  245. else
  246. val = ret | PPKB_SYS_CONFIG_DISABLE_SCAN;
  247. ret = i2c_smbus_write_byte_data(client, PPKB_SYS_CONFIG, val);
  248. if (ret) {
  249. dev_err(dev, "Failed to write config: %d\n", ret);
  250. return ret;
  251. }
  252. return 0;
  253. }
  254. static int ppkb_open(struct input_dev *input)
  255. {
  256. struct i2c_client *client = input_get_drvdata(input);
  257. int error;
  258. error = ppkb_set_scan(client, true);
  259. if (error)
  260. return error;
  261. return 0;
  262. }
  263. static void ppkb_close(struct input_dev *input)
  264. {
  265. struct i2c_client *client = input_get_drvdata(input);
  266. ppkb_set_scan(client, false);
  267. }
  268. static void ppkb_regulator_disable(void *regulator)
  269. {
  270. regulator_disable(regulator);
  271. }
  272. static int ppkb_probe(struct i2c_client *client)
  273. {
  274. struct device *dev = &client->dev;
  275. unsigned int phys_rows, phys_cols;
  276. struct pinephone_keyboard *ppkb;
  277. struct regulator *vbat_supply;
  278. u8 info[PPKB_MATRIX_SIZE + 1];
  279. struct device_node *i2c_bus;
  280. int ret;
  281. int error;
  282. vbat_supply = devm_regulator_get(dev, "vbat");
  283. error = PTR_ERR_OR_ZERO(vbat_supply);
  284. if (error) {
  285. dev_err(dev, "Failed to get VBAT supply: %d\n", error);
  286. return error;
  287. }
  288. error = regulator_enable(vbat_supply);
  289. if (error) {
  290. dev_err(dev, "Failed to enable VBAT: %d\n", error);
  291. return error;
  292. }
  293. error = devm_add_action_or_reset(dev, ppkb_regulator_disable,
  294. vbat_supply);
  295. if (error)
  296. return error;
  297. ret = i2c_smbus_read_i2c_block_data(client, 0, sizeof(info), info);
  298. if (ret != sizeof(info)) {
  299. error = ret < 0 ? ret : -EIO;
  300. dev_err(dev, "Failed to read device ID: %d\n", error);
  301. return error;
  302. }
  303. if (info[PPKB_DEVICE_ID_HI] != PPKB_DEVICE_ID_HI_VALUE ||
  304. info[PPKB_DEVICE_ID_LO] != PPKB_DEVICE_ID_LO_VALUE) {
  305. dev_warn(dev, "Unexpected device ID: %#02x %#02x\n",
  306. info[PPKB_DEVICE_ID_HI], info[PPKB_DEVICE_ID_LO]);
  307. return -ENODEV;
  308. }
  309. dev_info(dev, "Found firmware version %d.%d features %#x\n",
  310. info[PPKB_FW_REVISION] >> 4,
  311. info[PPKB_FW_REVISION] & 0xf,
  312. info[PPKB_FW_FEATURES]);
  313. phys_rows = info[PPKB_MATRIX_SIZE] & 0xf;
  314. phys_cols = info[PPKB_MATRIX_SIZE] >> 4;
  315. if (phys_rows != PPKB_ROWS || phys_cols != PPKB_COLS) {
  316. dev_err(dev, "Unexpected keyboard size %ux%u\n",
  317. phys_rows, phys_cols);
  318. return -EINVAL;
  319. }
  320. /* Disable scan by default to save power. */
  321. error = ppkb_set_scan(client, false);
  322. if (error)
  323. return error;
  324. ppkb = devm_kzalloc(dev, sizeof(*ppkb), GFP_KERNEL);
  325. if (!ppkb)
  326. return -ENOMEM;
  327. i2c_set_clientdata(client, ppkb);
  328. i2c_bus = of_get_child_by_name(dev->of_node, "i2c");
  329. if (i2c_bus) {
  330. ppkb->adapter.owner = THIS_MODULE;
  331. ppkb->adapter.algo = &ppkb_adap_algo;
  332. ppkb->adapter.algo_data = client;
  333. ppkb->adapter.dev.parent = dev;
  334. ppkb->adapter.dev.of_node = i2c_bus;
  335. strscpy(ppkb->adapter.name, DRV_NAME, sizeof(ppkb->adapter.name));
  336. error = devm_i2c_add_adapter(dev, &ppkb->adapter);
  337. if (error) {
  338. dev_err(dev, "Failed to add I2C adapter: %d\n", error);
  339. return error;
  340. }
  341. }
  342. crc8_populate_msb(ppkb->crc_table, PPKB_CRC8_POLYNOMIAL);
  343. ppkb->input = devm_input_allocate_device(dev);
  344. if (!ppkb->input)
  345. return -ENOMEM;
  346. input_set_drvdata(ppkb->input, client);
  347. ppkb->input->name = "PinePhone Keyboard";
  348. ppkb->input->phys = DRV_NAME "/input0";
  349. ppkb->input->id.bustype = BUS_I2C;
  350. ppkb->input->open = ppkb_open;
  351. ppkb->input->close = ppkb_close;
  352. input_set_capability(ppkb->input, EV_MSC, MSC_SCAN);
  353. __set_bit(EV_REP, ppkb->input->evbit);
  354. error = matrix_keypad_build_keymap(&ppkb_keymap_data, NULL,
  355. 2 * PPKB_ROWS, PPKB_COLS, NULL,
  356. ppkb->input);
  357. if (error) {
  358. dev_err(dev, "Failed to build keymap: %d\n", error);
  359. return error;
  360. }
  361. error = input_register_device(ppkb->input);
  362. if (error) {
  363. dev_err(dev, "Failed to register input: %d\n", error);
  364. return error;
  365. }
  366. error = devm_request_threaded_irq(dev, client->irq,
  367. NULL, ppkb_irq_thread,
  368. IRQF_ONESHOT, client->name, client);
  369. if (error) {
  370. dev_err(dev, "Failed to request IRQ: %d\n", error);
  371. return error;
  372. }
  373. return 0;
  374. }
  375. static const struct of_device_id ppkb_of_match[] = {
  376. { .compatible = "pine64,pinephone-keyboard" },
  377. { }
  378. };
  379. MODULE_DEVICE_TABLE(of, ppkb_of_match);
  380. static struct i2c_driver ppkb_driver = {
  381. .probe_new = ppkb_probe,
  382. .driver = {
  383. .name = DRV_NAME,
  384. .of_match_table = ppkb_of_match,
  385. },
  386. };
  387. module_i2c_driver(ppkb_driver);
  388. MODULE_AUTHOR("Samuel Holland <[email protected]>");
  389. MODULE_DESCRIPTION("Pine64 PinePhone keyboard driver");
  390. MODULE_LICENSE("GPL");