mt_usbphy_a60810.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * Copyright (c) 2012 MediaTek Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining
  5. * a copy of this software and associated documentation files
  6. * (the "Software"), to deal in the Software without restriction,
  7. * including without limitation the rights to use, copy, modify, merge,
  8. * publish, distribute, sublicense, and/or sell copies of the Software,
  9. * and to permit persons to whom the Software is furnished to do so,
  10. * subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be
  13. * included in all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  18. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  19. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  20. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  21. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <debug.h>
  24. #include <reg.h>
  25. #include <platform/bitops.h>
  26. #include <platform/mt_reg_base.h>
  27. #include <platform/mt_typedefs.h>
  28. #include <platform/timer.h>
  29. #include <mt_ssusb_sifslv_ippc.h>
  30. #include <mt_ssusb.h>
  31. #include <mt_ssusbphy.h>
  32. #include <mt_usbphy_a60810.h>
  33. #include <mt_ssusb_usb3_mac_csr.h>
  34. #ifdef MACH_FPGA
  35. #define CFG_FPGA_PLATFORM (1)
  36. #else
  37. #define DBG_PHY_CALIBRATION 1
  38. #endif
  39. #ifdef DBG_USB_PHY
  40. #define PHY_LOG(x...) dprintf(INFO, "[USB][PHY] " x)
  41. #else
  42. #define PHY_LOG(x...) do{} while(0)
  43. #endif
  44. #define PHY_DRV_SHIFT 3
  45. #define PHY_PHASE_SHIFT 3
  46. #define PHY_PHASE_DRV_SHIFT 1
  47. #if CFG_FPGA_PLATFORM
  48. u32 u2_slew_rate_calibration_a60810(struct u3phy_info *info)
  49. {
  50. u32 i=0;
  51. u32 fgRet = 0;
  52. u32 u4FmOut = 0;
  53. u32 u4Tmp = 0;
  54. // => RG_USB20_HSTX_SRCAL_EN = 1
  55. // enable HS TX SR calibration
  56. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr5)
  57. , A60810_RG_USB20_HSTX_SRCAL_EN_OFST, A60810_RG_USB20_HSTX_SRCAL_EN, 1);
  58. mdelay(1);
  59. // => RG_FRCK_EN = 1
  60. // Enable free run clock
  61. u3_phy_write_field32(((u32)&info->sifslv_fm_regs_a->fmmonr1)
  62. , A60810_RG_FRCK_EN_OFST, A60810_RG_FRCK_EN, 0x1);
  63. // => RG_CYCLECNT = 0x400
  64. // Setting cyclecnt = 0x400
  65. u3_phy_write_field32(((u32)&info->sifslv_fm_regs_a->fmcr0)
  66. , A60810_RG_CYCLECNT_OFST, A60810_RG_CYCLECNT, 0x400);
  67. // => RG_FREQDET_EN = 1
  68. // Enable frequency meter
  69. u3_phy_write_field32(((u32)&info->sifslv_fm_regs_a->fmcr0)
  70. , A60810_RG_FREQDET_EN_OFST, A60810_RG_FREQDET_EN, 0x1);
  71. // wait for FM detection done, set 10ms timeout
  72. for (i=0; i<10; i++) {
  73. // => u4FmOut = USB_FM_OUT
  74. // read FM_OUT
  75. u4FmOut = u3_phy_read_reg32(((u32)&info->sifslv_fm_regs_a->fmmonr0));
  76. PHY_LOG("FM_OUT value: u4FmOut = %d(0x%08X)\n", u4FmOut, u4FmOut);
  77. // check if FM detection done
  78. if (u4FmOut != 0) {
  79. fgRet = 0;
  80. PHY_LOG("FM detection done! loop = %d\n", i);
  81. break;
  82. }
  83. fgRet = 1;
  84. mdelay(1);
  85. }
  86. // => RG_FREQDET_EN = 0
  87. // disable frequency meter
  88. u3_phy_write_field32(((u32)&info->sifslv_fm_regs_a->fmcr0)
  89. , A60810_RG_FREQDET_EN_OFST, A60810_RG_FREQDET_EN, 0);
  90. // => RG_FRCK_EN = 0
  91. // disable free run clock
  92. u3_phy_write_field32(((u32)&info->sifslv_fm_regs_a->fmmonr1)
  93. , A60810_RG_FRCK_EN_OFST, A60810_RG_FRCK_EN, 0);
  94. // => RG_USB20_HSTX_SRCAL_EN = 0
  95. // disable HS TX SR calibration
  96. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr5)
  97. , A60810_RG_USB20_HSTX_SRCAL_EN_OFST, A60810_RG_USB20_HSTX_SRCAL_EN, 0);
  98. mdelay(1);
  99. if (u4FmOut == 0) {
  100. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr5)
  101. , A60810_RG_USB20_HSTX_SRCTRL_OFST, A60810_RG_USB20_HSTX_SRCTRL, 0x4);
  102. fgRet = 1;
  103. } else {
  104. // set reg = (1024/FM_OUT) * REF_CK * U2_SR_COEF_A60810 / 1000 (round to the nearest digits)
  105. u4Tmp = (((1024 * 26 * U2_SR_COEF_A60810) / u4FmOut) + 500) / 1000;
  106. PHY_LOG("SR calibration value u1SrCalVal = %d\n", (u8)u4Tmp);
  107. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr5)
  108. , A60810_RG_USB20_HSTX_SRCTRL_OFST, A60810_RG_USB20_HSTX_SRCTRL, u4Tmp);
  109. }
  110. PHY_LOG("[USBPHY] %s ends\n", __func__);
  111. return fgRet;
  112. }
  113. int phy_change_pipe_phase_a60810(struct u3phy_info *info, int phy_drv, int pipe_phase)
  114. {
  115. int drv_reg_value;
  116. int phase_reg_value;
  117. int temp;
  118. drv_reg_value = phy_drv << PHY_DRV_SHIFT;
  119. phase_reg_value = (pipe_phase << PHY_PHASE_SHIFT) | (phy_drv << PHY_PHASE_DRV_SHIFT);
  120. temp = u3_phy_read_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+2);
  121. temp &= ~(0x3 << PHY_DRV_SHIFT);
  122. temp |= drv_reg_value;
  123. u3_phy_write_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+2, temp);
  124. temp = u3_phy_read_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+3);
  125. temp &= ~((0x3 << PHY_PHASE_DRV_SHIFT) | (0x1f << PHY_PHASE_SHIFT));
  126. temp |= phase_reg_value;
  127. u3_phy_write_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+3, temp);
  128. return TRUE;
  129. }
  130. void phy_init_a60810(struct u3phy_info *info)
  131. {
  132. PHY_LOG("phy_init_a60810==========\n");
  133. //BANK 0x00
  134. //for U2 hS eye diagram
  135. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr1)
  136. , A60810_RG_USB20_TERM_VREF_SEL_OFST, A60810_RG_USB20_TERM_VREF_SEL, 0x05);
  137. //for U2 hS eye diagram
  138. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr1)
  139. , A60810_RG_USB20_VRT_VREF_SEL_OFST, A60810_RG_USB20_VRT_VREF_SEL, 0x05);
  140. //for U2 sensititvity
  141. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr6)
  142. , A60810_RG_USB20_SQTH_OFST, A60810_RG_USB20_SQTH, 0x04);
  143. //BANK 0x10
  144. //disable ssusb_p3_entry to work around resume from P3 bug
  145. u3_phy_write_field32(((u32)&info->u3phyd_regs_a->phyd_lfps0)
  146. , A60810_RG_SSUSB_P3_ENTRY_OFST, A60810_RG_SSUSB_P3_ENTRY, 0x00);
  147. //force disable ssusb_p3_entry to work around resume from P3 bug
  148. u3_phy_write_field32(((u32)&info->u3phyd_regs_a->phyd_lfps0)
  149. , A60810_RG_SSUSB_P3_ENTRY_SEL_OFST, A60810_RG_SSUSB_P3_ENTRY_SEL, 0x01);
  150. //BANK 0x40
  151. // fine tune SSC delta1 to let SSC min average ~0ppm
  152. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg19)
  153. , A60810_RG_SSUSB_PLL_SSC_DELTA1_U3_OFST, A60810_RG_SSUSB_PLL_SSC_DELTA1_U3, 0x46);
  154. //u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg19)
  155. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg21)
  156. , A60810_RG_SSUSB_PLL_SSC_DELTA1_PE1H_OFST, A60810_RG_SSUSB_PLL_SSC_DELTA1_PE1H, 0x40);
  157. // fine tune SSC delta to let SSC min average ~0ppm
  158. // Fine tune SYSPLL to improve phase noise
  159. // I2C 60 0x08[01:00] 0x03 RW RG_SSUSB_PLL_BC_U3
  160. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg4)
  161. , A60810_RG_SSUSB_PLL_BC_U3_OFST, A60810_RG_SSUSB_PLL_BC_U3, 0x3);
  162. // I2C 60 0x08[12:10] 0x03 RW RG_SSUSB_PLL_DIVEN_U3
  163. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg4)
  164. , A60810_RG_SSUSB_PLL_DIVEN_U3_OFST, A60810_RG_SSUSB_PLL_DIVEN_U3, 0x3);
  165. // I2C 60 0x0C[03:00] 0x01 RW RG_SSUSB_PLL_IC_U3
  166. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg5)
  167. , A60810_RG_SSUSB_PLL_IC_U3_OFST, A60810_RG_SSUSB_PLL_IC_U3, 0x1);
  168. // I2C 60 0x0C[23:22] 0x01 RW RG_SSUSB_PLL_BR_U3
  169. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg5)
  170. , A60810_RG_SSUSB_PLL_BR_U3_OFST, A60810_RG_SSUSB_PLL_BR_U3, 0x1);
  171. // I2C 60 0x10[03:00] 0x01 RW RG_SSUSB_PLL_IR_U3
  172. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg6)
  173. , A60810_RG_SSUSB_PLL_IR_U3_OFST, A60810_RG_SSUSB_PLL_IR_U3, 0x1);
  174. // I2C 60 0x14[03:00] 0x0F RW RG_SSUSB_PLL_BP_U3
  175. u3_phy_write_field32(((u32)&info->u3phya_da_regs_a->reg7)
  176. //// , A60810_RG_SSUSB_PLL_BP_U3, A60810_RG_SSUSB_PLL_BP_U3, 0xF);
  177. , A60810_RG_SSUSB_PLL_BP_U3_OFST, A60810_RG_SSUSB_PLL_BP_U3, 0x0f);
  178. //BANK 0x60
  179. //force xtal pwd mode enable
  180. u3_phy_write_field32(((u32)&info->spllc_regs_a->u3d_xtalctl_2)
  181. , A60810_RG_SSUSB_FORCE_XTAL_PWD_OFST, A60810_RG_SSUSB_FORCE_XTAL_PWD, 0x1);
  182. //force bias pwd mode enable
  183. u3_phy_write_field32(((u32)&info->spllc_regs_a->u3d_xtalctl_2)
  184. , A60810_RG_SSUSB_FORCE_BIAS_PWD_OFST, A60810_RG_SSUSB_FORCE_BIAS_PWD, 0x1);
  185. //force xtal pwd mode off to work around xtal drv de
  186. u3_phy_write_field32(((u32)&info->spllc_regs_a->u3d_xtalctl_2)
  187. , A60810_RG_SSUSB_XTAL_PWD_OFST, A60810_RG_SSUSB_XTAL_PWD, 0x0);
  188. //force bias pwd mode off to work around xtal drv de
  189. u3_phy_write_field32(((u32)&info->spllc_regs_a->u3d_xtalctl_2)
  190. , A60810_RG_SSUSB_BIAS_PWD_OFST, A60810_RG_SSUSB_BIAS_PWD, 0x0);
  191. //******** test chip settings ***********
  192. //BANK 0x00
  193. // slew rate setting
  194. u3_phy_write_field32(((u32)&info->u2phy_regs_a->usbphyacr5)
  195. , A60810_RG_USB20_HSTX_SRCTRL_OFST, A60810_RG_USB20_HSTX_SRCTRL, 0x4);
  196. //BANK 0x50
  197. // PIPE setting BANK5
  198. // PIPE drv = 2
  199. u3_phy_write_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+2, 0x10);
  200. // PIPE phase
  201. //u3_phy_write_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+3, 0xdc);
  202. u3_phy_write_reg8(((u32)&info->sifslv_chip_regs_a->gpio_ctla)+3, 0x24);
  203. }
  204. #endif