mtk-phy.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #define U3_PHY_LIB
  2. #include "mtk-phy.h"
  3. #undef U3_PHY_LIB
  4. #ifdef CONFIG_C60802_SUPPORT
  5. #include "mtk-phy-c60802.h"
  6. #endif
  7. #ifdef CONFIG_D60802_SUPPORT
  8. #include "mtk-phy-d60802.h"
  9. #endif
  10. #ifdef CONFIG_E60802_SUPPORT
  11. #include "mtk-phy-e60802.h"
  12. #endif
  13. #ifdef CONFIG_A60810_SUPPORT
  14. #include "mtk-phy-a60810.h"
  15. #endif
  16. #ifdef CONFIG_PROJECT_PHY
  17. #include "mtk-phy-asic.h"
  18. #endif
  19. #ifdef CONFIG_C60802_SUPPORT
  20. static const struct u3phy_operator c60802_operators = {
  21. .init = phy_init_c60802,
  22. .change_pipe_phase = phy_change_pipe_phase_c60802,
  23. .eyescan_init = eyescan_init_c60802,
  24. .eyescan = phy_eyescan_c60802,
  25. .u2_connect = u2_connect_c60802,
  26. .u2_disconnect = u2_disconnect_c60802,
  27. .u2_save_current_entry = u2_save_cur_en_c60802,
  28. .u2_save_current_recovery = u2_save_cur_re_c60802,
  29. .u2_slew_rate_calibration = u2_slew_rate_calibration_c60802,
  30. };
  31. #endif
  32. #ifdef CONFIG_D60802_SUPPORT
  33. static const struct u3phy_operator d60802_operators = {
  34. .init = phy_init_d60802,
  35. .change_pipe_phase = phy_change_pipe_phase_d60802,
  36. .eyescan_init = eyescan_init_d60802,
  37. .eyescan = phy_eyescan_d60802,
  38. .u2_connect = u2_connect_d60802,
  39. .u2_disconnect = u2_disconnect_d60802,
  40. /* .u2_save_current_entry = u2_save_cur_en_d60802, */
  41. /* .u2_save_current_recovery = u2_save_cur_re_d60802, */
  42. .u2_slew_rate_calibration = u2_slew_rate_calibration_d60802,
  43. };
  44. #endif
  45. #ifdef CONFIG_E60802_SUPPORT
  46. static const struct u3phy_operator e60802_operators = {
  47. .init = phy_init_e60802,
  48. .change_pipe_phase = phy_change_pipe_phase_e60802,
  49. .eyescan_init = eyescan_init_e60802,
  50. .eyescan = phy_eyescan_e60802,
  51. .u2_connect = u2_connect_e60802,
  52. .u2_disconnect = u2_disconnect_e60802,
  53. /* .u2_save_current_entry = u2_save_cur_en_e60802, */
  54. /* .u2_save_current_recovery = u2_save_cur_re_e60802, */
  55. .u2_slew_rate_calibration = u2_slew_rate_calibration_e60802,
  56. };
  57. #endif
  58. #ifdef CONFIG_A60810_SUPPORT
  59. static const struct u3phy_operator a60810_operators = {
  60. .init = phy_init_a60810,
  61. .change_pipe_phase = phy_change_pipe_phase_a60810,
  62. .eyescan_init = eyescan_init_a60810,
  63. .eyescan = phy_eyescan_a60810,
  64. .u2_connect = u2_connect_a60810,
  65. .u2_disconnect = u2_disconnect_a60810,
  66. /* .u2_save_current_entry = u2_save_cur_en_a60810, */
  67. /* .u2_save_current_recovery = u2_save_cur_re_a60810, */
  68. .u2_slew_rate_calibration = u2_slew_rate_calibration_a60810,
  69. };
  70. #endif
  71. #ifdef CONFIG_PROJECT_PHY
  72. static struct u3phy_operator project_operators = {
  73. .init = phy_init_soc,
  74. .u2_slew_rate_calibration = u2_slew_rate_calibration,
  75. };
  76. #endif
  77. PHY_INT32 u3phy_init(void)
  78. {
  79. #ifndef CONFIG_PROJECT_PHY
  80. PHY_INT32 u3phy_version;
  81. #endif
  82. if (u3phy != NULL)
  83. return PHY_TRUE;
  84. u3phy = kmalloc(sizeof(struct u3phy_info), GFP_NOIO);
  85. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  86. u3phy->phyd_version_addr = 0x2000e4;
  87. #else
  88. u3phy->phyd_version_addr = U3_PHYD_B2_BASE + 0xe4;
  89. #endif
  90. u3phy_ops = NULL;
  91. #ifdef CONFIG_PROJECT_PHY
  92. u3phy->u2phy_regs_e = (struct u2phy_reg_e *)U2_PHY_BASE;
  93. u3phy->u3phyd_regs_e = (struct u3phyd_reg_e *)U3_PHYD_BASE;
  94. u3phy->u3phyd_bank2_regs_e = (struct u3phyd_bank2_reg_e *)U3_PHYD_B2_BASE;
  95. u3phy->u3phya_regs_e = (struct u3phya_reg_e *)U3_PHYA_BASE;
  96. u3phy->u3phya_da_regs_e = (struct u3phya_da_reg_e *)U3_PHYA_DA_BASE;
  97. u3phy->sifslv_chip_regs_e = (struct sifslv_chip_reg_e *)SIFSLV_CHIP_BASE;
  98. u3phy->spllc_regs_e = (struct spllc_reg_e *)SIFSLV_SPLLC_BASE;
  99. u3phy->sifslv_fm_regs_e = (struct sifslv_fm_feg_e *)SIFSLV_FM_FEG_BASE;
  100. u3phy_ops = (struct u3phy_operator *)&project_operators;
  101. #else
  102. /* parse phy version */
  103. u3phy_version = U3PhyReadReg32(u3phy->phyd_version_addr);
  104. pr_debug("phy version: %x\n", u3phy_version);
  105. u3phy->phy_version = u3phy_version;
  106. if (u3phy_version == 0xc60802a) {
  107. #ifdef CONFIG_C60802_SUPPORT
  108. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  109. u3phy->u2phy_regs_c = (struct u2phy_reg_c *)0x0;
  110. u3phy->u3phyd_regs_c = (struct u3phyd_reg_c *)0x100000;
  111. u3phy->u3phyd_bank2_regs_c = (struct u3phyd_bank2_reg_c *)0x200000;
  112. u3phy->u3phya_regs_c = (struct u3phya_reg_c *)0x300000;
  113. u3phy->u3phya_da_regs_c = (struct u3phya_da_reg_c *)0x400000;
  114. u3phy->sifslv_chip_regs_c = (struct sifslv_chip_reg_c *)0x500000;
  115. u3phy->sifslv_fm_regs_c = (struct sifslv_fm_feg_c *)0xf00000;
  116. #else
  117. u3phy->u2phy_regs_c = (struct u2phy_reg_c *)U2_PHY_BASE;
  118. u3phy->u3phyd_regs_c = (struct u3phyd_reg_c *)U3_PHYD_BASE;
  119. u3phy->u3phyd_bank2_regs_c = (struct u3phyd_bank2_reg_c *)U3_PHYD_B2_BASE;
  120. u3phy->u3phya_regs_c = (struct u3phya_reg_c *)U3_PHYA_BASE;
  121. u3phy->u3phya_da_regs_c = (struct u3phya_da_reg_c *)U3_PHYA_DA_BASE;
  122. u3phy->sifslv_chip_regs_c = (struct sifslv_chip_reg_c *)SIFSLV_CHIP_BASE;
  123. u3phy->sifslv_fm_regs_c = (struct sifslv_fm_feg_c *)SIFSLV_FM_FEG_BASE;
  124. #endif
  125. u3phy_ops = (struct u3phy_operator *)&c60802_operators;
  126. #endif
  127. } else if (u3phy_version == 0xd60802a) {
  128. #ifdef CONFIG_D60802_SUPPORT
  129. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  130. u3phy->u2phy_regs_d = (struct u2phy_reg_d *)0x0;
  131. u3phy->u3phyd_regs_d = (struct u3phyd_reg_d *)0x100000;
  132. u3phy->u3phyd_bank2_regs_d = (struct u3phyd_bank2_reg_d *)0x200000;
  133. u3phy->u3phya_regs_d = (struct u3phya_reg_d *)0x300000;
  134. u3phy->u3phya_da_regs_d = (struct u3phya_da_reg_d *)0x400000;
  135. u3phy->sifslv_chip_regs_d = (struct sifslv_chip_reg_d *)0x500000;
  136. u3phy->sifslv_fm_regs_d = (struct sifslv_fm_feg_d *)0xf00000;
  137. #else
  138. u3phy->u2phy_regs_d = (struct u2phy_reg_d *)U2_PHY_BASE;
  139. u3phy->u3phyd_regs_d = (struct u3phyd_reg_d *)U3_PHYD_BASE;
  140. u3phy->u3phyd_bank2_regs_d = (struct u3phyd_bank2_reg_d *)U3_PHYD_B2_BASE;
  141. u3phy->u3phya_regs_d = (struct u3phya_reg_d *)U3_PHYA_BASE;
  142. u3phy->u3phya_da_regs_d = (struct u3phya_da_reg_d *)U3_PHYA_DA_BASE;
  143. u3phy->sifslv_chip_regs_d = (struct sifslv_chip_reg_d *)SIFSLV_CHIP_BASE;
  144. u3phy->sifslv_fm_regs_d = (struct sifslv_fm_feg_d *)SIFSLV_FM_FEG_BASE;
  145. #endif
  146. u3phy_ops = ((struct u3phy_operator *)&d60802_operators);
  147. #endif
  148. } else if (u3phy_version == 0xe60802a) {
  149. #ifdef CONFIG_E60802_SUPPORT
  150. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  151. u3phy->u2phy_regs_e = (struct u2phy_reg_e *)0x0;
  152. u3phy->u3phyd_regs_e = (struct u3phyd_reg_e *)0x100000;
  153. u3phy->u3phyd_bank2_regs_e = (struct u3phyd_bank2_reg_e *)0x200000;
  154. u3phy->u3phya_regs_e = (struct u3phya_reg_e *)0x300000;
  155. u3phy->u3phya_da_regs_e = (struct u3phya_da_reg_e *)0x400000;
  156. u3phy->sifslv_chip_regs_e = (struct sifslv_chip_reg_e *)0x500000;
  157. u3phy->spllc_regs_e = (struct spllc_reg_e *)0x600000;
  158. u3phy->sifslv_fm_regs_e = (struct sifslv_fm_feg_e *)0xf00000;
  159. #else
  160. u3phy->u2phy_regs_e = (struct u2phy_reg_e *)U2_PHY_BASE;
  161. u3phy->u3phyd_regs_e = (struct u3phyd_reg_e *)U3_PHYD_BASE;
  162. u3phy->u3phyd_bank2_regs_e = (struct u3phyd_bank2_reg_e *)U3_PHYD_B2_BASE;
  163. u3phy->u3phya_regs_e = (struct u3phya_reg_e *)U3_PHYA_BASE;
  164. u3phy->u3phya_da_regs_e = (struct u3phya_da_reg_e *)U3_PHYA_DA_BASE;
  165. u3phy->sifslv_chip_regs_e = (struct sifslv_chip_reg_e *)SIFSLV_CHIP_BASE;
  166. u3phy->sifslv_fm_regs_e = (struct sifslv_fm_feg_e *)SIFSLV_FM_FEG_BASE;
  167. #endif
  168. u3phy_ops = ((struct u3phy_operator *)&e60802_operators);
  169. #endif
  170. } else if (u3phy_version == 0xa60810a) {
  171. #ifdef CONFIG_A60810_SUPPORT
  172. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  173. u3phy->u2phy_regs_a = (struct u2phy_reg_a *)0x0;
  174. u3phy->u3phyd_regs_a = (struct u3phyd_reg_a *)0x100000;
  175. u3phy->u3phyd_bank2_regs_a = (struct u3phyd_bank2_reg_a *)0x200000;
  176. u3phy->u3phya_regs_a = (struct u3phya_reg_a *)0x300000;
  177. u3phy->u3phya_da_regs_a = (struct u3phya_da_reg_a *)0x400000;
  178. u3phy->sifslv_chip_regs_a = (struct sifslv_chip_reg_a *)0x500000;
  179. u3phy->spllc_regs_a = (struct spllc_reg_a *)0x600000;
  180. u3phy->sifslv_fm_regs_a = (struct sifslv_fm_reg_a *)0xf00000;
  181. #else
  182. u3phy->u2phy_regs_a = (struct u2phy_reg_a *)U2_PHY_BASE;
  183. u3phy->u3phyd_regs_a = (struct u3phyd_reg_a *)U3_PHYD_BASE;
  184. u3phy->u3phyd_bank2_regs_a = (struct u3phyd_bank2_reg_a *)U3_PHYD_B2_BASE;
  185. u3phy->u3phya_regs_a = (struct u3phya_reg_a *)U3_PHYA_BASE;
  186. u3phy->u3phya_da_regs_a = (struct u3phya_da_reg_a *)U3_PHYA_DA_BASE;
  187. u3phy->sifslv_chip_regs_a = (struct sifslv_chip_reg_a *)SIFSLV_CHIP_BASE;
  188. u3phy->sifslv_fm_regs_a = (struct sifslv_fm_reg_a *)SIFSLV_FM_FEG_BASE;
  189. #endif
  190. u3phy_ops = ((struct u3phy_operator *)&a60810_operators);
  191. #endif
  192. } else {
  193. pr_err("No match phy version, version: %x\n", u3phy_version);
  194. return PHY_FALSE;
  195. }
  196. #endif
  197. if (!u3phy_ops)
  198. return PHY_FALSE;
  199. else
  200. return PHY_TRUE;
  201. }
  202. PHY_INT32 U3PhyWriteField8(phys_addr_t addr, PHY_INT32 offset, PHY_INT32 mask, PHY_INT32 value)
  203. {
  204. PHY_INT8 cur_value;
  205. PHY_INT8 new_value;
  206. cur_value = U3PhyReadReg8((u3phy_addr_t) addr);
  207. new_value = (cur_value & (~mask)) | ((value << offset) & mask);
  208. mb();
  209. /**/ U3PhyWriteReg8((u3phy_addr_t) addr, new_value);
  210. mb();
  211. /**/ return PHY_TRUE;
  212. }
  213. PHY_INT32 U3PhyWriteField32(phys_addr_t addr, PHY_INT32 offset, PHY_INT32 mask, PHY_INT32 value)
  214. {
  215. PHY_INT32 cur_value;
  216. PHY_INT32 new_value;
  217. cur_value = U3PhyReadReg32((u3phy_addr_t) addr);
  218. new_value = (cur_value & (~mask)) | ((value << offset) & mask);
  219. mb();
  220. /**/ U3PhyWriteReg32((u3phy_addr_t) addr, new_value);
  221. mb();
  222. /**/ return PHY_TRUE;
  223. }
  224. PHY_INT32 U3PhyReadField8(phys_addr_t addr, PHY_INT32 offset, PHY_INT32 mask)
  225. {
  226. return (U3PhyReadReg8((u3phy_addr_t) addr) & mask) >> offset;
  227. }
  228. PHY_INT32 U3PhyReadField32(phys_addr_t addr, PHY_INT32 offset, PHY_INT32 mask)
  229. {
  230. return (U3PhyReadReg32((u3phy_addr_t) addr) & mask) >> offset;
  231. }
  232. void phy_hsrx_set(void)
  233. {
  234. switch (u3phy->phy_version) {
  235. #ifdef CONFIG_D60802_SUPPORT
  236. case 0xd60802a:
  237. U3PhyWriteField32(((phys_addr_t) &u3phy->u2phy_regs_d->usbphyacr6)
  238. , D60802_RG_USB20_HSRX_MMODE_SELE_OFST,
  239. D60802_RG_USB20_HSRX_MMODE_SELE, 0x2);
  240. pr_debug("%s: WRITE HSRX_MMODE_SELE(%d)\n", __func__,
  241. U3PhyReadField32(((phys_addr_t) &u3phy->u2phy_regs_d->usbphyacr6)
  242. , D60802_RG_USB20_HSRX_MMODE_SELE_OFST,
  243. D60802_RG_USB20_HSRX_MMODE_SELE));
  244. break;
  245. #endif
  246. }
  247. }
  248. void phy_hsrx_reset(void)
  249. {
  250. switch (u3phy->phy_version) {
  251. #ifdef CONFIG_D60802_SUPPORT
  252. case 0xd60802a:
  253. U3PhyWriteField32(((phys_addr_t) &u3phy->u2phy_regs_d->usbphyacr6)
  254. , D60802_RG_USB20_HSRX_MMODE_SELE_OFST,
  255. D60802_RG_USB20_HSRX_MMODE_SELE, 0x0);
  256. pr_debug("%s: WRITE HSRX_MMODE_SELE(%d)\n", __func__,
  257. U3PhyReadField32(((phys_addr_t) &u3phy->u2phy_regs_d->usbphyacr6)
  258. , D60802_RG_USB20_HSRX_MMODE_SELE_OFST,
  259. D60802_RG_USB20_HSRX_MMODE_SELE));
  260. break;
  261. #endif
  262. }
  263. }