phy-mvebu-cp110-comphy.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2017 Marvell
  4. *
  5. * Antoine Tenart <[email protected]>
  6. */
  7. #include <linux/arm-smccc.h>
  8. #include <linux/clk.h>
  9. #include <linux/io.h>
  10. #include <linux/iopoll.h>
  11. #include <linux/mfd/syscon.h>
  12. #include <linux/module.h>
  13. #include <linux/phy.h>
  14. #include <linux/phy/phy.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/regmap.h>
  17. /* Relative to priv->base */
  18. #define MVEBU_COMPHY_SERDES_CFG0(n) (0x0 + (n) * 0x1000)
  19. #define MVEBU_COMPHY_SERDES_CFG0_PU_PLL BIT(1)
  20. #define MVEBU_COMPHY_SERDES_CFG0_GEN_RX(n) ((n) << 3)
  21. #define MVEBU_COMPHY_SERDES_CFG0_GEN_TX(n) ((n) << 7)
  22. #define MVEBU_COMPHY_SERDES_CFG0_PU_RX BIT(11)
  23. #define MVEBU_COMPHY_SERDES_CFG0_PU_TX BIT(12)
  24. #define MVEBU_COMPHY_SERDES_CFG0_HALF_BUS BIT(14)
  25. #define MVEBU_COMPHY_SERDES_CFG0_RXAUI_MODE BIT(15)
  26. #define MVEBU_COMPHY_SERDES_CFG1(n) (0x4 + (n) * 0x1000)
  27. #define MVEBU_COMPHY_SERDES_CFG1_RESET BIT(3)
  28. #define MVEBU_COMPHY_SERDES_CFG1_RX_INIT BIT(4)
  29. #define MVEBU_COMPHY_SERDES_CFG1_CORE_RESET BIT(5)
  30. #define MVEBU_COMPHY_SERDES_CFG1_RF_RESET BIT(6)
  31. #define MVEBU_COMPHY_SERDES_CFG2(n) (0x8 + (n) * 0x1000)
  32. #define MVEBU_COMPHY_SERDES_CFG2_DFE_EN BIT(4)
  33. #define MVEBU_COMPHY_SERDES_STATUS0(n) (0x18 + (n) * 0x1000)
  34. #define MVEBU_COMPHY_SERDES_STATUS0_TX_PLL_RDY BIT(2)
  35. #define MVEBU_COMPHY_SERDES_STATUS0_RX_PLL_RDY BIT(3)
  36. #define MVEBU_COMPHY_SERDES_STATUS0_RX_INIT BIT(4)
  37. #define MVEBU_COMPHY_PWRPLL_CTRL(n) (0x804 + (n) * 0x1000)
  38. #define MVEBU_COMPHY_PWRPLL_CTRL_RFREQ(n) ((n) << 0)
  39. #define MVEBU_COMPHY_PWRPLL_PHY_MODE(n) ((n) << 5)
  40. #define MVEBU_COMPHY_IMP_CAL(n) (0x80c + (n) * 0x1000)
  41. #define MVEBU_COMPHY_IMP_CAL_TX_EXT(n) ((n) << 10)
  42. #define MVEBU_COMPHY_IMP_CAL_TX_EXT_EN BIT(15)
  43. #define MVEBU_COMPHY_DFE_RES(n) (0x81c + (n) * 0x1000)
  44. #define MVEBU_COMPHY_DFE_RES_FORCE_GEN_TBL BIT(15)
  45. #define MVEBU_COMPHY_COEF(n) (0x828 + (n) * 0x1000)
  46. #define MVEBU_COMPHY_COEF_DFE_EN BIT(14)
  47. #define MVEBU_COMPHY_COEF_DFE_CTRL BIT(15)
  48. #define MVEBU_COMPHY_GEN1_S0(n) (0x834 + (n) * 0x1000)
  49. #define MVEBU_COMPHY_GEN1_S0_TX_AMP(n) ((n) << 1)
  50. #define MVEBU_COMPHY_GEN1_S0_TX_EMPH(n) ((n) << 7)
  51. #define MVEBU_COMPHY_GEN1_S1(n) (0x838 + (n) * 0x1000)
  52. #define MVEBU_COMPHY_GEN1_S1_RX_MUL_PI(n) ((n) << 0)
  53. #define MVEBU_COMPHY_GEN1_S1_RX_MUL_PF(n) ((n) << 3)
  54. #define MVEBU_COMPHY_GEN1_S1_RX_MUL_FI(n) ((n) << 6)
  55. #define MVEBU_COMPHY_GEN1_S1_RX_MUL_FF(n) ((n) << 8)
  56. #define MVEBU_COMPHY_GEN1_S1_RX_DFE_EN BIT(10)
  57. #define MVEBU_COMPHY_GEN1_S1_RX_DIV(n) ((n) << 11)
  58. #define MVEBU_COMPHY_GEN1_S2(n) (0x8f4 + (n) * 0x1000)
  59. #define MVEBU_COMPHY_GEN1_S2_TX_EMPH(n) ((n) << 0)
  60. #define MVEBU_COMPHY_GEN1_S2_TX_EMPH_EN BIT(4)
  61. #define MVEBU_COMPHY_LOOPBACK(n) (0x88c + (n) * 0x1000)
  62. #define MVEBU_COMPHY_LOOPBACK_DBUS_WIDTH(n) ((n) << 1)
  63. #define MVEBU_COMPHY_VDD_CAL0(n) (0x908 + (n) * 0x1000)
  64. #define MVEBU_COMPHY_VDD_CAL0_CONT_MODE BIT(15)
  65. #define MVEBU_COMPHY_EXT_SELV(n) (0x914 + (n) * 0x1000)
  66. #define MVEBU_COMPHY_EXT_SELV_RX_SAMPL(n) ((n) << 5)
  67. #define MVEBU_COMPHY_MISC_CTRL0(n) (0x93c + (n) * 0x1000)
  68. #define MVEBU_COMPHY_MISC_CTRL0_ICP_FORCE BIT(5)
  69. #define MVEBU_COMPHY_MISC_CTRL0_REFCLK_SEL BIT(10)
  70. #define MVEBU_COMPHY_RX_CTRL1(n) (0x940 + (n) * 0x1000)
  71. #define MVEBU_COMPHY_RX_CTRL1_RXCLK2X_SEL BIT(11)
  72. #define MVEBU_COMPHY_RX_CTRL1_CLK8T_EN BIT(12)
  73. #define MVEBU_COMPHY_SPEED_DIV(n) (0x954 + (n) * 0x1000)
  74. #define MVEBU_COMPHY_SPEED_DIV_TX_FORCE BIT(7)
  75. #define MVEBU_SP_CALIB(n) (0x96c + (n) * 0x1000)
  76. #define MVEBU_SP_CALIB_SAMPLER(n) ((n) << 8)
  77. #define MVEBU_SP_CALIB_SAMPLER_EN BIT(12)
  78. #define MVEBU_COMPHY_TX_SLEW_RATE(n) (0x974 + (n) * 0x1000)
  79. #define MVEBU_COMPHY_TX_SLEW_RATE_EMPH(n) ((n) << 5)
  80. #define MVEBU_COMPHY_TX_SLEW_RATE_SLC(n) ((n) << 10)
  81. #define MVEBU_COMPHY_DTL_CTRL(n) (0x984 + (n) * 0x1000)
  82. #define MVEBU_COMPHY_DTL_CTRL_DTL_FLOOP_EN BIT(2)
  83. #define MVEBU_COMPHY_FRAME_DETECT0(n) (0xa14 + (n) * 0x1000)
  84. #define MVEBU_COMPHY_FRAME_DETECT0_PATN(n) ((n) << 7)
  85. #define MVEBU_COMPHY_FRAME_DETECT3(n) (0xa20 + (n) * 0x1000)
  86. #define MVEBU_COMPHY_FRAME_DETECT3_LOST_TIMEOUT_EN BIT(12)
  87. #define MVEBU_COMPHY_DME(n) (0xa28 + (n) * 0x1000)
  88. #define MVEBU_COMPHY_DME_ETH_MODE BIT(7)
  89. #define MVEBU_COMPHY_TRAINING0(n) (0xa68 + (n) * 0x1000)
  90. #define MVEBU_COMPHY_TRAINING0_P2P_HOLD BIT(15)
  91. #define MVEBU_COMPHY_TRAINING5(n) (0xaa4 + (n) * 0x1000)
  92. #define MVEBU_COMPHY_TRAINING5_RX_TIMER(n) ((n) << 0)
  93. #define MVEBU_COMPHY_TX_TRAIN_PRESET(n) (0xb1c + (n) * 0x1000)
  94. #define MVEBU_COMPHY_TX_TRAIN_PRESET_16B_AUTO_EN BIT(8)
  95. #define MVEBU_COMPHY_TX_TRAIN_PRESET_PRBS11 BIT(9)
  96. #define MVEBU_COMPHY_GEN1_S3(n) (0xc40 + (n) * 0x1000)
  97. #define MVEBU_COMPHY_GEN1_S3_FBCK_SEL BIT(9)
  98. #define MVEBU_COMPHY_GEN1_S4(n) (0xc44 + (n) * 0x1000)
  99. #define MVEBU_COMPHY_GEN1_S4_DFE_RES(n) ((n) << 8)
  100. #define MVEBU_COMPHY_TX_PRESET(n) (0xc68 + (n) * 0x1000)
  101. #define MVEBU_COMPHY_TX_PRESET_INDEX(n) ((n) << 0)
  102. #define MVEBU_COMPHY_GEN1_S5(n) (0xd38 + (n) * 0x1000)
  103. #define MVEBU_COMPHY_GEN1_S5_ICP(n) ((n) << 0)
  104. /* Relative to priv->regmap */
  105. #define MVEBU_COMPHY_CONF1(n) (0x1000 + (n) * 0x28)
  106. #define MVEBU_COMPHY_CONF1_PWRUP BIT(1)
  107. #define MVEBU_COMPHY_CONF1_USB_PCIE BIT(2) /* 0: Ethernet/SATA */
  108. #define MVEBU_COMPHY_CONF6(n) (0x1014 + (n) * 0x28)
  109. #define MVEBU_COMPHY_CONF6_40B BIT(18)
  110. #define MVEBU_COMPHY_SELECTOR 0x1140
  111. #define MVEBU_COMPHY_SELECTOR_PHY(n) ((n) * 0x4)
  112. #define MVEBU_COMPHY_PIPE_SELECTOR 0x1144
  113. #define MVEBU_COMPHY_PIPE_SELECTOR_PIPE(n) ((n) * 0x4)
  114. #define MVEBU_COMPHY_SD1_CTRL1 0x1148
  115. #define MVEBU_COMPHY_SD1_CTRL1_RXAUI1_EN BIT(26)
  116. #define MVEBU_COMPHY_SD1_CTRL1_RXAUI0_EN BIT(27)
  117. #define MVEBU_COMPHY_LANES 6
  118. #define MVEBU_COMPHY_PORTS 3
  119. #define COMPHY_SIP_POWER_ON 0x82000001
  120. #define COMPHY_SIP_POWER_OFF 0x82000002
  121. /*
  122. * A lane is described by the following bitfields:
  123. * [ 1- 0]: COMPHY polarity invertion
  124. * [ 2- 7]: COMPHY speed
  125. * [ 5-11]: COMPHY port index
  126. * [12-16]: COMPHY mode
  127. * [17]: Clock source
  128. * [18-20]: PCIe width (x1, x2, x4)
  129. */
  130. #define COMPHY_FW_POL_OFFSET 0
  131. #define COMPHY_FW_POL_MASK GENMASK(1, 0)
  132. #define COMPHY_FW_SPEED_OFFSET 2
  133. #define COMPHY_FW_SPEED_MASK GENMASK(7, 2)
  134. #define COMPHY_FW_SPEED_MAX COMPHY_FW_SPEED_MASK
  135. #define COMPHY_FW_SPEED_1250 0
  136. #define COMPHY_FW_SPEED_3125 2
  137. #define COMPHY_FW_SPEED_5000 3
  138. #define COMPHY_FW_SPEED_515625 4
  139. #define COMPHY_FW_SPEED_103125 6
  140. #define COMPHY_FW_PORT_OFFSET 8
  141. #define COMPHY_FW_PORT_MASK GENMASK(11, 8)
  142. #define COMPHY_FW_MODE_OFFSET 12
  143. #define COMPHY_FW_MODE_MASK GENMASK(16, 12)
  144. #define COMPHY_FW_WIDTH_OFFSET 18
  145. #define COMPHY_FW_WIDTH_MASK GENMASK(20, 18)
  146. #define COMPHY_FW_PARAM_FULL(mode, port, speed, pol, width) \
  147. ((((pol) << COMPHY_FW_POL_OFFSET) & COMPHY_FW_POL_MASK) | \
  148. (((mode) << COMPHY_FW_MODE_OFFSET) & COMPHY_FW_MODE_MASK) | \
  149. (((port) << COMPHY_FW_PORT_OFFSET) & COMPHY_FW_PORT_MASK) | \
  150. (((speed) << COMPHY_FW_SPEED_OFFSET) & COMPHY_FW_SPEED_MASK) | \
  151. (((width) << COMPHY_FW_WIDTH_OFFSET) & COMPHY_FW_WIDTH_MASK))
  152. #define COMPHY_FW_PARAM(mode, port) \
  153. COMPHY_FW_PARAM_FULL(mode, port, COMPHY_FW_SPEED_MAX, 0, 0)
  154. #define COMPHY_FW_PARAM_ETH(mode, port, speed) \
  155. COMPHY_FW_PARAM_FULL(mode, port, speed, 0, 0)
  156. #define COMPHY_FW_PARAM_PCIE(mode, port, width) \
  157. COMPHY_FW_PARAM_FULL(mode, port, COMPHY_FW_SPEED_5000, 0, width)
  158. #define COMPHY_FW_MODE_SATA 0x1
  159. #define COMPHY_FW_MODE_SGMII 0x2 /* SGMII 1G */
  160. #define COMPHY_FW_MODE_2500BASEX 0x3 /* 2500BASE-X */
  161. #define COMPHY_FW_MODE_USB3H 0x4
  162. #define COMPHY_FW_MODE_USB3D 0x5
  163. #define COMPHY_FW_MODE_PCIE 0x6
  164. #define COMPHY_FW_MODE_RXAUI 0x7
  165. #define COMPHY_FW_MODE_XFI 0x8 /* SFI: 0x9 (is treated like XFI) */
  166. struct mvebu_comphy_conf {
  167. enum phy_mode mode;
  168. int submode;
  169. unsigned lane;
  170. unsigned port;
  171. u32 mux;
  172. u32 fw_mode;
  173. };
  174. #define ETH_CONF(_lane, _port, _submode, _mux, _fw) \
  175. { \
  176. .lane = _lane, \
  177. .port = _port, \
  178. .mode = PHY_MODE_ETHERNET, \
  179. .submode = _submode, \
  180. .mux = _mux, \
  181. .fw_mode = _fw, \
  182. }
  183. #define GEN_CONF(_lane, _port, _mode, _fw) \
  184. { \
  185. .lane = _lane, \
  186. .port = _port, \
  187. .mode = _mode, \
  188. .submode = PHY_INTERFACE_MODE_NA, \
  189. .mux = -1, \
  190. .fw_mode = _fw, \
  191. }
  192. static const struct mvebu_comphy_conf mvebu_comphy_cp110_modes[] = {
  193. /* lane 0 */
  194. GEN_CONF(0, 0, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
  195. ETH_CONF(0, 1, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
  196. ETH_CONF(0, 1, PHY_INTERFACE_MODE_2500BASEX, 0x1, COMPHY_FW_MODE_2500BASEX),
  197. GEN_CONF(0, 1, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
  198. /* lane 1 */
  199. GEN_CONF(1, 0, PHY_MODE_USB_HOST_SS, COMPHY_FW_MODE_USB3H),
  200. GEN_CONF(1, 0, PHY_MODE_USB_DEVICE_SS, COMPHY_FW_MODE_USB3D),
  201. GEN_CONF(1, 0, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
  202. GEN_CONF(1, 0, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
  203. ETH_CONF(1, 2, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
  204. ETH_CONF(1, 2, PHY_INTERFACE_MODE_2500BASEX, 0x1, COMPHY_FW_MODE_2500BASEX),
  205. /* lane 2 */
  206. ETH_CONF(2, 0, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
  207. ETH_CONF(2, 0, PHY_INTERFACE_MODE_2500BASEX, 0x1, COMPHY_FW_MODE_2500BASEX),
  208. ETH_CONF(2, 0, PHY_INTERFACE_MODE_RXAUI, 0x1, COMPHY_FW_MODE_RXAUI),
  209. ETH_CONF(2, 0, PHY_INTERFACE_MODE_5GBASER, 0x1, COMPHY_FW_MODE_XFI),
  210. ETH_CONF(2, 0, PHY_INTERFACE_MODE_10GBASER, 0x1, COMPHY_FW_MODE_XFI),
  211. GEN_CONF(2, 0, PHY_MODE_USB_HOST_SS, COMPHY_FW_MODE_USB3H),
  212. GEN_CONF(2, 0, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
  213. GEN_CONF(2, 0, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
  214. /* lane 3 */
  215. GEN_CONF(3, 0, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
  216. ETH_CONF(3, 1, PHY_INTERFACE_MODE_SGMII, 0x2, COMPHY_FW_MODE_SGMII),
  217. ETH_CONF(3, 1, PHY_INTERFACE_MODE_2500BASEX, 0x2, COMPHY_FW_MODE_2500BASEX),
  218. ETH_CONF(3, 1, PHY_INTERFACE_MODE_RXAUI, 0x1, COMPHY_FW_MODE_RXAUI),
  219. GEN_CONF(3, 1, PHY_MODE_USB_HOST_SS, COMPHY_FW_MODE_USB3H),
  220. GEN_CONF(3, 1, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
  221. /* lane 4 */
  222. ETH_CONF(4, 0, PHY_INTERFACE_MODE_SGMII, 0x2, COMPHY_FW_MODE_SGMII),
  223. ETH_CONF(4, 0, PHY_INTERFACE_MODE_2500BASEX, 0x2, COMPHY_FW_MODE_2500BASEX),
  224. ETH_CONF(4, 0, PHY_INTERFACE_MODE_5GBASER, 0x2, COMPHY_FW_MODE_XFI),
  225. ETH_CONF(4, 0, PHY_INTERFACE_MODE_10GBASER, 0x2, COMPHY_FW_MODE_XFI),
  226. ETH_CONF(4, 0, PHY_INTERFACE_MODE_RXAUI, 0x2, COMPHY_FW_MODE_RXAUI),
  227. GEN_CONF(4, 0, PHY_MODE_USB_DEVICE_SS, COMPHY_FW_MODE_USB3D),
  228. GEN_CONF(4, 1, PHY_MODE_USB_HOST_SS, COMPHY_FW_MODE_USB3H),
  229. GEN_CONF(4, 1, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
  230. ETH_CONF(4, 1, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
  231. ETH_CONF(4, 1, PHY_INTERFACE_MODE_2500BASEX, -1, COMPHY_FW_MODE_2500BASEX),
  232. ETH_CONF(4, 1, PHY_INTERFACE_MODE_5GBASER, -1, COMPHY_FW_MODE_XFI),
  233. ETH_CONF(4, 1, PHY_INTERFACE_MODE_10GBASER, -1, COMPHY_FW_MODE_XFI),
  234. /* lane 5 */
  235. ETH_CONF(5, 1, PHY_INTERFACE_MODE_RXAUI, 0x2, COMPHY_FW_MODE_RXAUI),
  236. GEN_CONF(5, 1, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
  237. ETH_CONF(5, 2, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
  238. ETH_CONF(5, 2, PHY_INTERFACE_MODE_2500BASEX, 0x1, COMPHY_FW_MODE_2500BASEX),
  239. GEN_CONF(5, 2, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
  240. };
  241. struct mvebu_comphy_priv {
  242. void __iomem *base;
  243. struct regmap *regmap;
  244. struct device *dev;
  245. struct clk *mg_domain_clk;
  246. struct clk *mg_core_clk;
  247. struct clk *axi_clk;
  248. unsigned long cp_phys;
  249. };
  250. struct mvebu_comphy_lane {
  251. struct mvebu_comphy_priv *priv;
  252. unsigned id;
  253. enum phy_mode mode;
  254. int submode;
  255. int port;
  256. };
  257. static int mvebu_comphy_smc(unsigned long function, unsigned long phys,
  258. unsigned long lane, unsigned long mode)
  259. {
  260. struct arm_smccc_res res;
  261. s32 ret;
  262. arm_smccc_smc(function, phys, lane, mode, 0, 0, 0, 0, &res);
  263. ret = res.a0;
  264. switch (ret) {
  265. case SMCCC_RET_SUCCESS:
  266. return 0;
  267. case SMCCC_RET_NOT_SUPPORTED:
  268. return -EOPNOTSUPP;
  269. default:
  270. return -EINVAL;
  271. }
  272. }
  273. static int mvebu_comphy_get_mode(bool fw_mode, int lane, int port,
  274. enum phy_mode mode, int submode)
  275. {
  276. int i, n = ARRAY_SIZE(mvebu_comphy_cp110_modes);
  277. /* Ignore PCIe submode: it represents the width */
  278. bool ignore_submode = (mode == PHY_MODE_PCIE);
  279. const struct mvebu_comphy_conf *conf;
  280. /* Unused PHY mux value is 0x0 */
  281. if (mode == PHY_MODE_INVALID)
  282. return 0;
  283. for (i = 0; i < n; i++) {
  284. conf = &mvebu_comphy_cp110_modes[i];
  285. if (conf->lane == lane &&
  286. conf->port == port &&
  287. conf->mode == mode &&
  288. (conf->submode == submode || ignore_submode))
  289. break;
  290. }
  291. if (i == n)
  292. return -EINVAL;
  293. if (fw_mode)
  294. return conf->fw_mode;
  295. else
  296. return conf->mux;
  297. }
  298. static inline int mvebu_comphy_get_mux(int lane, int port,
  299. enum phy_mode mode, int submode)
  300. {
  301. return mvebu_comphy_get_mode(false, lane, port, mode, submode);
  302. }
  303. static inline int mvebu_comphy_get_fw_mode(int lane, int port,
  304. enum phy_mode mode, int submode)
  305. {
  306. return mvebu_comphy_get_mode(true, lane, port, mode, submode);
  307. }
  308. static int mvebu_comphy_ethernet_init_reset(struct mvebu_comphy_lane *lane)
  309. {
  310. struct mvebu_comphy_priv *priv = lane->priv;
  311. u32 val;
  312. regmap_read(priv->regmap, MVEBU_COMPHY_CONF1(lane->id), &val);
  313. val &= ~MVEBU_COMPHY_CONF1_USB_PCIE;
  314. val |= MVEBU_COMPHY_CONF1_PWRUP;
  315. regmap_write(priv->regmap, MVEBU_COMPHY_CONF1(lane->id), val);
  316. /* Select baud rates and PLLs */
  317. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG0(lane->id));
  318. val &= ~(MVEBU_COMPHY_SERDES_CFG0_PU_PLL |
  319. MVEBU_COMPHY_SERDES_CFG0_PU_RX |
  320. MVEBU_COMPHY_SERDES_CFG0_PU_TX |
  321. MVEBU_COMPHY_SERDES_CFG0_HALF_BUS |
  322. MVEBU_COMPHY_SERDES_CFG0_GEN_RX(0xf) |
  323. MVEBU_COMPHY_SERDES_CFG0_GEN_TX(0xf) |
  324. MVEBU_COMPHY_SERDES_CFG0_RXAUI_MODE);
  325. switch (lane->submode) {
  326. case PHY_INTERFACE_MODE_10GBASER:
  327. val |= MVEBU_COMPHY_SERDES_CFG0_GEN_RX(0xe) |
  328. MVEBU_COMPHY_SERDES_CFG0_GEN_TX(0xe);
  329. break;
  330. case PHY_INTERFACE_MODE_RXAUI:
  331. val |= MVEBU_COMPHY_SERDES_CFG0_GEN_RX(0xb) |
  332. MVEBU_COMPHY_SERDES_CFG0_GEN_TX(0xb) |
  333. MVEBU_COMPHY_SERDES_CFG0_RXAUI_MODE;
  334. break;
  335. case PHY_INTERFACE_MODE_2500BASEX:
  336. val |= MVEBU_COMPHY_SERDES_CFG0_GEN_RX(0x8) |
  337. MVEBU_COMPHY_SERDES_CFG0_GEN_TX(0x8) |
  338. MVEBU_COMPHY_SERDES_CFG0_HALF_BUS;
  339. break;
  340. case PHY_INTERFACE_MODE_SGMII:
  341. val |= MVEBU_COMPHY_SERDES_CFG0_GEN_RX(0x6) |
  342. MVEBU_COMPHY_SERDES_CFG0_GEN_TX(0x6) |
  343. MVEBU_COMPHY_SERDES_CFG0_HALF_BUS;
  344. break;
  345. default:
  346. dev_err(priv->dev,
  347. "unsupported comphy submode (%d) on lane %d\n",
  348. lane->submode,
  349. lane->id);
  350. return -ENOTSUPP;
  351. }
  352. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG0(lane->id));
  353. if (lane->submode == PHY_INTERFACE_MODE_RXAUI) {
  354. regmap_read(priv->regmap, MVEBU_COMPHY_SD1_CTRL1, &val);
  355. switch (lane->id) {
  356. case 2:
  357. case 3:
  358. val |= MVEBU_COMPHY_SD1_CTRL1_RXAUI0_EN;
  359. break;
  360. case 4:
  361. case 5:
  362. val |= MVEBU_COMPHY_SD1_CTRL1_RXAUI1_EN;
  363. break;
  364. default:
  365. dev_err(priv->dev,
  366. "RXAUI is not supported on comphy lane %d\n",
  367. lane->id);
  368. return -EINVAL;
  369. }
  370. regmap_write(priv->regmap, MVEBU_COMPHY_SD1_CTRL1, val);
  371. }
  372. /* reset */
  373. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  374. val &= ~(MVEBU_COMPHY_SERDES_CFG1_RESET |
  375. MVEBU_COMPHY_SERDES_CFG1_CORE_RESET |
  376. MVEBU_COMPHY_SERDES_CFG1_RF_RESET);
  377. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  378. /* de-assert reset */
  379. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  380. val |= MVEBU_COMPHY_SERDES_CFG1_RESET |
  381. MVEBU_COMPHY_SERDES_CFG1_CORE_RESET;
  382. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  383. /* wait until clocks are ready */
  384. mdelay(1);
  385. /* exlicitly disable 40B, the bits isn't clear on reset */
  386. regmap_read(priv->regmap, MVEBU_COMPHY_CONF6(lane->id), &val);
  387. val &= ~MVEBU_COMPHY_CONF6_40B;
  388. regmap_write(priv->regmap, MVEBU_COMPHY_CONF6(lane->id), val);
  389. /* refclk selection */
  390. val = readl(priv->base + MVEBU_COMPHY_MISC_CTRL0(lane->id));
  391. val &= ~MVEBU_COMPHY_MISC_CTRL0_REFCLK_SEL;
  392. if (lane->submode == PHY_INTERFACE_MODE_10GBASER)
  393. val |= MVEBU_COMPHY_MISC_CTRL0_ICP_FORCE;
  394. writel(val, priv->base + MVEBU_COMPHY_MISC_CTRL0(lane->id));
  395. /* power and pll selection */
  396. val = readl(priv->base + MVEBU_COMPHY_PWRPLL_CTRL(lane->id));
  397. val &= ~(MVEBU_COMPHY_PWRPLL_CTRL_RFREQ(0x1f) |
  398. MVEBU_COMPHY_PWRPLL_PHY_MODE(0x7));
  399. val |= MVEBU_COMPHY_PWRPLL_CTRL_RFREQ(0x1) |
  400. MVEBU_COMPHY_PWRPLL_PHY_MODE(0x4);
  401. writel(val, priv->base + MVEBU_COMPHY_PWRPLL_CTRL(lane->id));
  402. val = readl(priv->base + MVEBU_COMPHY_LOOPBACK(lane->id));
  403. val &= ~MVEBU_COMPHY_LOOPBACK_DBUS_WIDTH(0x7);
  404. val |= MVEBU_COMPHY_LOOPBACK_DBUS_WIDTH(0x1);
  405. writel(val, priv->base + MVEBU_COMPHY_LOOPBACK(lane->id));
  406. return 0;
  407. }
  408. static int mvebu_comphy_init_plls(struct mvebu_comphy_lane *lane)
  409. {
  410. struct mvebu_comphy_priv *priv = lane->priv;
  411. u32 val;
  412. /* SERDES external config */
  413. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG0(lane->id));
  414. val |= MVEBU_COMPHY_SERDES_CFG0_PU_PLL |
  415. MVEBU_COMPHY_SERDES_CFG0_PU_RX |
  416. MVEBU_COMPHY_SERDES_CFG0_PU_TX;
  417. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG0(lane->id));
  418. /* check rx/tx pll */
  419. readl_poll_timeout(priv->base + MVEBU_COMPHY_SERDES_STATUS0(lane->id),
  420. val,
  421. val & (MVEBU_COMPHY_SERDES_STATUS0_RX_PLL_RDY |
  422. MVEBU_COMPHY_SERDES_STATUS0_TX_PLL_RDY),
  423. 1000, 150000);
  424. if (!(val & (MVEBU_COMPHY_SERDES_STATUS0_RX_PLL_RDY |
  425. MVEBU_COMPHY_SERDES_STATUS0_TX_PLL_RDY)))
  426. return -ETIMEDOUT;
  427. /* rx init */
  428. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  429. val |= MVEBU_COMPHY_SERDES_CFG1_RX_INIT;
  430. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  431. /* check rx */
  432. readl_poll_timeout(priv->base + MVEBU_COMPHY_SERDES_STATUS0(lane->id),
  433. val, val & MVEBU_COMPHY_SERDES_STATUS0_RX_INIT,
  434. 1000, 10000);
  435. if (!(val & MVEBU_COMPHY_SERDES_STATUS0_RX_INIT))
  436. return -ETIMEDOUT;
  437. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  438. val &= ~MVEBU_COMPHY_SERDES_CFG1_RX_INIT;
  439. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  440. return 0;
  441. }
  442. static int mvebu_comphy_set_mode_sgmii(struct phy *phy)
  443. {
  444. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  445. struct mvebu_comphy_priv *priv = lane->priv;
  446. u32 val;
  447. int err;
  448. err = mvebu_comphy_ethernet_init_reset(lane);
  449. if (err)
  450. return err;
  451. val = readl(priv->base + MVEBU_COMPHY_RX_CTRL1(lane->id));
  452. val &= ~MVEBU_COMPHY_RX_CTRL1_CLK8T_EN;
  453. val |= MVEBU_COMPHY_RX_CTRL1_RXCLK2X_SEL;
  454. writel(val, priv->base + MVEBU_COMPHY_RX_CTRL1(lane->id));
  455. val = readl(priv->base + MVEBU_COMPHY_DTL_CTRL(lane->id));
  456. val &= ~MVEBU_COMPHY_DTL_CTRL_DTL_FLOOP_EN;
  457. writel(val, priv->base + MVEBU_COMPHY_DTL_CTRL(lane->id));
  458. regmap_read(priv->regmap, MVEBU_COMPHY_CONF1(lane->id), &val);
  459. val &= ~MVEBU_COMPHY_CONF1_USB_PCIE;
  460. val |= MVEBU_COMPHY_CONF1_PWRUP;
  461. regmap_write(priv->regmap, MVEBU_COMPHY_CONF1(lane->id), val);
  462. val = readl(priv->base + MVEBU_COMPHY_GEN1_S0(lane->id));
  463. val &= ~MVEBU_COMPHY_GEN1_S0_TX_EMPH(0xf);
  464. val |= MVEBU_COMPHY_GEN1_S0_TX_EMPH(0x1);
  465. writel(val, priv->base + MVEBU_COMPHY_GEN1_S0(lane->id));
  466. return mvebu_comphy_init_plls(lane);
  467. }
  468. static int mvebu_comphy_set_mode_rxaui(struct phy *phy)
  469. {
  470. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  471. struct mvebu_comphy_priv *priv = lane->priv;
  472. u32 val;
  473. int err;
  474. err = mvebu_comphy_ethernet_init_reset(lane);
  475. if (err)
  476. return err;
  477. val = readl(priv->base + MVEBU_COMPHY_RX_CTRL1(lane->id));
  478. val |= MVEBU_COMPHY_RX_CTRL1_RXCLK2X_SEL |
  479. MVEBU_COMPHY_RX_CTRL1_CLK8T_EN;
  480. writel(val, priv->base + MVEBU_COMPHY_RX_CTRL1(lane->id));
  481. val = readl(priv->base + MVEBU_COMPHY_DTL_CTRL(lane->id));
  482. val |= MVEBU_COMPHY_DTL_CTRL_DTL_FLOOP_EN;
  483. writel(val, priv->base + MVEBU_COMPHY_DTL_CTRL(lane->id));
  484. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG2(lane->id));
  485. val |= MVEBU_COMPHY_SERDES_CFG2_DFE_EN;
  486. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG2(lane->id));
  487. val = readl(priv->base + MVEBU_COMPHY_DFE_RES(lane->id));
  488. val |= MVEBU_COMPHY_DFE_RES_FORCE_GEN_TBL;
  489. writel(val, priv->base + MVEBU_COMPHY_DFE_RES(lane->id));
  490. val = readl(priv->base + MVEBU_COMPHY_GEN1_S0(lane->id));
  491. val &= ~MVEBU_COMPHY_GEN1_S0_TX_EMPH(0xf);
  492. val |= MVEBU_COMPHY_GEN1_S0_TX_EMPH(0xd);
  493. writel(val, priv->base + MVEBU_COMPHY_GEN1_S0(lane->id));
  494. val = readl(priv->base + MVEBU_COMPHY_GEN1_S1(lane->id));
  495. val &= ~(MVEBU_COMPHY_GEN1_S1_RX_MUL_PI(0x7) |
  496. MVEBU_COMPHY_GEN1_S1_RX_MUL_PF(0x7));
  497. val |= MVEBU_COMPHY_GEN1_S1_RX_MUL_PI(0x1) |
  498. MVEBU_COMPHY_GEN1_S1_RX_MUL_PF(0x1) |
  499. MVEBU_COMPHY_GEN1_S1_RX_DFE_EN;
  500. writel(val, priv->base + MVEBU_COMPHY_GEN1_S1(lane->id));
  501. val = readl(priv->base + MVEBU_COMPHY_COEF(lane->id));
  502. val &= ~(MVEBU_COMPHY_COEF_DFE_EN | MVEBU_COMPHY_COEF_DFE_CTRL);
  503. writel(val, priv->base + MVEBU_COMPHY_COEF(lane->id));
  504. val = readl(priv->base + MVEBU_COMPHY_GEN1_S4(lane->id));
  505. val &= ~MVEBU_COMPHY_GEN1_S4_DFE_RES(0x3);
  506. val |= MVEBU_COMPHY_GEN1_S4_DFE_RES(0x1);
  507. writel(val, priv->base + MVEBU_COMPHY_GEN1_S4(lane->id));
  508. return mvebu_comphy_init_plls(lane);
  509. }
  510. static int mvebu_comphy_set_mode_10gbaser(struct phy *phy)
  511. {
  512. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  513. struct mvebu_comphy_priv *priv = lane->priv;
  514. u32 val;
  515. int err;
  516. err = mvebu_comphy_ethernet_init_reset(lane);
  517. if (err)
  518. return err;
  519. val = readl(priv->base + MVEBU_COMPHY_RX_CTRL1(lane->id));
  520. val |= MVEBU_COMPHY_RX_CTRL1_RXCLK2X_SEL |
  521. MVEBU_COMPHY_RX_CTRL1_CLK8T_EN;
  522. writel(val, priv->base + MVEBU_COMPHY_RX_CTRL1(lane->id));
  523. val = readl(priv->base + MVEBU_COMPHY_DTL_CTRL(lane->id));
  524. val |= MVEBU_COMPHY_DTL_CTRL_DTL_FLOOP_EN;
  525. writel(val, priv->base + MVEBU_COMPHY_DTL_CTRL(lane->id));
  526. /* Speed divider */
  527. val = readl(priv->base + MVEBU_COMPHY_SPEED_DIV(lane->id));
  528. val |= MVEBU_COMPHY_SPEED_DIV_TX_FORCE;
  529. writel(val, priv->base + MVEBU_COMPHY_SPEED_DIV(lane->id));
  530. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG2(lane->id));
  531. val |= MVEBU_COMPHY_SERDES_CFG2_DFE_EN;
  532. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG2(lane->id));
  533. /* DFE resolution */
  534. val = readl(priv->base + MVEBU_COMPHY_DFE_RES(lane->id));
  535. val |= MVEBU_COMPHY_DFE_RES_FORCE_GEN_TBL;
  536. writel(val, priv->base + MVEBU_COMPHY_DFE_RES(lane->id));
  537. val = readl(priv->base + MVEBU_COMPHY_GEN1_S0(lane->id));
  538. val &= ~(MVEBU_COMPHY_GEN1_S0_TX_AMP(0x1f) |
  539. MVEBU_COMPHY_GEN1_S0_TX_EMPH(0xf));
  540. val |= MVEBU_COMPHY_GEN1_S0_TX_AMP(0x1c) |
  541. MVEBU_COMPHY_GEN1_S0_TX_EMPH(0xe);
  542. writel(val, priv->base + MVEBU_COMPHY_GEN1_S0(lane->id));
  543. val = readl(priv->base + MVEBU_COMPHY_GEN1_S2(lane->id));
  544. val &= ~MVEBU_COMPHY_GEN1_S2_TX_EMPH(0xf);
  545. val |= MVEBU_COMPHY_GEN1_S2_TX_EMPH_EN;
  546. writel(val, priv->base + MVEBU_COMPHY_GEN1_S2(lane->id));
  547. val = readl(priv->base + MVEBU_COMPHY_TX_SLEW_RATE(lane->id));
  548. val |= MVEBU_COMPHY_TX_SLEW_RATE_EMPH(0x3) |
  549. MVEBU_COMPHY_TX_SLEW_RATE_SLC(0x3f);
  550. writel(val, priv->base + MVEBU_COMPHY_TX_SLEW_RATE(lane->id));
  551. /* Impedance calibration */
  552. val = readl(priv->base + MVEBU_COMPHY_IMP_CAL(lane->id));
  553. val &= ~MVEBU_COMPHY_IMP_CAL_TX_EXT(0x1f);
  554. val |= MVEBU_COMPHY_IMP_CAL_TX_EXT(0xe) |
  555. MVEBU_COMPHY_IMP_CAL_TX_EXT_EN;
  556. writel(val, priv->base + MVEBU_COMPHY_IMP_CAL(lane->id));
  557. val = readl(priv->base + MVEBU_COMPHY_GEN1_S5(lane->id));
  558. val &= ~MVEBU_COMPHY_GEN1_S5_ICP(0xf);
  559. writel(val, priv->base + MVEBU_COMPHY_GEN1_S5(lane->id));
  560. val = readl(priv->base + MVEBU_COMPHY_GEN1_S1(lane->id));
  561. val &= ~(MVEBU_COMPHY_GEN1_S1_RX_MUL_PI(0x7) |
  562. MVEBU_COMPHY_GEN1_S1_RX_MUL_PF(0x7) |
  563. MVEBU_COMPHY_GEN1_S1_RX_MUL_FI(0x3) |
  564. MVEBU_COMPHY_GEN1_S1_RX_MUL_FF(0x3));
  565. val |= MVEBU_COMPHY_GEN1_S1_RX_DFE_EN |
  566. MVEBU_COMPHY_GEN1_S1_RX_MUL_PI(0x2) |
  567. MVEBU_COMPHY_GEN1_S1_RX_MUL_PF(0x2) |
  568. MVEBU_COMPHY_GEN1_S1_RX_MUL_FF(0x1) |
  569. MVEBU_COMPHY_GEN1_S1_RX_DIV(0x3);
  570. writel(val, priv->base + MVEBU_COMPHY_GEN1_S1(lane->id));
  571. val = readl(priv->base + MVEBU_COMPHY_COEF(lane->id));
  572. val &= ~(MVEBU_COMPHY_COEF_DFE_EN | MVEBU_COMPHY_COEF_DFE_CTRL);
  573. writel(val, priv->base + MVEBU_COMPHY_COEF(lane->id));
  574. val = readl(priv->base + MVEBU_COMPHY_GEN1_S4(lane->id));
  575. val &= ~MVEBU_COMPHY_GEN1_S4_DFE_RES(0x3);
  576. val |= MVEBU_COMPHY_GEN1_S4_DFE_RES(0x1);
  577. writel(val, priv->base + MVEBU_COMPHY_GEN1_S4(lane->id));
  578. val = readl(priv->base + MVEBU_COMPHY_GEN1_S3(lane->id));
  579. val |= MVEBU_COMPHY_GEN1_S3_FBCK_SEL;
  580. writel(val, priv->base + MVEBU_COMPHY_GEN1_S3(lane->id));
  581. /* rx training timer */
  582. val = readl(priv->base + MVEBU_COMPHY_TRAINING5(lane->id));
  583. val &= ~MVEBU_COMPHY_TRAINING5_RX_TIMER(0x3ff);
  584. val |= MVEBU_COMPHY_TRAINING5_RX_TIMER(0x13);
  585. writel(val, priv->base + MVEBU_COMPHY_TRAINING5(lane->id));
  586. /* tx train peak to peak hold */
  587. val = readl(priv->base + MVEBU_COMPHY_TRAINING0(lane->id));
  588. val |= MVEBU_COMPHY_TRAINING0_P2P_HOLD;
  589. writel(val, priv->base + MVEBU_COMPHY_TRAINING0(lane->id));
  590. val = readl(priv->base + MVEBU_COMPHY_TX_PRESET(lane->id));
  591. val &= ~MVEBU_COMPHY_TX_PRESET_INDEX(0xf);
  592. val |= MVEBU_COMPHY_TX_PRESET_INDEX(0x2); /* preset coeff */
  593. writel(val, priv->base + MVEBU_COMPHY_TX_PRESET(lane->id));
  594. val = readl(priv->base + MVEBU_COMPHY_FRAME_DETECT3(lane->id));
  595. val &= ~MVEBU_COMPHY_FRAME_DETECT3_LOST_TIMEOUT_EN;
  596. writel(val, priv->base + MVEBU_COMPHY_FRAME_DETECT3(lane->id));
  597. val = readl(priv->base + MVEBU_COMPHY_TX_TRAIN_PRESET(lane->id));
  598. val |= MVEBU_COMPHY_TX_TRAIN_PRESET_16B_AUTO_EN |
  599. MVEBU_COMPHY_TX_TRAIN_PRESET_PRBS11;
  600. writel(val, priv->base + MVEBU_COMPHY_TX_TRAIN_PRESET(lane->id));
  601. val = readl(priv->base + MVEBU_COMPHY_FRAME_DETECT0(lane->id));
  602. val &= ~MVEBU_COMPHY_FRAME_DETECT0_PATN(0x1ff);
  603. val |= MVEBU_COMPHY_FRAME_DETECT0_PATN(0x88);
  604. writel(val, priv->base + MVEBU_COMPHY_FRAME_DETECT0(lane->id));
  605. val = readl(priv->base + MVEBU_COMPHY_DME(lane->id));
  606. val |= MVEBU_COMPHY_DME_ETH_MODE;
  607. writel(val, priv->base + MVEBU_COMPHY_DME(lane->id));
  608. val = readl(priv->base + MVEBU_COMPHY_VDD_CAL0(lane->id));
  609. val |= MVEBU_COMPHY_VDD_CAL0_CONT_MODE;
  610. writel(val, priv->base + MVEBU_COMPHY_VDD_CAL0(lane->id));
  611. val = readl(priv->base + MVEBU_SP_CALIB(lane->id));
  612. val &= ~MVEBU_SP_CALIB_SAMPLER(0x3);
  613. val |= MVEBU_SP_CALIB_SAMPLER(0x3) |
  614. MVEBU_SP_CALIB_SAMPLER_EN;
  615. writel(val, priv->base + MVEBU_SP_CALIB(lane->id));
  616. val &= ~MVEBU_SP_CALIB_SAMPLER_EN;
  617. writel(val, priv->base + MVEBU_SP_CALIB(lane->id));
  618. /* External rx regulator */
  619. val = readl(priv->base + MVEBU_COMPHY_EXT_SELV(lane->id));
  620. val &= ~MVEBU_COMPHY_EXT_SELV_RX_SAMPL(0x1f);
  621. val |= MVEBU_COMPHY_EXT_SELV_RX_SAMPL(0x1a);
  622. writel(val, priv->base + MVEBU_COMPHY_EXT_SELV(lane->id));
  623. return mvebu_comphy_init_plls(lane);
  624. }
  625. static int mvebu_comphy_power_on_legacy(struct phy *phy)
  626. {
  627. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  628. struct mvebu_comphy_priv *priv = lane->priv;
  629. int ret, mux;
  630. u32 val;
  631. mux = mvebu_comphy_get_mux(lane->id, lane->port,
  632. lane->mode, lane->submode);
  633. if (mux < 0)
  634. return -ENOTSUPP;
  635. regmap_read(priv->regmap, MVEBU_COMPHY_PIPE_SELECTOR, &val);
  636. val &= ~(0xf << MVEBU_COMPHY_PIPE_SELECTOR_PIPE(lane->id));
  637. regmap_write(priv->regmap, MVEBU_COMPHY_PIPE_SELECTOR, val);
  638. regmap_read(priv->regmap, MVEBU_COMPHY_SELECTOR, &val);
  639. val &= ~(0xf << MVEBU_COMPHY_SELECTOR_PHY(lane->id));
  640. val |= mux << MVEBU_COMPHY_SELECTOR_PHY(lane->id);
  641. regmap_write(priv->regmap, MVEBU_COMPHY_SELECTOR, val);
  642. switch (lane->submode) {
  643. case PHY_INTERFACE_MODE_SGMII:
  644. case PHY_INTERFACE_MODE_2500BASEX:
  645. ret = mvebu_comphy_set_mode_sgmii(phy);
  646. break;
  647. case PHY_INTERFACE_MODE_RXAUI:
  648. ret = mvebu_comphy_set_mode_rxaui(phy);
  649. break;
  650. case PHY_INTERFACE_MODE_10GBASER:
  651. ret = mvebu_comphy_set_mode_10gbaser(phy);
  652. break;
  653. default:
  654. return -ENOTSUPP;
  655. }
  656. /* digital reset */
  657. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  658. val |= MVEBU_COMPHY_SERDES_CFG1_RF_RESET;
  659. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  660. return ret;
  661. }
  662. static int mvebu_comphy_power_on(struct phy *phy)
  663. {
  664. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  665. struct mvebu_comphy_priv *priv = lane->priv;
  666. int fw_mode, fw_speed;
  667. u32 fw_param = 0;
  668. int ret;
  669. fw_mode = mvebu_comphy_get_fw_mode(lane->id, lane->port,
  670. lane->mode, lane->submode);
  671. if (fw_mode < 0)
  672. goto try_legacy;
  673. /* Try SMC flow first */
  674. switch (lane->mode) {
  675. case PHY_MODE_ETHERNET:
  676. switch (lane->submode) {
  677. case PHY_INTERFACE_MODE_RXAUI:
  678. dev_dbg(priv->dev, "set lane %d to RXAUI mode\n",
  679. lane->id);
  680. fw_speed = 0;
  681. break;
  682. case PHY_INTERFACE_MODE_SGMII:
  683. dev_dbg(priv->dev, "set lane %d to 1000BASE-X mode\n",
  684. lane->id);
  685. fw_speed = COMPHY_FW_SPEED_1250;
  686. break;
  687. case PHY_INTERFACE_MODE_2500BASEX:
  688. dev_dbg(priv->dev, "set lane %d to 2500BASE-X mode\n",
  689. lane->id);
  690. fw_speed = COMPHY_FW_SPEED_3125;
  691. break;
  692. case PHY_INTERFACE_MODE_5GBASER:
  693. dev_dbg(priv->dev, "set lane %d to 5GBASE-R mode\n",
  694. lane->id);
  695. fw_speed = COMPHY_FW_SPEED_515625;
  696. break;
  697. case PHY_INTERFACE_MODE_10GBASER:
  698. dev_dbg(priv->dev, "set lane %d to 10GBASE-R mode\n",
  699. lane->id);
  700. fw_speed = COMPHY_FW_SPEED_103125;
  701. break;
  702. default:
  703. dev_err(priv->dev, "unsupported Ethernet mode (%d)\n",
  704. lane->submode);
  705. return -ENOTSUPP;
  706. }
  707. fw_param = COMPHY_FW_PARAM_ETH(fw_mode, lane->port, fw_speed);
  708. break;
  709. case PHY_MODE_USB_HOST_SS:
  710. case PHY_MODE_USB_DEVICE_SS:
  711. dev_dbg(priv->dev, "set lane %d to USB3 mode\n", lane->id);
  712. fw_param = COMPHY_FW_PARAM(fw_mode, lane->port);
  713. break;
  714. case PHY_MODE_SATA:
  715. dev_dbg(priv->dev, "set lane %d to SATA mode\n", lane->id);
  716. fw_param = COMPHY_FW_PARAM(fw_mode, lane->port);
  717. break;
  718. case PHY_MODE_PCIE:
  719. dev_dbg(priv->dev, "set lane %d to PCIe mode (x%d)\n", lane->id,
  720. lane->submode);
  721. fw_param = COMPHY_FW_PARAM_PCIE(fw_mode, lane->port,
  722. lane->submode);
  723. break;
  724. default:
  725. dev_err(priv->dev, "unsupported PHY mode (%d)\n", lane->mode);
  726. return -ENOTSUPP;
  727. }
  728. ret = mvebu_comphy_smc(COMPHY_SIP_POWER_ON, priv->cp_phys, lane->id,
  729. fw_param);
  730. if (!ret)
  731. return ret;
  732. if (ret == -EOPNOTSUPP)
  733. dev_err(priv->dev,
  734. "unsupported SMC call, try updating your firmware\n");
  735. dev_warn(priv->dev,
  736. "Firmware could not configure PHY %d with mode %d (ret: %d), trying legacy method\n",
  737. lane->id, lane->mode, ret);
  738. try_legacy:
  739. /* Fallback to Linux's implementation */
  740. return mvebu_comphy_power_on_legacy(phy);
  741. }
  742. static int mvebu_comphy_set_mode(struct phy *phy,
  743. enum phy_mode mode, int submode)
  744. {
  745. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  746. if (submode == PHY_INTERFACE_MODE_1000BASEX)
  747. submode = PHY_INTERFACE_MODE_SGMII;
  748. if (mvebu_comphy_get_fw_mode(lane->id, lane->port, mode, submode) < 0)
  749. return -EINVAL;
  750. lane->mode = mode;
  751. lane->submode = submode;
  752. /* PCIe submode represents the width */
  753. if (mode == PHY_MODE_PCIE && !lane->submode)
  754. lane->submode = 1;
  755. return 0;
  756. }
  757. static int mvebu_comphy_power_off_legacy(struct phy *phy)
  758. {
  759. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  760. struct mvebu_comphy_priv *priv = lane->priv;
  761. u32 val;
  762. val = readl(priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  763. val &= ~(MVEBU_COMPHY_SERDES_CFG1_RESET |
  764. MVEBU_COMPHY_SERDES_CFG1_CORE_RESET |
  765. MVEBU_COMPHY_SERDES_CFG1_RF_RESET);
  766. writel(val, priv->base + MVEBU_COMPHY_SERDES_CFG1(lane->id));
  767. regmap_read(priv->regmap, MVEBU_COMPHY_SELECTOR, &val);
  768. val &= ~(0xf << MVEBU_COMPHY_SELECTOR_PHY(lane->id));
  769. regmap_write(priv->regmap, MVEBU_COMPHY_SELECTOR, val);
  770. regmap_read(priv->regmap, MVEBU_COMPHY_PIPE_SELECTOR, &val);
  771. val &= ~(0xf << MVEBU_COMPHY_PIPE_SELECTOR_PIPE(lane->id));
  772. regmap_write(priv->regmap, MVEBU_COMPHY_PIPE_SELECTOR, val);
  773. return 0;
  774. }
  775. static int mvebu_comphy_power_off(struct phy *phy)
  776. {
  777. struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
  778. struct mvebu_comphy_priv *priv = lane->priv;
  779. int ret;
  780. ret = mvebu_comphy_smc(COMPHY_SIP_POWER_OFF, priv->cp_phys,
  781. lane->id, 0);
  782. if (!ret)
  783. return ret;
  784. /* Fallback to Linux's implementation */
  785. return mvebu_comphy_power_off_legacy(phy);
  786. }
  787. static const struct phy_ops mvebu_comphy_ops = {
  788. .power_on = mvebu_comphy_power_on,
  789. .power_off = mvebu_comphy_power_off,
  790. .set_mode = mvebu_comphy_set_mode,
  791. .owner = THIS_MODULE,
  792. };
  793. static struct phy *mvebu_comphy_xlate(struct device *dev,
  794. struct of_phandle_args *args)
  795. {
  796. struct mvebu_comphy_lane *lane;
  797. struct phy *phy;
  798. if (WARN_ON(args->args[0] >= MVEBU_COMPHY_PORTS))
  799. return ERR_PTR(-EINVAL);
  800. phy = of_phy_simple_xlate(dev, args);
  801. if (IS_ERR(phy))
  802. return phy;
  803. lane = phy_get_drvdata(phy);
  804. lane->port = args->args[0];
  805. return phy;
  806. }
  807. static int mvebu_comphy_init_clks(struct mvebu_comphy_priv *priv)
  808. {
  809. int ret;
  810. priv->mg_domain_clk = devm_clk_get(priv->dev, "mg_clk");
  811. if (IS_ERR(priv->mg_domain_clk))
  812. return PTR_ERR(priv->mg_domain_clk);
  813. ret = clk_prepare_enable(priv->mg_domain_clk);
  814. if (ret < 0)
  815. return ret;
  816. priv->mg_core_clk = devm_clk_get(priv->dev, "mg_core_clk");
  817. if (IS_ERR(priv->mg_core_clk)) {
  818. ret = PTR_ERR(priv->mg_core_clk);
  819. goto dis_mg_domain_clk;
  820. }
  821. ret = clk_prepare_enable(priv->mg_core_clk);
  822. if (ret < 0)
  823. goto dis_mg_domain_clk;
  824. priv->axi_clk = devm_clk_get(priv->dev, "axi_clk");
  825. if (IS_ERR(priv->axi_clk)) {
  826. ret = PTR_ERR(priv->axi_clk);
  827. goto dis_mg_core_clk;
  828. }
  829. ret = clk_prepare_enable(priv->axi_clk);
  830. if (ret < 0)
  831. goto dis_mg_core_clk;
  832. return 0;
  833. dis_mg_core_clk:
  834. clk_disable_unprepare(priv->mg_core_clk);
  835. dis_mg_domain_clk:
  836. clk_disable_unprepare(priv->mg_domain_clk);
  837. priv->mg_domain_clk = NULL;
  838. priv->mg_core_clk = NULL;
  839. priv->axi_clk = NULL;
  840. return ret;
  841. };
  842. static void mvebu_comphy_disable_unprepare_clks(struct mvebu_comphy_priv *priv)
  843. {
  844. if (priv->axi_clk)
  845. clk_disable_unprepare(priv->axi_clk);
  846. if (priv->mg_core_clk)
  847. clk_disable_unprepare(priv->mg_core_clk);
  848. if (priv->mg_domain_clk)
  849. clk_disable_unprepare(priv->mg_domain_clk);
  850. }
  851. static int mvebu_comphy_probe(struct platform_device *pdev)
  852. {
  853. struct mvebu_comphy_priv *priv;
  854. struct phy_provider *provider;
  855. struct device_node *child;
  856. struct resource *res;
  857. int ret;
  858. priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
  859. if (!priv)
  860. return -ENOMEM;
  861. priv->dev = &pdev->dev;
  862. priv->regmap =
  863. syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
  864. "marvell,system-controller");
  865. if (IS_ERR(priv->regmap))
  866. return PTR_ERR(priv->regmap);
  867. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  868. priv->base = devm_ioremap_resource(&pdev->dev, res);
  869. if (IS_ERR(priv->base))
  870. return PTR_ERR(priv->base);
  871. /*
  872. * Ignore error if clocks have not been initialized properly for DT
  873. * compatibility reasons.
  874. */
  875. ret = mvebu_comphy_init_clks(priv);
  876. if (ret) {
  877. if (ret == -EPROBE_DEFER)
  878. return ret;
  879. dev_warn(&pdev->dev, "cannot initialize clocks\n");
  880. }
  881. /*
  882. * Hack to retrieve a physical offset relative to this CP that will be
  883. * given to the firmware
  884. */
  885. priv->cp_phys = res->start;
  886. for_each_available_child_of_node(pdev->dev.of_node, child) {
  887. struct mvebu_comphy_lane *lane;
  888. struct phy *phy;
  889. u32 val;
  890. ret = of_property_read_u32(child, "reg", &val);
  891. if (ret < 0) {
  892. dev_err(&pdev->dev, "missing 'reg' property (%d)\n",
  893. ret);
  894. continue;
  895. }
  896. if (val >= MVEBU_COMPHY_LANES) {
  897. dev_err(&pdev->dev, "invalid 'reg' property\n");
  898. continue;
  899. }
  900. lane = devm_kzalloc(&pdev->dev, sizeof(*lane), GFP_KERNEL);
  901. if (!lane) {
  902. of_node_put(child);
  903. ret = -ENOMEM;
  904. goto disable_clks;
  905. }
  906. phy = devm_phy_create(&pdev->dev, child, &mvebu_comphy_ops);
  907. if (IS_ERR(phy)) {
  908. of_node_put(child);
  909. ret = PTR_ERR(phy);
  910. goto disable_clks;
  911. }
  912. lane->priv = priv;
  913. lane->mode = PHY_MODE_INVALID;
  914. lane->submode = PHY_INTERFACE_MODE_NA;
  915. lane->id = val;
  916. lane->port = -1;
  917. phy_set_drvdata(phy, lane);
  918. /*
  919. * All modes are supported in this driver so we could call
  920. * mvebu_comphy_power_off(phy) here to avoid relying on the
  921. * bootloader/firmware configuration, but for compatibility
  922. * reasons we cannot de-configure the COMPHY without being sure
  923. * that the firmware is up-to-date and fully-featured.
  924. */
  925. }
  926. dev_set_drvdata(&pdev->dev, priv);
  927. provider = devm_of_phy_provider_register(&pdev->dev,
  928. mvebu_comphy_xlate);
  929. return PTR_ERR_OR_ZERO(provider);
  930. disable_clks:
  931. mvebu_comphy_disable_unprepare_clks(priv);
  932. return ret;
  933. }
  934. static const struct of_device_id mvebu_comphy_of_match_table[] = {
  935. { .compatible = "marvell,comphy-cp110" },
  936. { },
  937. };
  938. MODULE_DEVICE_TABLE(of, mvebu_comphy_of_match_table);
  939. static struct platform_driver mvebu_comphy_driver = {
  940. .probe = mvebu_comphy_probe,
  941. .driver = {
  942. .name = "mvebu-comphy",
  943. .of_match_table = mvebu_comphy_of_match_table,
  944. },
  945. };
  946. module_platform_driver(mvebu_comphy_driver);
  947. MODULE_AUTHOR("Antoine Tenart <[email protected]>");
  948. MODULE_DESCRIPTION("Common PHY driver for mvebu SoCs");
  949. MODULE_LICENSE("GPL v2");