i2c-viperboard.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Nano River Technologies viperboard i2c master driver
  4. *
  5. * (C) 2012 by Lemonage GmbH
  6. * Author: Lars Poeschel <[email protected]>
  7. * All rights reserved.
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/errno.h>
  11. #include <linux/module.h>
  12. #include <linux/slab.h>
  13. #include <linux/types.h>
  14. #include <linux/mutex.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/usb.h>
  17. #include <linux/i2c.h>
  18. #include <linux/mfd/viperboard.h>
  19. struct vprbrd_i2c {
  20. struct i2c_adapter i2c;
  21. u8 bus_freq_param;
  22. };
  23. /* i2c bus frequency module parameter */
  24. static u8 i2c_bus_param;
  25. static unsigned int i2c_bus_freq = 100;
  26. module_param(i2c_bus_freq, int, 0);
  27. MODULE_PARM_DESC(i2c_bus_freq,
  28. "i2c bus frequency in khz (default is 100) valid values: 10, 100, 200, 400, 1000, 3000, 6000");
  29. static int vprbrd_i2c_status(struct i2c_adapter *i2c,
  30. struct vprbrd_i2c_status *status, bool prev_error)
  31. {
  32. u16 bytes_xfer;
  33. int ret;
  34. struct vprbrd *vb = (struct vprbrd *)i2c->algo_data;
  35. /* check for protocol error */
  36. bytes_xfer = sizeof(struct vprbrd_i2c_status);
  37. ret = usb_control_msg(vb->usb_dev, usb_rcvctrlpipe(vb->usb_dev, 0),
  38. VPRBRD_USB_REQUEST_I2C, VPRBRD_USB_TYPE_IN, 0x0000, 0x0000,
  39. status, bytes_xfer, VPRBRD_USB_TIMEOUT_MS);
  40. if (ret != bytes_xfer)
  41. prev_error = true;
  42. if (prev_error) {
  43. dev_err(&i2c->dev, "failure in usb communication\n");
  44. return -EREMOTEIO;
  45. }
  46. dev_dbg(&i2c->dev, " status = %d\n", status->status);
  47. if (status->status != 0x00) {
  48. dev_err(&i2c->dev, "failure: i2c protocol error\n");
  49. return -EPROTO;
  50. }
  51. return 0;
  52. }
  53. static int vprbrd_i2c_receive(struct usb_device *usb_dev,
  54. struct vprbrd_i2c_read_msg *rmsg, int bytes_xfer)
  55. {
  56. int ret, bytes_actual;
  57. int error = 0;
  58. /* send the read request */
  59. ret = usb_bulk_msg(usb_dev,
  60. usb_sndbulkpipe(usb_dev, VPRBRD_EP_OUT), rmsg,
  61. sizeof(struct vprbrd_i2c_read_hdr), &bytes_actual,
  62. VPRBRD_USB_TIMEOUT_MS);
  63. if ((ret < 0)
  64. || (bytes_actual != sizeof(struct vprbrd_i2c_read_hdr))) {
  65. dev_err(&usb_dev->dev, "failure transmitting usb\n");
  66. error = -EREMOTEIO;
  67. }
  68. /* read the actual data */
  69. ret = usb_bulk_msg(usb_dev,
  70. usb_rcvbulkpipe(usb_dev, VPRBRD_EP_IN), rmsg,
  71. bytes_xfer, &bytes_actual, VPRBRD_USB_TIMEOUT_MS);
  72. if ((ret < 0) || (bytes_xfer != bytes_actual)) {
  73. dev_err(&usb_dev->dev, "failure receiving usb\n");
  74. error = -EREMOTEIO;
  75. }
  76. return error;
  77. }
  78. static int vprbrd_i2c_addr(struct usb_device *usb_dev,
  79. struct vprbrd_i2c_addr_msg *amsg)
  80. {
  81. int ret, bytes_actual;
  82. ret = usb_bulk_msg(usb_dev,
  83. usb_sndbulkpipe(usb_dev, VPRBRD_EP_OUT), amsg,
  84. sizeof(struct vprbrd_i2c_addr_msg), &bytes_actual,
  85. VPRBRD_USB_TIMEOUT_MS);
  86. if ((ret < 0) ||
  87. (sizeof(struct vprbrd_i2c_addr_msg) != bytes_actual)) {
  88. dev_err(&usb_dev->dev, "failure transmitting usb\n");
  89. return -EREMOTEIO;
  90. }
  91. return 0;
  92. }
  93. static int vprbrd_i2c_read(struct vprbrd *vb, struct i2c_msg *msg)
  94. {
  95. int ret;
  96. u16 remain_len, len1, len2, start = 0x0000;
  97. struct vprbrd_i2c_read_msg *rmsg =
  98. (struct vprbrd_i2c_read_msg *)vb->buf;
  99. remain_len = msg->len;
  100. rmsg->header.cmd = VPRBRD_I2C_CMD_READ;
  101. while (remain_len > 0) {
  102. rmsg->header.addr = cpu_to_le16(start + 0x4000);
  103. if (remain_len <= 255) {
  104. len1 = remain_len;
  105. len2 = 0x00;
  106. rmsg->header.len0 = remain_len;
  107. rmsg->header.len1 = 0x00;
  108. rmsg->header.len2 = 0x00;
  109. rmsg->header.len3 = 0x00;
  110. rmsg->header.len4 = 0x00;
  111. rmsg->header.len5 = 0x00;
  112. remain_len = 0;
  113. } else if (remain_len <= 510) {
  114. len1 = remain_len;
  115. len2 = 0x00;
  116. rmsg->header.len0 = remain_len - 255;
  117. rmsg->header.len1 = 0xff;
  118. rmsg->header.len2 = 0x00;
  119. rmsg->header.len3 = 0x00;
  120. rmsg->header.len4 = 0x00;
  121. rmsg->header.len5 = 0x00;
  122. remain_len = 0;
  123. } else if (remain_len <= 512) {
  124. len1 = remain_len;
  125. len2 = 0x00;
  126. rmsg->header.len0 = remain_len - 510;
  127. rmsg->header.len1 = 0xff;
  128. rmsg->header.len2 = 0xff;
  129. rmsg->header.len3 = 0x00;
  130. rmsg->header.len4 = 0x00;
  131. rmsg->header.len5 = 0x00;
  132. remain_len = 0;
  133. } else if (remain_len <= 767) {
  134. len1 = 512;
  135. len2 = remain_len - 512;
  136. rmsg->header.len0 = 0x02;
  137. rmsg->header.len1 = 0xff;
  138. rmsg->header.len2 = 0xff;
  139. rmsg->header.len3 = remain_len - 512;
  140. rmsg->header.len4 = 0x00;
  141. rmsg->header.len5 = 0x00;
  142. remain_len = 0;
  143. } else if (remain_len <= 1022) {
  144. len1 = 512;
  145. len2 = remain_len - 512;
  146. rmsg->header.len0 = 0x02;
  147. rmsg->header.len1 = 0xff;
  148. rmsg->header.len2 = 0xff;
  149. rmsg->header.len3 = remain_len - 767;
  150. rmsg->header.len4 = 0xff;
  151. rmsg->header.len5 = 0x00;
  152. remain_len = 0;
  153. } else if (remain_len <= 1024) {
  154. len1 = 512;
  155. len2 = remain_len - 512;
  156. rmsg->header.len0 = 0x02;
  157. rmsg->header.len1 = 0xff;
  158. rmsg->header.len2 = 0xff;
  159. rmsg->header.len3 = remain_len - 1022;
  160. rmsg->header.len4 = 0xff;
  161. rmsg->header.len5 = 0xff;
  162. remain_len = 0;
  163. } else {
  164. len1 = 512;
  165. len2 = 512;
  166. rmsg->header.len0 = 0x02;
  167. rmsg->header.len1 = 0xff;
  168. rmsg->header.len2 = 0xff;
  169. rmsg->header.len3 = 0x02;
  170. rmsg->header.len4 = 0xff;
  171. rmsg->header.len5 = 0xff;
  172. remain_len -= 1024;
  173. start += 1024;
  174. }
  175. rmsg->header.tf1 = cpu_to_le16(len1);
  176. rmsg->header.tf2 = cpu_to_le16(len2);
  177. /* first read transfer */
  178. ret = vprbrd_i2c_receive(vb->usb_dev, rmsg, len1);
  179. if (ret < 0)
  180. return ret;
  181. /* copy the received data */
  182. memcpy(msg->buf + start, rmsg, len1);
  183. /* second read transfer if neccessary */
  184. if (len2 > 0) {
  185. ret = vprbrd_i2c_receive(vb->usb_dev, rmsg, len2);
  186. if (ret < 0)
  187. return ret;
  188. /* copy the received data */
  189. memcpy(msg->buf + start + 512, rmsg, len2);
  190. }
  191. }
  192. return 0;
  193. }
  194. static int vprbrd_i2c_write(struct vprbrd *vb, struct i2c_msg *msg)
  195. {
  196. int ret, bytes_actual;
  197. u16 remain_len, bytes_xfer,
  198. start = 0x0000;
  199. struct vprbrd_i2c_write_msg *wmsg =
  200. (struct vprbrd_i2c_write_msg *)vb->buf;
  201. remain_len = msg->len;
  202. wmsg->header.cmd = VPRBRD_I2C_CMD_WRITE;
  203. wmsg->header.last = 0x00;
  204. wmsg->header.chan = 0x00;
  205. wmsg->header.spi = 0x0000;
  206. while (remain_len > 0) {
  207. wmsg->header.addr = cpu_to_le16(start + 0x4000);
  208. if (remain_len > 503) {
  209. wmsg->header.len1 = 0xff;
  210. wmsg->header.len2 = 0xf8;
  211. remain_len -= 503;
  212. bytes_xfer = 503 + sizeof(struct vprbrd_i2c_write_hdr);
  213. start += 503;
  214. } else if (remain_len > 255) {
  215. wmsg->header.len1 = 0xff;
  216. wmsg->header.len2 = (remain_len - 255);
  217. bytes_xfer = remain_len +
  218. sizeof(struct vprbrd_i2c_write_hdr);
  219. remain_len = 0;
  220. } else {
  221. wmsg->header.len1 = remain_len;
  222. wmsg->header.len2 = 0x00;
  223. bytes_xfer = remain_len +
  224. sizeof(struct vprbrd_i2c_write_hdr);
  225. remain_len = 0;
  226. }
  227. memcpy(wmsg->data, msg->buf + start,
  228. bytes_xfer - sizeof(struct vprbrd_i2c_write_hdr));
  229. ret = usb_bulk_msg(vb->usb_dev,
  230. usb_sndbulkpipe(vb->usb_dev,
  231. VPRBRD_EP_OUT), wmsg,
  232. bytes_xfer, &bytes_actual, VPRBRD_USB_TIMEOUT_MS);
  233. if ((ret < 0) || (bytes_xfer != bytes_actual))
  234. return -EREMOTEIO;
  235. }
  236. return 0;
  237. }
  238. static int vprbrd_i2c_xfer(struct i2c_adapter *i2c, struct i2c_msg *msgs,
  239. int num)
  240. {
  241. struct i2c_msg *pmsg;
  242. int i, ret,
  243. error = 0;
  244. struct vprbrd *vb = (struct vprbrd *)i2c->algo_data;
  245. struct vprbrd_i2c_addr_msg *amsg =
  246. (struct vprbrd_i2c_addr_msg *)vb->buf;
  247. struct vprbrd_i2c_status *smsg = (struct vprbrd_i2c_status *)vb->buf;
  248. dev_dbg(&i2c->dev, "master xfer %d messages:\n", num);
  249. for (i = 0 ; i < num ; i++) {
  250. pmsg = &msgs[i];
  251. dev_dbg(&i2c->dev,
  252. " %d: %s (flags %d) %d bytes to 0x%02x\n",
  253. i, pmsg->flags & I2C_M_RD ? "read" : "write",
  254. pmsg->flags, pmsg->len, pmsg->addr);
  255. mutex_lock(&vb->lock);
  256. /* directly send the message */
  257. if (pmsg->flags & I2C_M_RD) {
  258. /* read data */
  259. amsg->cmd = VPRBRD_I2C_CMD_ADDR;
  260. amsg->unknown2 = 0x00;
  261. amsg->unknown3 = 0x00;
  262. amsg->addr = pmsg->addr;
  263. amsg->unknown1 = 0x01;
  264. amsg->len = cpu_to_le16(pmsg->len);
  265. /* send the addr and len, we're interested to board */
  266. ret = vprbrd_i2c_addr(vb->usb_dev, amsg);
  267. if (ret < 0)
  268. error = ret;
  269. ret = vprbrd_i2c_read(vb, pmsg);
  270. if (ret < 0)
  271. error = ret;
  272. ret = vprbrd_i2c_status(i2c, smsg, error);
  273. if (ret < 0)
  274. error = ret;
  275. /* in case of protocol error, return the error */
  276. if (error < 0)
  277. goto error;
  278. } else {
  279. /* write data */
  280. ret = vprbrd_i2c_write(vb, pmsg);
  281. amsg->cmd = VPRBRD_I2C_CMD_ADDR;
  282. amsg->unknown2 = 0x00;
  283. amsg->unknown3 = 0x00;
  284. amsg->addr = pmsg->addr;
  285. amsg->unknown1 = 0x00;
  286. amsg->len = cpu_to_le16(pmsg->len);
  287. /* send the addr, the data goes to to board */
  288. ret = vprbrd_i2c_addr(vb->usb_dev, amsg);
  289. if (ret < 0)
  290. error = ret;
  291. ret = vprbrd_i2c_status(i2c, smsg, error);
  292. if (ret < 0)
  293. error = ret;
  294. if (error < 0)
  295. goto error;
  296. }
  297. mutex_unlock(&vb->lock);
  298. }
  299. return num;
  300. error:
  301. mutex_unlock(&vb->lock);
  302. return error;
  303. }
  304. static u32 vprbrd_i2c_func(struct i2c_adapter *i2c)
  305. {
  306. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
  307. }
  308. /* This is the actual algorithm we define */
  309. static const struct i2c_algorithm vprbrd_algorithm = {
  310. .master_xfer = vprbrd_i2c_xfer,
  311. .functionality = vprbrd_i2c_func,
  312. };
  313. static const struct i2c_adapter_quirks vprbrd_quirks = {
  314. .max_read_len = 2048,
  315. .max_write_len = 2048,
  316. };
  317. static int vprbrd_i2c_probe(struct platform_device *pdev)
  318. {
  319. struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent);
  320. struct vprbrd_i2c *vb_i2c;
  321. int ret;
  322. int pipe;
  323. vb_i2c = devm_kzalloc(&pdev->dev, sizeof(*vb_i2c), GFP_KERNEL);
  324. if (vb_i2c == NULL)
  325. return -ENOMEM;
  326. /* setup i2c adapter description */
  327. vb_i2c->i2c.owner = THIS_MODULE;
  328. vb_i2c->i2c.class = I2C_CLASS_HWMON;
  329. vb_i2c->i2c.algo = &vprbrd_algorithm;
  330. vb_i2c->i2c.quirks = &vprbrd_quirks;
  331. vb_i2c->i2c.algo_data = vb;
  332. /* save the param in usb capabable memory */
  333. vb_i2c->bus_freq_param = i2c_bus_param;
  334. snprintf(vb_i2c->i2c.name, sizeof(vb_i2c->i2c.name),
  335. "viperboard at bus %03d device %03d",
  336. vb->usb_dev->bus->busnum, vb->usb_dev->devnum);
  337. /* setting the bus frequency */
  338. if ((i2c_bus_param <= VPRBRD_I2C_FREQ_10KHZ)
  339. && (i2c_bus_param >= VPRBRD_I2C_FREQ_6MHZ)) {
  340. pipe = usb_sndctrlpipe(vb->usb_dev, 0);
  341. ret = usb_control_msg(vb->usb_dev, pipe,
  342. VPRBRD_USB_REQUEST_I2C_FREQ, VPRBRD_USB_TYPE_OUT,
  343. 0x0000, 0x0000, &vb_i2c->bus_freq_param, 1,
  344. VPRBRD_USB_TIMEOUT_MS);
  345. if (ret != 1) {
  346. dev_err(&pdev->dev, "failure setting i2c_bus_freq to %d\n",
  347. i2c_bus_freq);
  348. return -EIO;
  349. }
  350. } else {
  351. dev_err(&pdev->dev,
  352. "invalid i2c_bus_freq setting:%d\n", i2c_bus_freq);
  353. return -EIO;
  354. }
  355. vb_i2c->i2c.dev.parent = &pdev->dev;
  356. /* attach to i2c layer */
  357. i2c_add_adapter(&vb_i2c->i2c);
  358. platform_set_drvdata(pdev, vb_i2c);
  359. return 0;
  360. }
  361. static int vprbrd_i2c_remove(struct platform_device *pdev)
  362. {
  363. struct vprbrd_i2c *vb_i2c = platform_get_drvdata(pdev);
  364. i2c_del_adapter(&vb_i2c->i2c);
  365. return 0;
  366. }
  367. static struct platform_driver vprbrd_i2c_driver = {
  368. .driver.name = "viperboard-i2c",
  369. .driver.owner = THIS_MODULE,
  370. .probe = vprbrd_i2c_probe,
  371. .remove = vprbrd_i2c_remove,
  372. };
  373. static int __init vprbrd_i2c_init(void)
  374. {
  375. switch (i2c_bus_freq) {
  376. case 6000:
  377. i2c_bus_param = VPRBRD_I2C_FREQ_6MHZ;
  378. break;
  379. case 3000:
  380. i2c_bus_param = VPRBRD_I2C_FREQ_3MHZ;
  381. break;
  382. case 1000:
  383. i2c_bus_param = VPRBRD_I2C_FREQ_1MHZ;
  384. break;
  385. case 400:
  386. i2c_bus_param = VPRBRD_I2C_FREQ_400KHZ;
  387. break;
  388. case 200:
  389. i2c_bus_param = VPRBRD_I2C_FREQ_200KHZ;
  390. break;
  391. case 100:
  392. i2c_bus_param = VPRBRD_I2C_FREQ_100KHZ;
  393. break;
  394. case 10:
  395. i2c_bus_param = VPRBRD_I2C_FREQ_10KHZ;
  396. break;
  397. default:
  398. pr_warn("invalid i2c_bus_freq (%d)\n", i2c_bus_freq);
  399. i2c_bus_param = VPRBRD_I2C_FREQ_100KHZ;
  400. }
  401. return platform_driver_register(&vprbrd_i2c_driver);
  402. }
  403. subsys_initcall(vprbrd_i2c_init);
  404. static void __exit vprbrd_i2c_exit(void)
  405. {
  406. platform_driver_unregister(&vprbrd_i2c_driver);
  407. }
  408. module_exit(vprbrd_i2c_exit);
  409. MODULE_AUTHOR("Lars Poeschel <[email protected]>");
  410. MODULE_DESCRIPTION("I2C master driver for Nano River Techs Viperboard");
  411. MODULE_LICENSE("GPL");
  412. MODULE_ALIAS("platform:viperboard-i2c");