mu3d_hal_phy.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "mu3d_hal_osal.h"
  2. #include "mu3d_hal_phy.h"
  3. #include "mu3d_hal_usb_drv.h"
  4. #include "mtk-phy.h"
  5. /**
  6. * mu3d_hal_phy_scan - u3 phy clock phase scan
  7. *
  8. */
  9. DEV_INT32 mu3d_hal_phy_scan(DEV_INT32 latch_val, DEV_UINT8 driving)
  10. {
  11. #ifdef CONFIG_U3_PHY_GPIO_SUPPORT
  12. DEV_INT32 count, fset_phase_val, recov_cnt, link_error_count, U0_count;
  13. DEV_UINT8 phase_val;
  14. /* DEV_UINT8 driving; */
  15. /* disable ip power down,disable U2/U3 ip power down. */
  16. mu3d_hal_ssusb_en();
  17. /* mu3d_hal_pdn_dis(); */
  18. u3phy_ops->change_pipe_phase(u3phy, 0, 0);
  19. os_writel(U3D_PIPE_LATCH_SELECT, latch_val); /* set tx/rx latch sel */
  20. /* driving = 2; */
  21. u3phy_ops->change_pipe_phase(u3phy, driving, 0);
  22. phase_val = 0;
  23. count = 0;
  24. fset_phase_val = TRUE;
  25. while (TRUE) {
  26. if (fset_phase_val) {
  27. u3phy_ops->change_pipe_phase(u3phy, driving, phase_val);
  28. mu3d_hal_rst_dev();
  29. os_ms_delay(50);
  30. os_writel(U3D_USB3_CONFIG, USB3_EN);
  31. os_writel(U3D_PIPE_LATCH_SELECT, latch_val); /* set tx/rx latch sel */
  32. fset_phase_val = FALSE;
  33. U0_count = 0;
  34. link_error_count = 0;
  35. recov_cnt = 0;
  36. count = 0;
  37. }
  38. os_ms_delay(50);
  39. count++;
  40. recov_cnt = os_readl(U3D_RECOVERY_COUNT); /* read U0 recovery count */
  41. link_error_count = os_readl(U3D_LINK_ERR_COUNT); /* read link error count */
  42. if ((os_readl(U3D_LINK_STATE_MACHINE) & LTSSM) == STATE_U0_STATE) { /* enter U0 state */
  43. U0_count++;
  44. }
  45. if (U0_count > ENTER_U0_TH) { /* link up */
  46. os_ms_delay(1000); /* 1s */
  47. recov_cnt = os_readl(U3D_RECOVERY_COUNT);
  48. link_error_count = os_readl(U3D_LINK_ERR_COUNT);
  49. os_writel(U3D_RECOVERY_COUNT, CLR_RECOV_CNT); /* clear recovery count */
  50. os_writel(U3D_LINK_ERR_COUNT, CLR_LINK_ERR_CNT); /* clear link error count */
  51. pr_debug("[PASS] Link Error Count=%d, Recovery Count=%d\n",
  52. link_error_count, recov_cnt);
  53. pr_debug("I2C(0x%02x) : [0x%02x], I2C(0x%02x) : [0x%02x]\n",
  54. U3_PHY_I2C_PCLK_DRV_REG,
  55. _U3Read_Reg(U3_PHY_I2C_PCLK_DRV_REG),
  56. U3_PHY_I2C_PCLK_PHASE_REG,
  57. _U3Read_Reg(U3_PHY_I2C_PCLK_PHASE_REG));
  58. pr_debug("Reg(0x130) : [0x%02x], PhaseDelay[0x%02x], Driving[0x%02x], Latch[0x%02x]\n",
  59. os_readl(U3D_PIPE_LATCH_SELECT), phase_val, driving, latch_val);
  60. phase_val++;
  61. fset_phase_val = TRUE;
  62. } else if ((os_readl(U3D_LINK_STATE_MACHINE) & LTSSM) == STATE_DISABLE) { /* link fail */
  63. pr_debug("[FAIL] STATE_DISABLE, PhaseDelay[0x%02x]\n", phase_val);
  64. phase_val++;
  65. fset_phase_val = TRUE;
  66. } else if (count > MAX_TIMEOUT_COUNT) { /* link timeout */
  67. pr_debug("[FAIL] TIMEOUT, PhaseDelay[0x%02x]\n", phase_val);
  68. phase_val++;
  69. fset_phase_val = TRUE;
  70. }
  71. if (phase_val > MAX_PHASE_RANGE) {
  72. /* reset device */
  73. mu3d_hal_rst_dev();
  74. os_ms_delay(50);
  75. /* disable ip power down,disable U2/U3 ip power down. */
  76. mu3d_hal_ssusb_en();
  77. /* mu3d_hal_pdn_dis(); */
  78. os_ms_delay(10);
  79. break;
  80. }
  81. }
  82. #endif
  83. return 0;
  84. }