1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * DOC: dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer
5 * Copyright (C) 2014 Chen-Zhi (Roger Chen)
7 * Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>
10 #include <linux/stmmac.h>
11 #include <linux/bitops.h>
12 #include <linux/clk.h>
13 #include <linux/phy.h>
14 #include <linux/of_net.h>
15 #include <linux/gpio.h>
16 #include <linux/module.h>
17 #include <linux/of_gpio.h>
18 #include <linux/of_device.h>
19 #include <linux/platform_device.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/delay.h>
22 #include <linux/mfd/syscon.h>
23 #include <linux/regmap.h>
25 #include "stmmac_platform.h"
29 void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
30 int tx_delay, int rx_delay);
31 void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
32 void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
33 void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
34 void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
39 struct platform_device *pdev;
40 phy_interface_t phy_iface;
42 struct regulator *regulator;
44 const struct rk_gmac_ops *ops;
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 *clk_mac_speed;
61 struct reset_control *phy_reset;
69 #define HIWORD_UPDATE(val, mask, shift) \
70 ((val) << (shift) | (mask) << ((shift) + 16))
72 #define GRF_BIT(nr) (BIT(nr) | BIT(nr+16))
73 #define GRF_CLR_BIT(nr) (BIT(nr+16))
75 #define DELAY_ENABLE(soc, tx, rx) \
76 (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
77 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
79 #define PX30_GRF_GMAC_CON1 0x0904
81 /* PX30_GRF_GMAC_CON1 */
82 #define PX30_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
84 #define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
85 #define PX30_GMAC_SPEED_100M GRF_BIT(2)
87 static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
89 struct device *dev = &bsp_priv->pdev->dev;
91 if (IS_ERR(bsp_priv->grf)) {
92 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
96 regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
97 PX30_GMAC_PHY_INTF_SEL_RMII);
100 static void px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
102 struct device *dev = &bsp_priv->pdev->dev;
105 if (IS_ERR(bsp_priv->clk_mac_speed)) {
106 dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
111 regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
112 PX30_GMAC_SPEED_10M);
114 ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000);
116 dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
118 } else if (speed == 100) {
119 regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
120 PX30_GMAC_SPEED_100M);
122 ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000);
124 dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
128 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
132 static const struct rk_gmac_ops px30_ops = {
133 .set_to_rmii = px30_set_to_rmii,
134 .set_rmii_speed = px30_set_rmii_speed,
137 #define RK3128_GRF_MAC_CON0 0x0168
138 #define RK3128_GRF_MAC_CON1 0x016c
140 /* RK3128_GRF_MAC_CON0 */
141 #define RK3128_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
142 #define RK3128_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
143 #define RK3128_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
144 #define RK3128_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
145 #define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
146 #define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
148 /* RK3128_GRF_MAC_CON1 */
149 #define RK3128_GMAC_PHY_INTF_SEL_RGMII \
150 (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
151 #define RK3128_GMAC_PHY_INTF_SEL_RMII \
152 (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
153 #define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
154 #define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
155 #define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
156 #define RK3128_GMAC_SPEED_100M GRF_BIT(10)
157 #define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
158 #define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
159 #define RK3128_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
160 #define RK3128_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
161 #define RK3128_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
162 #define RK3128_GMAC_RMII_MODE GRF_BIT(14)
163 #define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
165 static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
166 int tx_delay, int rx_delay)
168 struct device *dev = &bsp_priv->pdev->dev;
170 if (IS_ERR(bsp_priv->grf)) {
171 dev_err(dev, "Missing rockchip,grf property\n");
175 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
176 RK3128_GMAC_PHY_INTF_SEL_RGMII |
177 RK3128_GMAC_RMII_MODE_CLR);
178 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
179 DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
180 RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
181 RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
184 static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
186 struct device *dev = &bsp_priv->pdev->dev;
188 if (IS_ERR(bsp_priv->grf)) {
189 dev_err(dev, "Missing rockchip,grf property\n");
193 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
194 RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
197 static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
199 struct device *dev = &bsp_priv->pdev->dev;
201 if (IS_ERR(bsp_priv->grf)) {
202 dev_err(dev, "Missing rockchip,grf property\n");
207 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
208 RK3128_GMAC_CLK_2_5M);
209 else if (speed == 100)
210 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
211 RK3128_GMAC_CLK_25M);
212 else if (speed == 1000)
213 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
214 RK3128_GMAC_CLK_125M);
216 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
219 static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
221 struct device *dev = &bsp_priv->pdev->dev;
223 if (IS_ERR(bsp_priv->grf)) {
224 dev_err(dev, "Missing rockchip,grf property\n");
229 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
230 RK3128_GMAC_RMII_CLK_2_5M |
231 RK3128_GMAC_SPEED_10M);
232 } else if (speed == 100) {
233 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
234 RK3128_GMAC_RMII_CLK_25M |
235 RK3128_GMAC_SPEED_100M);
237 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
241 static const struct rk_gmac_ops rk3128_ops = {
242 .set_to_rgmii = rk3128_set_to_rgmii,
243 .set_to_rmii = rk3128_set_to_rmii,
244 .set_rgmii_speed = rk3128_set_rgmii_speed,
245 .set_rmii_speed = rk3128_set_rmii_speed,
248 #define RK3228_GRF_MAC_CON0 0x0900
249 #define RK3228_GRF_MAC_CON1 0x0904
251 #define RK3228_GRF_CON_MUX 0x50
253 /* RK3228_GRF_MAC_CON0 */
254 #define RK3228_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
255 #define RK3228_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
257 /* RK3228_GRF_MAC_CON1 */
258 #define RK3228_GMAC_PHY_INTF_SEL_RGMII \
259 (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
260 #define RK3228_GMAC_PHY_INTF_SEL_RMII \
261 (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
262 #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
263 #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
264 #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
265 #define RK3228_GMAC_SPEED_100M GRF_BIT(2)
266 #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
267 #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
268 #define RK3228_GMAC_CLK_125M (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
269 #define RK3228_GMAC_CLK_25M (GRF_BIT(8) | GRF_BIT(9))
270 #define RK3228_GMAC_CLK_2_5M (GRF_CLR_BIT(8) | GRF_BIT(9))
271 #define RK3228_GMAC_RMII_MODE GRF_BIT(10)
272 #define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
273 #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
274 #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
275 #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
276 #define RK3228_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
278 /* RK3228_GRF_COM_MUX */
279 #define RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY GRF_BIT(15)
281 static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
282 int tx_delay, int rx_delay)
284 struct device *dev = &bsp_priv->pdev->dev;
286 if (IS_ERR(bsp_priv->grf)) {
287 dev_err(dev, "Missing rockchip,grf property\n");
291 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
292 RK3228_GMAC_PHY_INTF_SEL_RGMII |
293 RK3228_GMAC_RMII_MODE_CLR |
294 DELAY_ENABLE(RK3228, tx_delay, rx_delay));
296 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
297 RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
298 RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
301 static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
303 struct device *dev = &bsp_priv->pdev->dev;
305 if (IS_ERR(bsp_priv->grf)) {
306 dev_err(dev, "Missing rockchip,grf property\n");
310 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
311 RK3228_GMAC_PHY_INTF_SEL_RMII |
312 RK3228_GMAC_RMII_MODE);
314 /* set MAC to RMII mode */
315 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
318 static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
320 struct device *dev = &bsp_priv->pdev->dev;
322 if (IS_ERR(bsp_priv->grf)) {
323 dev_err(dev, "Missing rockchip,grf property\n");
328 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
329 RK3228_GMAC_CLK_2_5M);
330 else if (speed == 100)
331 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
332 RK3228_GMAC_CLK_25M);
333 else if (speed == 1000)
334 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
335 RK3228_GMAC_CLK_125M);
337 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
340 static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
342 struct device *dev = &bsp_priv->pdev->dev;
344 if (IS_ERR(bsp_priv->grf)) {
345 dev_err(dev, "Missing rockchip,grf property\n");
350 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
351 RK3228_GMAC_RMII_CLK_2_5M |
352 RK3228_GMAC_SPEED_10M);
353 else if (speed == 100)
354 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
355 RK3228_GMAC_RMII_CLK_25M |
356 RK3228_GMAC_SPEED_100M);
358 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
361 static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
363 regmap_write(priv->grf, RK3228_GRF_CON_MUX,
364 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
367 static const struct rk_gmac_ops rk3228_ops = {
368 .set_to_rgmii = rk3228_set_to_rgmii,
369 .set_to_rmii = rk3228_set_to_rmii,
370 .set_rgmii_speed = rk3228_set_rgmii_speed,
371 .set_rmii_speed = rk3228_set_rmii_speed,
372 .integrated_phy_powerup = rk3228_integrated_phy_powerup,
375 #define RK3288_GRF_SOC_CON1 0x0248
376 #define RK3288_GRF_SOC_CON3 0x0250
378 /*RK3288_GRF_SOC_CON1*/
379 #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | \
381 #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
383 #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
384 #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
385 #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
386 #define RK3288_GMAC_SPEED_100M GRF_BIT(10)
387 #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
388 #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
389 #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
390 #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
391 #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
392 #define RK3288_GMAC_RMII_MODE GRF_BIT(14)
393 #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
395 /*RK3288_GRF_SOC_CON3*/
396 #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
397 #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
398 #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
399 #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
400 #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
401 #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
403 static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
404 int tx_delay, int rx_delay)
406 struct device *dev = &bsp_priv->pdev->dev;
408 if (IS_ERR(bsp_priv->grf)) {
409 dev_err(dev, "Missing rockchip,grf property\n");
413 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
414 RK3288_GMAC_PHY_INTF_SEL_RGMII |
415 RK3288_GMAC_RMII_MODE_CLR);
416 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
417 DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
418 RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
419 RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
422 static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
424 struct device *dev = &bsp_priv->pdev->dev;
426 if (IS_ERR(bsp_priv->grf)) {
427 dev_err(dev, "Missing rockchip,grf property\n");
431 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
432 RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
435 static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
437 struct device *dev = &bsp_priv->pdev->dev;
439 if (IS_ERR(bsp_priv->grf)) {
440 dev_err(dev, "Missing rockchip,grf property\n");
445 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
446 RK3288_GMAC_CLK_2_5M);
447 else if (speed == 100)
448 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
449 RK3288_GMAC_CLK_25M);
450 else if (speed == 1000)
451 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
452 RK3288_GMAC_CLK_125M);
454 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
457 static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
459 struct device *dev = &bsp_priv->pdev->dev;
461 if (IS_ERR(bsp_priv->grf)) {
462 dev_err(dev, "Missing rockchip,grf property\n");
467 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
468 RK3288_GMAC_RMII_CLK_2_5M |
469 RK3288_GMAC_SPEED_10M);
470 } else if (speed == 100) {
471 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
472 RK3288_GMAC_RMII_CLK_25M |
473 RK3288_GMAC_SPEED_100M);
475 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
479 static const struct rk_gmac_ops rk3288_ops = {
480 .set_to_rgmii = rk3288_set_to_rgmii,
481 .set_to_rmii = rk3288_set_to_rmii,
482 .set_rgmii_speed = rk3288_set_rgmii_speed,
483 .set_rmii_speed = rk3288_set_rmii_speed,
486 #define RK3308_GRF_MAC_CON0 0x04a0
488 /* RK3308_GRF_MAC_CON0 */
489 #define RK3308_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(2) | GRF_CLR_BIT(3) | \
491 #define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
492 #define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
493 #define RK3308_GMAC_SPEED_10M GRF_CLR_BIT(0)
494 #define RK3308_GMAC_SPEED_100M GRF_BIT(0)
496 static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
498 struct device *dev = &bsp_priv->pdev->dev;
500 if (IS_ERR(bsp_priv->grf)) {
501 dev_err(dev, "Missing rockchip,grf property\n");
505 regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
506 RK3308_GMAC_PHY_INTF_SEL_RMII);
509 static void rk3308_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
511 struct device *dev = &bsp_priv->pdev->dev;
513 if (IS_ERR(bsp_priv->grf)) {
514 dev_err(dev, "Missing rockchip,grf property\n");
519 regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
520 RK3308_GMAC_SPEED_10M);
521 } else if (speed == 100) {
522 regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
523 RK3308_GMAC_SPEED_100M);
525 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
529 static const struct rk_gmac_ops rk3308_ops = {
530 .set_to_rmii = rk3308_set_to_rmii,
531 .set_rmii_speed = rk3308_set_rmii_speed,
534 #define RK3328_GRF_MAC_CON0 0x0900
535 #define RK3328_GRF_MAC_CON1 0x0904
536 #define RK3328_GRF_MAC_CON2 0x0908
537 #define RK3328_GRF_MACPHY_CON1 0xb04
539 /* RK3328_GRF_MAC_CON0 */
540 #define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
541 #define RK3328_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
543 /* RK3328_GRF_MAC_CON1 */
544 #define RK3328_GMAC_PHY_INTF_SEL_RGMII \
545 (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
546 #define RK3328_GMAC_PHY_INTF_SEL_RMII \
547 (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
548 #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
549 #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
550 #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
551 #define RK3328_GMAC_SPEED_100M GRF_BIT(2)
552 #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
553 #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
554 #define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
555 #define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
556 #define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
557 #define RK3328_GMAC_RMII_MODE GRF_BIT(9)
558 #define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
559 #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
560 #define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
561 #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
562 #define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
564 /* RK3328_GRF_MACPHY_CON1 */
565 #define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
567 static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
568 int tx_delay, int rx_delay)
570 struct device *dev = &bsp_priv->pdev->dev;
572 if (IS_ERR(bsp_priv->grf)) {
573 dev_err(dev, "Missing rockchip,grf property\n");
577 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
578 RK3328_GMAC_PHY_INTF_SEL_RGMII |
579 RK3328_GMAC_RMII_MODE_CLR |
580 RK3328_GMAC_RXCLK_DLY_ENABLE |
581 RK3328_GMAC_TXCLK_DLY_ENABLE);
583 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
584 RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
585 RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
588 static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
590 struct device *dev = &bsp_priv->pdev->dev;
593 if (IS_ERR(bsp_priv->grf)) {
594 dev_err(dev, "Missing rockchip,grf property\n");
598 reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
601 regmap_write(bsp_priv->grf, reg,
602 RK3328_GMAC_PHY_INTF_SEL_RMII |
603 RK3328_GMAC_RMII_MODE);
606 static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
608 struct device *dev = &bsp_priv->pdev->dev;
610 if (IS_ERR(bsp_priv->grf)) {
611 dev_err(dev, "Missing rockchip,grf property\n");
616 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
617 RK3328_GMAC_CLK_2_5M);
618 else if (speed == 100)
619 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
620 RK3328_GMAC_CLK_25M);
621 else if (speed == 1000)
622 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
623 RK3328_GMAC_CLK_125M);
625 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
628 static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
630 struct device *dev = &bsp_priv->pdev->dev;
633 if (IS_ERR(bsp_priv->grf)) {
634 dev_err(dev, "Missing rockchip,grf property\n");
638 reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
642 regmap_write(bsp_priv->grf, reg,
643 RK3328_GMAC_RMII_CLK_2_5M |
644 RK3328_GMAC_SPEED_10M);
645 else if (speed == 100)
646 regmap_write(bsp_priv->grf, reg,
647 RK3328_GMAC_RMII_CLK_25M |
648 RK3328_GMAC_SPEED_100M);
650 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
653 static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
655 regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
656 RK3328_MACPHY_RMII_MODE);
659 static const struct rk_gmac_ops rk3328_ops = {
660 .set_to_rgmii = rk3328_set_to_rgmii,
661 .set_to_rmii = rk3328_set_to_rmii,
662 .set_rgmii_speed = rk3328_set_rgmii_speed,
663 .set_rmii_speed = rk3328_set_rmii_speed,
664 .integrated_phy_powerup = rk3328_integrated_phy_powerup,
667 #define RK3366_GRF_SOC_CON6 0x0418
668 #define RK3366_GRF_SOC_CON7 0x041c
670 /* RK3366_GRF_SOC_CON6 */
671 #define RK3366_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
673 #define RK3366_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
675 #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
676 #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
677 #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
678 #define RK3366_GMAC_SPEED_100M GRF_BIT(7)
679 #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
680 #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
681 #define RK3366_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
682 #define RK3366_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
683 #define RK3366_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
684 #define RK3366_GMAC_RMII_MODE GRF_BIT(6)
685 #define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
687 /* RK3366_GRF_SOC_CON7 */
688 #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
689 #define RK3366_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
690 #define RK3366_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
691 #define RK3366_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
692 #define RK3366_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
693 #define RK3366_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
695 static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
696 int tx_delay, int rx_delay)
698 struct device *dev = &bsp_priv->pdev->dev;
700 if (IS_ERR(bsp_priv->grf)) {
701 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
705 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
706 RK3366_GMAC_PHY_INTF_SEL_RGMII |
707 RK3366_GMAC_RMII_MODE_CLR);
708 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
709 DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
710 RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
711 RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
714 static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
716 struct device *dev = &bsp_priv->pdev->dev;
718 if (IS_ERR(bsp_priv->grf)) {
719 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
723 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
724 RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
727 static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
729 struct device *dev = &bsp_priv->pdev->dev;
731 if (IS_ERR(bsp_priv->grf)) {
732 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
737 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
738 RK3366_GMAC_CLK_2_5M);
739 else if (speed == 100)
740 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
741 RK3366_GMAC_CLK_25M);
742 else if (speed == 1000)
743 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
744 RK3366_GMAC_CLK_125M);
746 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
749 static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
751 struct device *dev = &bsp_priv->pdev->dev;
753 if (IS_ERR(bsp_priv->grf)) {
754 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
759 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
760 RK3366_GMAC_RMII_CLK_2_5M |
761 RK3366_GMAC_SPEED_10M);
762 } else if (speed == 100) {
763 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
764 RK3366_GMAC_RMII_CLK_25M |
765 RK3366_GMAC_SPEED_100M);
767 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
771 static const struct rk_gmac_ops rk3366_ops = {
772 .set_to_rgmii = rk3366_set_to_rgmii,
773 .set_to_rmii = rk3366_set_to_rmii,
774 .set_rgmii_speed = rk3366_set_rgmii_speed,
775 .set_rmii_speed = rk3366_set_rmii_speed,
778 #define RK3368_GRF_SOC_CON15 0x043c
779 #define RK3368_GRF_SOC_CON16 0x0440
781 /* RK3368_GRF_SOC_CON15 */
782 #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
784 #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
786 #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
787 #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
788 #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
789 #define RK3368_GMAC_SPEED_100M GRF_BIT(7)
790 #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
791 #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
792 #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
793 #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
794 #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
795 #define RK3368_GMAC_RMII_MODE GRF_BIT(6)
796 #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
798 /* RK3368_GRF_SOC_CON16 */
799 #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
800 #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
801 #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
802 #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
803 #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
804 #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
806 static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
807 int tx_delay, int rx_delay)
809 struct device *dev = &bsp_priv->pdev->dev;
811 if (IS_ERR(bsp_priv->grf)) {
812 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
816 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
817 RK3368_GMAC_PHY_INTF_SEL_RGMII |
818 RK3368_GMAC_RMII_MODE_CLR);
819 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
820 DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
821 RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
822 RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
825 static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
827 struct device *dev = &bsp_priv->pdev->dev;
829 if (IS_ERR(bsp_priv->grf)) {
830 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
834 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
835 RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
838 static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
840 struct device *dev = &bsp_priv->pdev->dev;
842 if (IS_ERR(bsp_priv->grf)) {
843 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
848 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
849 RK3368_GMAC_CLK_2_5M);
850 else if (speed == 100)
851 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
852 RK3368_GMAC_CLK_25M);
853 else if (speed == 1000)
854 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
855 RK3368_GMAC_CLK_125M);
857 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
860 static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
862 struct device *dev = &bsp_priv->pdev->dev;
864 if (IS_ERR(bsp_priv->grf)) {
865 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
870 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
871 RK3368_GMAC_RMII_CLK_2_5M |
872 RK3368_GMAC_SPEED_10M);
873 } else if (speed == 100) {
874 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
875 RK3368_GMAC_RMII_CLK_25M |
876 RK3368_GMAC_SPEED_100M);
878 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
882 static const struct rk_gmac_ops rk3368_ops = {
883 .set_to_rgmii = rk3368_set_to_rgmii,
884 .set_to_rmii = rk3368_set_to_rmii,
885 .set_rgmii_speed = rk3368_set_rgmii_speed,
886 .set_rmii_speed = rk3368_set_rmii_speed,
889 #define RK3399_GRF_SOC_CON5 0xc214
890 #define RK3399_GRF_SOC_CON6 0xc218
892 /* RK3399_GRF_SOC_CON5 */
893 #define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
895 #define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
897 #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
898 #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
899 #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
900 #define RK3399_GMAC_SPEED_100M GRF_BIT(7)
901 #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
902 #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
903 #define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
904 #define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
905 #define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
906 #define RK3399_GMAC_RMII_MODE GRF_BIT(6)
907 #define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
909 /* RK3399_GRF_SOC_CON6 */
910 #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
911 #define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
912 #define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
913 #define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
914 #define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
915 #define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
917 static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
918 int tx_delay, int rx_delay)
920 struct device *dev = &bsp_priv->pdev->dev;
922 if (IS_ERR(bsp_priv->grf)) {
923 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
927 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
928 RK3399_GMAC_PHY_INTF_SEL_RGMII |
929 RK3399_GMAC_RMII_MODE_CLR);
930 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
931 DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
932 RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
933 RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
936 static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
938 struct device *dev = &bsp_priv->pdev->dev;
940 if (IS_ERR(bsp_priv->grf)) {
941 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
945 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
946 RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
949 static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
951 struct device *dev = &bsp_priv->pdev->dev;
953 if (IS_ERR(bsp_priv->grf)) {
954 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
959 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
960 RK3399_GMAC_CLK_2_5M);
961 else if (speed == 100)
962 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
963 RK3399_GMAC_CLK_25M);
964 else if (speed == 1000)
965 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
966 RK3399_GMAC_CLK_125M);
968 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
971 static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
973 struct device *dev = &bsp_priv->pdev->dev;
975 if (IS_ERR(bsp_priv->grf)) {
976 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
981 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
982 RK3399_GMAC_RMII_CLK_2_5M |
983 RK3399_GMAC_SPEED_10M);
984 } else if (speed == 100) {
985 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
986 RK3399_GMAC_RMII_CLK_25M |
987 RK3399_GMAC_SPEED_100M);
989 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
993 static const struct rk_gmac_ops rk3399_ops = {
994 .set_to_rgmii = rk3399_set_to_rgmii,
995 .set_to_rmii = rk3399_set_to_rmii,
996 .set_rgmii_speed = rk3399_set_rgmii_speed,
997 .set_rmii_speed = rk3399_set_rmii_speed,
1000 #define RK3568_GRF_GMAC0_CON0 0x0380
1001 #define RK3568_GRF_GMAC0_CON1 0x0384
1002 #define RK3568_GRF_GMAC1_CON0 0x0388
1003 #define RK3568_GRF_GMAC1_CON1 0x038c
1005 /* RK3568_GRF_GMAC0_CON1 && RK3568_GRF_GMAC1_CON1 */
1006 #define RK3568_GMAC_PHY_INTF_SEL_RGMII \
1007 (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
1008 #define RK3568_GMAC_PHY_INTF_SEL_RMII \
1009 (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
1010 #define RK3568_GMAC_FLOW_CTRL GRF_BIT(3)
1011 #define RK3568_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
1012 #define RK3568_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
1013 #define RK3568_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
1014 #define RK3568_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
1015 #define RK3568_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
1017 /* RK3568_GRF_GMAC0_CON0 && RK3568_GRF_GMAC1_CON0 */
1018 #define RK3568_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
1019 #define RK3568_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
1021 static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
1022 int tx_delay, int rx_delay)
1024 struct device *dev = &bsp_priv->pdev->dev;
1027 if (IS_ERR(bsp_priv->grf)) {
1028 dev_err(dev, "Missing rockchip,grf property\n");
1032 con0 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON0 :
1033 RK3568_GRF_GMAC0_CON0;
1034 con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
1035 RK3568_GRF_GMAC0_CON1;
1037 regmap_write(bsp_priv->grf, con0,
1038 RK3568_GMAC_CLK_RX_DL_CFG(rx_delay) |
1039 RK3568_GMAC_CLK_TX_DL_CFG(tx_delay));
1041 regmap_write(bsp_priv->grf, con1,
1042 RK3568_GMAC_PHY_INTF_SEL_RGMII |
1043 RK3568_GMAC_RXCLK_DLY_ENABLE |
1044 RK3568_GMAC_TXCLK_DLY_ENABLE);
1047 static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
1049 struct device *dev = &bsp_priv->pdev->dev;
1052 if (IS_ERR(bsp_priv->grf)) {
1053 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1057 con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
1058 RK3568_GRF_GMAC0_CON1;
1059 regmap_write(bsp_priv->grf, con1, RK3568_GMAC_PHY_INTF_SEL_RMII);
1062 static void rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1064 struct device *dev = &bsp_priv->pdev->dev;
1079 dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1083 ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
1085 dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
1086 __func__, rate, ret);
1089 static const struct rk_gmac_ops rk3568_ops = {
1090 .set_to_rgmii = rk3568_set_to_rgmii,
1091 .set_to_rmii = rk3568_set_to_rmii,
1092 .set_rgmii_speed = rk3568_set_gmac_speed,
1093 .set_rmii_speed = rk3568_set_gmac_speed,
1095 0xfe2a0000, /* gmac0 */
1096 0xfe010000, /* gmac1 */
1101 #define RV1108_GRF_GMAC_CON0 0X0900
1103 /* RV1108_GRF_GMAC_CON0 */
1104 #define RV1108_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
1106 #define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
1107 #define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
1108 #define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
1109 #define RV1108_GMAC_SPEED_100M GRF_BIT(2)
1110 #define RV1108_GMAC_RMII_CLK_25M GRF_BIT(7)
1111 #define RV1108_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
1113 static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
1115 struct device *dev = &bsp_priv->pdev->dev;
1117 if (IS_ERR(bsp_priv->grf)) {
1118 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1122 regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
1123 RV1108_GMAC_PHY_INTF_SEL_RMII);
1126 static void rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1128 struct device *dev = &bsp_priv->pdev->dev;
1130 if (IS_ERR(bsp_priv->grf)) {
1131 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1136 regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
1137 RV1108_GMAC_RMII_CLK_2_5M |
1138 RV1108_GMAC_SPEED_10M);
1139 } else if (speed == 100) {
1140 regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
1141 RV1108_GMAC_RMII_CLK_25M |
1142 RV1108_GMAC_SPEED_100M);
1144 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1148 static const struct rk_gmac_ops rv1108_ops = {
1149 .set_to_rmii = rv1108_set_to_rmii,
1150 .set_rmii_speed = rv1108_set_rmii_speed,
1153 #define RK_GRF_MACPHY_CON0 0xb00
1154 #define RK_GRF_MACPHY_CON1 0xb04
1155 #define RK_GRF_MACPHY_CON2 0xb08
1156 #define RK_GRF_MACPHY_CON3 0xb0c
1158 #define RK_MACPHY_ENABLE GRF_BIT(0)
1159 #define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
1160 #define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
1161 #define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
1162 #define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
1163 #define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
1165 static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
1167 if (priv->ops->integrated_phy_powerup)
1168 priv->ops->integrated_phy_powerup(priv);
1170 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
1171 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
1173 regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
1174 regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
1176 if (priv->phy_reset) {
1177 /* PHY needs to be disabled before trying to reset it */
1178 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
1179 if (priv->phy_reset)
1180 reset_control_assert(priv->phy_reset);
1181 usleep_range(10, 20);
1182 if (priv->phy_reset)
1183 reset_control_deassert(priv->phy_reset);
1184 usleep_range(10, 20);
1185 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
1190 static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
1192 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
1193 if (priv->phy_reset)
1194 reset_control_assert(priv->phy_reset);
1197 static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
1199 struct rk_priv_data *bsp_priv = plat->bsp_priv;
1200 struct device *dev = &bsp_priv->pdev->dev;
1203 bsp_priv->clk_enabled = false;
1205 bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
1206 if (IS_ERR(bsp_priv->mac_clk_rx))
1207 dev_err(dev, "cannot get clock %s\n",
1210 bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
1211 if (IS_ERR(bsp_priv->mac_clk_tx))
1212 dev_err(dev, "cannot get clock %s\n",
1215 bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
1216 if (IS_ERR(bsp_priv->aclk_mac))
1217 dev_err(dev, "cannot get clock %s\n",
1220 bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
1221 if (IS_ERR(bsp_priv->pclk_mac))
1222 dev_err(dev, "cannot get clock %s\n",
1225 bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
1226 if (IS_ERR(bsp_priv->clk_mac))
1227 dev_err(dev, "cannot get clock %s\n",
1230 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1231 bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
1232 if (IS_ERR(bsp_priv->clk_mac_ref))
1233 dev_err(dev, "cannot get clock %s\n",
1236 if (!bsp_priv->clock_input) {
1237 bsp_priv->clk_mac_refout =
1238 devm_clk_get(dev, "clk_mac_refout");
1239 if (IS_ERR(bsp_priv->clk_mac_refout))
1240 dev_err(dev, "cannot get clock %s\n",
1245 bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed");
1246 if (IS_ERR(bsp_priv->clk_mac_speed))
1247 dev_err(dev, "cannot get clock %s\n", "clk_mac_speed");
1249 if (bsp_priv->clock_input) {
1250 dev_info(dev, "clock input from PHY\n");
1252 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
1253 clk_set_rate(bsp_priv->clk_mac, 50000000);
1256 if (plat->phy_node && bsp_priv->integrated_phy) {
1257 bsp_priv->clk_phy = of_clk_get(plat->phy_node, 0);
1258 if (IS_ERR(bsp_priv->clk_phy)) {
1259 ret = PTR_ERR(bsp_priv->clk_phy);
1260 dev_err(dev, "Cannot get PHY clock: %d\n", ret);
1263 clk_set_rate(bsp_priv->clk_phy, 50000000);
1269 static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
1271 int phy_iface = bsp_priv->phy_iface;
1274 if (!bsp_priv->clk_enabled) {
1275 if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1276 if (!IS_ERR(bsp_priv->mac_clk_rx))
1278 bsp_priv->mac_clk_rx);
1280 if (!IS_ERR(bsp_priv->clk_mac_ref))
1282 bsp_priv->clk_mac_ref);
1284 if (!IS_ERR(bsp_priv->clk_mac_refout))
1286 bsp_priv->clk_mac_refout);
1289 if (!IS_ERR(bsp_priv->clk_phy))
1290 clk_prepare_enable(bsp_priv->clk_phy);
1292 if (!IS_ERR(bsp_priv->aclk_mac))
1293 clk_prepare_enable(bsp_priv->aclk_mac);
1295 if (!IS_ERR(bsp_priv->pclk_mac))
1296 clk_prepare_enable(bsp_priv->pclk_mac);
1298 if (!IS_ERR(bsp_priv->mac_clk_tx))
1299 clk_prepare_enable(bsp_priv->mac_clk_tx);
1301 if (!IS_ERR(bsp_priv->clk_mac_speed))
1302 clk_prepare_enable(bsp_priv->clk_mac_speed);
1305 * if (!IS_ERR(bsp_priv->clk_mac))
1306 * clk_prepare_enable(bsp_priv->clk_mac);
1309 bsp_priv->clk_enabled = true;
1312 if (bsp_priv->clk_enabled) {
1313 if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1314 clk_disable_unprepare(bsp_priv->mac_clk_rx);
1316 clk_disable_unprepare(bsp_priv->clk_mac_ref);
1318 clk_disable_unprepare(bsp_priv->clk_mac_refout);
1321 clk_disable_unprepare(bsp_priv->clk_phy);
1323 clk_disable_unprepare(bsp_priv->aclk_mac);
1325 clk_disable_unprepare(bsp_priv->pclk_mac);
1327 clk_disable_unprepare(bsp_priv->mac_clk_tx);
1329 clk_disable_unprepare(bsp_priv->clk_mac_speed);
1331 * if (!IS_ERR(bsp_priv->clk_mac))
1332 * clk_disable_unprepare(bsp_priv->clk_mac);
1334 bsp_priv->clk_enabled = false;
1341 static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
1343 struct regulator *ldo = bsp_priv->regulator;
1345 struct device *dev = &bsp_priv->pdev->dev;
1351 ret = regulator_enable(ldo);
1353 dev_err(dev, "fail to enable phy-supply\n");
1355 ret = regulator_disable(ldo);
1357 dev_err(dev, "fail to disable phy-supply\n");
1363 static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
1364 struct plat_stmmacenet_data *plat,
1365 const struct rk_gmac_ops *ops)
1367 struct rk_priv_data *bsp_priv;
1368 struct device *dev = &pdev->dev;
1369 struct resource *res;
1371 const char *strings = NULL;
1374 bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
1376 return ERR_PTR(-ENOMEM);
1378 of_get_phy_mode(dev->of_node, &bsp_priv->phy_iface);
1379 bsp_priv->ops = ops;
1381 /* Some SoCs have multiple MAC controllers, which need
1382 * to be distinguished.
1384 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1388 while (ops->regs[i]) {
1389 if (ops->regs[i] == res->start) {
1397 bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
1398 if (IS_ERR(bsp_priv->regulator)) {
1399 if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
1400 dev_err(dev, "phy regulator is not available yet, deferred probing\n");
1401 return ERR_PTR(-EPROBE_DEFER);
1403 dev_err(dev, "no regulator found\n");
1404 bsp_priv->regulator = NULL;
1407 ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
1409 dev_err(dev, "Can not read property: clock_in_out.\n");
1410 bsp_priv->clock_input = true;
1412 dev_info(dev, "clock input or output? (%s).\n",
1414 if (!strcmp(strings, "input"))
1415 bsp_priv->clock_input = true;
1417 bsp_priv->clock_input = false;
1420 ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
1422 bsp_priv->tx_delay = 0x30;
1423 dev_err(dev, "Can not read property: tx_delay.");
1424 dev_err(dev, "set tx_delay to 0x%x\n",
1425 bsp_priv->tx_delay);
1427 dev_info(dev, "TX delay(0x%x).\n", value);
1428 bsp_priv->tx_delay = value;
1431 ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
1433 bsp_priv->rx_delay = 0x10;
1434 dev_err(dev, "Can not read property: rx_delay.");
1435 dev_err(dev, "set rx_delay to 0x%x\n",
1436 bsp_priv->rx_delay);
1438 dev_info(dev, "RX delay(0x%x).\n", value);
1439 bsp_priv->rx_delay = value;
1442 bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
1445 if (plat->phy_node) {
1446 bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
1447 "phy-is-integrated");
1448 if (bsp_priv->integrated_phy) {
1449 bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
1450 if (IS_ERR(bsp_priv->phy_reset)) {
1451 dev_err(&pdev->dev, "No PHY reset control found.\n");
1452 bsp_priv->phy_reset = NULL;
1456 dev_info(dev, "integrated PHY? (%s).\n",
1457 bsp_priv->integrated_phy ? "yes" : "no");
1459 bsp_priv->pdev = pdev;
1464 static int rk_gmac_check_ops(struct rk_priv_data *bsp_priv)
1466 switch (bsp_priv->phy_iface) {
1467 case PHY_INTERFACE_MODE_RGMII:
1468 case PHY_INTERFACE_MODE_RGMII_ID:
1469 case PHY_INTERFACE_MODE_RGMII_RXID:
1470 case PHY_INTERFACE_MODE_RGMII_TXID:
1471 if (!bsp_priv->ops->set_to_rgmii)
1474 case PHY_INTERFACE_MODE_RMII:
1475 if (!bsp_priv->ops->set_to_rmii)
1479 dev_err(&bsp_priv->pdev->dev,
1480 "unsupported interface %d", bsp_priv->phy_iface);
1485 static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
1488 struct device *dev = &bsp_priv->pdev->dev;
1490 ret = rk_gmac_check_ops(bsp_priv);
1494 ret = gmac_clk_enable(bsp_priv, true);
1499 switch (bsp_priv->phy_iface) {
1500 case PHY_INTERFACE_MODE_RGMII:
1501 dev_info(dev, "init for RGMII\n");
1502 bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
1503 bsp_priv->rx_delay);
1505 case PHY_INTERFACE_MODE_RGMII_ID:
1506 dev_info(dev, "init for RGMII_ID\n");
1507 bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
1509 case PHY_INTERFACE_MODE_RGMII_RXID:
1510 dev_info(dev, "init for RGMII_RXID\n");
1511 bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
1513 case PHY_INTERFACE_MODE_RGMII_TXID:
1514 dev_info(dev, "init for RGMII_TXID\n");
1515 bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
1517 case PHY_INTERFACE_MODE_RMII:
1518 dev_info(dev, "init for RMII\n");
1519 bsp_priv->ops->set_to_rmii(bsp_priv);
1522 dev_err(dev, "NO interface defined!\n");
1525 ret = phy_power_on(bsp_priv, true);
1527 gmac_clk_enable(bsp_priv, false);
1531 if (bsp_priv->integrated_phy)
1532 rk_gmac_integrated_phy_powerup(bsp_priv);
1537 static void rk_gmac_powerdown(struct rk_priv_data *gmac)
1539 if (gmac->integrated_phy)
1540 rk_gmac_integrated_phy_powerdown(gmac);
1542 phy_power_on(gmac, false);
1543 gmac_clk_enable(gmac, false);
1546 static void rk_fix_speed(void *priv, unsigned int speed)
1548 struct rk_priv_data *bsp_priv = priv;
1549 struct device *dev = &bsp_priv->pdev->dev;
1551 switch (bsp_priv->phy_iface) {
1552 case PHY_INTERFACE_MODE_RGMII:
1553 case PHY_INTERFACE_MODE_RGMII_ID:
1554 case PHY_INTERFACE_MODE_RGMII_RXID:
1555 case PHY_INTERFACE_MODE_RGMII_TXID:
1556 if (bsp_priv->ops->set_rgmii_speed)
1557 bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
1559 case PHY_INTERFACE_MODE_RMII:
1560 if (bsp_priv->ops->set_rmii_speed)
1561 bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
1564 dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
1568 static int rk_gmac_probe(struct platform_device *pdev)
1570 struct plat_stmmacenet_data *plat_dat;
1571 struct stmmac_resources stmmac_res;
1572 const struct rk_gmac_ops *data;
1575 data = of_device_get_match_data(&pdev->dev);
1577 dev_err(&pdev->dev, "no of match data provided\n");
1581 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
1585 plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
1586 if (IS_ERR(plat_dat))
1587 return PTR_ERR(plat_dat);
1589 /* If the stmmac is not already selected as gmac4,
1590 * then make sure we fallback to gmac.
1592 if (!plat_dat->has_gmac4)
1593 plat_dat->has_gmac = true;
1594 plat_dat->fix_mac_speed = rk_fix_speed;
1596 plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
1597 if (IS_ERR(plat_dat->bsp_priv)) {
1598 ret = PTR_ERR(plat_dat->bsp_priv);
1599 goto err_remove_config_dt;
1602 ret = rk_gmac_clk_init(plat_dat);
1604 goto err_remove_config_dt;
1606 ret = rk_gmac_powerup(plat_dat->bsp_priv);
1608 goto err_remove_config_dt;
1610 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
1612 goto err_gmac_powerdown;
1617 rk_gmac_powerdown(plat_dat->bsp_priv);
1618 err_remove_config_dt:
1619 stmmac_remove_config_dt(pdev, plat_dat);
1624 static int rk_gmac_remove(struct platform_device *pdev)
1626 struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
1627 int ret = stmmac_dvr_remove(&pdev->dev);
1629 rk_gmac_powerdown(bsp_priv);
1634 #ifdef CONFIG_PM_SLEEP
1635 static int rk_gmac_suspend(struct device *dev)
1637 struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
1638 int ret = stmmac_suspend(dev);
1640 /* Keep the PHY up if we use Wake-on-Lan. */
1641 if (!device_may_wakeup(dev)) {
1642 rk_gmac_powerdown(bsp_priv);
1643 bsp_priv->suspended = true;
1649 static int rk_gmac_resume(struct device *dev)
1651 struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
1653 /* The PHY was up for Wake-on-Lan. */
1654 if (bsp_priv->suspended) {
1655 rk_gmac_powerup(bsp_priv);
1656 bsp_priv->suspended = false;
1659 return stmmac_resume(dev);
1661 #endif /* CONFIG_PM_SLEEP */
1663 static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
1665 static const struct of_device_id rk_gmac_dwmac_match[] = {
1666 { .compatible = "rockchip,px30-gmac", .data = &px30_ops },
1667 { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
1668 { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
1669 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
1670 { .compatible = "rockchip,rk3308-gmac", .data = &rk3308_ops },
1671 { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
1672 { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
1673 { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
1674 { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
1675 { .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
1676 { .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
1679 MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
1681 static struct platform_driver rk_gmac_dwmac_driver = {
1682 .probe = rk_gmac_probe,
1683 .remove = rk_gmac_remove,
1685 .name = "rk_gmac-dwmac",
1686 .pm = &rk_gmac_pm_ops,
1687 .of_match_table = rk_gmac_dwmac_match,
1690 module_platform_driver(rk_gmac_dwmac_driver);
1692 MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
1693 MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
1694 MODULE_LICENSE("GPL");