i2c_common.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/i2c.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/dma-mapping.h>
  6. #include <linux/slab.h>
  7. #include <linux/errno.h>
  8. #include <linux/err.h>
  9. /* #include <mach/mt_pm_ldo.h> */
  10. #include <asm/memory.h>
  11. #include <mt_i2c.h>
  12. static char data_buffer[256 * 4];
  13. static ssize_t show_config(struct device *dev, struct device_attribute *attr, char *buff)
  14. {
  15. int len = strlen(data_buffer);
  16. memcpy(buff, data_buffer, len);
  17. I2CLOG("Return Value:%s\n", data_buffer);
  18. return len;
  19. }
  20. static int pows(int x, int y)
  21. {
  22. int result = 1;
  23. while (y--)
  24. result *= x;
  25. return result;
  26. }
  27. int string2hex(const char *buffer, int cnt)
  28. {
  29. int c = 0;
  30. char t = 0;
  31. int count = cnt;
  32. while (count--) {
  33. t = *(buffer + cnt - count - 1);
  34. if (t >= 'A' && t <= 'F')
  35. c += ((t - 'A') + 10) * pows(16, count);
  36. else if (t >= '0' && t <= '9')
  37. c += (t - '0') * pows(16, count);
  38. else
  39. c = -1;
  40. }
  41. return c;
  42. }
  43. char *get_hexbuffer(char *data_buffer, char *hex_buffer)
  44. {
  45. char *ptr = data_buffer;
  46. int index = 0;
  47. while (*ptr && *++ptr) {
  48. *(hex_buffer + index++) = string2hex(ptr - 1, 2);
  49. ptr++;
  50. }
  51. *(hex_buffer + index) = 0;
  52. return hex_buffer;
  53. }
  54. int i2c_trans_data(int bus_id, int address, char *buf, int count, unsigned int ext_flag, int timing,
  55. int op)
  56. {
  57. int ret;
  58. struct i2c_msg msg;
  59. struct i2c_adapter *adap;
  60. adap = i2c_get_adapter(bus_id);
  61. if (!adap)
  62. return -1;
  63. msg.addr = address;
  64. if (0 == op)
  65. msg.flags = 0;
  66. else if (1 == op)
  67. msg.flags = I2C_M_RD;
  68. else if (2 == op)
  69. msg.flags = 0;
  70. /* msg.flags = ((ext_flag & 0x80000000)?I2C_M_RD:0); */
  71. msg.len = count;
  72. msg.buf = (char *)buf;
  73. #ifdef CONFIG_MTK_I2C_EXTENSION
  74. msg.timing = timing;
  75. msg.ext_flag = ext_flag;
  76. #endif
  77. /* msg.ext_flag = (ext_flag & 0x7FFF00FF); */
  78. /* msg.addr |= ext_flag & 0x0000FF00; */
  79. ret = i2c_transfer(adap, &msg, 1);
  80. /* If everything went ok (i.e. 1 msg transmitted), return #bytes
  81. transmitted, else error code. */
  82. i2c_put_adapter(adap);
  83. return (ret == 1) ? count : ret;
  84. }
  85. int mt_i2c_test(int id, int addr)
  86. {
  87. int ret = 0;
  88. unsigned long flag;
  89. /* unsigned char buffer[]={0x55}; */
  90. if (id > 3)
  91. flag = I2C_DIRECTION_FLAG;
  92. /* flag |= 0x80000000; */
  93. /* ret = i2c_trans_data(id, addr,buffer,1,flag,200); */
  94. return ret;
  95. }
  96. EXPORT_SYMBOL(mt_i2c_test);
  97. /* extern struct mt_i2c_t ; */
  98. static int i2c_test_reg(int bus_id, int val)
  99. {
  100. int ret = 0;
  101. struct i2c_adapter *adap;
  102. struct mt_i2c_t *i2c;
  103. adap = i2c_get_adapter(bus_id);
  104. if (!adap)
  105. return -1;
  106. i2c = container_of(adap, struct mt_i2c_t, adap);
  107. I2CLOG("I2C%d base address 0x%p\n", bus_id, i2c->base);
  108. /* write i2c writable register with 0 */
  109. i2c_writel(i2c, OFFSET_SLAVE_ADDR, val);
  110. i2c_writel(i2c, OFFSET_INTR_MASK, val);
  111. i2c_writel(i2c, OFFSET_INTR_STAT, val);
  112. i2c_writel(i2c, OFFSET_CONTROL, val);
  113. i2c_writel(i2c, OFFSET_TRANSFER_LEN, val);
  114. i2c_writel(i2c, OFFSET_TRANSAC_LEN, val);
  115. i2c_writel(i2c, OFFSET_DELAY_LEN, val);
  116. i2c_writel(i2c, OFFSET_TIMING, val);
  117. i2c_writel(i2c, OFFSET_EXT_CONF, val);
  118. i2c_writel(i2c, OFFSET_IO_CONFIG, val);
  119. i2c_writel(i2c, OFFSET_HS, val);
  120. /* If everything went ok (i.e. 1 msg transmitted), return #bytes
  121. transmitted, else error code. */
  122. i2c_put_adapter(adap);
  123. return ret;
  124. }
  125. static int i2c_soft_reset(int bus_id)
  126. {
  127. int ret = 0;
  128. struct i2c_adapter *adap;
  129. struct mt_i2c_t *i2c;
  130. adap = i2c_get_adapter(bus_id);
  131. if (!adap)
  132. return -1;
  133. i2c = container_of(adap, struct mt_i2c_t, adap);
  134. I2CLOG("I2C%d base address 0x%p\n", bus_id, i2c->base);
  135. /* write i2c writable register with 0 */
  136. i2c_writel(i2c, OFFSET_SOFTRESET, 1);
  137. /* If everything went ok (i.e. 1 msg transmitted), return #bytes
  138. transmitted, else error code. */
  139. i2c_put_adapter(adap);
  140. return ret;
  141. }
  142. static int i2c_ext_conf_test(int bus_id, int val)
  143. {
  144. int ret = 0;
  145. struct i2c_adapter *adap;
  146. struct mt_i2c_t *i2c;
  147. adap = i2c_get_adapter(bus_id);
  148. if (!adap)
  149. return -1;
  150. i2c = container_of(adap, struct mt_i2c_t, adap);
  151. I2CLOG("I2C%d base address 0x%p\n", bus_id, i2c->base);
  152. /* write i2c writable register with 0 */
  153. i2c_writel(i2c, OFFSET_EXT_CONF, val);
  154. I2CLOG("EXT_CONF 0x%x", i2c_readl(i2c, OFFSET_EXT_CONF));
  155. /* If everything went ok (i.e. 1 msg transmitted), return #bytes
  156. transmitted, else error code. */
  157. i2c_put_adapter(adap);
  158. return ret;
  159. }
  160. static void hex2string(unsigned char *in, unsigned char *out, int length)
  161. {
  162. unsigned char *ptr = in;
  163. unsigned char *ptrout = out;
  164. unsigned char t;
  165. while (length--) {
  166. t = (*ptr & 0xF0) >> 4;
  167. if (t < 10)
  168. *ptrout = t + '0';
  169. else
  170. *ptrout = t + 'A' - 10;
  171. ptrout++;
  172. t = (*ptr & 0x0F);
  173. if (t < 10)
  174. *ptrout = t + '0';
  175. else
  176. *ptrout = t + 'A' - 10;
  177. ptr++;
  178. ptrout++;
  179. }
  180. *ptrout = 0;
  181. }
  182. static ssize_t set_config(struct device *dev, struct device_attribute *attr, const char *buf,
  183. size_t count)
  184. {
  185. int bus_id;
  186. int address;
  187. int operation;
  188. int trans_mode;
  189. int trans_stop;
  190. int speed_mode;
  191. int pushpull_mode;
  192. int query_mode;
  193. int timing;
  194. int trans_num;
  195. int trans_auxlen;
  196. int dir = 0;
  197. int number = 0;
  198. int length = 0;
  199. unsigned int ext_flag = 0;
  200. dma_addr_t dma_addr = 0;
  201. void *vir_addr = NULL;
  202. /* int status; */
  203. int ret = 0;
  204. unsigned char tmpbuffer[128];
  205. I2CLOG("%s\n", buf);
  206. /* if ( sscanf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d %s",
  207. &bus_id, &address, &operation, &trans_mode, &trans_stop,
  208. &speed_mode, &pushpull_mode, &query_mode, &timing, &trans_num,
  209. &trans_auxlen,&dir, data_buffer) ) { */
  210. if (sscanf(buf, "%d %x %d %d %d %d %d %d %d %d %d %s", &bus_id, &address, &operation, &trans_mode,
  211. &trans_stop, &speed_mode, &pushpull_mode, &query_mode, &timing, &trans_num,
  212. &trans_auxlen, data_buffer) != 0) {
  213. if ((address != 0) && (operation <= 2)) {
  214. length = strlen(data_buffer);
  215. if (operation == 0) {
  216. ext_flag |= I2C_WR_FLAG;
  217. number = (trans_auxlen << 8) | (length >> 1); /* /TODO:need to confitm 8 Or 16 */
  218. } else if (operation == 1) {
  219. /* ext_flag |= 0x80000000; */
  220. number = (trans_num << 16) | (length >> 1);
  221. } else if (operation == 2) {
  222. /* ext_flag &= 0x7FFFFFFF; */
  223. number = (trans_num << 16) | (length >> 1);
  224. } else {
  225. I2CERR("invalid operation\n");
  226. goto err;
  227. }
  228. if (dir > 0)
  229. ext_flag |= I2C_DIRECTION_FLAG;
  230. if (trans_mode == 0) {
  231. /* default is fifo */
  232. } else if (trans_mode == 1) {
  233. ext_flag |= I2C_DMA_FLAG;
  234. } else {
  235. I2CERR("invalid trans_mod fifo/dma\n");
  236. goto err;
  237. }
  238. if (trans_stop == 0) {
  239. /* default */
  240. } else if (trans_stop == 1) {
  241. ext_flag |= I2C_RS_FLAG;
  242. } else {
  243. I2CERR("invalid trans_stop\n");
  244. goto err;
  245. }
  246. if (speed_mode == 0) {
  247. timing = 0; /* ST mode */
  248. } else if (speed_mode == 1) {
  249. /* ext_flag |= I2C_FS_FLAG;//FS MODE */
  250. } else if (speed_mode == 2) {
  251. ext_flag |= I2C_HS_FLAG; /* HS mode */
  252. } else {
  253. I2CERR("invalid speed_mode\n");
  254. goto err;
  255. }
  256. if (pushpull_mode == 0) {
  257. /* default */
  258. } else if (pushpull_mode == 1) {
  259. ext_flag |= I2C_PUSHPULL_FLAG;
  260. } else {
  261. I2CERR("invalid pushpull mode\n");
  262. goto err;
  263. }
  264. if (query_mode == 0) {
  265. /* */
  266. } else if (query_mode == 1) {
  267. ext_flag |= I2C_POLLING_FLAG;
  268. } else {
  269. I2CERR("invalid query mode interrupt/polling\n");
  270. goto err;
  271. }
  272. if (trans_mode == 1) { /*DMA MODE */
  273. /*need GFP_DMA32 flag to confirm DMA alloc PA is 32bit range */
  274. vir_addr =
  275. dma_alloc_coherent(dev, length >> 1, &dma_addr,
  276. GFP_KERNEL | GFP_DMA32);
  277. if (vir_addr == NULL) {
  278. I2CERR("alloc dma memory failed\n");
  279. goto err;
  280. }
  281. } else {
  282. vir_addr = kzalloc(length >> 1, GFP_KERNEL);
  283. if (vir_addr == NULL) {
  284. I2CERR("alloc virtual memory failed\n");
  285. goto err;
  286. }
  287. }
  288. get_hexbuffer(data_buffer, vir_addr);
  289. I2CLOG("bus_id:%d,address:%x,count:%x,ext_flag:0x%x,timing:%d\n", bus_id,
  290. address, number, ext_flag, timing);
  291. I2CLOG("data_buffer:%s\n", data_buffer);
  292. if (trans_mode == 1) {
  293. #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
  294. pr_info("phys_addr: 0x%llx\n", dma_addr);
  295. #else
  296. pr_info("phys_addr: 0x%x\n", dma_addr);
  297. #endif
  298. ret =
  299. i2c_trans_data(bus_id, address, mt_i2c_bus_to_virt(dma_addr),
  300. number, ext_flag, timing, operation);
  301. } else {
  302. ret =
  303. i2c_trans_data(bus_id, address, vir_addr, number, ext_flag,
  304. timing, operation);
  305. }
  306. /* dealing */
  307. if (ret >= 0) {
  308. if (operation == 1) {
  309. hex2string(vir_addr, tmpbuffer, length >> 1);
  310. sprintf(data_buffer, "1 %s", tmpbuffer);
  311. I2CLOG("received data: %s\n", tmpbuffer);
  312. } else if (operation == 0) {
  313. hex2string(vir_addr, tmpbuffer, trans_auxlen);
  314. sprintf(data_buffer, "1 %s", tmpbuffer);
  315. I2CLOG("received data: %s\n", tmpbuffer);
  316. } else {
  317. sprintf(data_buffer, "1 %s", "00");
  318. }
  319. I2CLOG("Actual return Value:%d 0x%p\n", ret, vir_addr);
  320. } else if (ret < 0) {
  321. if (ret == -EINVAL)
  322. sprintf(data_buffer, "0 %s", "Invalid Parameter");
  323. else if (ret == -ETIMEDOUT)
  324. sprintf(data_buffer, "0 %s", "Transfer Timeout");
  325. else if (ret == -EREMOTEIO)
  326. sprintf(data_buffer, "0 %s", "Ack Error");
  327. else
  328. sprintf(data_buffer, "0 %s", "unknown error");
  329. I2CLOG("Actual return Value:%d 0x%p\n", ret, vir_addr);
  330. }
  331. if (trans_mode == 1 && vir_addr != NULL) { /*DMA MODE */
  332. dma_free_coherent(dev, length >> 1, vir_addr, dma_addr);
  333. } else {
  334. kfree(vir_addr);
  335. }
  336. /* log for UT test. */
  337. {
  338. struct i2c_adapter *adap = i2c_get_adapter(bus_id);
  339. struct mt_i2c_t *i2c = i2c_get_adapdata(adap);
  340. _i2c_dump_info(i2c);
  341. }
  342. } else {
  343. struct i2c_adapter *adap = i2c_get_adapter(bus_id);
  344. struct mt_i2c_t *i2c = i2c_get_adapdata(adap);
  345. if (operation == 3) {
  346. _i2c_dump_info(i2c);
  347. } else if (operation == 4) {
  348. i2c_test_reg(bus_id, 0);
  349. _i2c_dump_info(i2c);
  350. i2c_test_reg(bus_id, 0xFFFFFFFF);
  351. _i2c_dump_info(i2c);
  352. } else if (operation == 5) {
  353. i2c_ext_conf_test(bus_id, address);
  354. } else if (operation == 9) {
  355. i2c_soft_reset(bus_id);
  356. _i2c_dump_info(i2c);
  357. } else if (operation == 6) {
  358. if (bus_id == 0) {
  359. /* I2C0 PINMUX2 power on */
  360. /* hwPowerOn(MT65XX_POWER_LDO_VMC1,VOL_DEFAULT,"i2c_pinmux"); */
  361. /* hwPowerOn(MT65XX_POWER_LDO_VMCH1,VOL_DEFAULT,"i2c_pinmux"); */
  362. }
  363. } else if (operation == 7) {
  364. mt_i2c_test(1, 0x50);
  365. } else {
  366. dev_err(dev, "i2c debug system: Parameter invalid!\n");
  367. }
  368. _i2c_dump_info(i2c);
  369. }
  370. } else {
  371. /*parameter invalid */
  372. dev_err(dev, "i2c debug system: Parameter invalid!\n");
  373. }
  374. return count;
  375. err:
  376. I2CERR("analyze failed\n");
  377. return -1;
  378. }
  379. static DEVICE_ATTR(ut, 0660, show_config, set_config);
  380. static int i2c_common_probe(struct platform_device *pdev)
  381. {
  382. int ret = 0;
  383. /* your code here£¬your should save client in your own way */
  384. I2CLOG("i2c_common device probe\n");
  385. ret = device_create_file(&pdev->dev, &dev_attr_ut);
  386. return ret;
  387. }
  388. static int i2c_common_remove(struct platform_device *pdev)
  389. {
  390. int ret = 0;
  391. /* your code here */
  392. device_remove_file(&pdev->dev, &dev_attr_ut);
  393. return ret;
  394. }
  395. static struct platform_driver i2c_common_driver = {
  396. .driver = {
  397. .name = "mt-i2cd",
  398. .owner = THIS_MODULE,
  399. },
  400. .probe = i2c_common_probe,
  401. .remove = i2c_common_remove,
  402. };
  403. /* platform device */
  404. static struct platform_device i2c_common_device = {
  405. .name = "mt-i2cd",
  406. .dev = {
  407. .coherent_dma_mask = DMA_BIT_MASK(32),
  408. },
  409. };
  410. static int __init xxx_init(void)
  411. {
  412. I2CLOG("i2c_common device init\n");
  413. platform_device_register(&i2c_common_device);
  414. return platform_driver_register(&i2c_common_driver);
  415. }
  416. static void __exit xxx_exit(void)
  417. {
  418. platform_driver_unregister(&i2c_common_driver);
  419. platform_device_unregister(&i2c_common_device);
  420. }
  421. module_init(xxx_init);
  422. module_exit(xxx_exit);
  423. MODULE_LICENSE("GPL");
  424. MODULE_DESCRIPTION("MediaTek I2C Bus Driver Test Driver");
  425. MODULE_AUTHOR("Ranran Lu");