dwmac-rk.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. /**
  2. * dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer
  3. *
  4. * Copyright (C) 2014 Chen-Zhi (Roger Chen)
  5. *
  6. * Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. */
  18. #include <linux/stmmac.h>
  19. #include <linux/bitops.h>
  20. #include <linux/clk.h>
  21. #include <linux/phy.h>
  22. #include <linux/of_net.h>
  23. #include <linux/gpio.h>
  24. #include <linux/module.h>
  25. #include <linux/of_gpio.h>
  26. #include <linux/of_device.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/regulator/consumer.h>
  29. #include <linux/delay.h>
  30. #include <linux/mfd/syscon.h>
  31. #include <linux/regmap.h>
  32. #include <linux/pm_runtime.h>
  33. #include "stmmac_platform.h"
  34. struct rk_priv_data;
  35. struct rk_gmac_ops {
  36. void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
  37. int tx_delay, int rx_delay);
  38. void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
  39. void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  40. void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  41. };
  42. struct rk_priv_data {
  43. struct platform_device *pdev;
  44. int phy_iface;
  45. struct regulator *regulator;
  46. bool suspended;
  47. const struct rk_gmac_ops *ops;
  48. bool clk_enabled;
  49. bool clock_input;
  50. struct clk *clk_mac;
  51. struct clk *gmac_clkin;
  52. struct clk *mac_clk_rx;
  53. struct clk *mac_clk_tx;
  54. struct clk *clk_mac_ref;
  55. struct clk *clk_mac_refout;
  56. struct clk *aclk_mac;
  57. struct clk *pclk_mac;
  58. int tx_delay;
  59. int rx_delay;
  60. struct regmap *grf;
  61. };
  62. #define HIWORD_UPDATE(val, mask, shift) \
  63. ((val) << (shift) | (mask) << ((shift) + 16))
  64. #define GRF_BIT(nr) (BIT(nr) | BIT(nr+16))
  65. #define GRF_CLR_BIT(nr) (BIT(nr+16))
  66. #define DELAY_ENABLE(soc, tx, rx) \
  67. (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
  68. ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
  69. #define RK3228_GRF_MAC_CON0 0x0900
  70. #define RK3228_GRF_MAC_CON1 0x0904
  71. /* RK3228_GRF_MAC_CON0 */
  72. #define RK3228_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  73. #define RK3228_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  74. /* RK3228_GRF_MAC_CON1 */
  75. #define RK3228_GMAC_PHY_INTF_SEL_RGMII \
  76. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  77. #define RK3228_GMAC_PHY_INTF_SEL_RMII \
  78. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  79. #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
  80. #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  81. #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
  82. #define RK3228_GMAC_SPEED_100M GRF_BIT(2)
  83. #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
  84. #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
  85. #define RK3228_GMAC_CLK_125M (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
  86. #define RK3228_GMAC_CLK_25M (GRF_BIT(8) | GRF_BIT(9))
  87. #define RK3228_GMAC_CLK_2_5M (GRF_CLR_BIT(8) | GRF_BIT(9))
  88. #define RK3228_GMAC_RMII_MODE GRF_BIT(10)
  89. #define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
  90. #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
  91. #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  92. #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
  93. #define RK3228_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
  94. static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
  95. int tx_delay, int rx_delay)
  96. {
  97. struct device *dev = &bsp_priv->pdev->dev;
  98. if (IS_ERR(bsp_priv->grf)) {
  99. dev_err(dev, "Missing rockchip,grf property\n");
  100. return;
  101. }
  102. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  103. RK3228_GMAC_PHY_INTF_SEL_RGMII |
  104. RK3228_GMAC_RMII_MODE_CLR |
  105. DELAY_ENABLE(RK3228, tx_delay, rx_delay));
  106. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
  107. RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
  108. RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
  109. }
  110. static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
  111. {
  112. struct device *dev = &bsp_priv->pdev->dev;
  113. if (IS_ERR(bsp_priv->grf)) {
  114. dev_err(dev, "Missing rockchip,grf property\n");
  115. return;
  116. }
  117. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  118. RK3228_GMAC_PHY_INTF_SEL_RMII |
  119. RK3228_GMAC_RMII_MODE);
  120. /* set MAC to RMII mode */
  121. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
  122. }
  123. static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  124. {
  125. struct device *dev = &bsp_priv->pdev->dev;
  126. if (IS_ERR(bsp_priv->grf)) {
  127. dev_err(dev, "Missing rockchip,grf property\n");
  128. return;
  129. }
  130. if (speed == 10)
  131. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  132. RK3228_GMAC_CLK_2_5M);
  133. else if (speed == 100)
  134. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  135. RK3228_GMAC_CLK_25M);
  136. else if (speed == 1000)
  137. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  138. RK3228_GMAC_CLK_125M);
  139. else
  140. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  141. }
  142. static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  143. {
  144. struct device *dev = &bsp_priv->pdev->dev;
  145. if (IS_ERR(bsp_priv->grf)) {
  146. dev_err(dev, "Missing rockchip,grf property\n");
  147. return;
  148. }
  149. if (speed == 10)
  150. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  151. RK3228_GMAC_RMII_CLK_2_5M |
  152. RK3228_GMAC_SPEED_10M);
  153. else if (speed == 100)
  154. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  155. RK3228_GMAC_RMII_CLK_25M |
  156. RK3228_GMAC_SPEED_100M);
  157. else
  158. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  159. }
  160. static const struct rk_gmac_ops rk3228_ops = {
  161. .set_to_rgmii = rk3228_set_to_rgmii,
  162. .set_to_rmii = rk3228_set_to_rmii,
  163. .set_rgmii_speed = rk3228_set_rgmii_speed,
  164. .set_rmii_speed = rk3228_set_rmii_speed,
  165. };
  166. #define RK3288_GRF_SOC_CON1 0x0248
  167. #define RK3288_GRF_SOC_CON3 0x0250
  168. /*RK3288_GRF_SOC_CON1*/
  169. #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | \
  170. GRF_CLR_BIT(8))
  171. #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
  172. GRF_BIT(8))
  173. #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
  174. #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
  175. #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
  176. #define RK3288_GMAC_SPEED_100M GRF_BIT(10)
  177. #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
  178. #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
  179. #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
  180. #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
  181. #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
  182. #define RK3288_GMAC_RMII_MODE GRF_BIT(14)
  183. #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
  184. /*RK3288_GRF_SOC_CON3*/
  185. #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
  186. #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
  187. #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  188. #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  189. #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  190. #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  191. static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
  192. int tx_delay, int rx_delay)
  193. {
  194. struct device *dev = &bsp_priv->pdev->dev;
  195. if (IS_ERR(bsp_priv->grf)) {
  196. dev_err(dev, "Missing rockchip,grf property\n");
  197. return;
  198. }
  199. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  200. RK3288_GMAC_PHY_INTF_SEL_RGMII |
  201. RK3288_GMAC_RMII_MODE_CLR);
  202. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
  203. DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
  204. RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
  205. RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
  206. }
  207. static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
  208. {
  209. struct device *dev = &bsp_priv->pdev->dev;
  210. if (IS_ERR(bsp_priv->grf)) {
  211. dev_err(dev, "Missing rockchip,grf property\n");
  212. return;
  213. }
  214. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  215. RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
  216. }
  217. static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  218. {
  219. struct device *dev = &bsp_priv->pdev->dev;
  220. if (IS_ERR(bsp_priv->grf)) {
  221. dev_err(dev, "Missing rockchip,grf property\n");
  222. return;
  223. }
  224. if (speed == 10)
  225. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  226. RK3288_GMAC_CLK_2_5M);
  227. else if (speed == 100)
  228. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  229. RK3288_GMAC_CLK_25M);
  230. else if (speed == 1000)
  231. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  232. RK3288_GMAC_CLK_125M);
  233. else
  234. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  235. }
  236. static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  237. {
  238. struct device *dev = &bsp_priv->pdev->dev;
  239. if (IS_ERR(bsp_priv->grf)) {
  240. dev_err(dev, "Missing rockchip,grf property\n");
  241. return;
  242. }
  243. if (speed == 10) {
  244. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  245. RK3288_GMAC_RMII_CLK_2_5M |
  246. RK3288_GMAC_SPEED_10M);
  247. } else if (speed == 100) {
  248. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  249. RK3288_GMAC_RMII_CLK_25M |
  250. RK3288_GMAC_SPEED_100M);
  251. } else {
  252. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  253. }
  254. }
  255. static const struct rk_gmac_ops rk3288_ops = {
  256. .set_to_rgmii = rk3288_set_to_rgmii,
  257. .set_to_rmii = rk3288_set_to_rmii,
  258. .set_rgmii_speed = rk3288_set_rgmii_speed,
  259. .set_rmii_speed = rk3288_set_rmii_speed,
  260. };
  261. #define RK3328_GRF_MAC_CON0 0x0900
  262. #define RK3328_GRF_MAC_CON1 0x0904
  263. /* RK3328_GRF_MAC_CON0 */
  264. #define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  265. #define RK3328_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  266. /* RK3328_GRF_MAC_CON1 */
  267. #define RK3328_GMAC_PHY_INTF_SEL_RGMII \
  268. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  269. #define RK3328_GMAC_PHY_INTF_SEL_RMII \
  270. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  271. #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
  272. #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  273. #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
  274. #define RK3328_GMAC_SPEED_100M GRF_BIT(2)
  275. #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
  276. #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
  277. #define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
  278. #define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
  279. #define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
  280. #define RK3328_GMAC_RMII_MODE GRF_BIT(9)
  281. #define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
  282. #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
  283. #define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  284. #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
  285. #define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  286. static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
  287. int tx_delay, int rx_delay)
  288. {
  289. struct device *dev = &bsp_priv->pdev->dev;
  290. if (IS_ERR(bsp_priv->grf)) {
  291. dev_err(dev, "Missing rockchip,grf property\n");
  292. return;
  293. }
  294. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  295. RK3328_GMAC_PHY_INTF_SEL_RGMII |
  296. RK3328_GMAC_RMII_MODE_CLR |
  297. RK3328_GMAC_RXCLK_DLY_ENABLE |
  298. RK3328_GMAC_TXCLK_DLY_ENABLE);
  299. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
  300. RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
  301. RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
  302. }
  303. static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
  304. {
  305. struct device *dev = &bsp_priv->pdev->dev;
  306. if (IS_ERR(bsp_priv->grf)) {
  307. dev_err(dev, "Missing rockchip,grf property\n");
  308. return;
  309. }
  310. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  311. RK3328_GMAC_PHY_INTF_SEL_RMII |
  312. RK3328_GMAC_RMII_MODE);
  313. /* set MAC to RMII mode */
  314. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, GRF_BIT(11));
  315. }
  316. static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  317. {
  318. struct device *dev = &bsp_priv->pdev->dev;
  319. if (IS_ERR(bsp_priv->grf)) {
  320. dev_err(dev, "Missing rockchip,grf property\n");
  321. return;
  322. }
  323. if (speed == 10)
  324. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  325. RK3328_GMAC_CLK_2_5M);
  326. else if (speed == 100)
  327. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  328. RK3328_GMAC_CLK_25M);
  329. else if (speed == 1000)
  330. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  331. RK3328_GMAC_CLK_125M);
  332. else
  333. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  334. }
  335. static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  336. {
  337. struct device *dev = &bsp_priv->pdev->dev;
  338. if (IS_ERR(bsp_priv->grf)) {
  339. dev_err(dev, "Missing rockchip,grf property\n");
  340. return;
  341. }
  342. if (speed == 10)
  343. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  344. RK3328_GMAC_RMII_CLK_2_5M |
  345. RK3328_GMAC_SPEED_10M);
  346. else if (speed == 100)
  347. regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
  348. RK3328_GMAC_RMII_CLK_25M |
  349. RK3328_GMAC_SPEED_100M);
  350. else
  351. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  352. }
  353. static const struct rk_gmac_ops rk3328_ops = {
  354. .set_to_rgmii = rk3328_set_to_rgmii,
  355. .set_to_rmii = rk3328_set_to_rmii,
  356. .set_rgmii_speed = rk3328_set_rgmii_speed,
  357. .set_rmii_speed = rk3328_set_rmii_speed,
  358. };
  359. #define RK3366_GRF_SOC_CON6 0x0418
  360. #define RK3366_GRF_SOC_CON7 0x041c
  361. /* RK3366_GRF_SOC_CON6 */
  362. #define RK3366_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  363. GRF_CLR_BIT(11))
  364. #define RK3366_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  365. GRF_BIT(11))
  366. #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
  367. #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  368. #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
  369. #define RK3366_GMAC_SPEED_100M GRF_BIT(7)
  370. #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
  371. #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  372. #define RK3366_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  373. #define RK3366_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  374. #define RK3366_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  375. #define RK3366_GMAC_RMII_MODE GRF_BIT(6)
  376. #define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  377. /* RK3366_GRF_SOC_CON7 */
  378. #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  379. #define RK3366_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  380. #define RK3366_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  381. #define RK3366_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  382. #define RK3366_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  383. #define RK3366_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  384. static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
  385. int tx_delay, int rx_delay)
  386. {
  387. struct device *dev = &bsp_priv->pdev->dev;
  388. if (IS_ERR(bsp_priv->grf)) {
  389. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  390. return;
  391. }
  392. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  393. RK3366_GMAC_PHY_INTF_SEL_RGMII |
  394. RK3366_GMAC_RMII_MODE_CLR);
  395. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
  396. DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
  397. RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
  398. RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
  399. }
  400. static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
  401. {
  402. struct device *dev = &bsp_priv->pdev->dev;
  403. if (IS_ERR(bsp_priv->grf)) {
  404. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  405. return;
  406. }
  407. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  408. RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
  409. }
  410. static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  411. {
  412. struct device *dev = &bsp_priv->pdev->dev;
  413. if (IS_ERR(bsp_priv->grf)) {
  414. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  415. return;
  416. }
  417. if (speed == 10)
  418. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  419. RK3366_GMAC_CLK_2_5M);
  420. else if (speed == 100)
  421. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  422. RK3366_GMAC_CLK_25M);
  423. else if (speed == 1000)
  424. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  425. RK3366_GMAC_CLK_125M);
  426. else
  427. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  428. }
  429. static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  430. {
  431. struct device *dev = &bsp_priv->pdev->dev;
  432. if (IS_ERR(bsp_priv->grf)) {
  433. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  434. return;
  435. }
  436. if (speed == 10) {
  437. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  438. RK3366_GMAC_RMII_CLK_2_5M |
  439. RK3366_GMAC_SPEED_10M);
  440. } else if (speed == 100) {
  441. regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
  442. RK3366_GMAC_RMII_CLK_25M |
  443. RK3366_GMAC_SPEED_100M);
  444. } else {
  445. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  446. }
  447. }
  448. static const struct rk_gmac_ops rk3366_ops = {
  449. .set_to_rgmii = rk3366_set_to_rgmii,
  450. .set_to_rmii = rk3366_set_to_rmii,
  451. .set_rgmii_speed = rk3366_set_rgmii_speed,
  452. .set_rmii_speed = rk3366_set_rmii_speed,
  453. };
  454. #define RK3368_GRF_SOC_CON15 0x043c
  455. #define RK3368_GRF_SOC_CON16 0x0440
  456. /* RK3368_GRF_SOC_CON15 */
  457. #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  458. GRF_CLR_BIT(11))
  459. #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  460. GRF_BIT(11))
  461. #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
  462. #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  463. #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
  464. #define RK3368_GMAC_SPEED_100M GRF_BIT(7)
  465. #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
  466. #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  467. #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  468. #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  469. #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  470. #define RK3368_GMAC_RMII_MODE GRF_BIT(6)
  471. #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  472. /* RK3368_GRF_SOC_CON16 */
  473. #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  474. #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  475. #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  476. #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  477. #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  478. #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  479. static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
  480. int tx_delay, int rx_delay)
  481. {
  482. struct device *dev = &bsp_priv->pdev->dev;
  483. if (IS_ERR(bsp_priv->grf)) {
  484. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  485. return;
  486. }
  487. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  488. RK3368_GMAC_PHY_INTF_SEL_RGMII |
  489. RK3368_GMAC_RMII_MODE_CLR);
  490. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
  491. DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
  492. RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
  493. RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
  494. }
  495. static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
  496. {
  497. struct device *dev = &bsp_priv->pdev->dev;
  498. if (IS_ERR(bsp_priv->grf)) {
  499. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  500. return;
  501. }
  502. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  503. RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
  504. }
  505. static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  506. {
  507. struct device *dev = &bsp_priv->pdev->dev;
  508. if (IS_ERR(bsp_priv->grf)) {
  509. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  510. return;
  511. }
  512. if (speed == 10)
  513. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  514. RK3368_GMAC_CLK_2_5M);
  515. else if (speed == 100)
  516. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  517. RK3368_GMAC_CLK_25M);
  518. else if (speed == 1000)
  519. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  520. RK3368_GMAC_CLK_125M);
  521. else
  522. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  523. }
  524. static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  525. {
  526. struct device *dev = &bsp_priv->pdev->dev;
  527. if (IS_ERR(bsp_priv->grf)) {
  528. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  529. return;
  530. }
  531. if (speed == 10) {
  532. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  533. RK3368_GMAC_RMII_CLK_2_5M |
  534. RK3368_GMAC_SPEED_10M);
  535. } else if (speed == 100) {
  536. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  537. RK3368_GMAC_RMII_CLK_25M |
  538. RK3368_GMAC_SPEED_100M);
  539. } else {
  540. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  541. }
  542. }
  543. static const struct rk_gmac_ops rk3368_ops = {
  544. .set_to_rgmii = rk3368_set_to_rgmii,
  545. .set_to_rmii = rk3368_set_to_rmii,
  546. .set_rgmii_speed = rk3368_set_rgmii_speed,
  547. .set_rmii_speed = rk3368_set_rmii_speed,
  548. };
  549. #define RK3399_GRF_SOC_CON5 0xc214
  550. #define RK3399_GRF_SOC_CON6 0xc218
  551. /* RK3399_GRF_SOC_CON5 */
  552. #define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  553. GRF_CLR_BIT(11))
  554. #define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  555. GRF_BIT(11))
  556. #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
  557. #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  558. #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
  559. #define RK3399_GMAC_SPEED_100M GRF_BIT(7)
  560. #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
  561. #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  562. #define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  563. #define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  564. #define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  565. #define RK3399_GMAC_RMII_MODE GRF_BIT(6)
  566. #define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  567. /* RK3399_GRF_SOC_CON6 */
  568. #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  569. #define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  570. #define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  571. #define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  572. #define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  573. #define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  574. static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
  575. int tx_delay, int rx_delay)
  576. {
  577. struct device *dev = &bsp_priv->pdev->dev;
  578. if (IS_ERR(bsp_priv->grf)) {
  579. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  580. return;
  581. }
  582. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  583. RK3399_GMAC_PHY_INTF_SEL_RGMII |
  584. RK3399_GMAC_RMII_MODE_CLR);
  585. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
  586. DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
  587. RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
  588. RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
  589. }
  590. static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
  591. {
  592. struct device *dev = &bsp_priv->pdev->dev;
  593. if (IS_ERR(bsp_priv->grf)) {
  594. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  595. return;
  596. }
  597. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  598. RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
  599. }
  600. static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  601. {
  602. struct device *dev = &bsp_priv->pdev->dev;
  603. if (IS_ERR(bsp_priv->grf)) {
  604. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  605. return;
  606. }
  607. if (speed == 10)
  608. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  609. RK3399_GMAC_CLK_2_5M);
  610. else if (speed == 100)
  611. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  612. RK3399_GMAC_CLK_25M);
  613. else if (speed == 1000)
  614. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  615. RK3399_GMAC_CLK_125M);
  616. else
  617. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  618. }
  619. static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  620. {
  621. struct device *dev = &bsp_priv->pdev->dev;
  622. if (IS_ERR(bsp_priv->grf)) {
  623. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  624. return;
  625. }
  626. if (speed == 10) {
  627. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  628. RK3399_GMAC_RMII_CLK_2_5M |
  629. RK3399_GMAC_SPEED_10M);
  630. } else if (speed == 100) {
  631. regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
  632. RK3399_GMAC_RMII_CLK_25M |
  633. RK3399_GMAC_SPEED_100M);
  634. } else {
  635. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  636. }
  637. }
  638. static const struct rk_gmac_ops rk3399_ops = {
  639. .set_to_rgmii = rk3399_set_to_rgmii,
  640. .set_to_rmii = rk3399_set_to_rmii,
  641. .set_rgmii_speed = rk3399_set_rgmii_speed,
  642. .set_rmii_speed = rk3399_set_rmii_speed,
  643. };
  644. static int gmac_clk_init(struct rk_priv_data *bsp_priv)
  645. {
  646. struct device *dev = &bsp_priv->pdev->dev;
  647. bsp_priv->clk_enabled = false;
  648. bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
  649. if (IS_ERR(bsp_priv->mac_clk_rx))
  650. dev_err(dev, "cannot get clock %s\n",
  651. "mac_clk_rx");
  652. bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
  653. if (IS_ERR(bsp_priv->mac_clk_tx))
  654. dev_err(dev, "cannot get clock %s\n",
  655. "mac_clk_tx");
  656. bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
  657. if (IS_ERR(bsp_priv->aclk_mac))
  658. dev_err(dev, "cannot get clock %s\n",
  659. "aclk_mac");
  660. bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
  661. if (IS_ERR(bsp_priv->pclk_mac))
  662. dev_err(dev, "cannot get clock %s\n",
  663. "pclk_mac");
  664. bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
  665. if (IS_ERR(bsp_priv->clk_mac))
  666. dev_err(dev, "cannot get clock %s\n",
  667. "stmmaceth");
  668. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
  669. bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
  670. if (IS_ERR(bsp_priv->clk_mac_ref))
  671. dev_err(dev, "cannot get clock %s\n",
  672. "clk_mac_ref");
  673. if (!bsp_priv->clock_input) {
  674. bsp_priv->clk_mac_refout =
  675. devm_clk_get(dev, "clk_mac_refout");
  676. if (IS_ERR(bsp_priv->clk_mac_refout))
  677. dev_err(dev, "cannot get clock %s\n",
  678. "clk_mac_refout");
  679. }
  680. }
  681. if (bsp_priv->clock_input) {
  682. dev_info(dev, "clock input from PHY\n");
  683. } else {
  684. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  685. clk_set_rate(bsp_priv->clk_mac, 50000000);
  686. }
  687. return 0;
  688. }
  689. static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
  690. {
  691. int phy_iface = bsp_priv->phy_iface;
  692. if (enable) {
  693. if (!bsp_priv->clk_enabled) {
  694. if (phy_iface == PHY_INTERFACE_MODE_RMII) {
  695. if (!IS_ERR(bsp_priv->mac_clk_rx))
  696. clk_prepare_enable(
  697. bsp_priv->mac_clk_rx);
  698. if (!IS_ERR(bsp_priv->clk_mac_ref))
  699. clk_prepare_enable(
  700. bsp_priv->clk_mac_ref);
  701. if (!IS_ERR(bsp_priv->clk_mac_refout))
  702. clk_prepare_enable(
  703. bsp_priv->clk_mac_refout);
  704. }
  705. if (!IS_ERR(bsp_priv->aclk_mac))
  706. clk_prepare_enable(bsp_priv->aclk_mac);
  707. if (!IS_ERR(bsp_priv->pclk_mac))
  708. clk_prepare_enable(bsp_priv->pclk_mac);
  709. if (!IS_ERR(bsp_priv->mac_clk_tx))
  710. clk_prepare_enable(bsp_priv->mac_clk_tx);
  711. /**
  712. * if (!IS_ERR(bsp_priv->clk_mac))
  713. * clk_prepare_enable(bsp_priv->clk_mac);
  714. */
  715. mdelay(5);
  716. bsp_priv->clk_enabled = true;
  717. }
  718. } else {
  719. if (bsp_priv->clk_enabled) {
  720. if (phy_iface == PHY_INTERFACE_MODE_RMII) {
  721. if (!IS_ERR(bsp_priv->mac_clk_rx))
  722. clk_disable_unprepare(
  723. bsp_priv->mac_clk_rx);
  724. if (!IS_ERR(bsp_priv->clk_mac_ref))
  725. clk_disable_unprepare(
  726. bsp_priv->clk_mac_ref);
  727. if (!IS_ERR(bsp_priv->clk_mac_refout))
  728. clk_disable_unprepare(
  729. bsp_priv->clk_mac_refout);
  730. }
  731. if (!IS_ERR(bsp_priv->aclk_mac))
  732. clk_disable_unprepare(bsp_priv->aclk_mac);
  733. if (!IS_ERR(bsp_priv->pclk_mac))
  734. clk_disable_unprepare(bsp_priv->pclk_mac);
  735. if (!IS_ERR(bsp_priv->mac_clk_tx))
  736. clk_disable_unprepare(bsp_priv->mac_clk_tx);
  737. /**
  738. * if (!IS_ERR(bsp_priv->clk_mac))
  739. * clk_disable_unprepare(bsp_priv->clk_mac);
  740. */
  741. bsp_priv->clk_enabled = false;
  742. }
  743. }
  744. return 0;
  745. }
  746. static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
  747. {
  748. struct regulator *ldo = bsp_priv->regulator;
  749. int ret;
  750. struct device *dev = &bsp_priv->pdev->dev;
  751. if (!ldo) {
  752. dev_err(dev, "no regulator found\n");
  753. return -1;
  754. }
  755. if (enable) {
  756. ret = regulator_enable(ldo);
  757. if (ret)
  758. dev_err(dev, "fail to enable phy-supply\n");
  759. } else {
  760. ret = regulator_disable(ldo);
  761. if (ret)
  762. dev_err(dev, "fail to disable phy-supply\n");
  763. }
  764. return 0;
  765. }
  766. static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
  767. const struct rk_gmac_ops *ops)
  768. {
  769. struct rk_priv_data *bsp_priv;
  770. struct device *dev = &pdev->dev;
  771. int ret;
  772. const char *strings = NULL;
  773. int value;
  774. bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
  775. if (!bsp_priv)
  776. return ERR_PTR(-ENOMEM);
  777. bsp_priv->phy_iface = of_get_phy_mode(dev->of_node);
  778. bsp_priv->ops = ops;
  779. bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
  780. if (IS_ERR(bsp_priv->regulator)) {
  781. if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
  782. dev_err(dev, "phy regulator is not available yet, deferred probing\n");
  783. return ERR_PTR(-EPROBE_DEFER);
  784. }
  785. dev_err(dev, "no regulator found\n");
  786. bsp_priv->regulator = NULL;
  787. }
  788. ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
  789. if (ret) {
  790. dev_err(dev, "Can not read property: clock_in_out.\n");
  791. bsp_priv->clock_input = true;
  792. } else {
  793. dev_info(dev, "clock input or output? (%s).\n",
  794. strings);
  795. if (!strcmp(strings, "input"))
  796. bsp_priv->clock_input = true;
  797. else
  798. bsp_priv->clock_input = false;
  799. }
  800. ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
  801. if (ret) {
  802. bsp_priv->tx_delay = 0x30;
  803. dev_err(dev, "Can not read property: tx_delay.");
  804. dev_err(dev, "set tx_delay to 0x%x\n",
  805. bsp_priv->tx_delay);
  806. } else {
  807. dev_info(dev, "TX delay(0x%x).\n", value);
  808. bsp_priv->tx_delay = value;
  809. }
  810. ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
  811. if (ret) {
  812. bsp_priv->rx_delay = 0x10;
  813. dev_err(dev, "Can not read property: rx_delay.");
  814. dev_err(dev, "set rx_delay to 0x%x\n",
  815. bsp_priv->rx_delay);
  816. } else {
  817. dev_info(dev, "RX delay(0x%x).\n", value);
  818. bsp_priv->rx_delay = value;
  819. }
  820. bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
  821. "rockchip,grf");
  822. bsp_priv->pdev = pdev;
  823. gmac_clk_init(bsp_priv);
  824. return bsp_priv;
  825. }
  826. static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
  827. {
  828. int ret;
  829. struct device *dev = &bsp_priv->pdev->dev;
  830. ret = gmac_clk_enable(bsp_priv, true);
  831. if (ret)
  832. return ret;
  833. /*rmii or rgmii*/
  834. switch (bsp_priv->phy_iface) {
  835. case PHY_INTERFACE_MODE_RGMII:
  836. dev_info(dev, "init for RGMII\n");
  837. bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
  838. bsp_priv->rx_delay);
  839. break;
  840. case PHY_INTERFACE_MODE_RGMII_ID:
  841. dev_info(dev, "init for RGMII_ID\n");
  842. bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
  843. break;
  844. case PHY_INTERFACE_MODE_RGMII_RXID:
  845. dev_info(dev, "init for RGMII_RXID\n");
  846. bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
  847. break;
  848. case PHY_INTERFACE_MODE_RGMII_TXID:
  849. dev_info(dev, "init for RGMII_TXID\n");
  850. bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
  851. break;
  852. case PHY_INTERFACE_MODE_RMII:
  853. dev_info(dev, "init for RMII\n");
  854. bsp_priv->ops->set_to_rmii(bsp_priv);
  855. break;
  856. default:
  857. dev_err(dev, "NO interface defined!\n");
  858. }
  859. ret = phy_power_on(bsp_priv, true);
  860. if (ret)
  861. return ret;
  862. pm_runtime_enable(dev);
  863. pm_runtime_get_sync(dev);
  864. return 0;
  865. }
  866. static void rk_gmac_powerdown(struct rk_priv_data *gmac)
  867. {
  868. struct device *dev = &gmac->pdev->dev;
  869. pm_runtime_put_sync(dev);
  870. pm_runtime_disable(dev);
  871. phy_power_on(gmac, false);
  872. gmac_clk_enable(gmac, false);
  873. }
  874. static void rk_fix_speed(void *priv, unsigned int speed)
  875. {
  876. struct rk_priv_data *bsp_priv = priv;
  877. struct device *dev = &bsp_priv->pdev->dev;
  878. switch (bsp_priv->phy_iface) {
  879. case PHY_INTERFACE_MODE_RGMII:
  880. case PHY_INTERFACE_MODE_RGMII_ID:
  881. case PHY_INTERFACE_MODE_RGMII_RXID:
  882. case PHY_INTERFACE_MODE_RGMII_TXID:
  883. bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
  884. break;
  885. case PHY_INTERFACE_MODE_RMII:
  886. bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
  887. break;
  888. default:
  889. dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
  890. }
  891. }
  892. static int rk_gmac_probe(struct platform_device *pdev)
  893. {
  894. struct plat_stmmacenet_data *plat_dat;
  895. struct stmmac_resources stmmac_res;
  896. const struct rk_gmac_ops *data;
  897. int ret;
  898. data = of_device_get_match_data(&pdev->dev);
  899. if (!data) {
  900. dev_err(&pdev->dev, "no of match data provided\n");
  901. return -EINVAL;
  902. }
  903. ret = stmmac_get_platform_resources(pdev, &stmmac_res);
  904. if (ret)
  905. return ret;
  906. plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
  907. if (IS_ERR(plat_dat))
  908. return PTR_ERR(plat_dat);
  909. plat_dat->has_gmac = true;
  910. plat_dat->fix_mac_speed = rk_fix_speed;
  911. plat_dat->bsp_priv = rk_gmac_setup(pdev, data);
  912. if (IS_ERR(plat_dat->bsp_priv)) {
  913. ret = PTR_ERR(plat_dat->bsp_priv);
  914. goto err_remove_config_dt;
  915. }
  916. ret = rk_gmac_powerup(plat_dat->bsp_priv);
  917. if (ret)
  918. goto err_remove_config_dt;
  919. ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
  920. if (ret)
  921. goto err_gmac_powerdown;
  922. return 0;
  923. err_gmac_powerdown:
  924. rk_gmac_powerdown(plat_dat->bsp_priv);
  925. err_remove_config_dt:
  926. stmmac_remove_config_dt(pdev, plat_dat);
  927. return ret;
  928. }
  929. static int rk_gmac_remove(struct platform_device *pdev)
  930. {
  931. struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
  932. int ret = stmmac_dvr_remove(&pdev->dev);
  933. rk_gmac_powerdown(bsp_priv);
  934. return ret;
  935. }
  936. #ifdef CONFIG_PM_SLEEP
  937. static int rk_gmac_suspend(struct device *dev)
  938. {
  939. struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
  940. int ret = stmmac_suspend(dev);
  941. /* Keep the PHY up if we use Wake-on-Lan. */
  942. if (!device_may_wakeup(dev)) {
  943. rk_gmac_powerdown(bsp_priv);
  944. bsp_priv->suspended = true;
  945. }
  946. return ret;
  947. }
  948. static int rk_gmac_resume(struct device *dev)
  949. {
  950. struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
  951. /* The PHY was up for Wake-on-Lan. */
  952. if (bsp_priv->suspended) {
  953. rk_gmac_powerup(bsp_priv);
  954. bsp_priv->suspended = false;
  955. }
  956. return stmmac_resume(dev);
  957. }
  958. #endif /* CONFIG_PM_SLEEP */
  959. static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
  960. static const struct of_device_id rk_gmac_dwmac_match[] = {
  961. { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
  962. { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
  963. { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
  964. { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
  965. { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
  966. { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
  967. { }
  968. };
  969. MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
  970. static struct platform_driver rk_gmac_dwmac_driver = {
  971. .probe = rk_gmac_probe,
  972. .remove = rk_gmac_remove,
  973. .driver = {
  974. .name = "rk_gmac-dwmac",
  975. .pm = &rk_gmac_pm_ops,
  976. .of_match_table = rk_gmac_dwmac_match,
  977. },
  978. };
  979. module_platform_driver(rk_gmac_dwmac_driver);
  980. MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
  981. MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
  982. MODULE_LICENSE("GPL");