mtk-phy-gpio.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #include "mtk-phy.h"
  2. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  3. /* TEST CHIP PHY define, edit this in different platform */
  4. #define U3_PHY_I2C_DEV 0x60
  5. #define U3_PHY_PAGE 0xff
  6. #define GPIO_BASE (u3_sif_base + 0x700) /* 0xf0044700 */
  7. #define SSUSB_I2C_OUT (GPIO_BASE + 0xd0)
  8. #define SSUSB_I2C_IN (GPIO_BASE + 0xd4)
  9. #if 1 /* #ifdef NEVER //USE_GPIO */
  10. /* /////////////////////////////////////////////////////////////// */
  11. #define OUTPUT 1
  12. #define INPUT 0
  13. #define SDA 0 /* / GPIO #0: I2C data pin */
  14. #define SCL 1 /* / GPIO #1: I2C clock pin */
  15. /* /////////////////////////////////////////////////////////////// */
  16. #define SDA_OUT (1<<0)
  17. #define SDA_OEN (1<<1)
  18. #define SCL_OUT (1<<2)
  19. #define SCL_OEN (1<<3)
  20. #define SDA_IN_OFFSET 0
  21. #define SCL_IN_OFFSET 1
  22. /* #define GPIO_PULLEN1_SET (GPIO_BASE+0x0030+0x04) */
  23. /* #define GPIO_DIR1_SET (GPIO_BASE+0x0000+0x04) */
  24. /* #define GPIO_PULLEN1_CLR (GPIO_BASE+0x0030+0x08) */
  25. /* #define GPIO_DIR1_CLR (GPIO_BASE+0x0000+0x08) */
  26. /* #define GPIO_DOUT1_SET (GPIO_BASE+0x00C0+0x04) */
  27. /* #define GPIO_DOUT1_CLR (GPIO_BASE+0x00C0+0x08) */
  28. /* #define GPIO_DIN1 (GPIO_BASE+0x00F0) */
  29. void gpio_dir_set(PHY_INT32 pin)
  30. {
  31. PHY_INT32 temp;
  32. u64 addr;
  33. addr = (u64)SSUSB_I2C_OUT;
  34. temp = DRV_Reg32(addr);
  35. if (pin == SDA) {
  36. temp |= SDA_OEN;
  37. DRV_WriteReg32(addr, temp);
  38. } else {
  39. temp |= SCL_OEN;
  40. DRV_WriteReg32(addr, temp);
  41. }
  42. }
  43. void gpio_dir_clr(PHY_INT32 pin)
  44. {
  45. PHY_INT32 temp;
  46. u64 addr;
  47. addr = (u64)SSUSB_I2C_OUT;
  48. temp = DRV_Reg32(addr);
  49. if (pin == SDA) {
  50. temp &= ~SDA_OEN;
  51. DRV_WriteReg32(addr, temp);
  52. } else {
  53. temp &= ~SCL_OEN;
  54. DRV_WriteReg32(addr, temp);
  55. }
  56. }
  57. void gpio_dout_set(PHY_INT32 pin)
  58. {
  59. PHY_INT32 temp;
  60. u64 addr;
  61. addr = (u64)SSUSB_I2C_OUT;
  62. temp = DRV_Reg32(addr);
  63. if (pin == SDA) {
  64. temp |= SDA_OUT;
  65. DRV_WriteReg32(addr, temp);
  66. } else {
  67. temp |= SCL_OUT;
  68. DRV_WriteReg32(addr, temp);
  69. }
  70. }
  71. void gpio_dout_clr(PHY_INT32 pin)
  72. {
  73. PHY_INT32 temp;
  74. u64 addr;
  75. addr = (u64)SSUSB_I2C_OUT;
  76. temp = DRV_Reg32(addr);
  77. if (pin == SDA) {
  78. temp &= ~SDA_OUT;
  79. DRV_WriteReg32(addr, temp);
  80. } else {
  81. temp &= ~SCL_OUT;
  82. DRV_WriteReg32(addr, temp);
  83. }
  84. }
  85. PHY_INT32 gpio_din(PHY_INT32 pin)
  86. {
  87. PHY_INT32 temp;
  88. u64 addr;
  89. addr = (u64)SSUSB_I2C_IN;
  90. temp = DRV_Reg32(addr);
  91. if (pin == SDA)
  92. temp = (temp >> SDA_IN_OFFSET) & 1;
  93. else
  94. temp = (temp >> SCL_IN_OFFSET) & 1;
  95. return temp;
  96. }
  97. /* #define GPIO_PULLEN_SET(_no) (GPIO_PULLEN1_SET+(0x10*(_no))) */
  98. #define GPIO_DIR_SET(pin) gpio_dir_set(pin)
  99. #define GPIO_DOUT_SET(pin) gpio_dout_set(pin)
  100. /* #define GPIO_PULLEN_CLR(_no) (GPIO_PULLEN1_CLR+(0x10*(_no))) */
  101. #define GPIO_DIR_CLR(pin) gpio_dir_clr(pin)
  102. #define GPIO_DOUT_CLR(pin) gpio_dout_clr(pin)
  103. #define GPIO_DIN(pin) gpio_din(pin)
  104. PHY_UINT32 i2c_dummy_cnt;
  105. #define I2C_DELAY 10
  106. #define I2C_DUMMY_DELAY(_delay) for (i2c_dummy_cnt = ((_delay)); i2c_dummy_cnt != 0; i2c_dummy_cnt--)
  107. void GPIO_InitIO(PHY_UINT32 dir, PHY_UINT32 pin)
  108. {
  109. if (dir == OUTPUT) {
  110. /* DRV_WriteReg16(GPIO_PULLEN_SET(no),(1 << remainder)); */
  111. GPIO_DIR_SET(pin);
  112. } else {
  113. /* DRV_WriteReg16(GPIO_PULLEN_CLR(no),(1 << remainder)); */
  114. GPIO_DIR_CLR(pin);
  115. }
  116. I2C_DUMMY_DELAY(100);
  117. }
  118. void GPIO_WriteIO(PHY_UINT32 data, PHY_UINT32 pin)
  119. {
  120. if (data == 1)
  121. GPIO_DOUT_SET(pin);
  122. else
  123. GPIO_DOUT_CLR(pin);
  124. }
  125. PHY_UINT32 GPIO_ReadIO(PHY_UINT32 pin)
  126. {
  127. PHY_UINT16 data;
  128. data = GPIO_DIN(pin);
  129. return (PHY_UINT32) data;
  130. }
  131. void SerialCommStop(void)
  132. {
  133. GPIO_InitIO(OUTPUT, SDA);
  134. GPIO_WriteIO(0, SCL);
  135. I2C_DUMMY_DELAY(I2C_DELAY);
  136. GPIO_WriteIO(0, SDA);
  137. I2C_DUMMY_DELAY(I2C_DELAY);
  138. GPIO_WriteIO(1, SCL);
  139. I2C_DUMMY_DELAY(I2C_DELAY);
  140. GPIO_WriteIO(1, SDA);
  141. I2C_DUMMY_DELAY(I2C_DELAY);
  142. GPIO_InitIO(INPUT, SCL);
  143. GPIO_InitIO(INPUT, SDA);
  144. }
  145. void SerialCommStart(void)
  146. { /* Prepare the SDA and SCL for sending/receiving */
  147. GPIO_InitIO(OUTPUT, SCL);
  148. GPIO_InitIO(OUTPUT, SDA);
  149. GPIO_WriteIO(1, SDA);
  150. I2C_DUMMY_DELAY(I2C_DELAY);
  151. GPIO_WriteIO(1, SCL);
  152. I2C_DUMMY_DELAY(I2C_DELAY);
  153. GPIO_WriteIO(0, SDA);
  154. I2C_DUMMY_DELAY(I2C_DELAY);
  155. GPIO_WriteIO(0, SCL);
  156. I2C_DUMMY_DELAY(I2C_DELAY);
  157. }
  158. PHY_UINT32 SerialCommTxByte(PHY_UINT8 data)
  159. { /* return 0 --> ack */
  160. PHY_INT32 i, ack;
  161. GPIO_InitIO(OUTPUT, SDA);
  162. for (i = 8; --i > 0;) {
  163. GPIO_WriteIO((data >> i) & 0x01, SDA);
  164. I2C_DUMMY_DELAY(I2C_DELAY);
  165. GPIO_WriteIO(1, SCL); /* high */
  166. I2C_DUMMY_DELAY(I2C_DELAY);
  167. GPIO_WriteIO(0, SCL); /* low */
  168. I2C_DUMMY_DELAY(I2C_DELAY);
  169. }
  170. GPIO_WriteIO((data >> i) & 0x01, SDA);
  171. I2C_DUMMY_DELAY(I2C_DELAY);
  172. GPIO_WriteIO(1, SCL); /* high */
  173. I2C_DUMMY_DELAY(I2C_DELAY);
  174. GPIO_WriteIO(0, SCL); /* low */
  175. I2C_DUMMY_DELAY(I2C_DELAY);
  176. GPIO_WriteIO(0, SDA);
  177. I2C_DUMMY_DELAY(I2C_DELAY);
  178. GPIO_InitIO(INPUT, SDA);
  179. I2C_DUMMY_DELAY(I2C_DELAY);
  180. GPIO_WriteIO(1, SCL);
  181. I2C_DUMMY_DELAY(I2C_DELAY);
  182. ack = GPIO_ReadIO(SDA); /* / ack 1: error , 0:ok */
  183. GPIO_WriteIO(0, SCL);
  184. I2C_DUMMY_DELAY(I2C_DELAY);
  185. if (ack == 1)
  186. return PHY_FALSE;
  187. else
  188. return PHY_TRUE;
  189. }
  190. void SerialCommRxByte(PHY_UINT8 *data, PHY_UINT8 ack)
  191. {
  192. PHY_INT32 i;
  193. PHY_UINT32 dataCache;
  194. dataCache = 0;
  195. GPIO_InitIO(INPUT, SDA);
  196. for (i = 8; --i >= 0;) {
  197. dataCache <<= 1;
  198. I2C_DUMMY_DELAY(I2C_DELAY);
  199. GPIO_WriteIO(1, SCL);
  200. I2C_DUMMY_DELAY(I2C_DELAY);
  201. dataCache |= GPIO_ReadIO(SDA);
  202. GPIO_WriteIO(0, SCL);
  203. I2C_DUMMY_DELAY(I2C_DELAY);
  204. }
  205. GPIO_InitIO(OUTPUT, SDA);
  206. GPIO_WriteIO(ack, SDA);
  207. I2C_DUMMY_DELAY(I2C_DELAY);
  208. GPIO_WriteIO(1, SCL);
  209. I2C_DUMMY_DELAY(I2C_DELAY);
  210. GPIO_WriteIO(0, SCL);
  211. I2C_DUMMY_DELAY(I2C_DELAY);
  212. *data = (unsigned char)dataCache;
  213. }
  214. PHY_INT32 I2cWriteReg(PHY_UINT8 dev_id, PHY_UINT8 Addr, PHY_UINT8 Data)
  215. {
  216. PHY_INT32 acknowledge = 0;
  217. SerialCommStart();
  218. acknowledge = SerialCommTxByte((dev_id << 1) & 0xff);
  219. if (acknowledge)
  220. acknowledge = SerialCommTxByte(Addr);
  221. else
  222. return PHY_FALSE;
  223. acknowledge = SerialCommTxByte(Data);
  224. if (acknowledge) {
  225. SerialCommStop();
  226. return PHY_FALSE;
  227. } else {
  228. return PHY_TRUE;
  229. }
  230. }
  231. PHY_INT32 I2cReadReg(PHY_UINT8 dev_id, PHY_UINT8 Addr, PHY_UINT8 *Data)
  232. {
  233. PHY_INT32 acknowledge = 0;
  234. SerialCommStart();
  235. acknowledge = SerialCommTxByte((dev_id << 1) & 0xff);
  236. if (acknowledge)
  237. acknowledge = SerialCommTxByte(Addr);
  238. else
  239. return PHY_FALSE;
  240. SerialCommStart();
  241. acknowledge = SerialCommTxByte(((dev_id << 1) & 0xff) | 0x01);
  242. if (acknowledge)
  243. SerialCommRxByte(Data, 1); /* ack 0: ok , 1 error */
  244. else
  245. return PHY_FALSE;
  246. SerialCommStop();
  247. return acknowledge;
  248. }
  249. #else /* Use I2C controller */
  250. #define REG_I2C_START_BIT 0x1
  251. #define I2C_READ_BIT 0x1
  252. #define PHY_I2C_BASE (i2c1_base)
  253. /* "volatile" type class should not be used, see volatile-considered-harmful.txt */
  254. #define REG_I2C_DATA_PORT (*((volatile unsigned short int *) (PHY_I2C_BASE + 0x00)))
  255. #define REG_I2C_SLAVE_ADDR (*((volatile unsigned short int *) (PHY_I2C_BASE + 0x04)))
  256. #define REG_I2C_TRANSFER_LEN (*((volatile unsigned short int *) (PHY_I2C_BASE + 0x14)))
  257. #define REG_I2C_START (*((volatile unsigned short int *) (PHY_I2C_BASE + 0x24)))
  258. #define REG_I2C_SOFT_RESET (*((volatile unsigned short int *) (PHY_I2C_BASE + 0x50)))
  259. #define REG_I2C_CONTROL (*((volatile unsigned short int *) (PHY_I2C_BASE + 0x10)))
  260. #define IS_PRINT 0
  261. PHY_INT32 I2cWriteReg(PHY_UINT8 dev_id, PHY_UINT8 addr, PHY_UINT8 val)
  262. {
  263. if (IS_PRINT)
  264. pr_info("I2C Write@%x [%x]=%x\n", dev_id, addr, val);
  265. REG_I2C_SLAVE_ADDR = dev_id << 1;
  266. REG_I2C_TRANSFER_LEN = 2;
  267. REG_I2C_DATA_PORT = addr;
  268. REG_I2C_DATA_PORT = val;
  269. REG_I2C_START = REG_I2C_START_BIT;
  270. while ((REG_I2C_START & REG_I2C_START_BIT))
  271. ;
  272. return PHY_TRUE;
  273. }
  274. PHY_INT32 I2cReadReg(PHY_UINT8 dev_id, PHY_UINT8 addr, PHY_UINT8 *data)
  275. {
  276. if (IS_PRINT)
  277. pr_info("I2C Read@%x [%x]\n", dev_id, addr);
  278. REG_I2C_SLAVE_ADDR = dev_id << 1;
  279. REG_I2C_TRANSFER_LEN = 0x01;
  280. REG_I2C_DATA_PORT = addr;
  281. REG_I2C_START = REG_I2C_START_BIT;
  282. while ((REG_I2C_START & REG_I2C_START_BIT))
  283. ;
  284. REG_I2C_SLAVE_ADDR = (dev_id << 1) | I2C_READ_BIT;
  285. REG_I2C_TRANSFER_LEN = 0x01;
  286. REG_I2C_START = REG_I2C_START_BIT;
  287. while ((REG_I2C_START & REG_I2C_START_BIT))
  288. ;
  289. *data = REG_I2C_DATA_PORT;
  290. if (IS_PRINT)
  291. pr_info("I2C Read [%x]=%x\n", addr, *data);
  292. return PHY_TRUE; /* !!(PHY_INT32)*data; */
  293. }
  294. #endif
  295. void _U3_Write_Bank(PHY_INT32 bankValue)
  296. {
  297. I2cWriteReg(U3_PHY_I2C_DEV, U3_PHY_PAGE, bankValue);
  298. }
  299. PHY_INT32 _U3Write_Reg(PHY_INT32 address, PHY_INT32 value)
  300. {
  301. I2cWriteReg(U3_PHY_I2C_DEV, address, value);
  302. return PHY_TRUE;
  303. }
  304. PHY_INT32 _U3Read_Reg(PHY_INT32 address)
  305. {
  306. PHY_INT8 *pu1Buf;
  307. PHY_INT32 ret;
  308. pu1Buf = kmalloc(1, GFP_NOIO);
  309. ret = I2cReadReg(U3_PHY_I2C_DEV, address, pu1Buf);
  310. if (ret == PHY_FALSE) {
  311. pr_err("Read failed\n");
  312. return PHY_FALSE;
  313. }
  314. ret = (char)pu1Buf[0];
  315. kfree(pu1Buf);
  316. return ret;
  317. }
  318. PHY_INT32 U3PhyWriteReg32(PHY_UINT32 addr, PHY_UINT32 data)
  319. {
  320. PHY_INT32 bank;
  321. PHY_INT32 addr8;
  322. PHY_INT32 data_0, data_1, data_2, data_3;
  323. bank = (addr >> 16) & 0xff;
  324. addr8 = addr & 0xff;
  325. data_0 = data & 0xff;
  326. data_1 = (data >> 8) & 0xff;
  327. data_2 = (data >> 16) & 0xff;
  328. data_3 = (data >> 24) & 0xff;
  329. pr_debug("addr: %x, data: %x\n", addr8, data);
  330. _U3_Write_Bank(bank);
  331. pr_debug("addr: %x, data: %x\n", addr8, data_0);
  332. _U3Write_Reg(addr8, data_0);
  333. pr_debug("addr: %x, data: %x\n", addr8 + 1, data_1);
  334. _U3Write_Reg(addr8 + 1, data_1);
  335. pr_debug("addr: %x, data: %x\n", addr8 + 2, data_2);
  336. _U3Write_Reg(addr8 + 2, data_2);
  337. pr_debug("addr: %x, data: %x\n", addr8 + 3, data_3);
  338. _U3Write_Reg(addr8 + 3, data_3);
  339. return 0;
  340. }
  341. PHY_INT32 U3PhyReadReg32(PHY_UINT32 addr)
  342. {
  343. PHY_INT32 bank;
  344. PHY_INT32 addr8;
  345. PHY_INT32 data;
  346. bank = (addr >> 16) & 0xff;
  347. addr8 = addr & 0xff;
  348. _U3_Write_Bank(bank);
  349. data = _U3Read_Reg(addr8);
  350. data |= (_U3Read_Reg(addr8 + 1) << 8);
  351. data |= (_U3Read_Reg(addr8 + 2) << 16);
  352. data |= (_U3Read_Reg(addr8 + 3) << 24);
  353. return data;
  354. }
  355. PHY_INT32 U3PhyWriteReg8(PHY_UINT32 addr, PHY_UINT8 data)
  356. {
  357. PHY_INT32 bank;
  358. PHY_INT32 addr8;
  359. bank = (addr >> 16) & 0xff;
  360. addr8 = addr & 0xff;
  361. _U3_Write_Bank(bank);
  362. _U3Write_Reg(addr8, data);
  363. pr_debug("addr: %x, data: %x\n", addr8, data);
  364. return PHY_TRUE;
  365. }
  366. PHY_INT8 U3PhyReadReg8(PHY_UINT32 addr)
  367. {
  368. PHY_INT32 bank;
  369. PHY_INT32 addr8;
  370. PHY_INT32 data;
  371. bank = (addr >> 16) & 0xff;
  372. addr8 = addr & 0xff;
  373. _U3_Write_Bank(bank);
  374. data = _U3Read_Reg(addr8);
  375. return data;
  376. }
  377. #endif