dwmac-rk.c 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /**
  3. * DOC: dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer
  4. *
  5. * Copyright (C) 2014 Chen-Zhi (Roger Chen)
  6. *
  7. * Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>
  8. */
  9. #include <linux/stmmac.h>
  10. #include <linux/bitops.h>
  11. #include <linux/clk.h>
  12. #include <linux/phy.h>
  13. #include <linux/of_net.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/regulator/consumer.h>
  18. #include <linux/delay.h>
  19. #include <linux/mfd/syscon.h>
  20. #include <linux/regmap.h>
  21. #include <linux/pm_runtime.h>
  22. #include "stmmac_platform.h"
  23. struct rk_priv_data;
  24. struct rk_gmac_ops {
  25. void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
  26. int tx_delay, int rx_delay);
  27. void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
  28. void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  29. void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  30. void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input,
  31. bool enable);
  32. void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
  33. bool php_grf_required;
  34. bool regs_valid;
  35. u32 regs[];
  36. };
  37. static const char * const rk_clocks[] = {
  38. "aclk_mac", "pclk_mac", "mac_clk_tx", "clk_mac_speed",
  39. };
  40. static const char * const rk_rmii_clocks[] = {
  41. "mac_clk_rx", "clk_mac_ref", "clk_mac_refout",
  42. };
  43. enum rk_clocks_index {
  44. RK_ACLK_MAC = 0,
  45. RK_PCLK_MAC,
  46. RK_MAC_CLK_TX,
  47. RK_CLK_MAC_SPEED,
  48. RK_MAC_CLK_RX,
  49. RK_CLK_MAC_REF,
  50. RK_CLK_MAC_REFOUT,
  51. };
  52. struct rk_priv_data {
  53. struct platform_device *pdev;
  54. phy_interface_t phy_iface;
  55. int id;
  56. struct regulator *regulator;
  57. bool suspended;
  58. const struct rk_gmac_ops *ops;
  59. bool clk_enabled;
  60. bool clock_input;
  61. bool integrated_phy;
  62. struct clk_bulk_data *clks;
  63. int num_clks;
  64. struct clk *clk_mac;
  65. struct clk *clk_phy;
  66. struct reset_control *phy_reset;
  67. int tx_delay;
  68. int rx_delay;
  69. struct regmap *grf;
  70. struct regmap *php_grf;
  71. };
  72. #define HIWORD_UPDATE(val, mask, shift) \
  73. ((val) << (shift) | (mask) << ((shift) + 16))
  74. #define GRF_BIT(nr) (BIT(nr) | BIT(nr+16))
  75. #define GRF_CLR_BIT(nr) (BIT(nr+16))
  76. #define DELAY_ENABLE(soc, tx, rx) \
  77. (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
  78. ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
  79. #define PX30_GRF_GMAC_CON1 0x0904
  80. /* PX30_GRF_GMAC_CON1 */
  81. #define PX30_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
  82. GRF_BIT(6))
  83. #define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
  84. #define PX30_GMAC_SPEED_100M GRF_BIT(2)
  85. static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
  86. {
  87. struct device *dev = &bsp_priv->pdev->dev;
  88. if (IS_ERR(bsp_priv->grf)) {
  89. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  90. return;
  91. }
  92. regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
  93. PX30_GMAC_PHY_INTF_SEL_RMII);
  94. }
  95. static void px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  96. {
  97. struct clk *clk_mac_speed = bsp_priv->clks[RK_CLK_MAC_SPEED].clk;
  98. struct device *dev = &bsp_priv->pdev->dev;
  99. int ret;
  100. if (!clk_mac_speed) {
  101. dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
  102. return;
  103. }
  104. if (speed == 10) {
  105. regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
  106. PX30_GMAC_SPEED_10M);
  107. ret = clk_set_rate(clk_mac_speed, 2500000);
  108. if (ret)
  109. dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
  110. __func__, ret);
  111. } else if (speed == 100) {
  112. regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
  113. PX30_GMAC_SPEED_100M);
  114. ret = clk_set_rate(clk_mac_speed, 25000000);
  115. if (ret)
  116. dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
  117. __func__, ret);
  118. } else {
  119. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  120. }
  121. }
  122. static const struct rk_gmac_ops px30_ops = {
  123. .set_to_rmii = px30_set_to_rmii,
  124. .set_rmii_speed = px30_set_rmii_speed,
  125. };
  126. #define RK3128_GRF_MAC_CON0 0x0168
  127. #define RK3128_GRF_MAC_CON1 0x016c
  128. /* RK3128_GRF_MAC_CON0 */
  129. #define RK3128_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
  130. #define RK3128_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
  131. #define RK3128_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  132. #define RK3128_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  133. #define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  134. #define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  135. /* RK3128_GRF_MAC_CON1 */
  136. #define RK3128_GMAC_PHY_INTF_SEL_RGMII \
  137. (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
  138. #define RK3128_GMAC_PHY_INTF_SEL_RMII \
  139. (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
  140. #define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
  141. #define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
  142. #define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
  143. #define RK3128_GMAC_SPEED_100M GRF_BIT(10)
  144. #define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
  145. #define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
  146. #define RK3128_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
  147. #define RK3128_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
  148. #define RK3128_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
  149. #define RK3128_GMAC_RMII_MODE GRF_BIT(14)
  150. #define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
  151. static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
  152. int tx_delay, int rx_delay)
  153. {
  154. struct device *dev = &bsp_priv->pdev->dev;
  155. if (IS_ERR(bsp_priv->grf)) {
  156. dev_err(dev, "Missing rockchip,grf property\n");
  157. return;
  158. }
  159. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  160. RK3128_GMAC_PHY_INTF_SEL_RGMII |
  161. RK3128_GMAC_RMII_MODE_CLR);
  162. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
  163. DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
  164. RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
  165. RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
  166. }
  167. static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
  168. {
  169. struct device *dev = &bsp_priv->pdev->dev;
  170. if (IS_ERR(bsp_priv->grf)) {
  171. dev_err(dev, "Missing rockchip,grf property\n");
  172. return;
  173. }
  174. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  175. RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
  176. }
  177. static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  178. {
  179. struct device *dev = &bsp_priv->pdev->dev;
  180. if (IS_ERR(bsp_priv->grf)) {
  181. dev_err(dev, "Missing rockchip,grf property\n");
  182. return;
  183. }
  184. if (speed == 10)
  185. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  186. RK3128_GMAC_CLK_2_5M);
  187. else if (speed == 100)
  188. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  189. RK3128_GMAC_CLK_25M);
  190. else if (speed == 1000)
  191. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  192. RK3128_GMAC_CLK_125M);
  193. else
  194. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  195. }
  196. static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  197. {
  198. struct device *dev = &bsp_priv->pdev->dev;
  199. if (IS_ERR(bsp_priv->grf)) {
  200. dev_err(dev, "Missing rockchip,grf property\n");
  201. return;
  202. }
  203. if (speed == 10) {
  204. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  205. RK3128_GMAC_RMII_CLK_2_5M |
  206. RK3128_GMAC_SPEED_10M);
  207. } else if (speed == 100) {
  208. regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
  209. RK3128_GMAC_RMII_CLK_25M |
  210. RK3128_GMAC_SPEED_100M);
  211. } else {
  212. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  213. }
  214. }
  215. static const struct rk_gmac_ops rk3128_ops = {
  216. .set_to_rgmii = rk3128_set_to_rgmii,
  217. .set_to_rmii = rk3128_set_to_rmii,
  218. .set_rgmii_speed = rk3128_set_rgmii_speed,
  219. .set_rmii_speed = rk3128_set_rmii_speed,
  220. };
  221. #define RK3228_GRF_MAC_CON0 0x0900
  222. #define RK3228_GRF_MAC_CON1 0x0904
  223. #define RK3228_GRF_CON_MUX 0x50
  224. /* RK3228_GRF_MAC_CON0 */
  225. #define RK3228_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  226. #define RK3228_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  227. /* RK3228_GRF_MAC_CON1 */
  228. #define RK3228_GMAC_PHY_INTF_SEL_RGMII \
  229. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  230. #define RK3228_GMAC_PHY_INTF_SEL_RMII \
  231. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  232. #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
  233. #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  234. #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
  235. #define RK3228_GMAC_SPEED_100M GRF_BIT(2)
  236. #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
  237. #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
  238. #define RK3228_GMAC_CLK_125M (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
  239. #define RK3228_GMAC_CLK_25M (GRF_BIT(8) | GRF_BIT(9))
  240. #define RK3228_GMAC_CLK_2_5M (GRF_CLR_BIT(8) | GRF_BIT(9))
  241. #define RK3228_GMAC_RMII_MODE GRF_BIT(10)
  242. #define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
  243. #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
  244. #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  245. #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
  246. #define RK3228_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
  247. /* RK3228_GRF_COM_MUX */
  248. #define RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY GRF_BIT(15)
  249. static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
  250. int tx_delay, int rx_delay)
  251. {
  252. struct device *dev = &bsp_priv->pdev->dev;
  253. if (IS_ERR(bsp_priv->grf)) {
  254. dev_err(dev, "Missing rockchip,grf property\n");
  255. return;
  256. }
  257. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  258. RK3228_GMAC_PHY_INTF_SEL_RGMII |
  259. RK3228_GMAC_RMII_MODE_CLR |
  260. DELAY_ENABLE(RK3228, tx_delay, rx_delay));
  261. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
  262. RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
  263. RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
  264. }
  265. static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
  266. {
  267. struct device *dev = &bsp_priv->pdev->dev;
  268. if (IS_ERR(bsp_priv->grf)) {
  269. dev_err(dev, "Missing rockchip,grf property\n");
  270. return;
  271. }
  272. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  273. RK3228_GMAC_PHY_INTF_SEL_RMII |
  274. RK3228_GMAC_RMII_MODE);
  275. /* set MAC to RMII mode */
  276. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
  277. }
  278. static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  279. {
  280. struct device *dev = &bsp_priv->pdev->dev;
  281. if (IS_ERR(bsp_priv->grf)) {
  282. dev_err(dev, "Missing rockchip,grf property\n");
  283. return;
  284. }
  285. if (speed == 10)
  286. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  287. RK3228_GMAC_CLK_2_5M);
  288. else if (speed == 100)
  289. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  290. RK3228_GMAC_CLK_25M);
  291. else if (speed == 1000)
  292. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  293. RK3228_GMAC_CLK_125M);
  294. else
  295. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  296. }
  297. static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  298. {
  299. struct device *dev = &bsp_priv->pdev->dev;
  300. if (IS_ERR(bsp_priv->grf)) {
  301. dev_err(dev, "Missing rockchip,grf property\n");
  302. return;
  303. }
  304. if (speed == 10)
  305. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  306. RK3228_GMAC_RMII_CLK_2_5M |
  307. RK3228_GMAC_SPEED_10M);
  308. else if (speed == 100)
  309. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  310. RK3228_GMAC_RMII_CLK_25M |
  311. RK3228_GMAC_SPEED_100M);
  312. else
  313. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  314. }
  315. static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
  316. {
  317. regmap_write(priv->grf, RK3228_GRF_CON_MUX,
  318. RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
  319. }
  320. static const struct rk_gmac_ops rk3228_ops = {
  321. .set_to_rgmii = rk3228_set_to_rgmii,
  322. .set_to_rmii = rk3228_set_to_rmii,
  323. .set_rgmii_speed = rk3228_set_rgmii_speed,
  324. .set_rmii_speed = rk3228_set_rmii_speed,
  325. .integrated_phy_powerup = rk3228_integrated_phy_powerup,
  326. };
  327. #define RK3288_GRF_SOC_CON1 0x0248
  328. #define RK3288_GRF_SOC_CON3 0x0250
  329. /*RK3288_GRF_SOC_CON1*/
  330. #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | \
  331. GRF_CLR_BIT(8))
  332. #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
  333. GRF_BIT(8))
  334. #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
  335. #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
  336. #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
  337. #define RK3288_GMAC_SPEED_100M GRF_BIT(10)
  338. #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
  339. #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
  340. #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
  341. #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
  342. #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
  343. #define RK3288_GMAC_RMII_MODE GRF_BIT(14)
  344. #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
  345. /*RK3288_GRF_SOC_CON3*/
  346. #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
  347. #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
  348. #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  349. #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  350. #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  351. #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  352. static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
  353. int tx_delay, int rx_delay)
  354. {
  355. struct device *dev = &bsp_priv->pdev->dev;
  356. if (IS_ERR(bsp_priv->grf)) {
  357. dev_err(dev, "Missing rockchip,grf property\n");
  358. return;
  359. }
  360. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  361. RK3288_GMAC_PHY_INTF_SEL_RGMII |
  362. RK3288_GMAC_RMII_MODE_CLR);
  363. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
  364. DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
  365. RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
  366. RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
  367. }
  368. static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
  369. {
  370. struct device *dev = &bsp_priv->pdev->dev;
  371. if (IS_ERR(bsp_priv->grf)) {
  372. dev_err(dev, "Missing rockchip,grf property\n");
  373. return;
  374. }
  375. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  376. RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
  377. }
  378. static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  379. {
  380. struct device *dev = &bsp_priv->pdev->dev;
  381. if (IS_ERR(bsp_priv->grf)) {
  382. dev_err(dev, "Missing rockchip,grf property\n");
  383. return;
  384. }
  385. if (speed == 10)
  386. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  387. RK3288_GMAC_CLK_2_5M);
  388. else if (speed == 100)
  389. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  390. RK3288_GMAC_CLK_25M);
  391. else if (speed == 1000)
  392. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  393. RK3288_GMAC_CLK_125M);
  394. else
  395. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  396. }
  397. static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  398. {
  399. struct device *dev = &bsp_priv->pdev->dev;
  400. if (IS_ERR(bsp_priv->grf)) {
  401. dev_err(dev, "Missing rockchip,grf property\n");
  402. return;
  403. }
  404. if (speed == 10) {
  405. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  406. RK3288_GMAC_RMII_CLK_2_5M |
  407. RK3288_GMAC_SPEED_10M);
  408. } else if (speed == 100) {
  409. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  410. RK3288_GMAC_RMII_CLK_25M |
  411. RK3288_GMAC_SPEED_100M);
  412. } else {
  413. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  414. }
  415. }
  416. static const struct rk_gmac_ops rk3288_ops = {
  417. .set_to_rgmii = rk3288_set_to_rgmii,
  418. .set_to_rmii = rk3288_set_to_rmii,
  419. .set_rgmii_speed = rk3288_set_rgmii_speed,
  420. .set_rmii_speed = rk3288_set_rmii_speed,
  421. };
  422. #define RK3308_GRF_MAC_CON0 0x04a0
  423. /* RK3308_GRF_MAC_CON0 */
  424. #define RK3308_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(2) | GRF_CLR_BIT(3) | \
  425. GRF_BIT(4))
  426. #define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
  427. #define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  428. #define RK3308_GMAC_SPEED_10M GRF_CLR_BIT(0)
  429. #define RK3308_GMAC_SPEED_100M GRF_BIT(0)
  430. static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
  431. {
  432. struct device *dev = &bsp_priv->pdev->dev;
  433. if (IS_ERR(bsp_priv->grf)) {
  434. dev_err(dev, "Missing rockchip,grf property\n");
  435. return;
  436. }
  437. regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
  438. RK3308_GMAC_PHY_INTF_SEL_RMII);
  439. }
  440. static void rk3308_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  441. {
  442. struct device *dev = &bsp_priv->pdev->dev;
  443. if (IS_ERR(bsp_priv->grf)) {
  444. dev_err(dev, "Missing rockchip,grf property\n");
  445. return;
  446. }
  447. if (speed == 10) {
  448. regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
  449. RK3308_GMAC_SPEED_10M);
  450. } else if (speed == 100) {
  451. regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
  452. RK3308_GMAC_SPEED_100M);
  453. } else {
  454. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  455. }
  456. }
  457. static const struct rk_gmac_ops rk3308_ops = {
  458. .set_to_rmii = rk3308_set_to_rmii,
  459. .set_rmii_speed = rk3308_set_rmii_speed,
  460. };
  461. #define RK3328_GRF_MAC_CON0 0x0900
  462. #define RK3328_GRF_MAC_CON1 0x0904
  463. #define RK3328_GRF_MAC_CON2 0x0908
  464. #define RK3328_GRF_MACPHY_CON1 0xb04
  465. /* RK3328_GRF_MAC_CON0 */
  466. #define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  467. #define RK3328_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  468. /* RK3328_GRF_MAC_CON1 */
  469. #define RK3328_GMAC_PHY_INTF_SEL_RGMII \
  470. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  471. #define RK3328_GMAC_PHY_INTF_SEL_RMII \
  472. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  473. #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
  474. #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  475. #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
  476. #define RK3328_GMAC_SPEED_100M GRF_BIT(2)
  477. #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
  478. #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
  479. #define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
  480. #define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
  481. #define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
  482. #define RK3328_GMAC_RMII_MODE GRF_BIT(9)
  483. #define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
  484. #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
  485. #define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  486. #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
  487. #define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  488. /* RK3328_GRF_MACPHY_CON1 */
  489. #define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
  490. static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
  491. int tx_delay, int rx_delay)
  492. {
  493. struct device *dev = &bsp_priv->pdev->dev;
  494. if (IS_ERR(bsp_priv->grf)) {
  495. dev_err(dev, "Missing rockchip,grf property\n");
  496. return;
  497. }
  498. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  499. RK3328_GMAC_PHY_INTF_SEL_RGMII |
  500. RK3328_GMAC_RMII_MODE_CLR |
  501. RK3328_GMAC_RXCLK_DLY_ENABLE |
  502. RK3328_GMAC_TXCLK_DLY_ENABLE);
  503. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
  504. RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
  505. RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
  506. }
  507. static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
  508. {
  509. struct device *dev = &bsp_priv->pdev->dev;
  510. unsigned int reg;
  511. if (IS_ERR(bsp_priv->grf)) {
  512. dev_err(dev, "Missing rockchip,grf property\n");
  513. return;
  514. }
  515. reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
  516. RK3328_GRF_MAC_CON1;
  517. regmap_write(bsp_priv->grf, reg,
  518. RK3328_GMAC_PHY_INTF_SEL_RMII |
  519. RK3328_GMAC_RMII_MODE);
  520. }
  521. static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  522. {
  523. struct device *dev = &bsp_priv->pdev->dev;
  524. if (IS_ERR(bsp_priv->grf)) {
  525. dev_err(dev, "Missing rockchip,grf property\n");
  526. return;
  527. }
  528. if (speed == 10)
  529. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  530. RK3328_GMAC_CLK_2_5M);
  531. else if (speed == 100)
  532. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  533. RK3328_GMAC_CLK_25M);
  534. else if (speed == 1000)
  535. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  536. RK3328_GMAC_CLK_125M);
  537. else
  538. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  539. }
  540. static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  541. {
  542. struct device *dev = &bsp_priv->pdev->dev;
  543. unsigned int reg;
  544. if (IS_ERR(bsp_priv->grf)) {
  545. dev_err(dev, "Missing rockchip,grf property\n");
  546. return;
  547. }
  548. reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
  549. RK3328_GRF_MAC_CON1;
  550. if (speed == 10)
  551. regmap_write(bsp_priv->grf, reg,
  552. RK3328_GMAC_RMII_CLK_2_5M |
  553. RK3328_GMAC_SPEED_10M);
  554. else if (speed == 100)
  555. regmap_write(bsp_priv->grf, reg,
  556. RK3328_GMAC_RMII_CLK_25M |
  557. RK3328_GMAC_SPEED_100M);
  558. else
  559. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  560. }
  561. static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
  562. {
  563. regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
  564. RK3328_MACPHY_RMII_MODE);
  565. }
  566. static const struct rk_gmac_ops rk3328_ops = {
  567. .set_to_rgmii = rk3328_set_to_rgmii,
  568. .set_to_rmii = rk3328_set_to_rmii,
  569. .set_rgmii_speed = rk3328_set_rgmii_speed,
  570. .set_rmii_speed = rk3328_set_rmii_speed,
  571. .integrated_phy_powerup = rk3328_integrated_phy_powerup,
  572. };
  573. #define RK3366_GRF_SOC_CON6 0x0418
  574. #define RK3366_GRF_SOC_CON7 0x041c
  575. /* RK3366_GRF_SOC_CON6 */
  576. #define RK3366_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  577. GRF_CLR_BIT(11))
  578. #define RK3366_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  579. GRF_BIT(11))
  580. #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
  581. #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  582. #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
  583. #define RK3366_GMAC_SPEED_100M GRF_BIT(7)
  584. #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
  585. #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  586. #define RK3366_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  587. #define RK3366_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  588. #define RK3366_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  589. #define RK3366_GMAC_RMII_MODE GRF_BIT(6)
  590. #define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  591. /* RK3366_GRF_SOC_CON7 */
  592. #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  593. #define RK3366_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  594. #define RK3366_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  595. #define RK3366_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  596. #define RK3366_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  597. #define RK3366_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  598. static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
  599. int tx_delay, int rx_delay)
  600. {
  601. struct device *dev = &bsp_priv->pdev->dev;
  602. if (IS_ERR(bsp_priv->grf)) {
  603. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  604. return;
  605. }
  606. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  607. RK3366_GMAC_PHY_INTF_SEL_RGMII |
  608. RK3366_GMAC_RMII_MODE_CLR);
  609. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
  610. DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
  611. RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
  612. RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
  613. }
  614. static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
  615. {
  616. struct device *dev = &bsp_priv->pdev->dev;
  617. if (IS_ERR(bsp_priv->grf)) {
  618. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  619. return;
  620. }
  621. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  622. RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
  623. }
  624. static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  625. {
  626. struct device *dev = &bsp_priv->pdev->dev;
  627. if (IS_ERR(bsp_priv->grf)) {
  628. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  629. return;
  630. }
  631. if (speed == 10)
  632. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  633. RK3366_GMAC_CLK_2_5M);
  634. else if (speed == 100)
  635. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  636. RK3366_GMAC_CLK_25M);
  637. else if (speed == 1000)
  638. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  639. RK3366_GMAC_CLK_125M);
  640. else
  641. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  642. }
  643. static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  644. {
  645. struct device *dev = &bsp_priv->pdev->dev;
  646. if (IS_ERR(bsp_priv->grf)) {
  647. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  648. return;
  649. }
  650. if (speed == 10) {
  651. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  652. RK3366_GMAC_RMII_CLK_2_5M |
  653. RK3366_GMAC_SPEED_10M);
  654. } else if (speed == 100) {
  655. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  656. RK3366_GMAC_RMII_CLK_25M |
  657. RK3366_GMAC_SPEED_100M);
  658. } else {
  659. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  660. }
  661. }
  662. static const struct rk_gmac_ops rk3366_ops = {
  663. .set_to_rgmii = rk3366_set_to_rgmii,
  664. .set_to_rmii = rk3366_set_to_rmii,
  665. .set_rgmii_speed = rk3366_set_rgmii_speed,
  666. .set_rmii_speed = rk3366_set_rmii_speed,
  667. };
  668. #define RK3368_GRF_SOC_CON15 0x043c
  669. #define RK3368_GRF_SOC_CON16 0x0440
  670. /* RK3368_GRF_SOC_CON15 */
  671. #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  672. GRF_CLR_BIT(11))
  673. #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  674. GRF_BIT(11))
  675. #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
  676. #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  677. #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
  678. #define RK3368_GMAC_SPEED_100M GRF_BIT(7)
  679. #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
  680. #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  681. #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  682. #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  683. #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  684. #define RK3368_GMAC_RMII_MODE GRF_BIT(6)
  685. #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  686. /* RK3368_GRF_SOC_CON16 */
  687. #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  688. #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  689. #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  690. #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  691. #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  692. #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  693. static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
  694. int tx_delay, int rx_delay)
  695. {
  696. struct device *dev = &bsp_priv->pdev->dev;
  697. if (IS_ERR(bsp_priv->grf)) {
  698. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  699. return;
  700. }
  701. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  702. RK3368_GMAC_PHY_INTF_SEL_RGMII |
  703. RK3368_GMAC_RMII_MODE_CLR);
  704. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
  705. DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
  706. RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
  707. RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
  708. }
  709. static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
  710. {
  711. struct device *dev = &bsp_priv->pdev->dev;
  712. if (IS_ERR(bsp_priv->grf)) {
  713. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  714. return;
  715. }
  716. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  717. RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
  718. }
  719. static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  720. {
  721. struct device *dev = &bsp_priv->pdev->dev;
  722. if (IS_ERR(bsp_priv->grf)) {
  723. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  724. return;
  725. }
  726. if (speed == 10)
  727. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  728. RK3368_GMAC_CLK_2_5M);
  729. else if (speed == 100)
  730. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  731. RK3368_GMAC_CLK_25M);
  732. else if (speed == 1000)
  733. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  734. RK3368_GMAC_CLK_125M);
  735. else
  736. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  737. }
  738. static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  739. {
  740. struct device *dev = &bsp_priv->pdev->dev;
  741. if (IS_ERR(bsp_priv->grf)) {
  742. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  743. return;
  744. }
  745. if (speed == 10) {
  746. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  747. RK3368_GMAC_RMII_CLK_2_5M |
  748. RK3368_GMAC_SPEED_10M);
  749. } else if (speed == 100) {
  750. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  751. RK3368_GMAC_RMII_CLK_25M |
  752. RK3368_GMAC_SPEED_100M);
  753. } else {
  754. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  755. }
  756. }
  757. static const struct rk_gmac_ops rk3368_ops = {
  758. .set_to_rgmii = rk3368_set_to_rgmii,
  759. .set_to_rmii = rk3368_set_to_rmii,
  760. .set_rgmii_speed = rk3368_set_rgmii_speed,
  761. .set_rmii_speed = rk3368_set_rmii_speed,
  762. };
  763. #define RK3399_GRF_SOC_CON5 0xc214
  764. #define RK3399_GRF_SOC_CON6 0xc218
  765. /* RK3399_GRF_SOC_CON5 */
  766. #define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  767. GRF_CLR_BIT(11))
  768. #define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  769. GRF_BIT(11))
  770. #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
  771. #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  772. #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
  773. #define RK3399_GMAC_SPEED_100M GRF_BIT(7)
  774. #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
  775. #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  776. #define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  777. #define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  778. #define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  779. #define RK3399_GMAC_RMII_MODE GRF_BIT(6)
  780. #define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  781. /* RK3399_GRF_SOC_CON6 */
  782. #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  783. #define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  784. #define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  785. #define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  786. #define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  787. #define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  788. static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
  789. int tx_delay, int rx_delay)
  790. {
  791. struct device *dev = &bsp_priv->pdev->dev;
  792. if (IS_ERR(bsp_priv->grf)) {
  793. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  794. return;
  795. }
  796. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  797. RK3399_GMAC_PHY_INTF_SEL_RGMII |
  798. RK3399_GMAC_RMII_MODE_CLR);
  799. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
  800. DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
  801. RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
  802. RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
  803. }
  804. static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
  805. {
  806. struct device *dev = &bsp_priv->pdev->dev;
  807. if (IS_ERR(bsp_priv->grf)) {
  808. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  809. return;
  810. }
  811. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  812. RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
  813. }
  814. static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  815. {
  816. struct device *dev = &bsp_priv->pdev->dev;
  817. if (IS_ERR(bsp_priv->grf)) {
  818. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  819. return;
  820. }
  821. if (speed == 10)
  822. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  823. RK3399_GMAC_CLK_2_5M);
  824. else if (speed == 100)
  825. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  826. RK3399_GMAC_CLK_25M);
  827. else if (speed == 1000)
  828. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  829. RK3399_GMAC_CLK_125M);
  830. else
  831. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  832. }
  833. static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  834. {
  835. struct device *dev = &bsp_priv->pdev->dev;
  836. if (IS_ERR(bsp_priv->grf)) {
  837. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  838. return;
  839. }
  840. if (speed == 10) {
  841. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  842. RK3399_GMAC_RMII_CLK_2_5M |
  843. RK3399_GMAC_SPEED_10M);
  844. } else if (speed == 100) {
  845. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  846. RK3399_GMAC_RMII_CLK_25M |
  847. RK3399_GMAC_SPEED_100M);
  848. } else {
  849. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  850. }
  851. }
  852. static const struct rk_gmac_ops rk3399_ops = {
  853. .set_to_rgmii = rk3399_set_to_rgmii,
  854. .set_to_rmii = rk3399_set_to_rmii,
  855. .set_rgmii_speed = rk3399_set_rgmii_speed,
  856. .set_rmii_speed = rk3399_set_rmii_speed,
  857. };
  858. #define RK3568_GRF_GMAC0_CON0 0x0380
  859. #define RK3568_GRF_GMAC0_CON1 0x0384
  860. #define RK3568_GRF_GMAC1_CON0 0x0388
  861. #define RK3568_GRF_GMAC1_CON1 0x038c
  862. /* RK3568_GRF_GMAC0_CON1 && RK3568_GRF_GMAC1_CON1 */
  863. #define RK3568_GMAC_PHY_INTF_SEL_RGMII \
  864. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  865. #define RK3568_GMAC_PHY_INTF_SEL_RMII \
  866. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  867. #define RK3568_GMAC_FLOW_CTRL GRF_BIT(3)
  868. #define RK3568_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  869. #define RK3568_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
  870. #define RK3568_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
  871. #define RK3568_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
  872. #define RK3568_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  873. /* RK3568_GRF_GMAC0_CON0 && RK3568_GRF_GMAC1_CON0 */
  874. #define RK3568_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  875. #define RK3568_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  876. static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
  877. int tx_delay, int rx_delay)
  878. {
  879. struct device *dev = &bsp_priv->pdev->dev;
  880. u32 con0, con1;
  881. if (IS_ERR(bsp_priv->grf)) {
  882. dev_err(dev, "Missing rockchip,grf property\n");
  883. return;
  884. }
  885. con0 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON0 :
  886. RK3568_GRF_GMAC0_CON0;
  887. con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
  888. RK3568_GRF_GMAC0_CON1;
  889. regmap_write(bsp_priv->grf, con0,
  890. RK3568_GMAC_CLK_RX_DL_CFG(rx_delay) |
  891. RK3568_GMAC_CLK_TX_DL_CFG(tx_delay));
  892. regmap_write(bsp_priv->grf, con1,
  893. RK3568_GMAC_PHY_INTF_SEL_RGMII |
  894. RK3568_GMAC_RXCLK_DLY_ENABLE |
  895. RK3568_GMAC_TXCLK_DLY_ENABLE);
  896. }
  897. static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
  898. {
  899. struct device *dev = &bsp_priv->pdev->dev;
  900. u32 con1;
  901. if (IS_ERR(bsp_priv->grf)) {
  902. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  903. return;
  904. }
  905. con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
  906. RK3568_GRF_GMAC0_CON1;
  907. regmap_write(bsp_priv->grf, con1, RK3568_GMAC_PHY_INTF_SEL_RMII);
  908. }
  909. static void rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
  910. {
  911. struct clk *clk_mac_speed = bsp_priv->clks[RK_CLK_MAC_SPEED].clk;
  912. struct device *dev = &bsp_priv->pdev->dev;
  913. unsigned long rate;
  914. int ret;
  915. switch (speed) {
  916. case 10:
  917. rate = 2500000;
  918. break;
  919. case 100:
  920. rate = 25000000;
  921. break;
  922. case 1000:
  923. rate = 125000000;
  924. break;
  925. default:
  926. dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
  927. return;
  928. }
  929. ret = clk_set_rate(clk_mac_speed, rate);
  930. if (ret)
  931. dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
  932. __func__, rate, ret);
  933. }
  934. static const struct rk_gmac_ops rk3568_ops = {
  935. .set_to_rgmii = rk3568_set_to_rgmii,
  936. .set_to_rmii = rk3568_set_to_rmii,
  937. .set_rgmii_speed = rk3568_set_gmac_speed,
  938. .set_rmii_speed = rk3568_set_gmac_speed,
  939. .regs_valid = true,
  940. .regs = {
  941. 0xfe2a0000, /* gmac0 */
  942. 0xfe010000, /* gmac1 */
  943. 0x0, /* sentinel */
  944. },
  945. };
  946. /* VCCIO0_1_3_IOC */
  947. #define RK3576_VCCIO0_1_3_IOC_CON2 0X6408
  948. #define RK3576_VCCIO0_1_3_IOC_CON3 0X640c
  949. #define RK3576_VCCIO0_1_3_IOC_CON4 0X6410
  950. #define RK3576_VCCIO0_1_3_IOC_CON5 0X6414
  951. #define RK3576_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  952. #define RK3576_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  953. #define RK3576_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  954. #define RK3576_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  955. #define RK3576_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  956. #define RK3576_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  957. /* SDGMAC_GRF */
  958. #define RK3576_GRF_GMAC_CON0 0X0020
  959. #define RK3576_GRF_GMAC_CON1 0X0024
  960. #define RK3576_GMAC_RMII_MODE GRF_BIT(3)
  961. #define RK3576_GMAC_RGMII_MODE GRF_CLR_BIT(3)
  962. #define RK3576_GMAC_CLK_SELECT_IO GRF_BIT(7)
  963. #define RK3576_GMAC_CLK_SELECT_CRU GRF_CLR_BIT(7)
  964. #define RK3576_GMAC_CLK_RMII_DIV2 GRF_BIT(5)
  965. #define RK3576_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(5)
  966. #define RK3576_GMAC_CLK_RGMII_DIV1 \
  967. (GRF_CLR_BIT(6) | GRF_CLR_BIT(5))
  968. #define RK3576_GMAC_CLK_RGMII_DIV5 \
  969. (GRF_BIT(6) | GRF_BIT(5))
  970. #define RK3576_GMAC_CLK_RGMII_DIV50 \
  971. (GRF_BIT(6) | GRF_CLR_BIT(5))
  972. #define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
  973. #define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
  974. static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
  975. int tx_delay, int rx_delay)
  976. {
  977. struct device *dev = &bsp_priv->pdev->dev;
  978. unsigned int offset_con;
  979. if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
  980. dev_err(dev, "Missing rockchip,grf or rockchip,php-grf property\n");
  981. return;
  982. }
  983. offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
  984. RK3576_GRF_GMAC_CON0;
  985. regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RGMII_MODE);
  986. offset_con = bsp_priv->id == 1 ? RK3576_VCCIO0_1_3_IOC_CON4 :
  987. RK3576_VCCIO0_1_3_IOC_CON2;
  988. /* m0 && m1 delay enabled */
  989. regmap_write(bsp_priv->php_grf, offset_con,
  990. DELAY_ENABLE(RK3576, tx_delay, rx_delay));
  991. regmap_write(bsp_priv->php_grf, offset_con + 0x4,
  992. DELAY_ENABLE(RK3576, tx_delay, rx_delay));
  993. /* m0 && m1 delay value */
  994. regmap_write(bsp_priv->php_grf, offset_con,
  995. RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
  996. RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
  997. regmap_write(bsp_priv->php_grf, offset_con + 0x4,
  998. RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
  999. RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
  1000. }
  1001. static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
  1002. {
  1003. struct device *dev = &bsp_priv->pdev->dev;
  1004. unsigned int offset_con;
  1005. if (IS_ERR(bsp_priv->grf)) {
  1006. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  1007. return;
  1008. }
  1009. offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
  1010. RK3576_GRF_GMAC_CON0;
  1011. regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RMII_MODE);
  1012. }
  1013. static void rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
  1014. {
  1015. struct device *dev = &bsp_priv->pdev->dev;
  1016. unsigned int val = 0, offset_con;
  1017. switch (speed) {
  1018. case 10:
  1019. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  1020. val = RK3576_GMAC_CLK_RMII_DIV20;
  1021. else
  1022. val = RK3576_GMAC_CLK_RGMII_DIV50;
  1023. break;
  1024. case 100:
  1025. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  1026. val = RK3576_GMAC_CLK_RMII_DIV2;
  1027. else
  1028. val = RK3576_GMAC_CLK_RGMII_DIV5;
  1029. break;
  1030. case 1000:
  1031. if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
  1032. val = RK3576_GMAC_CLK_RGMII_DIV1;
  1033. else
  1034. goto err;
  1035. break;
  1036. default:
  1037. goto err;
  1038. }
  1039. offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
  1040. RK3576_GRF_GMAC_CON0;
  1041. regmap_write(bsp_priv->grf, offset_con, val);
  1042. return;
  1043. err:
  1044. dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
  1045. }
  1046. static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
  1047. bool enable)
  1048. {
  1049. unsigned int val = input ? RK3576_GMAC_CLK_SELECT_IO :
  1050. RK3576_GMAC_CLK_SELECT_CRU;
  1051. unsigned int offset_con;
  1052. val |= enable ? RK3576_GMAC_CLK_RMII_NOGATE :
  1053. RK3576_GMAC_CLK_RMII_GATE;
  1054. offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
  1055. RK3576_GRF_GMAC_CON0;
  1056. regmap_write(bsp_priv->grf, offset_con, val);
  1057. }
  1058. static const struct rk_gmac_ops rk3576_ops = {
  1059. .set_to_rgmii = rk3576_set_to_rgmii,
  1060. .set_to_rmii = rk3576_set_to_rmii,
  1061. .set_rgmii_speed = rk3576_set_gmac_speed,
  1062. .set_rmii_speed = rk3576_set_gmac_speed,
  1063. .set_clock_selection = rk3576_set_clock_selection,
  1064. .php_grf_required = true,
  1065. .regs_valid = true,
  1066. .regs = {
  1067. 0x2a220000, /* gmac0 */
  1068. 0x2a230000, /* gmac1 */
  1069. 0x0, /* sentinel */
  1070. },
  1071. };
  1072. /* sys_grf */
  1073. #define RK3588_GRF_GMAC_CON7 0X031c
  1074. #define RK3588_GRF_GMAC_CON8 0X0320
  1075. #define RK3588_GRF_GMAC_CON9 0X0324
  1076. #define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3)
  1077. #define RK3588_GMAC_RXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 3)
  1078. #define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2)
  1079. #define RK3588_GMAC_TXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 2)
  1080. #define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8)
  1081. #define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0)
  1082. /* php_grf */
  1083. #define RK3588_GRF_GMAC_CON0 0X0008
  1084. #define RK3588_GRF_CLK_CON1 0X0070
  1085. #define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) \
  1086. (GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + (id) * 6))
  1087. #define RK3588_GMAC_PHY_INTF_SEL_RMII(id) \
  1088. (GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + (id) * 6))
  1089. #define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id))
  1090. #define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id))
  1091. #define RK3588_GMAC_CLK_SELECT_CRU(id) GRF_BIT(5 * (id) + 4)
  1092. #define RK3588_GMAC_CLK_SELECT_IO(id) GRF_CLR_BIT(5 * (id) + 4)
  1093. #define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2)
  1094. #define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2)
  1095. #define RK3588_GMAC_CLK_RGMII_DIV1(id) \
  1096. (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3))
  1097. #define RK3588_GMAC_CLK_RGMII_DIV5(id) \
  1098. (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3))
  1099. #define RK3588_GMAC_CLK_RGMII_DIV50(id) \
  1100. (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3))
  1101. #define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
  1102. #define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
  1103. static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
  1104. int tx_delay, int rx_delay)
  1105. {
  1106. struct device *dev = &bsp_priv->pdev->dev;
  1107. u32 offset_con, id = bsp_priv->id;
  1108. if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
  1109. dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n");
  1110. return;
  1111. }
  1112. offset_con = bsp_priv->id == 1 ? RK3588_GRF_GMAC_CON9 :
  1113. RK3588_GRF_GMAC_CON8;
  1114. regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
  1115. RK3588_GMAC_PHY_INTF_SEL_RGMII(id));
  1116. regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
  1117. RK3588_GMAC_CLK_RGMII_MODE(id));
  1118. regmap_write(bsp_priv->grf, RK3588_GRF_GMAC_CON7,
  1119. RK3588_GMAC_RXCLK_DLY_ENABLE(id) |
  1120. RK3588_GMAC_TXCLK_DLY_ENABLE(id));
  1121. regmap_write(bsp_priv->grf, offset_con,
  1122. RK3588_GMAC_CLK_RX_DL_CFG(rx_delay) |
  1123. RK3588_GMAC_CLK_TX_DL_CFG(tx_delay));
  1124. }
  1125. static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
  1126. {
  1127. struct device *dev = &bsp_priv->pdev->dev;
  1128. if (IS_ERR(bsp_priv->php_grf)) {
  1129. dev_err(dev, "%s: Missing rockchip,php_grf property\n", __func__);
  1130. return;
  1131. }
  1132. regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
  1133. RK3588_GMAC_PHY_INTF_SEL_RMII(bsp_priv->id));
  1134. regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
  1135. RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id));
  1136. }
  1137. static void rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
  1138. {
  1139. struct device *dev = &bsp_priv->pdev->dev;
  1140. unsigned int val = 0, id = bsp_priv->id;
  1141. switch (speed) {
  1142. case 10:
  1143. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  1144. val = RK3588_GMA_CLK_RMII_DIV20(id);
  1145. else
  1146. val = RK3588_GMAC_CLK_RGMII_DIV50(id);
  1147. break;
  1148. case 100:
  1149. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  1150. val = RK3588_GMA_CLK_RMII_DIV2(id);
  1151. else
  1152. val = RK3588_GMAC_CLK_RGMII_DIV5(id);
  1153. break;
  1154. case 1000:
  1155. if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
  1156. val = RK3588_GMAC_CLK_RGMII_DIV1(id);
  1157. else
  1158. goto err;
  1159. break;
  1160. default:
  1161. goto err;
  1162. }
  1163. regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
  1164. return;
  1165. err:
  1166. dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
  1167. }
  1168. static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
  1169. bool enable)
  1170. {
  1171. unsigned int val = input ? RK3588_GMAC_CLK_SELECT_IO(bsp_priv->id) :
  1172. RK3588_GMAC_CLK_SELECT_CRU(bsp_priv->id);
  1173. val |= enable ? RK3588_GMAC_CLK_RMII_NOGATE(bsp_priv->id) :
  1174. RK3588_GMAC_CLK_RMII_GATE(bsp_priv->id);
  1175. regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
  1176. }
  1177. static const struct rk_gmac_ops rk3588_ops = {
  1178. .set_to_rgmii = rk3588_set_to_rgmii,
  1179. .set_to_rmii = rk3588_set_to_rmii,
  1180. .set_rgmii_speed = rk3588_set_gmac_speed,
  1181. .set_rmii_speed = rk3588_set_gmac_speed,
  1182. .set_clock_selection = rk3588_set_clock_selection,
  1183. .php_grf_required = true,
  1184. .regs_valid = true,
  1185. .regs = {
  1186. 0xfe1b0000, /* gmac0 */
  1187. 0xfe1c0000, /* gmac1 */
  1188. 0x0, /* sentinel */
  1189. },
  1190. };
  1191. #define RV1108_GRF_GMAC_CON0 0X0900
  1192. /* RV1108_GRF_GMAC_CON0 */
  1193. #define RV1108_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
  1194. GRF_BIT(6))
  1195. #define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
  1196. #define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  1197. #define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
  1198. #define RV1108_GMAC_SPEED_100M GRF_BIT(2)
  1199. #define RV1108_GMAC_RMII_CLK_25M GRF_BIT(7)
  1200. #define RV1108_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
  1201. static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
  1202. {
  1203. struct device *dev = &bsp_priv->pdev->dev;
  1204. if (IS_ERR(bsp_priv->grf)) {
  1205. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  1206. return;
  1207. }
  1208. regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
  1209. RV1108_GMAC_PHY_INTF_SEL_RMII);
  1210. }
  1211. static void rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  1212. {
  1213. struct device *dev = &bsp_priv->pdev->dev;
  1214. if (IS_ERR(bsp_priv->grf)) {
  1215. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  1216. return;
  1217. }
  1218. if (speed == 10) {
  1219. regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
  1220. RV1108_GMAC_RMII_CLK_2_5M |
  1221. RV1108_GMAC_SPEED_10M);
  1222. } else if (speed == 100) {
  1223. regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
  1224. RV1108_GMAC_RMII_CLK_25M |
  1225. RV1108_GMAC_SPEED_100M);
  1226. } else {
  1227. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  1228. }
  1229. }
  1230. static const struct rk_gmac_ops rv1108_ops = {
  1231. .set_to_rmii = rv1108_set_to_rmii,
  1232. .set_rmii_speed = rv1108_set_rmii_speed,
  1233. };
  1234. #define RV1126_GRF_GMAC_CON0 0X0070
  1235. #define RV1126_GRF_GMAC_CON1 0X0074
  1236. #define RV1126_GRF_GMAC_CON2 0X0078
  1237. /* RV1126_GRF_GMAC_CON0 */
  1238. #define RV1126_GMAC_PHY_INTF_SEL_RGMII \
  1239. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  1240. #define RV1126_GMAC_PHY_INTF_SEL_RMII \
  1241. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  1242. #define RV1126_GMAC_FLOW_CTRL GRF_BIT(7)
  1243. #define RV1126_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(7)
  1244. #define RV1126_GMAC_M0_RXCLK_DLY_ENABLE GRF_BIT(1)
  1245. #define RV1126_GMAC_M0_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
  1246. #define RV1126_GMAC_M0_TXCLK_DLY_ENABLE GRF_BIT(0)
  1247. #define RV1126_GMAC_M0_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  1248. #define RV1126_GMAC_M1_RXCLK_DLY_ENABLE GRF_BIT(3)
  1249. #define RV1126_GMAC_M1_RXCLK_DLY_DISABLE GRF_CLR_BIT(3)
  1250. #define RV1126_GMAC_M1_TXCLK_DLY_ENABLE GRF_BIT(2)
  1251. #define RV1126_GMAC_M1_TXCLK_DLY_DISABLE GRF_CLR_BIT(2)
  1252. /* RV1126_GRF_GMAC_CON1 */
  1253. #define RV1126_GMAC_M0_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  1254. #define RV1126_GMAC_M0_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  1255. /* RV1126_GRF_GMAC_CON2 */
  1256. #define RV1126_GMAC_M1_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  1257. #define RV1126_GMAC_M1_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  1258. static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
  1259. int tx_delay, int rx_delay)
  1260. {
  1261. struct device *dev = &bsp_priv->pdev->dev;
  1262. if (IS_ERR(bsp_priv->grf)) {
  1263. dev_err(dev, "Missing rockchip,grf property\n");
  1264. return;
  1265. }
  1266. regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
  1267. RV1126_GMAC_PHY_INTF_SEL_RGMII |
  1268. RV1126_GMAC_M0_RXCLK_DLY_ENABLE |
  1269. RV1126_GMAC_M0_TXCLK_DLY_ENABLE |
  1270. RV1126_GMAC_M1_RXCLK_DLY_ENABLE |
  1271. RV1126_GMAC_M1_TXCLK_DLY_ENABLE);
  1272. regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON1,
  1273. RV1126_GMAC_M0_CLK_RX_DL_CFG(rx_delay) |
  1274. RV1126_GMAC_M0_CLK_TX_DL_CFG(tx_delay));
  1275. regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON2,
  1276. RV1126_GMAC_M1_CLK_RX_DL_CFG(rx_delay) |
  1277. RV1126_GMAC_M1_CLK_TX_DL_CFG(tx_delay));
  1278. }
  1279. static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
  1280. {
  1281. struct device *dev = &bsp_priv->pdev->dev;
  1282. if (IS_ERR(bsp_priv->grf)) {
  1283. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  1284. return;
  1285. }
  1286. regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
  1287. RV1126_GMAC_PHY_INTF_SEL_RMII);
  1288. }
  1289. static void rv1126_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  1290. {
  1291. struct clk *clk_mac_speed = bsp_priv->clks[RK_CLK_MAC_SPEED].clk;
  1292. struct device *dev = &bsp_priv->pdev->dev;
  1293. unsigned long rate;
  1294. int ret;
  1295. switch (speed) {
  1296. case 10:
  1297. rate = 2500000;
  1298. break;
  1299. case 100:
  1300. rate = 25000000;
  1301. break;
  1302. case 1000:
  1303. rate = 125000000;
  1304. break;
  1305. default:
  1306. dev_err(dev, "unknown speed value for RGMII speed=%d", speed);
  1307. return;
  1308. }
  1309. ret = clk_set_rate(clk_mac_speed, rate);
  1310. if (ret)
  1311. dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
  1312. __func__, rate, ret);
  1313. }
  1314. static void rv1126_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  1315. {
  1316. struct clk *clk_mac_speed = bsp_priv->clks[RK_CLK_MAC_SPEED].clk;
  1317. struct device *dev = &bsp_priv->pdev->dev;
  1318. unsigned long rate;
  1319. int ret;
  1320. switch (speed) {
  1321. case 10:
  1322. rate = 2500000;
  1323. break;
  1324. case 100:
  1325. rate = 25000000;
  1326. break;
  1327. default:
  1328. dev_err(dev, "unknown speed value for RGMII speed=%d", speed);
  1329. return;
  1330. }
  1331. ret = clk_set_rate(clk_mac_speed, rate);
  1332. if (ret)
  1333. dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
  1334. __func__, rate, ret);
  1335. }
  1336. static const struct rk_gmac_ops rv1126_ops = {
  1337. .set_to_rgmii = rv1126_set_to_rgmii,
  1338. .set_to_rmii = rv1126_set_to_rmii,
  1339. .set_rgmii_speed = rv1126_set_rgmii_speed,
  1340. .set_rmii_speed = rv1126_set_rmii_speed,
  1341. };
  1342. #define RK_GRF_MACPHY_CON0 0xb00
  1343. #define RK_GRF_MACPHY_CON1 0xb04
  1344. #define RK_GRF_MACPHY_CON2 0xb08
  1345. #define RK_GRF_MACPHY_CON3 0xb0c
  1346. #define RK_MACPHY_ENABLE GRF_BIT(0)
  1347. #define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
  1348. #define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
  1349. #define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
  1350. #define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
  1351. #define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
  1352. static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
  1353. {
  1354. if (priv->ops->integrated_phy_powerup)
  1355. priv->ops->integrated_phy_powerup(priv);
  1356. regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
  1357. regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
  1358. regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
  1359. regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
  1360. if (priv->phy_reset) {
  1361. /* PHY needs to be disabled before trying to reset it */
  1362. regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
  1363. if (priv->phy_reset)
  1364. reset_control_assert(priv->phy_reset);
  1365. usleep_range(10, 20);
  1366. if (priv->phy_reset)
  1367. reset_control_deassert(priv->phy_reset);
  1368. usleep_range(10, 20);
  1369. regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
  1370. msleep(30);
  1371. }
  1372. }
  1373. static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
  1374. {
  1375. regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
  1376. if (priv->phy_reset)
  1377. reset_control_assert(priv->phy_reset);
  1378. }
  1379. static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
  1380. {
  1381. struct rk_priv_data *bsp_priv = plat->bsp_priv;
  1382. struct device *dev = &bsp_priv->pdev->dev;
  1383. int phy_iface = bsp_priv->phy_iface;
  1384. int i, j, ret;
  1385. bsp_priv->clk_enabled = false;
  1386. bsp_priv->num_clks = ARRAY_SIZE(rk_clocks);
  1387. if (phy_iface == PHY_INTERFACE_MODE_RMII)
  1388. bsp_priv->num_clks += ARRAY_SIZE(rk_rmii_clocks);
  1389. bsp_priv->clks = devm_kcalloc(dev, bsp_priv->num_clks,
  1390. sizeof(*bsp_priv->clks), GFP_KERNEL);
  1391. if (!bsp_priv->clks)
  1392. return -ENOMEM;
  1393. for (i = 0; i < ARRAY_SIZE(rk_clocks); i++)
  1394. bsp_priv->clks[i].id = rk_clocks[i];
  1395. if (phy_iface == PHY_INTERFACE_MODE_RMII) {
  1396. for (j = 0; j < ARRAY_SIZE(rk_rmii_clocks); j++)
  1397. bsp_priv->clks[i++].id = rk_rmii_clocks[j];
  1398. }
  1399. ret = devm_clk_bulk_get_optional(dev, bsp_priv->num_clks,
  1400. bsp_priv->clks);
  1401. if (ret)
  1402. return dev_err_probe(dev, ret, "Failed to get clocks\n");
  1403. /* "stmmaceth" will be enabled by the core */
  1404. bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
  1405. ret = PTR_ERR_OR_ZERO(bsp_priv->clk_mac);
  1406. if (ret)
  1407. return dev_err_probe(dev, ret, "Cannot get stmmaceth clock\n");
  1408. if (bsp_priv->clock_input) {
  1409. dev_info(dev, "clock input from PHY\n");
  1410. } else if (phy_iface == PHY_INTERFACE_MODE_RMII) {
  1411. clk_set_rate(bsp_priv->clk_mac, 50000000);
  1412. }
  1413. if (plat->phy_node && bsp_priv->integrated_phy) {
  1414. bsp_priv->clk_phy = of_clk_get(plat->phy_node, 0);
  1415. ret = PTR_ERR_OR_ZERO(bsp_priv->clk_phy);
  1416. if (ret)
  1417. return dev_err_probe(dev, ret, "Cannot get PHY clock\n");
  1418. clk_set_rate(bsp_priv->clk_phy, 50000000);
  1419. }
  1420. return 0;
  1421. }
  1422. static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
  1423. {
  1424. int ret;
  1425. if (enable) {
  1426. if (!bsp_priv->clk_enabled) {
  1427. ret = clk_bulk_prepare_enable(bsp_priv->num_clks,
  1428. bsp_priv->clks);
  1429. if (ret)
  1430. return ret;
  1431. ret = clk_prepare_enable(bsp_priv->clk_phy);
  1432. if (ret)
  1433. return ret;
  1434. if (bsp_priv->ops && bsp_priv->ops->set_clock_selection)
  1435. bsp_priv->ops->set_clock_selection(bsp_priv,
  1436. bsp_priv->clock_input, true);
  1437. mdelay(5);
  1438. bsp_priv->clk_enabled = true;
  1439. }
  1440. } else {
  1441. if (bsp_priv->clk_enabled) {
  1442. if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) {
  1443. bsp_priv->ops->set_clock_selection(bsp_priv,
  1444. bsp_priv->clock_input, false);
  1445. }
  1446. clk_bulk_disable_unprepare(bsp_priv->num_clks,
  1447. bsp_priv->clks);
  1448. clk_disable_unprepare(bsp_priv->clk_phy);
  1449. bsp_priv->clk_enabled = false;
  1450. }
  1451. }
  1452. return 0;
  1453. }
  1454. static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
  1455. {
  1456. struct regulator *ldo = bsp_priv->regulator;
  1457. int ret;
  1458. struct device *dev = &bsp_priv->pdev->dev;
  1459. if (enable) {
  1460. ret = regulator_enable(ldo);
  1461. if (ret)
  1462. dev_err(dev, "fail to enable phy-supply\n");
  1463. } else {
  1464. ret = regulator_disable(ldo);
  1465. if (ret)
  1466. dev_err(dev, "fail to disable phy-supply\n");
  1467. }
  1468. return 0;
  1469. }
  1470. static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
  1471. struct plat_stmmacenet_data *plat,
  1472. const struct rk_gmac_ops *ops)
  1473. {
  1474. struct rk_priv_data *bsp_priv;
  1475. struct device *dev = &pdev->dev;
  1476. struct resource *res;
  1477. int ret;
  1478. const char *strings = NULL;
  1479. int value;
  1480. bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
  1481. if (!bsp_priv)
  1482. return ERR_PTR(-ENOMEM);
  1483. of_get_phy_mode(dev->of_node, &bsp_priv->phy_iface);
  1484. bsp_priv->ops = ops;
  1485. /* Some SoCs have multiple MAC controllers, which need
  1486. * to be distinguished.
  1487. */
  1488. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1489. if (res && ops->regs_valid) {
  1490. int i = 0;
  1491. while (ops->regs[i]) {
  1492. if (ops->regs[i] == res->start) {
  1493. bsp_priv->id = i;
  1494. break;
  1495. }
  1496. i++;
  1497. }
  1498. }
  1499. bsp_priv->regulator = devm_regulator_get(dev, "phy");
  1500. if (IS_ERR(bsp_priv->regulator)) {
  1501. ret = PTR_ERR(bsp_priv->regulator);
  1502. dev_err_probe(dev, ret, "failed to get phy regulator\n");
  1503. return ERR_PTR(ret);
  1504. }
  1505. ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
  1506. if (ret) {
  1507. dev_err(dev, "Can not read property: clock_in_out.\n");
  1508. bsp_priv->clock_input = true;
  1509. } else {
  1510. dev_info(dev, "clock input or output? (%s).\n",
  1511. strings);
  1512. if (!strcmp(strings, "input"))
  1513. bsp_priv->clock_input = true;
  1514. else
  1515. bsp_priv->clock_input = false;
  1516. }
  1517. ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
  1518. if (ret) {
  1519. bsp_priv->tx_delay = 0x30;
  1520. dev_err(dev, "Can not read property: tx_delay.");
  1521. dev_err(dev, "set tx_delay to 0x%x\n",
  1522. bsp_priv->tx_delay);
  1523. } else {
  1524. dev_info(dev, "TX delay(0x%x).\n", value);
  1525. bsp_priv->tx_delay = value;
  1526. }
  1527. ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
  1528. if (ret) {
  1529. bsp_priv->rx_delay = 0x10;
  1530. dev_err(dev, "Can not read property: rx_delay.");
  1531. dev_err(dev, "set rx_delay to 0x%x\n",
  1532. bsp_priv->rx_delay);
  1533. } else {
  1534. dev_info(dev, "RX delay(0x%x).\n", value);
  1535. bsp_priv->rx_delay = value;
  1536. }
  1537. bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
  1538. "rockchip,grf");
  1539. if (IS_ERR(bsp_priv->grf)) {
  1540. dev_err_probe(dev, PTR_ERR(bsp_priv->grf),
  1541. "failed to lookup rockchip,grf\n");
  1542. return ERR_CAST(bsp_priv->grf);
  1543. }
  1544. if (ops->php_grf_required) {
  1545. bsp_priv->php_grf =
  1546. syscon_regmap_lookup_by_phandle(dev->of_node,
  1547. "rockchip,php-grf");
  1548. if (IS_ERR(bsp_priv->php_grf)) {
  1549. dev_err_probe(dev, PTR_ERR(bsp_priv->php_grf),
  1550. "failed to lookup rockchip,php-grf\n");
  1551. return ERR_CAST(bsp_priv->php_grf);
  1552. }
  1553. }
  1554. if (plat->phy_node) {
  1555. bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
  1556. "phy-is-integrated");
  1557. if (bsp_priv->integrated_phy) {
  1558. bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
  1559. if (IS_ERR(bsp_priv->phy_reset)) {
  1560. dev_err(&pdev->dev, "No PHY reset control found.\n");
  1561. bsp_priv->phy_reset = NULL;
  1562. }
  1563. }
  1564. }
  1565. dev_info(dev, "integrated PHY? (%s).\n",
  1566. bsp_priv->integrated_phy ? "yes" : "no");
  1567. bsp_priv->pdev = pdev;
  1568. return bsp_priv;
  1569. }
  1570. static int rk_gmac_check_ops(struct rk_priv_data *bsp_priv)
  1571. {
  1572. switch (bsp_priv->phy_iface) {
  1573. case PHY_INTERFACE_MODE_RGMII:
  1574. case PHY_INTERFACE_MODE_RGMII_ID:
  1575. case PHY_INTERFACE_MODE_RGMII_RXID:
  1576. case PHY_INTERFACE_MODE_RGMII_TXID:
  1577. if (!bsp_priv->ops->set_to_rgmii)
  1578. return -EINVAL;
  1579. break;
  1580. case PHY_INTERFACE_MODE_RMII:
  1581. if (!bsp_priv->ops->set_to_rmii)
  1582. return -EINVAL;
  1583. break;
  1584. default:
  1585. dev_err(&bsp_priv->pdev->dev,
  1586. "unsupported interface %d", bsp_priv->phy_iface);
  1587. }
  1588. return 0;
  1589. }
  1590. static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
  1591. {
  1592. int ret;
  1593. struct device *dev = &bsp_priv->pdev->dev;
  1594. ret = rk_gmac_check_ops(bsp_priv);
  1595. if (ret)
  1596. return ret;
  1597. ret = gmac_clk_enable(bsp_priv, true);
  1598. if (ret)
  1599. return ret;
  1600. /*rmii or rgmii*/
  1601. switch (bsp_priv->phy_iface) {
  1602. case PHY_INTERFACE_MODE_RGMII:
  1603. dev_info(dev, "init for RGMII\n");
  1604. bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
  1605. bsp_priv->rx_delay);
  1606. break;
  1607. case PHY_INTERFACE_MODE_RGMII_ID:
  1608. dev_info(dev, "init for RGMII_ID\n");
  1609. bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
  1610. break;
  1611. case PHY_INTERFACE_MODE_RGMII_RXID:
  1612. dev_info(dev, "init for RGMII_RXID\n");
  1613. bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
  1614. break;
  1615. case PHY_INTERFACE_MODE_RGMII_TXID:
  1616. dev_info(dev, "init for RGMII_TXID\n");
  1617. bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
  1618. break;
  1619. case PHY_INTERFACE_MODE_RMII:
  1620. dev_info(dev, "init for RMII\n");
  1621. bsp_priv->ops->set_to_rmii(bsp_priv);
  1622. break;
  1623. default:
  1624. dev_err(dev, "NO interface defined!\n");
  1625. }
  1626. ret = phy_power_on(bsp_priv, true);
  1627. if (ret) {
  1628. gmac_clk_enable(bsp_priv, false);
  1629. return ret;
  1630. }
  1631. pm_runtime_get_sync(dev);
  1632. if (bsp_priv->integrated_phy)
  1633. rk_gmac_integrated_phy_powerup(bsp_priv);
  1634. return 0;
  1635. }
  1636. static void rk_gmac_powerdown(struct rk_priv_data *gmac)
  1637. {
  1638. if (gmac->integrated_phy)
  1639. rk_gmac_integrated_phy_powerdown(gmac);
  1640. pm_runtime_put_sync(&gmac->pdev->dev);
  1641. phy_power_on(gmac, false);
  1642. gmac_clk_enable(gmac, false);
  1643. }
  1644. static void rk_fix_speed(void *priv, unsigned int speed, unsigned int mode)
  1645. {
  1646. struct rk_priv_data *bsp_priv = priv;
  1647. struct device *dev = &bsp_priv->pdev->dev;
  1648. switch (bsp_priv->phy_iface) {
  1649. case PHY_INTERFACE_MODE_RGMII:
  1650. case PHY_INTERFACE_MODE_RGMII_ID:
  1651. case PHY_INTERFACE_MODE_RGMII_RXID:
  1652. case PHY_INTERFACE_MODE_RGMII_TXID:
  1653. if (bsp_priv->ops->set_rgmii_speed)
  1654. bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
  1655. break;
  1656. case PHY_INTERFACE_MODE_RMII:
  1657. if (bsp_priv->ops->set_rmii_speed)
  1658. bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
  1659. break;
  1660. default:
  1661. dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
  1662. }
  1663. }
  1664. static int rk_gmac_probe(struct platform_device *pdev)
  1665. {
  1666. struct plat_stmmacenet_data *plat_dat;
  1667. struct stmmac_resources stmmac_res;
  1668. const struct rk_gmac_ops *data;
  1669. int ret;
  1670. data = of_device_get_match_data(&pdev->dev);
  1671. if (!data) {
  1672. dev_err(&pdev->dev, "no of match data provided\n");
  1673. return -EINVAL;
  1674. }
  1675. ret = stmmac_get_platform_resources(pdev, &stmmac_res);
  1676. if (ret)
  1677. return ret;
  1678. plat_dat = devm_stmmac_probe_config_dt(pdev, stmmac_res.mac);
  1679. if (IS_ERR(plat_dat))
  1680. return PTR_ERR(plat_dat);
  1681. /* If the stmmac is not already selected as gmac4,
  1682. * then make sure we fallback to gmac.
  1683. */
  1684. if (!plat_dat->has_gmac4)
  1685. plat_dat->has_gmac = true;
  1686. plat_dat->fix_mac_speed = rk_fix_speed;
  1687. plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
  1688. if (IS_ERR(plat_dat->bsp_priv))
  1689. return PTR_ERR(plat_dat->bsp_priv);
  1690. ret = rk_gmac_clk_init(plat_dat);
  1691. if (ret)
  1692. return ret;
  1693. ret = rk_gmac_powerup(plat_dat->bsp_priv);
  1694. if (ret)
  1695. return ret;
  1696. ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
  1697. if (ret)
  1698. goto err_gmac_powerdown;
  1699. return 0;
  1700. err_gmac_powerdown:
  1701. rk_gmac_powerdown(plat_dat->bsp_priv);
  1702. return ret;
  1703. }
  1704. static void rk_gmac_remove(struct platform_device *pdev)
  1705. {
  1706. struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
  1707. stmmac_dvr_remove(&pdev->dev);
  1708. rk_gmac_powerdown(bsp_priv);
  1709. }
  1710. #ifdef CONFIG_PM_SLEEP
  1711. static int rk_gmac_suspend(struct device *dev)
  1712. {
  1713. struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
  1714. int ret = stmmac_suspend(dev);
  1715. /* Keep the PHY up if we use Wake-on-Lan. */
  1716. if (!device_may_wakeup(dev)) {
  1717. rk_gmac_powerdown(bsp_priv);
  1718. bsp_priv->suspended = true;
  1719. }
  1720. return ret;
  1721. }
  1722. static int rk_gmac_resume(struct device *dev)
  1723. {
  1724. struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
  1725. /* The PHY was up for Wake-on-Lan. */
  1726. if (bsp_priv->suspended) {
  1727. rk_gmac_powerup(bsp_priv);
  1728. bsp_priv->suspended = false;
  1729. }
  1730. return stmmac_resume(dev);
  1731. }
  1732. #endif /* CONFIG_PM_SLEEP */
  1733. static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
  1734. static const struct of_device_id rk_gmac_dwmac_match[] = {
  1735. { .compatible = "rockchip,px30-gmac", .data = &px30_ops },
  1736. { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
  1737. { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
  1738. { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
  1739. { .compatible = "rockchip,rk3308-gmac", .data = &rk3308_ops },
  1740. { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
  1741. { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
  1742. { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
  1743. { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
  1744. { .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
  1745. { .compatible = "rockchip,rk3576-gmac", .data = &rk3576_ops },
  1746. { .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops },
  1747. { .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
  1748. { .compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops },
  1749. { }
  1750. };
  1751. MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
  1752. static struct platform_driver rk_gmac_dwmac_driver = {
  1753. .probe = rk_gmac_probe,
  1754. .remove_new = rk_gmac_remove,
  1755. .driver = {
  1756. .name = "rk_gmac-dwmac",
  1757. .pm = &rk_gmac_pm_ops,
  1758. .of_match_table = rk_gmac_dwmac_match,
  1759. },
  1760. };
  1761. module_platform_driver(rk_gmac_dwmac_driver);
  1762. MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
  1763. MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
  1764. MODULE_LICENSE("GPL");