dwmac-rk.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  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 "stmmac_platform.h"
  33. struct rk_priv_data;
  34. struct rk_gmac_ops {
  35. void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
  36. int tx_delay, int rx_delay);
  37. void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
  38. void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  39. void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  40. };
  41. struct rk_priv_data {
  42. struct platform_device *pdev;
  43. int phy_iface;
  44. struct regulator *regulator;
  45. bool suspended;
  46. const struct rk_gmac_ops *ops;
  47. bool clk_enabled;
  48. bool clock_input;
  49. struct clk *clk_mac;
  50. struct clk *gmac_clkin;
  51. struct clk *mac_clk_rx;
  52. struct clk *mac_clk_tx;
  53. struct clk *clk_mac_ref;
  54. struct clk *clk_mac_refout;
  55. struct clk *aclk_mac;
  56. struct clk *pclk_mac;
  57. int tx_delay;
  58. int rx_delay;
  59. struct regmap *grf;
  60. };
  61. #define HIWORD_UPDATE(val, mask, shift) \
  62. ((val) << (shift) | (mask) << ((shift) + 16))
  63. #define GRF_BIT(nr) (BIT(nr) | BIT(nr+16))
  64. #define GRF_CLR_BIT(nr) (BIT(nr+16))
  65. #define RK3228_GRF_MAC_CON0 0x0900
  66. #define RK3228_GRF_MAC_CON1 0x0904
  67. /* RK3228_GRF_MAC_CON0 */
  68. #define RK3228_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  69. #define RK3228_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  70. /* RK3228_GRF_MAC_CON1 */
  71. #define RK3228_GMAC_PHY_INTF_SEL_RGMII \
  72. (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
  73. #define RK3228_GMAC_PHY_INTF_SEL_RMII \
  74. (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
  75. #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
  76. #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
  77. #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
  78. #define RK3228_GMAC_SPEED_100M GRF_BIT(2)
  79. #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
  80. #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
  81. #define RK3228_GMAC_CLK_125M (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
  82. #define RK3228_GMAC_CLK_25M (GRF_BIT(8) | GRF_BIT(9))
  83. #define RK3228_GMAC_CLK_2_5M (GRF_CLR_BIT(8) | GRF_BIT(9))
  84. #define RK3228_GMAC_RMII_MODE GRF_BIT(10)
  85. #define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
  86. #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
  87. #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
  88. #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
  89. #define RK3228_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
  90. static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
  91. int tx_delay, int rx_delay)
  92. {
  93. struct device *dev = &bsp_priv->pdev->dev;
  94. if (IS_ERR(bsp_priv->grf)) {
  95. dev_err(dev, "Missing rockchip,grf property\n");
  96. return;
  97. }
  98. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  99. RK3228_GMAC_PHY_INTF_SEL_RGMII |
  100. RK3228_GMAC_RMII_MODE_CLR |
  101. RK3228_GMAC_RXCLK_DLY_ENABLE |
  102. RK3228_GMAC_TXCLK_DLY_ENABLE);
  103. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
  104. RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
  105. RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
  106. }
  107. static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
  108. {
  109. struct device *dev = &bsp_priv->pdev->dev;
  110. if (IS_ERR(bsp_priv->grf)) {
  111. dev_err(dev, "Missing rockchip,grf property\n");
  112. return;
  113. }
  114. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  115. RK3228_GMAC_PHY_INTF_SEL_RMII |
  116. RK3228_GMAC_RMII_MODE);
  117. /* set MAC to RMII mode */
  118. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
  119. }
  120. static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  121. {
  122. struct device *dev = &bsp_priv->pdev->dev;
  123. if (IS_ERR(bsp_priv->grf)) {
  124. dev_err(dev, "Missing rockchip,grf property\n");
  125. return;
  126. }
  127. if (speed == 10)
  128. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  129. RK3228_GMAC_CLK_2_5M);
  130. else if (speed == 100)
  131. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  132. RK3228_GMAC_CLK_25M);
  133. else if (speed == 1000)
  134. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  135. RK3228_GMAC_CLK_125M);
  136. else
  137. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  138. }
  139. static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  140. {
  141. struct device *dev = &bsp_priv->pdev->dev;
  142. if (IS_ERR(bsp_priv->grf)) {
  143. dev_err(dev, "Missing rockchip,grf property\n");
  144. return;
  145. }
  146. if (speed == 10)
  147. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  148. RK3228_GMAC_RMII_CLK_2_5M |
  149. RK3228_GMAC_SPEED_10M);
  150. else if (speed == 100)
  151. regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
  152. RK3228_GMAC_RMII_CLK_25M |
  153. RK3228_GMAC_SPEED_100M);
  154. else
  155. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  156. }
  157. static const struct rk_gmac_ops rk3228_ops = {
  158. .set_to_rgmii = rk3228_set_to_rgmii,
  159. .set_to_rmii = rk3228_set_to_rmii,
  160. .set_rgmii_speed = rk3228_set_rgmii_speed,
  161. .set_rmii_speed = rk3228_set_rmii_speed,
  162. };
  163. #define RK3288_GRF_SOC_CON1 0x0248
  164. #define RK3288_GRF_SOC_CON3 0x0250
  165. /*RK3288_GRF_SOC_CON1*/
  166. #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | \
  167. GRF_CLR_BIT(8))
  168. #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
  169. GRF_BIT(8))
  170. #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
  171. #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
  172. #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
  173. #define RK3288_GMAC_SPEED_100M GRF_BIT(10)
  174. #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
  175. #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
  176. #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
  177. #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
  178. #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
  179. #define RK3288_GMAC_RMII_MODE GRF_BIT(14)
  180. #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
  181. /*RK3288_GRF_SOC_CON3*/
  182. #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
  183. #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
  184. #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  185. #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  186. #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  187. #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  188. static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
  189. int tx_delay, int rx_delay)
  190. {
  191. struct device *dev = &bsp_priv->pdev->dev;
  192. if (IS_ERR(bsp_priv->grf)) {
  193. dev_err(dev, "Missing rockchip,grf property\n");
  194. return;
  195. }
  196. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  197. RK3288_GMAC_PHY_INTF_SEL_RGMII |
  198. RK3288_GMAC_RMII_MODE_CLR);
  199. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
  200. RK3288_GMAC_RXCLK_DLY_ENABLE |
  201. RK3288_GMAC_TXCLK_DLY_ENABLE |
  202. RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
  203. RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
  204. }
  205. static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
  206. {
  207. struct device *dev = &bsp_priv->pdev->dev;
  208. if (IS_ERR(bsp_priv->grf)) {
  209. dev_err(dev, "Missing rockchip,grf property\n");
  210. return;
  211. }
  212. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  213. RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
  214. }
  215. static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  216. {
  217. struct device *dev = &bsp_priv->pdev->dev;
  218. if (IS_ERR(bsp_priv->grf)) {
  219. dev_err(dev, "Missing rockchip,grf property\n");
  220. return;
  221. }
  222. if (speed == 10)
  223. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  224. RK3288_GMAC_CLK_2_5M);
  225. else if (speed == 100)
  226. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  227. RK3288_GMAC_CLK_25M);
  228. else if (speed == 1000)
  229. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  230. RK3288_GMAC_CLK_125M);
  231. else
  232. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  233. }
  234. static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  235. {
  236. struct device *dev = &bsp_priv->pdev->dev;
  237. if (IS_ERR(bsp_priv->grf)) {
  238. dev_err(dev, "Missing rockchip,grf property\n");
  239. return;
  240. }
  241. if (speed == 10) {
  242. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  243. RK3288_GMAC_RMII_CLK_2_5M |
  244. RK3288_GMAC_SPEED_10M);
  245. } else if (speed == 100) {
  246. regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
  247. RK3288_GMAC_RMII_CLK_25M |
  248. RK3288_GMAC_SPEED_100M);
  249. } else {
  250. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  251. }
  252. }
  253. static const struct rk_gmac_ops rk3288_ops = {
  254. .set_to_rgmii = rk3288_set_to_rgmii,
  255. .set_to_rmii = rk3288_set_to_rmii,
  256. .set_rgmii_speed = rk3288_set_rgmii_speed,
  257. .set_rmii_speed = rk3288_set_rmii_speed,
  258. };
  259. #define RK3368_GRF_SOC_CON15 0x043c
  260. #define RK3368_GRF_SOC_CON16 0x0440
  261. /* RK3368_GRF_SOC_CON15 */
  262. #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
  263. GRF_CLR_BIT(11))
  264. #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
  265. GRF_BIT(11))
  266. #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
  267. #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
  268. #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
  269. #define RK3368_GMAC_SPEED_100M GRF_BIT(7)
  270. #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
  271. #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
  272. #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
  273. #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
  274. #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
  275. #define RK3368_GMAC_RMII_MODE GRF_BIT(6)
  276. #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
  277. /* RK3368_GRF_SOC_CON16 */
  278. #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
  279. #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
  280. #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
  281. #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
  282. #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
  283. #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  284. static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
  285. int tx_delay, int rx_delay)
  286. {
  287. struct device *dev = &bsp_priv->pdev->dev;
  288. if (IS_ERR(bsp_priv->grf)) {
  289. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  290. return;
  291. }
  292. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  293. RK3368_GMAC_PHY_INTF_SEL_RGMII |
  294. RK3368_GMAC_RMII_MODE_CLR);
  295. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
  296. RK3368_GMAC_RXCLK_DLY_ENABLE |
  297. RK3368_GMAC_TXCLK_DLY_ENABLE |
  298. RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
  299. RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
  300. }
  301. static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
  302. {
  303. struct device *dev = &bsp_priv->pdev->dev;
  304. if (IS_ERR(bsp_priv->grf)) {
  305. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  306. return;
  307. }
  308. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  309. RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
  310. }
  311. static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
  312. {
  313. struct device *dev = &bsp_priv->pdev->dev;
  314. if (IS_ERR(bsp_priv->grf)) {
  315. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  316. return;
  317. }
  318. if (speed == 10)
  319. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  320. RK3368_GMAC_CLK_2_5M);
  321. else if (speed == 100)
  322. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  323. RK3368_GMAC_CLK_25M);
  324. else if (speed == 1000)
  325. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  326. RK3368_GMAC_CLK_125M);
  327. else
  328. dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
  329. }
  330. static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
  331. {
  332. struct device *dev = &bsp_priv->pdev->dev;
  333. if (IS_ERR(bsp_priv->grf)) {
  334. dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
  335. return;
  336. }
  337. if (speed == 10) {
  338. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  339. RK3368_GMAC_RMII_CLK_2_5M |
  340. RK3368_GMAC_SPEED_10M);
  341. } else if (speed == 100) {
  342. regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
  343. RK3368_GMAC_RMII_CLK_25M |
  344. RK3368_GMAC_SPEED_100M);
  345. } else {
  346. dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
  347. }
  348. }
  349. static const struct rk_gmac_ops rk3368_ops = {
  350. .set_to_rgmii = rk3368_set_to_rgmii,
  351. .set_to_rmii = rk3368_set_to_rmii,
  352. .set_rgmii_speed = rk3368_set_rgmii_speed,
  353. .set_rmii_speed = rk3368_set_rmii_speed,
  354. };
  355. static int gmac_clk_init(struct rk_priv_data *bsp_priv)
  356. {
  357. struct device *dev = &bsp_priv->pdev->dev;
  358. bsp_priv->clk_enabled = false;
  359. bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
  360. if (IS_ERR(bsp_priv->mac_clk_rx))
  361. dev_err(dev, "cannot get clock %s\n",
  362. "mac_clk_rx");
  363. bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
  364. if (IS_ERR(bsp_priv->mac_clk_tx))
  365. dev_err(dev, "cannot get clock %s\n",
  366. "mac_clk_tx");
  367. bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
  368. if (IS_ERR(bsp_priv->aclk_mac))
  369. dev_err(dev, "cannot get clock %s\n",
  370. "aclk_mac");
  371. bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
  372. if (IS_ERR(bsp_priv->pclk_mac))
  373. dev_err(dev, "cannot get clock %s\n",
  374. "pclk_mac");
  375. bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
  376. if (IS_ERR(bsp_priv->clk_mac))
  377. dev_err(dev, "cannot get clock %s\n",
  378. "stmmaceth");
  379. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
  380. bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
  381. if (IS_ERR(bsp_priv->clk_mac_ref))
  382. dev_err(dev, "cannot get clock %s\n",
  383. "clk_mac_ref");
  384. if (!bsp_priv->clock_input) {
  385. bsp_priv->clk_mac_refout =
  386. devm_clk_get(dev, "clk_mac_refout");
  387. if (IS_ERR(bsp_priv->clk_mac_refout))
  388. dev_err(dev, "cannot get clock %s\n",
  389. "clk_mac_refout");
  390. }
  391. }
  392. if (bsp_priv->clock_input) {
  393. dev_info(dev, "clock input from PHY\n");
  394. } else {
  395. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  396. clk_set_rate(bsp_priv->clk_mac, 50000000);
  397. }
  398. return 0;
  399. }
  400. static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
  401. {
  402. int phy_iface = bsp_priv->phy_iface;
  403. if (enable) {
  404. if (!bsp_priv->clk_enabled) {
  405. if (phy_iface == PHY_INTERFACE_MODE_RMII) {
  406. if (!IS_ERR(bsp_priv->mac_clk_rx))
  407. clk_prepare_enable(
  408. bsp_priv->mac_clk_rx);
  409. if (!IS_ERR(bsp_priv->clk_mac_ref))
  410. clk_prepare_enable(
  411. bsp_priv->clk_mac_ref);
  412. if (!IS_ERR(bsp_priv->clk_mac_refout))
  413. clk_prepare_enable(
  414. bsp_priv->clk_mac_refout);
  415. }
  416. if (!IS_ERR(bsp_priv->aclk_mac))
  417. clk_prepare_enable(bsp_priv->aclk_mac);
  418. if (!IS_ERR(bsp_priv->pclk_mac))
  419. clk_prepare_enable(bsp_priv->pclk_mac);
  420. if (!IS_ERR(bsp_priv->mac_clk_tx))
  421. clk_prepare_enable(bsp_priv->mac_clk_tx);
  422. /**
  423. * if (!IS_ERR(bsp_priv->clk_mac))
  424. * clk_prepare_enable(bsp_priv->clk_mac);
  425. */
  426. mdelay(5);
  427. bsp_priv->clk_enabled = true;
  428. }
  429. } else {
  430. if (bsp_priv->clk_enabled) {
  431. if (phy_iface == PHY_INTERFACE_MODE_RMII) {
  432. if (!IS_ERR(bsp_priv->mac_clk_rx))
  433. clk_disable_unprepare(
  434. bsp_priv->mac_clk_rx);
  435. if (!IS_ERR(bsp_priv->clk_mac_ref))
  436. clk_disable_unprepare(
  437. bsp_priv->clk_mac_ref);
  438. if (!IS_ERR(bsp_priv->clk_mac_refout))
  439. clk_disable_unprepare(
  440. bsp_priv->clk_mac_refout);
  441. }
  442. if (!IS_ERR(bsp_priv->aclk_mac))
  443. clk_disable_unprepare(bsp_priv->aclk_mac);
  444. if (!IS_ERR(bsp_priv->pclk_mac))
  445. clk_disable_unprepare(bsp_priv->pclk_mac);
  446. if (!IS_ERR(bsp_priv->mac_clk_tx))
  447. clk_disable_unprepare(bsp_priv->mac_clk_tx);
  448. /**
  449. * if (!IS_ERR(bsp_priv->clk_mac))
  450. * clk_disable_unprepare(bsp_priv->clk_mac);
  451. */
  452. bsp_priv->clk_enabled = false;
  453. }
  454. }
  455. return 0;
  456. }
  457. static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
  458. {
  459. struct regulator *ldo = bsp_priv->regulator;
  460. int ret;
  461. struct device *dev = &bsp_priv->pdev->dev;
  462. if (!ldo) {
  463. dev_err(dev, "no regulator found\n");
  464. return -1;
  465. }
  466. if (enable) {
  467. ret = regulator_enable(ldo);
  468. if (ret)
  469. dev_err(dev, "fail to enable phy-supply\n");
  470. } else {
  471. ret = regulator_disable(ldo);
  472. if (ret)
  473. dev_err(dev, "fail to disable phy-supply\n");
  474. }
  475. return 0;
  476. }
  477. static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
  478. const struct rk_gmac_ops *ops)
  479. {
  480. struct rk_priv_data *bsp_priv;
  481. struct device *dev = &pdev->dev;
  482. int ret;
  483. const char *strings = NULL;
  484. int value;
  485. bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
  486. if (!bsp_priv)
  487. return ERR_PTR(-ENOMEM);
  488. bsp_priv->phy_iface = of_get_phy_mode(dev->of_node);
  489. bsp_priv->ops = ops;
  490. bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
  491. if (IS_ERR(bsp_priv->regulator)) {
  492. if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
  493. dev_err(dev, "phy regulator is not available yet, deferred probing\n");
  494. return ERR_PTR(-EPROBE_DEFER);
  495. }
  496. dev_err(dev, "no regulator found\n");
  497. bsp_priv->regulator = NULL;
  498. }
  499. ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
  500. if (ret) {
  501. dev_err(dev, "Can not read property: clock_in_out.\n");
  502. bsp_priv->clock_input = true;
  503. } else {
  504. dev_info(dev, "clock input or output? (%s).\n",
  505. strings);
  506. if (!strcmp(strings, "input"))
  507. bsp_priv->clock_input = true;
  508. else
  509. bsp_priv->clock_input = false;
  510. }
  511. ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
  512. if (ret) {
  513. bsp_priv->tx_delay = 0x30;
  514. dev_err(dev, "Can not read property: tx_delay.");
  515. dev_err(dev, "set tx_delay to 0x%x\n",
  516. bsp_priv->tx_delay);
  517. } else {
  518. dev_info(dev, "TX delay(0x%x).\n", value);
  519. bsp_priv->tx_delay = value;
  520. }
  521. ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
  522. if (ret) {
  523. bsp_priv->rx_delay = 0x10;
  524. dev_err(dev, "Can not read property: rx_delay.");
  525. dev_err(dev, "set rx_delay to 0x%x\n",
  526. bsp_priv->rx_delay);
  527. } else {
  528. dev_info(dev, "RX delay(0x%x).\n", value);
  529. bsp_priv->rx_delay = value;
  530. }
  531. bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
  532. "rockchip,grf");
  533. bsp_priv->pdev = pdev;
  534. /*rmii or rgmii*/
  535. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RGMII) {
  536. dev_info(dev, "init for RGMII\n");
  537. bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
  538. bsp_priv->rx_delay);
  539. } else if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
  540. dev_info(dev, "init for RMII\n");
  541. bsp_priv->ops->set_to_rmii(bsp_priv);
  542. } else {
  543. dev_err(dev, "NO interface defined!\n");
  544. }
  545. gmac_clk_init(bsp_priv);
  546. return bsp_priv;
  547. }
  548. static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
  549. {
  550. int ret;
  551. ret = phy_power_on(bsp_priv, true);
  552. if (ret)
  553. return ret;
  554. ret = gmac_clk_enable(bsp_priv, true);
  555. if (ret)
  556. return ret;
  557. return 0;
  558. }
  559. static void rk_gmac_powerdown(struct rk_priv_data *gmac)
  560. {
  561. phy_power_on(gmac, false);
  562. gmac_clk_enable(gmac, false);
  563. }
  564. static int rk_gmac_init(struct platform_device *pdev, void *priv)
  565. {
  566. struct rk_priv_data *bsp_priv = priv;
  567. return rk_gmac_powerup(bsp_priv);
  568. }
  569. static void rk_gmac_exit(struct platform_device *pdev, void *priv)
  570. {
  571. struct rk_priv_data *bsp_priv = priv;
  572. rk_gmac_powerdown(bsp_priv);
  573. }
  574. static void rk_gmac_suspend(struct platform_device *pdev, void *priv)
  575. {
  576. struct rk_priv_data *bsp_priv = priv;
  577. /* Keep the PHY up if we use Wake-on-Lan. */
  578. if (device_may_wakeup(&pdev->dev))
  579. return;
  580. rk_gmac_powerdown(bsp_priv);
  581. bsp_priv->suspended = true;
  582. }
  583. static void rk_gmac_resume(struct platform_device *pdev, void *priv)
  584. {
  585. struct rk_priv_data *bsp_priv = priv;
  586. /* The PHY was up for Wake-on-Lan. */
  587. if (!bsp_priv->suspended)
  588. return;
  589. rk_gmac_powerup(bsp_priv);
  590. bsp_priv->suspended = false;
  591. }
  592. static void rk_fix_speed(void *priv, unsigned int speed)
  593. {
  594. struct rk_priv_data *bsp_priv = priv;
  595. struct device *dev = &bsp_priv->pdev->dev;
  596. if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RGMII)
  597. bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
  598. else if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
  599. bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
  600. else
  601. dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
  602. }
  603. static int rk_gmac_probe(struct platform_device *pdev)
  604. {
  605. struct plat_stmmacenet_data *plat_dat;
  606. struct stmmac_resources stmmac_res;
  607. const struct rk_gmac_ops *data;
  608. int ret;
  609. data = of_device_get_match_data(&pdev->dev);
  610. if (!data) {
  611. dev_err(&pdev->dev, "no of match data provided\n");
  612. return -EINVAL;
  613. }
  614. ret = stmmac_get_platform_resources(pdev, &stmmac_res);
  615. if (ret)
  616. return ret;
  617. plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
  618. if (IS_ERR(plat_dat))
  619. return PTR_ERR(plat_dat);
  620. plat_dat->has_gmac = true;
  621. plat_dat->init = rk_gmac_init;
  622. plat_dat->exit = rk_gmac_exit;
  623. plat_dat->fix_mac_speed = rk_fix_speed;
  624. plat_dat->suspend = rk_gmac_suspend;
  625. plat_dat->resume = rk_gmac_resume;
  626. plat_dat->bsp_priv = rk_gmac_setup(pdev, data);
  627. if (IS_ERR(plat_dat->bsp_priv))
  628. return PTR_ERR(plat_dat->bsp_priv);
  629. ret = rk_gmac_init(pdev, plat_dat->bsp_priv);
  630. if (ret)
  631. return ret;
  632. return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
  633. }
  634. static const struct of_device_id rk_gmac_dwmac_match[] = {
  635. { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
  636. { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
  637. { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
  638. { }
  639. };
  640. MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
  641. static struct platform_driver rk_gmac_dwmac_driver = {
  642. .probe = rk_gmac_probe,
  643. .remove = stmmac_pltfr_remove,
  644. .driver = {
  645. .name = "rk_gmac-dwmac",
  646. .pm = &stmmac_pltfr_pm_ops,
  647. .of_match_table = rk_gmac_dwmac_match,
  648. },
  649. };
  650. module_platform_driver(rk_gmac_dwmac_driver);
  651. MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
  652. MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
  653. MODULE_LICENSE("GPL");