mv_udc_phy.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include <linux/delay.h>
  2. #include <linux/timer.h>
  3. #include <linux/io.h>
  4. #include <linux/errno.h>
  5. #include <mach/cputype.h>
  6. #ifdef CONFIG_ARCH_MMP
  7. #define UTMI_REVISION 0x0
  8. #define UTMI_CTRL 0x4
  9. #define UTMI_PLL 0x8
  10. #define UTMI_TX 0xc
  11. #define UTMI_RX 0x10
  12. #define UTMI_IVREF 0x14
  13. #define UTMI_T0 0x18
  14. #define UTMI_T1 0x1c
  15. #define UTMI_T2 0x20
  16. #define UTMI_T3 0x24
  17. #define UTMI_T4 0x28
  18. #define UTMI_T5 0x2c
  19. #define UTMI_RESERVE 0x30
  20. #define UTMI_USB_INT 0x34
  21. #define UTMI_DBG_CTL 0x38
  22. #define UTMI_OTG_ADDON 0x3c
  23. /* For UTMICTRL Register */
  24. #define UTMI_CTRL_USB_CLK_EN (1 << 31)
  25. /* pxa168 */
  26. #define UTMI_CTRL_SUSPEND_SET1 (1 << 30)
  27. #define UTMI_CTRL_SUSPEND_SET2 (1 << 29)
  28. #define UTMI_CTRL_RXBUF_PDWN (1 << 24)
  29. #define UTMI_CTRL_TXBUF_PDWN (1 << 11)
  30. #define UTMI_CTRL_INPKT_DELAY_SHIFT 30
  31. #define UTMI_CTRL_INPKT_DELAY_SOF_SHIFT 28
  32. #define UTMI_CTRL_PU_REF_SHIFT 20
  33. #define UTMI_CTRL_ARC_PULLDN_SHIFT 12
  34. #define UTMI_CTRL_PLL_PWR_UP_SHIFT 1
  35. #define UTMI_CTRL_PWR_UP_SHIFT 0
  36. /* For UTMI_PLL Register */
  37. #define UTMI_PLL_CLK_BLK_EN_SHIFT 24
  38. #define UTMI_PLL_FBDIV_SHIFT 4
  39. #define UTMI_PLL_REFDIV_SHIFT 0
  40. #define UTMI_PLL_FBDIV_MASK 0x00000FF0
  41. #define UTMI_PLL_REFDIV_MASK 0x0000000F
  42. #define UTMI_PLL_ICP_MASK 0x00007000
  43. #define UTMI_PLL_KVCO_MASK 0x00031000
  44. #define UTMI_PLL_PLLCALI12_SHIFT 29
  45. #define UTMI_PLL_PLLCALI12_MASK (0x3 << 29)
  46. #define UTMI_PLL_PLLVDD18_SHIFT 27
  47. #define UTMI_PLL_PLLVDD18_MASK (0x3 << 27)
  48. #define UTMI_PLL_PLLVDD12_SHIFT 25
  49. #define UTMI_PLL_PLLVDD12_MASK (0x3 << 25)
  50. #define UTMI_PLL_KVCO_SHIFT 15
  51. #define UTMI_PLL_ICP_SHIFT 12
  52. /* For UTMI_TX Register */
  53. #define UTMI_TX_REG_EXT_FS_RCAL_SHIFT 27
  54. #define UTMI_TX_REG_EXT_FS_RCAL_MASK (0xf << 27)
  55. #define UTMI_TX_REG_EXT_FS_RCAL_EN_MASK 26
  56. #define UTMI_TX_REG_EXT_FS_RCAL_EN (0x1 << 26)
  57. #define UTMI_TX_LOW_VDD_EN_SHIFT 11
  58. #define UTMI_TX_IMPCAL_VTH_SHIFT 14
  59. #define UTMI_TX_IMPCAL_VTH_MASK (0x7 << 14)
  60. #define UTMI_TX_CK60_PHSEL_SHIFT 17
  61. #define UTMI_TX_CK60_PHSEL_MASK (0xf << 17)
  62. #define UTMI_TX_TXVDD12_SHIFT 22
  63. #define UTMI_TX_TXVDD12_MASK (0x3 << 22)
  64. #define UTMI_TX_AMP_SHIFT 0
  65. #define UTMI_TX_AMP_MASK (0x7 << 0)
  66. /* For UTMI_RX Register */
  67. #define UTMI_RX_SQ_THRESH_SHIFT 4
  68. #define UTMI_RX_SQ_THRESH_MASK (0xf << 4)
  69. #define UTMI_REG_SQ_LENGTH_SHIFT 15
  70. #define UTMI_REG_SQ_LENGTH_MASK (0x3 << 15)
  71. #define REG_RCAL_START 0x00001000
  72. #define VCOCAL_START 0x00200000
  73. #define KVCO_EXT 0x00400000
  74. #define PLL_READY 0x00800000
  75. #define CLK_BLK_EN 0x01000000
  76. #endif
  77. static unsigned int u2o_read(unsigned int base, unsigned int offset)
  78. {
  79. return readl(base + offset);
  80. }
  81. static void u2o_set(unsigned int base, unsigned int offset, unsigned int value)
  82. {
  83. unsigned int reg;
  84. reg = readl(base + offset);
  85. reg |= value;
  86. writel(reg, base + offset);
  87. readl(base + offset);
  88. }
  89. static void u2o_clear(unsigned int base, unsigned int offset,
  90. unsigned int value)
  91. {
  92. unsigned int reg;
  93. reg = readl(base + offset);
  94. reg &= ~value;
  95. writel(reg, base + offset);
  96. readl(base + offset);
  97. }
  98. static void u2o_write(unsigned int base, unsigned int offset,
  99. unsigned int value)
  100. {
  101. writel(value, base + offset);
  102. readl(base + offset);
  103. }
  104. #ifdef CONFIG_ARCH_MMP
  105. int mv_udc_phy_init(unsigned int base)
  106. {
  107. unsigned long timeout;
  108. /* Initialize the USB PHY power */
  109. if (cpu_is_pxa910()) {
  110. u2o_set(base, UTMI_CTRL, (1 << UTMI_CTRL_INPKT_DELAY_SOF_SHIFT)
  111. | (1 << UTMI_CTRL_PU_REF_SHIFT));
  112. }
  113. u2o_set(base, UTMI_CTRL, 1 << UTMI_CTRL_PLL_PWR_UP_SHIFT);
  114. u2o_set(base, UTMI_CTRL, 1 << UTMI_CTRL_PWR_UP_SHIFT);
  115. /* UTMI_PLL settings */
  116. u2o_clear(base, UTMI_PLL, UTMI_PLL_PLLVDD18_MASK
  117. | UTMI_PLL_PLLVDD12_MASK | UTMI_PLL_PLLCALI12_MASK
  118. | UTMI_PLL_FBDIV_MASK | UTMI_PLL_REFDIV_MASK
  119. | UTMI_PLL_ICP_MASK | UTMI_PLL_KVCO_MASK);
  120. u2o_set(base, UTMI_PLL, (0xee << UTMI_PLL_FBDIV_SHIFT)
  121. | (0xb << UTMI_PLL_REFDIV_SHIFT)
  122. | (3 << UTMI_PLL_PLLVDD18_SHIFT)
  123. | (3 << UTMI_PLL_PLLVDD12_SHIFT)
  124. | (3 << UTMI_PLL_PLLCALI12_SHIFT)
  125. | (1 << UTMI_PLL_ICP_SHIFT) | (3 << UTMI_PLL_KVCO_SHIFT));
  126. /* UTMI_TX */
  127. u2o_clear(base, UTMI_TX, UTMI_TX_REG_EXT_FS_RCAL_EN_MASK
  128. | UTMI_TX_TXVDD12_MASK
  129. | UTMI_TX_CK60_PHSEL_MASK | UTMI_TX_IMPCAL_VTH_MASK
  130. | UTMI_TX_REG_EXT_FS_RCAL_MASK | UTMI_TX_AMP_MASK);
  131. u2o_set(base, UTMI_TX, (3 << UTMI_TX_TXVDD12_SHIFT)
  132. | (4 << UTMI_TX_CK60_PHSEL_SHIFT)
  133. | (4 << UTMI_TX_IMPCAL_VTH_SHIFT)
  134. | (8 << UTMI_TX_REG_EXT_FS_RCAL_SHIFT)
  135. | (3 << UTMI_TX_AMP_SHIFT));
  136. /* UTMI_RX */
  137. u2o_clear(base, UTMI_RX, UTMI_RX_SQ_THRESH_MASK
  138. | UTMI_REG_SQ_LENGTH_MASK);
  139. if (cpu_is_pxa168())
  140. u2o_set(base, UTMI_RX, (7 << UTMI_RX_SQ_THRESH_SHIFT)
  141. | (2 << UTMI_REG_SQ_LENGTH_SHIFT));
  142. else
  143. u2o_set(base, UTMI_RX, (0x7 << UTMI_RX_SQ_THRESH_SHIFT)
  144. | (2 << UTMI_REG_SQ_LENGTH_SHIFT));
  145. /* UTMI_IVREF */
  146. if (cpu_is_pxa168())
  147. /*
  148. * fixing Microsoft Altair board interface with NEC hub issue -
  149. * Set UTMI_IVREF from 0x4a3 to 0x4bf
  150. */
  151. u2o_write(base, UTMI_IVREF, 0x4bf);
  152. /* calibrate */
  153. timeout = jiffies + 100;
  154. while ((u2o_read(base, UTMI_PLL) & PLL_READY) == 0) {
  155. if (time_after(jiffies, timeout))
  156. return -ETIME;
  157. cpu_relax();
  158. }
  159. /* toggle VCOCAL_START bit of UTMI_PLL */
  160. udelay(200);
  161. u2o_set(base, UTMI_PLL, VCOCAL_START);
  162. udelay(40);
  163. u2o_clear(base, UTMI_PLL, VCOCAL_START);
  164. /* toggle REG_RCAL_START bit of UTMI_TX */
  165. udelay(200);
  166. u2o_set(base, UTMI_TX, REG_RCAL_START);
  167. udelay(40);
  168. u2o_clear(base, UTMI_TX, REG_RCAL_START);
  169. udelay(200);
  170. /* make sure phy is ready */
  171. timeout = jiffies + 100;
  172. while ((u2o_read(base, UTMI_PLL) & PLL_READY) == 0) {
  173. if (time_after(jiffies, timeout))
  174. return -ETIME;
  175. cpu_relax();
  176. }
  177. if (cpu_is_pxa168()) {
  178. u2o_set(base, UTMI_RESERVE, 1 << 5);
  179. /* Turn on UTMI PHY OTG extension */
  180. u2o_write(base, UTMI_OTG_ADDON, 1);
  181. }
  182. return 0;
  183. }
  184. #else
  185. int mv_udc_phy_init(unsigned int base)
  186. {
  187. return 0;
  188. }
  189. #endif