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