rmi_smbus.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. /*
  2. * Copyright (c) 2015 - 2016 Red Hat, Inc
  3. * Copyright (c) 2011, 2012 Synaptics Incorporated
  4. * Copyright (c) 2011 Unixphere
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License version 2 as published by
  8. * the Free Software Foundation.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/delay.h>
  12. #include <linux/i2c.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/kconfig.h>
  15. #include <linux/lockdep.h>
  16. #include <linux/module.h>
  17. #include <linux/pm.h>
  18. #include <linux/rmi.h>
  19. #include <linux/slab.h>
  20. #include "rmi_driver.h"
  21. #define SMB_PROTOCOL_VERSION_ADDRESS 0xfd
  22. #define SMB_MAX_COUNT 32
  23. #define RMI_SMB2_MAP_SIZE 8 /* 8 entry of 4 bytes each */
  24. #define RMI_SMB2_MAP_FLAGS_WE 0x01
  25. struct mapping_table_entry {
  26. __le16 rmiaddr;
  27. u8 readcount;
  28. u8 flags;
  29. };
  30. struct rmi_smb_xport {
  31. struct rmi_transport_dev xport;
  32. struct i2c_client *client;
  33. struct mutex page_mutex;
  34. int page;
  35. u8 table_index;
  36. struct mutex mappingtable_mutex;
  37. struct mapping_table_entry mapping_table[RMI_SMB2_MAP_SIZE];
  38. };
  39. static int rmi_smb_get_version(struct rmi_smb_xport *rmi_smb)
  40. {
  41. struct i2c_client *client = rmi_smb->client;
  42. int retval;
  43. /* Check if for SMBus new version device by reading version byte. */
  44. retval = i2c_smbus_read_byte_data(client, SMB_PROTOCOL_VERSION_ADDRESS);
  45. if (retval < 0) {
  46. dev_err(&client->dev, "failed to get SMBus version number!\n");
  47. return retval;
  48. }
  49. return retval + 1;
  50. }
  51. /* SMB block write - wrapper over ic2_smb_write_block */
  52. static int smb_block_write(struct rmi_transport_dev *xport,
  53. u8 commandcode, const void *buf, size_t len)
  54. {
  55. struct rmi_smb_xport *rmi_smb =
  56. container_of(xport, struct rmi_smb_xport, xport);
  57. struct i2c_client *client = rmi_smb->client;
  58. int retval;
  59. retval = i2c_smbus_write_block_data(client, commandcode, len, buf);
  60. rmi_dbg(RMI_DEBUG_XPORT, &client->dev,
  61. "wrote %zd bytes at %#04x: %d (%*ph)\n",
  62. len, commandcode, retval, (int)len, buf);
  63. return retval;
  64. }
  65. /*
  66. * The function to get command code for smbus operations and keeps
  67. * records to the driver mapping table
  68. */
  69. static int rmi_smb_get_command_code(struct rmi_transport_dev *xport,
  70. u16 rmiaddr, int bytecount, bool isread, u8 *commandcode)
  71. {
  72. struct rmi_smb_xport *rmi_smb =
  73. container_of(xport, struct rmi_smb_xport, xport);
  74. int i;
  75. int retval;
  76. struct mapping_table_entry mapping_data[1];
  77. mutex_lock(&rmi_smb->mappingtable_mutex);
  78. for (i = 0; i < RMI_SMB2_MAP_SIZE; i++) {
  79. if (rmi_smb->mapping_table[i].rmiaddr == rmiaddr) {
  80. if (isread) {
  81. if (rmi_smb->mapping_table[i].readcount
  82. == bytecount) {
  83. *commandcode = i;
  84. retval = 0;
  85. goto exit;
  86. }
  87. } else {
  88. if (rmi_smb->mapping_table[i].flags &
  89. RMI_SMB2_MAP_FLAGS_WE) {
  90. *commandcode = i;
  91. retval = 0;
  92. goto exit;
  93. }
  94. }
  95. }
  96. }
  97. i = rmi_smb->table_index;
  98. rmi_smb->table_index = (i + 1) % RMI_SMB2_MAP_SIZE;
  99. /* constructs mapping table data entry. 4 bytes each entry */
  100. memset(mapping_data, 0, sizeof(mapping_data));
  101. mapping_data[0].rmiaddr = cpu_to_le16(rmiaddr);
  102. mapping_data[0].readcount = bytecount;
  103. mapping_data[0].flags = !isread ? RMI_SMB2_MAP_FLAGS_WE : 0;
  104. retval = smb_block_write(xport, i + 0x80, mapping_data,
  105. sizeof(mapping_data));
  106. if (retval < 0) {
  107. /*
  108. * if not written to device mapping table
  109. * clear the driver mapping table records
  110. */
  111. rmi_smb->mapping_table[i].rmiaddr = 0x0000;
  112. rmi_smb->mapping_table[i].readcount = 0;
  113. rmi_smb->mapping_table[i].flags = 0;
  114. goto exit;
  115. }
  116. /* save to the driver level mapping table */
  117. rmi_smb->mapping_table[i].rmiaddr = rmiaddr;
  118. rmi_smb->mapping_table[i].readcount = bytecount;
  119. rmi_smb->mapping_table[i].flags = !isread ? RMI_SMB2_MAP_FLAGS_WE : 0;
  120. *commandcode = i;
  121. exit:
  122. mutex_unlock(&rmi_smb->mappingtable_mutex);
  123. return retval;
  124. }
  125. static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
  126. const void *databuff, size_t len)
  127. {
  128. int retval = 0;
  129. u8 commandcode;
  130. struct rmi_smb_xport *rmi_smb =
  131. container_of(xport, struct rmi_smb_xport, xport);
  132. int cur_len = (int)len;
  133. mutex_lock(&rmi_smb->page_mutex);
  134. while (cur_len > 0) {
  135. /*
  136. * break into 32 bytes chunks to write get command code
  137. */
  138. int block_len = min_t(int, len, SMB_MAX_COUNT);
  139. retval = rmi_smb_get_command_code(xport, rmiaddr, block_len,
  140. false, &commandcode);
  141. if (retval < 0)
  142. goto exit;
  143. retval = smb_block_write(xport, commandcode,
  144. databuff, block_len);
  145. if (retval < 0)
  146. goto exit;
  147. /* prepare to write next block of bytes */
  148. cur_len -= SMB_MAX_COUNT;
  149. databuff += SMB_MAX_COUNT;
  150. rmiaddr += SMB_MAX_COUNT;
  151. }
  152. exit:
  153. mutex_unlock(&rmi_smb->page_mutex);
  154. return retval;
  155. }
  156. /* SMB block read - wrapper over ic2_smb_read_block */
  157. static int smb_block_read(struct rmi_transport_dev *xport,
  158. u8 commandcode, void *buf, size_t len)
  159. {
  160. struct rmi_smb_xport *rmi_smb =
  161. container_of(xport, struct rmi_smb_xport, xport);
  162. struct i2c_client *client = rmi_smb->client;
  163. int retval;
  164. retval = i2c_smbus_read_block_data(client, commandcode, buf);
  165. if (retval < 0)
  166. return retval;
  167. return retval;
  168. }
  169. static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr,
  170. void *databuff, size_t len)
  171. {
  172. struct rmi_smb_xport *rmi_smb =
  173. container_of(xport, struct rmi_smb_xport, xport);
  174. int retval;
  175. u8 commandcode;
  176. int cur_len = (int)len;
  177. mutex_lock(&rmi_smb->page_mutex);
  178. memset(databuff, 0, len);
  179. while (cur_len > 0) {
  180. /* break into 32 bytes chunks to write get command code */
  181. int block_len = min_t(int, cur_len, SMB_MAX_COUNT);
  182. retval = rmi_smb_get_command_code(xport, rmiaddr, block_len,
  183. true, &commandcode);
  184. if (retval < 0)
  185. goto exit;
  186. retval = smb_block_read(xport, commandcode,
  187. databuff, block_len);
  188. if (retval < 0)
  189. goto exit;
  190. /* prepare to read next block of bytes */
  191. cur_len -= SMB_MAX_COUNT;
  192. databuff += SMB_MAX_COUNT;
  193. rmiaddr += SMB_MAX_COUNT;
  194. }
  195. retval = 0;
  196. exit:
  197. mutex_unlock(&rmi_smb->page_mutex);
  198. return retval;
  199. }
  200. static void rmi_smb_clear_state(struct rmi_smb_xport *rmi_smb)
  201. {
  202. /* the mapping table has been flushed, discard the current one */
  203. mutex_lock(&rmi_smb->mappingtable_mutex);
  204. memset(rmi_smb->mapping_table, 0, sizeof(rmi_smb->mapping_table));
  205. mutex_unlock(&rmi_smb->mappingtable_mutex);
  206. }
  207. static int rmi_smb_enable_smbus_mode(struct rmi_smb_xport *rmi_smb)
  208. {
  209. int retval;
  210. /* we need to get the smbus version to activate the touchpad */
  211. retval = rmi_smb_get_version(rmi_smb);
  212. if (retval < 0)
  213. return retval;
  214. return 0;
  215. }
  216. static int rmi_smb_reset(struct rmi_transport_dev *xport, u16 reset_addr)
  217. {
  218. struct rmi_smb_xport *rmi_smb =
  219. container_of(xport, struct rmi_smb_xport, xport);
  220. rmi_smb_clear_state(rmi_smb);
  221. /*
  222. * we do not call the actual reset command, it has to be handled in
  223. * PS/2 or there will be races between PS/2 and SMBus.
  224. * PS/2 should ensure that a psmouse_reset is called before
  225. * intializing the device and after it has been removed to be in a known
  226. * state.
  227. */
  228. return rmi_smb_enable_smbus_mode(rmi_smb);
  229. }
  230. static const struct rmi_transport_ops rmi_smb_ops = {
  231. .write_block = rmi_smb_write_block,
  232. .read_block = rmi_smb_read_block,
  233. .reset = rmi_smb_reset,
  234. };
  235. static int rmi_smb_probe(struct i2c_client *client,
  236. const struct i2c_device_id *id)
  237. {
  238. struct rmi_device_platform_data *pdata = dev_get_platdata(&client->dev);
  239. struct rmi_smb_xport *rmi_smb;
  240. int retval;
  241. int smbus_version;
  242. if (!i2c_check_functionality(client->adapter,
  243. I2C_FUNC_SMBUS_READ_BLOCK_DATA |
  244. I2C_FUNC_SMBUS_HOST_NOTIFY)) {
  245. dev_err(&client->dev,
  246. "adapter does not support required functionality.\n");
  247. return -ENODEV;
  248. }
  249. if (client->irq <= 0) {
  250. dev_err(&client->dev, "no IRQ provided, giving up.\n");
  251. return client->irq ? client->irq : -ENODEV;
  252. }
  253. rmi_smb = devm_kzalloc(&client->dev, sizeof(struct rmi_smb_xport),
  254. GFP_KERNEL);
  255. if (!rmi_smb)
  256. return -ENOMEM;
  257. if (!pdata) {
  258. dev_err(&client->dev, "no platform data, aborting\n");
  259. return -ENOMEM;
  260. }
  261. rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Probing %s.\n",
  262. dev_name(&client->dev));
  263. rmi_smb->client = client;
  264. mutex_init(&rmi_smb->page_mutex);
  265. mutex_init(&rmi_smb->mappingtable_mutex);
  266. rmi_smb->xport.dev = &client->dev;
  267. rmi_smb->xport.pdata = *pdata;
  268. rmi_smb->xport.pdata.irq = client->irq;
  269. rmi_smb->xport.proto_name = "smb2";
  270. rmi_smb->xport.ops = &rmi_smb_ops;
  271. retval = rmi_smb_get_version(rmi_smb);
  272. if (retval < 0)
  273. return retval;
  274. smbus_version = retval;
  275. rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Smbus version is %d",
  276. smbus_version);
  277. if (smbus_version != 2) {
  278. dev_err(&client->dev, "Unrecognized SMB version %d.\n",
  279. smbus_version);
  280. return -ENODEV;
  281. }
  282. i2c_set_clientdata(client, rmi_smb);
  283. retval = rmi_register_transport_device(&rmi_smb->xport);
  284. if (retval) {
  285. dev_err(&client->dev, "Failed to register transport driver at 0x%.2X.\n",
  286. client->addr);
  287. i2c_set_clientdata(client, NULL);
  288. return retval;
  289. }
  290. dev_info(&client->dev, "registered rmi smb driver at %#04x.\n",
  291. client->addr);
  292. return 0;
  293. }
  294. static int rmi_smb_remove(struct i2c_client *client)
  295. {
  296. struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client);
  297. rmi_unregister_transport_device(&rmi_smb->xport);
  298. return 0;
  299. }
  300. static int __maybe_unused rmi_smb_suspend(struct device *dev)
  301. {
  302. struct i2c_client *client = to_i2c_client(dev);
  303. struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client);
  304. int ret;
  305. ret = rmi_driver_suspend(rmi_smb->xport.rmi_dev, true);
  306. if (ret)
  307. dev_warn(dev, "Failed to suspend device: %d\n", ret);
  308. return ret;
  309. }
  310. static int __maybe_unused rmi_smb_runtime_suspend(struct device *dev)
  311. {
  312. struct i2c_client *client = to_i2c_client(dev);
  313. struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client);
  314. int ret;
  315. ret = rmi_driver_suspend(rmi_smb->xport.rmi_dev, false);
  316. if (ret)
  317. dev_warn(dev, "Failed to suspend device: %d\n", ret);
  318. return ret;
  319. }
  320. static int __maybe_unused rmi_smb_resume(struct device *dev)
  321. {
  322. struct i2c_client *client = container_of(dev, struct i2c_client, dev);
  323. struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client);
  324. struct rmi_device *rmi_dev = rmi_smb->xport.rmi_dev;
  325. int ret;
  326. rmi_smb_reset(&rmi_smb->xport, 0);
  327. rmi_reset(rmi_dev);
  328. ret = rmi_driver_resume(rmi_smb->xport.rmi_dev, true);
  329. if (ret)
  330. dev_warn(dev, "Failed to resume device: %d\n", ret);
  331. return 0;
  332. }
  333. static int __maybe_unused rmi_smb_runtime_resume(struct device *dev)
  334. {
  335. struct i2c_client *client = to_i2c_client(dev);
  336. struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client);
  337. int ret;
  338. ret = rmi_driver_resume(rmi_smb->xport.rmi_dev, false);
  339. if (ret)
  340. dev_warn(dev, "Failed to resume device: %d\n", ret);
  341. return 0;
  342. }
  343. static const struct dev_pm_ops rmi_smb_pm = {
  344. SET_SYSTEM_SLEEP_PM_OPS(rmi_smb_suspend, rmi_smb_resume)
  345. SET_RUNTIME_PM_OPS(rmi_smb_runtime_suspend, rmi_smb_runtime_resume,
  346. NULL)
  347. };
  348. static const struct i2c_device_id rmi_id[] = {
  349. { "rmi4_smbus", 0 },
  350. { }
  351. };
  352. MODULE_DEVICE_TABLE(i2c, rmi_id);
  353. static struct i2c_driver rmi_smb_driver = {
  354. .driver = {
  355. .name = "rmi4_smbus",
  356. .pm = &rmi_smb_pm,
  357. },
  358. .id_table = rmi_id,
  359. .probe = rmi_smb_probe,
  360. .remove = rmi_smb_remove,
  361. };
  362. module_i2c_driver(rmi_smb_driver);
  363. MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com>");
  364. MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@redhat.com>");
  365. MODULE_DESCRIPTION("RMI4 SMBus driver");
  366. MODULE_LICENSE("GPL");