dwmac-rk.c 32 KB

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