1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /**
3  * DOC: dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer
4  *
5  * Copyright (C) 2014 Chen-Zhi (Roger Chen)
6  *
7  * Chen-Zhi (Roger Chen)  <roger.chen@rock-chips.com>
8  */
9 
10 #include <linux/stmmac.h>
11 #include <linux/bitops.h>
12 #include <linux/clk.h>
13 #include <linux/phy.h>
14 #include <linux/phy/phy.h>
15 #include <linux/of_net.h>
16 #include <linux/gpio.h>
17 #include <linux/module.h>
18 #include <linux/of_gpio.h>
19 #include <linux/of_device.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/consumer.h>
22 #include <linux/delay.h>
23 #include <linux/mfd/syscon.h>
24 #include <linux/regmap.h>
25 #include <linux/pm_runtime.h>
26 #include <linux/soc/rockchip/rk_vendor_storage.h>
27 #include "stmmac_platform.h"
28 #include "dwmac-rk-tool.h"
29 
30 #define MAX_ETH 2
31 #define RK_RETRY_COUNT 12
32 #define RK_DELAY_COUNT_FIFTY 50
33 #define RK_DELAY_COUNT_THIRTY 30
34 #define RK_SLEEP_RANGE_TEN 10
35 #define RK_SLEEP_RANGE_TWENTY 20
36 #define RK_SLEEP_RANGE_ONE_HUNDRED 100
37 #define RK_SLEEP_RANGE_TWO_HUNDRED 200
38 #define RK_LOOP_COUNT 4
39 #define RK_SPEED_TEN 10
40 #define RK_SPEED_ONE_HUNDRED 100
41 #define RK_SPEED_ONE_THOUSAND 1000
42 #define RK_CLK_MAC_SPEED_ONE 2500000
43 #define RK_CLK_MAC_SPEED_TWO 25000000
44 #define RK_CLK_MAC_SPEED_THREE 125000000
45 #define RK_CLK_MAC_SPEED_FOUR 50000000
46 
47 struct rk_priv_data;
48 struct rk_gmac_ops {
49     void (*set_to_rgmii)(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay);
50     void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
51     void (*set_to_sgmii)(struct rk_priv_data *bsp_priv);
52     void (*set_to_qsgmii)(struct rk_priv_data *bsp_priv);
53     void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
54     void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
55     void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input, bool enable);
56     void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
57 };
58 
59 struct rk_priv_data {
60     struct platform_device *pdev;
61     phy_interface_t phy_iface;
62     int bus_id;
63     struct regulator *regulator;
64     bool suspended;
65     const struct rk_gmac_ops *ops;
66 
67     bool clk_enabled;
68     bool clock_input;
69     bool integrated_phy;
70 
71     struct clk *clk_mac;
72     struct clk *gmac_clkin;
73     struct clk *mac_clk_rx;
74     struct clk *mac_clk_tx;
75     struct clk *clk_mac_ref;
76     struct clk *clk_mac_refout;
77     struct clk *clk_mac_speed;
78     struct clk *aclk_mac;
79     struct clk *pclk_mac;
80     struct clk *clk_phy;
81     struct clk *pclk_xpcs;
82 
83     struct reset_control *phy_reset;
84 
85     int tx_delay;
86     int rx_delay;
87 
88     struct regmap *grf;
89     struct regmap *php_grf;
90     struct regmap *xpcs;
91 };
92 
93 /* XPCS */
94 #define XPCS_APB_INCREMENT (0x4)
95 #define XPCS_APB_MASK GENMASK_ULL(20, 0)
96 
97 #define SR_MII_BASE (0x1F0000)
98 #define SR_MII1_BASE (0x1A0000)
99 
100 #define VR_MII_DIG_CTRL1 (0x8000)
101 #define VR_MII_AN_CTRL (0x8001)
102 #define VR_MII_AN_INTR_STS (0x8002)
103 #define VR_MII_LINK_TIMER_CTRL (0x800A)
104 
105 #define SR_MII_CTRL_AN_ENABLE (BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000)
106 #define MII_MAC_AUTO_SW (0x0200)
107 #define PCS_MODE_OFFSET (0x1)
108 #define MII_AN_INTR_EN (0x1)
109 #define PCS_SGMII_MODE (0x2 << PCS_MODE_OFFSET)
110 #define PCS_QSGMII_MODE (0X3 << PCS_MODE_OFFSET)
111 #define VR_MII_CTRL_SGMII_AN_EN (PCS_SGMII_MODE | MII_AN_INTR_EN)
112 #define VR_MII_CTRL_QSGMII_AN_EN (PCS_QSGMII_MODE | MII_AN_INTR_EN)
113 
114 #define SR_MII_OFFSET(_x)                                                                                              \
115     ( {                                                                                                                \
116         typeof(_x)(x) = (_x);                                                                                          \
117         (((x) == 0) ? SR_MII_BASE : (SR_MII1_BASE + ((x)-1) * 0x10000));                                               \
118     })
119 
xpcs_read(void *priv, int reg)120 static int xpcs_read(void *priv, int reg)
121 {
122     struct rk_priv_data *bsp_priv = (struct rk_priv_data *)priv;
123     int ret, val;
124 
125     ret = regmap_read(bsp_priv->xpcs, (u32)(reg * XPCS_APB_INCREMENT) & XPCS_APB_MASK, &val);
126     if (ret) {
127         return ret;
128     }
129 
130     return val;
131 }
132 
xpcs_write(void *priv, int reg, u16 value)133 static int xpcs_write(void *priv, int reg, u16 value)
134 {
135     struct rk_priv_data *bsp_priv = (struct rk_priv_data *)priv;
136 
137     return regmap_write(bsp_priv->xpcs, (reg * XPCS_APB_INCREMENT) & XPCS_APB_MASK, value);
138 }
139 
xpcs_poll_reset(struct rk_priv_data *bsp_priv, int dev)140 static int xpcs_poll_reset(struct rk_priv_data *bsp_priv, int dev)
141 {
142     /* Poll until the reset bit clears (50ms per retry == 0.6 sec) */
143     unsigned int retries = RK_RETRY_COUNT;
144     int ret;
145 
146     do {
147         msleep(RK_DELAY_COUNT_FIFTY);
148         ret = xpcs_read(bsp_priv, SR_MII_OFFSET(dev) + MDIO_CTRL1);
149         if (ret < 0) {
150             return ret;
151         }
152     } while (ret & MDIO_CTRL1_RESET && --retries);
153 
154     return (ret & MDIO_CTRL1_RESET) ? -ETIMEDOUT : 0;
155 }
156 
xpcs_soft_reset(struct rk_priv_data *bsp_priv, int dev)157 static int xpcs_soft_reset(struct rk_priv_data *bsp_priv, int dev)
158 {
159     int ret;
160 
161     ret = xpcs_write(bsp_priv, SR_MII_OFFSET(dev) + MDIO_CTRL1, MDIO_CTRL1_RESET);
162     if (ret < 0) {
163         return ret;
164     }
165 
166     return xpcs_poll_reset(bsp_priv, dev);
167 }
168 
xpcs_setup(struct rk_priv_data *bsp_priv, int mode)169 static int xpcs_setup(struct rk_priv_data *bsp_priv, int mode)
170 {
171     int ret, i, id = bsp_priv->bus_id;
172     u32 val;
173 
174     if (mode == PHY_INTERFACE_MODE_QSGMII && id > 0) {
175         return 0;
176     }
177 
178     ret = xpcs_soft_reset(bsp_priv, id);
179     if (ret) {
180         dev_err(&bsp_priv->pdev->dev, "xpcs_soft_reset fail %d\n", ret);
181         return ret;
182     }
183 
184     xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_AN_INTR_STS, 0x0);
185     xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_LINK_TIMER_CTRL, 0x1);
186 
187     if (mode == PHY_INTERFACE_MODE_SGMII) {
188         xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_AN_CTRL, VR_MII_CTRL_SGMII_AN_EN);
189     } else {
190         xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_AN_CTRL, VR_MII_CTRL_QSGMII_AN_EN);
191     }
192 
193     if (mode == PHY_INTERFACE_MODE_QSGMII) {
194         for (i = 0; i < RK_LOOP_COUNT; i++) {
195             val = xpcs_read(bsp_priv, SR_MII_OFFSET(i) + VR_MII_DIG_CTRL1);
196             xpcs_write(bsp_priv, SR_MII_OFFSET(i) + VR_MII_DIG_CTRL1, val | MII_MAC_AUTO_SW);
197             xpcs_write(bsp_priv, SR_MII_OFFSET(i) + MII_BMCR, SR_MII_CTRL_AN_ENABLE);
198         }
199     } else {
200         val = xpcs_read(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1);
201         xpcs_write(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1, val | MII_MAC_AUTO_SW);
202         xpcs_write(bsp_priv, SR_MII_OFFSET(id) + MII_BMCR, SR_MII_CTRL_AN_ENABLE);
203     }
204 
205     return ret;
206 }
207 
208 #define HIWORD_UPDATE(val, mask, shift) ((val) << (shift) | (mask) << ((shift) + 16))
209 
210 #define GRF_BIT(nr) (BIT(nr) | BIT((nr) + 16))
211 #define GRF_CLR_BIT(nr) (BIT((nr) + 16))
212 
213 #define DELAY_ENABLE(soc, tx, rx)                                                                                      \
214     ((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) |                                      \
215      (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
216 
217 #define DELAY_ENABLE_BY_ID(soc, tx, rx, id)                                                                            \
218     ((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE(id) : soc##_GMAC_TXCLK_DLY_DISABLE(id)) |                              \
219      (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE(id) : soc##_GMAC_RXCLK_DLY_DISABLE(id)))
220 
221 #define DELAY_VALUE(soc, tx, rx)                                                                                       \
222     ((((tx) >= 0) ? soc##_GMAC_CLK_TX_DL_CFG(tx) : 0) | (((rx) >= 0) ? soc##_GMAC_CLK_RX_DL_CFG(rx) : 0))
223 
224 #define PX30_GRF_GMAC_CON1 0x0904
225 
226 /* PX30_GRF_GMAC_CON1 */
227 #define PX30_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
228 #define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
229 #define PX30_GMAC_SPEED_100M GRF_BIT(2)
230 
px30_set_to_rmii(struct rk_priv_data *bsp_priv)231 static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
232 {
233     struct device *dev = &bsp_priv->pdev->dev;
234 
235     if (IS_ERR(bsp_priv->grf)) {
236         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
237         return;
238     }
239 
240     regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, PX30_GMAC_PHY_INTF_SEL_RMII);
241 }
242 
px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)243 static void px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
244 {
245     struct device *dev = &bsp_priv->pdev->dev;
246     int ret;
247 
248     if (IS_ERR(bsp_priv->clk_mac_speed)) {
249         dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
250         return;
251     }
252 
253     if (speed == RK_SPEED_TEN) {
254         regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, PX30_GMAC_SPEED_10M);
255 
256         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_ONE);
257         if (ret) {
258             dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n", __func__, ret);
259         }
260     } else if (speed == RK_SPEED_ONE_HUNDRED) {
261         regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, PX30_GMAC_SPEED_100M);
262 
263         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_TWO);
264         if (ret) {
265             dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n", __func__, ret);
266         }
267     } else {
268         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
269     }
270 }
271 
272 static const struct rk_gmac_ops px30_ops = {
273     .set_to_rmii = px30_set_to_rmii,
274     .set_rmii_speed = px30_set_rmii_speed,
275 };
276 
277 #define RK1808_GRF_GMAC_CON0 0X0900
278 #define RK1808_GRF_GMAC_CON1 0X0904
279 
280 /* RK1808_GRF_GMAC_CON0 */
281 #define RK1808_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
282 #define RK1808_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
283 
284 /* RK1808_GRF_GMAC_CON1 */
285 #define RK1808_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
286 #define RK1808_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
287 #define RK1808_GMAC_FLOW_CTRL GRF_BIT(3)
288 #define RK1808_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
289 #define RK1808_GMAC_SPEED_10M GRF_CLR_BIT(2)
290 #define RK1808_GMAC_SPEED_100M GRF_BIT(2)
291 #define RK1808_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
292 #define RK1808_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
293 #define RK1808_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
294 #define RK1808_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
295 
rk1808_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)296 static void rk1808_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
297 {
298     struct device *dev = &bsp_priv->pdev->dev;
299 
300     if (IS_ERR(bsp_priv->grf)) {
301         dev_err(dev, "Missing rockchip,grf property\n");
302         return;
303     }
304 
305     regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1,
306                  RK1808_GMAC_PHY_INTF_SEL_RGMII | DELAY_ENABLE(RK1808, tx_delay, rx_delay));
307 
308     regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON0, DELAY_VALUE(RK1808, tx_delay, rx_delay));
309 }
310 
rk1808_set_to_rmii(struct rk_priv_data *bsp_priv)311 static void rk1808_set_to_rmii(struct rk_priv_data *bsp_priv)
312 {
313     struct device *dev = &bsp_priv->pdev->dev;
314 
315     if (IS_ERR(bsp_priv->grf)) {
316         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
317         return;
318     }
319 
320     regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1, RK1808_GMAC_PHY_INTF_SEL_RMII);
321 }
322 
rk1808_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)323 static void rk1808_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
324 {
325     struct device *dev = &bsp_priv->pdev->dev;
326     int ret;
327 
328     if (IS_ERR(bsp_priv->grf)) {
329         dev_err(dev, "Missing rockchip,grf property\n");
330         return;
331     }
332 
333     if (speed == RK_SPEED_TEN) {
334         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_ONE);
335         if (ret) {
336             dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n", __func__, ret);
337         }
338     } else if (speed == RK_SPEED_ONE_HUNDRED) {
339         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_TWO);
340         if (ret) {
341             dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n", __func__, ret);
342         }
343     } else if (speed == RK_SPEED_ONE_THOUSAND) {
344         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_THREE);
345         if (ret) {
346             dev_err(dev, "%s: set clk_mac_speed rate 125000000 failed: %d\n", __func__, ret);
347         }
348     } else {
349         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
350     }
351 }
352 
rk1808_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)353 static void rk1808_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
354 {
355     struct device *dev = &bsp_priv->pdev->dev;
356     int ret;
357 
358     if (IS_ERR(bsp_priv->clk_mac_speed)) {
359         dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
360         return;
361     }
362 
363     if (speed == RK_SPEED_TEN) {
364         regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1, RK1808_GMAC_SPEED_10M);
365 
366         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_ONE);
367         if (ret) {
368             dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n", __func__, ret);
369         }
370     } else if (speed == RK_SPEED_ONE_HUNDRED) {
371         regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1, RK1808_GMAC_SPEED_100M);
372 
373         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_TWO);
374         if (ret) {
375             dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n", __func__, ret);
376         }
377     } else {
378         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
379     }
380 }
381 
382 static const struct rk_gmac_ops rk1808_ops = {
383     .set_to_rgmii = rk1808_set_to_rgmii,
384     .set_to_rmii = rk1808_set_to_rmii,
385     .set_rgmii_speed = rk1808_set_rgmii_speed,
386     .set_rmii_speed = rk1808_set_rmii_speed,
387 };
388 
389 #define RK3128_GRF_MAC_CON0 0x0168
390 #define RK3128_GRF_MAC_CON1 0x016c
391 
392 /* RK3128_GRF_MAC_CON0 */
393 #define RK3128_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
394 #define RK3128_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
395 #define RK3128_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
396 #define RK3128_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
397 #define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
398 #define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
399 
400 /* RK3128_GRF_MAC_CON1 */
401 #define RK3128_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
402 #define RK3128_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
403 #define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
404 #define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
405 #define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
406 #define RK3128_GMAC_SPEED_100M GRF_BIT(10)
407 #define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
408 #define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
409 #define RK3128_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
410 #define RK3128_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
411 #define RK3128_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
412 #define RK3128_GMAC_RMII_MODE GRF_BIT(14)
413 #define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
414 
rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)415 static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
416 {
417     struct device *dev = &bsp_priv->pdev->dev;
418 
419     if (IS_ERR(bsp_priv->grf)) {
420         dev_err(dev, "Missing rockchip,grf property\n");
421         return;
422     }
423 
424     regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_PHY_INTF_SEL_RGMII | RK3128_GMAC_RMII_MODE_CLR);
425     regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
426                  DELAY_ENABLE(RK3128, tx_delay, rx_delay) | DELAY_VALUE(RK3128, tx_delay, rx_delay));
427 }
428 
rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)429 static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
430 {
431     struct device *dev = &bsp_priv->pdev->dev;
432 
433     if (IS_ERR(bsp_priv->grf)) {
434         dev_err(dev, "Missing rockchip,grf property\n");
435         return;
436     }
437 
438     regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
439 }
440 
rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)441 static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
442 {
443     struct device *dev = &bsp_priv->pdev->dev;
444 
445     if (IS_ERR(bsp_priv->grf)) {
446         dev_err(dev, "Missing rockchip,grf property\n");
447         return;
448     }
449 
450     if (speed == RK_SPEED_TEN) {
451         regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_CLK_2_5M);
452     } else if (speed == RK_SPEED_ONE_HUNDRED) {
453         regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_CLK_25M);
454     } else if (speed == RK_SPEED_ONE_THOUSAND) {
455         regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_CLK_125M);
456     } else {
457         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
458     }
459 }
460 
rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)461 static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
462 {
463     struct device *dev = &bsp_priv->pdev->dev;
464 
465     if (IS_ERR(bsp_priv->grf)) {
466         dev_err(dev, "Missing rockchip,grf property\n");
467         return;
468     }
469 
470     if (speed == RK_SPEED_TEN) {
471         regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_RMII_CLK_2_5M | RK3128_GMAC_SPEED_10M);
472     } else if (speed == RK_SPEED_ONE_HUNDRED) {
473         regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, RK3128_GMAC_RMII_CLK_25M | RK3128_GMAC_SPEED_100M);
474     } else {
475         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
476     }
477 }
478 
479 static const struct rk_gmac_ops rk3128_ops = {
480     .set_to_rgmii = rk3128_set_to_rgmii,
481     .set_to_rmii = rk3128_set_to_rmii,
482     .set_rgmii_speed = rk3128_set_rgmii_speed,
483     .set_rmii_speed = rk3128_set_rmii_speed,
484 };
485 
486 #define RK3228_GRF_MAC_CON0 0x0900
487 #define RK3228_GRF_MAC_CON1 0x0904
488 
489 #define RK3228_GRF_CON_MUX 0x50
490 
491 /* RK3228_GRF_MAC_CON0 */
492 #define RK3228_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
493 #define RK3228_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
494 
495 /* RK3228_GRF_MAC_CON1 */
496 #define RK3228_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
497 #define RK3228_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
498 #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
499 #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
500 #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
501 #define RK3228_GMAC_SPEED_100M GRF_BIT(2)
502 #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
503 #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
504 #define RK3228_GMAC_CLK_125M (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
505 #define RK3228_GMAC_CLK_25M (GRF_BIT(8) | GRF_BIT(9))
506 #define RK3228_GMAC_CLK_2_5M (GRF_CLR_BIT(8) | GRF_BIT(9))
507 #define RK3228_GMAC_RMII_MODE GRF_BIT(10)
508 #define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
509 #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
510 #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
511 #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
512 #define RK3228_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
513 
514 /* RK3228_GRF_COM_MUX */
515 #define RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY GRF_BIT(15)
516 
rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)517 static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
518 {
519     struct device *dev = &bsp_priv->pdev->dev;
520 
521     if (IS_ERR(bsp_priv->grf)) {
522         dev_err(dev, "Missing rockchip,grf property\n");
523         return;
524     }
525 
526     regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
527                  RK3228_GMAC_PHY_INTF_SEL_RGMII | RK3228_GMAC_RMII_MODE_CLR | DELAY_ENABLE(RK3228, tx_delay, rx_delay));
528 
529     regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0, DELAY_VALUE(RK3128, tx_delay, rx_delay));
530 }
531 
rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)532 static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
533 {
534     struct device *dev = &bsp_priv->pdev->dev;
535 
536     if (IS_ERR(bsp_priv->grf)) {
537         dev_err(dev, "Missing rockchip,grf property\n");
538         return;
539     }
540 
541     regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, RK3228_GMAC_PHY_INTF_SEL_RMII | RK3228_GMAC_RMII_MODE);
542 
543     /* set MAC to RMII mode */
544     regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
545 }
546 
rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)547 static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
548 {
549     struct device *dev = &bsp_priv->pdev->dev;
550 
551     if (IS_ERR(bsp_priv->grf)) {
552         dev_err(dev, "Missing rockchip,grf property\n");
553         return;
554     }
555 
556     if (speed == RK_SPEED_TEN) {
557         regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, RK3228_GMAC_CLK_2_5M);
558     } else if (speed == RK_SPEED_ONE_HUNDRED) {
559         regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, RK3228_GMAC_CLK_25M);
560     } else if (speed == RK_SPEED_ONE_HUNDRED) {
561         regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, RK3228_GMAC_CLK_125M);
562     } else {
563         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
564     }
565 }
566 
rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)567 static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
568 {
569     struct device *dev = &bsp_priv->pdev->dev;
570 
571     if (IS_ERR(bsp_priv->grf)) {
572         dev_err(dev, "Missing rockchip,grf property\n");
573         return;
574     }
575 
576     if (speed == RK_SPEED_TEN) {
577         regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_SPEED_10M);
578     } else if (speed == RK_SPEED_ONE_HUNDRED) {
579         regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_SPEED_100M);
580     } else {
581         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
582     }
583 }
584 
rk3228_integrated_phy_powerup(struct rk_priv_data *priv)585 static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
586 {
587     regmap_write(priv->grf, RK3228_GRF_CON_MUX, RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
588 }
589 
590 static const struct rk_gmac_ops rk3228_ops = {
591     .set_to_rgmii = rk3228_set_to_rgmii,
592     .set_to_rmii = rk3228_set_to_rmii,
593     .set_rgmii_speed = rk3228_set_rgmii_speed,
594     .set_rmii_speed = rk3228_set_rmii_speed,
595     .integrated_phy_powerup = rk3228_integrated_phy_powerup,
596 };
597 
598 #define RK3288_GRF_SOC_CON1 0x0248
599 #define RK3288_GRF_SOC_CON3 0x0250
600 
601 /* RK3288_GRF_SOC_CON1 */
602 #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
603 #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
604 #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
605 #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
606 #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
607 #define RK3288_GMAC_SPEED_100M GRF_BIT(10)
608 #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
609 #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
610 #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
611 #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
612 #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
613 #define RK3288_GMAC_RMII_MODE GRF_BIT(14)
614 #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
615 
616 /* RK3288_GRF_SOC_CON3 */
617 #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
618 #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
619 #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
620 #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
621 #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
622 #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
623 
rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)624 static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
625 {
626     struct device *dev = &bsp_priv->pdev->dev;
627 
628     if (IS_ERR(bsp_priv->grf)) {
629         dev_err(dev, "Missing rockchip,grf property\n");
630         return;
631     }
632 
633     regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_PHY_INTF_SEL_RGMII | RK3288_GMAC_RMII_MODE_CLR);
634     regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
635                  DELAY_ENABLE(RK3288, tx_delay, rx_delay) | DELAY_VALUE(RK3288, tx_delay, rx_delay));
636 }
637 
rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)638 static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
639 {
640     struct device *dev = &bsp_priv->pdev->dev;
641 
642     if (IS_ERR(bsp_priv->grf)) {
643         dev_err(dev, "Missing rockchip,grf property\n");
644         return;
645     }
646 
647     regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
648 }
649 
rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)650 static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
651 {
652     struct device *dev = &bsp_priv->pdev->dev;
653 
654     if (IS_ERR(bsp_priv->grf)) {
655         dev_err(dev, "Missing rockchip,grf property\n");
656         return;
657     }
658 
659     if (speed == RK_SPEED_TEN) {
660         regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_CLK_2_5M);
661     } else if (speed == RK_SPEED_ONE_HUNDRED) {
662         regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_CLK_25M);
663     } else if (speed == RK_SPEED_ONE_THOUSAND) {
664         regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_CLK_125M);
665     } else {
666         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
667     }
668 }
669 
rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)670 static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
671 {
672     struct device *dev = &bsp_priv->pdev->dev;
673 
674     if (IS_ERR(bsp_priv->grf)) {
675         dev_err(dev, "Missing rockchip,grf property\n");
676         return;
677     }
678 
679     if (speed == RK_SPEED_TEN) {
680         regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_RMII_CLK_2_5M | RK3288_GMAC_SPEED_10M);
681     } else if (speed == RK_SPEED_ONE_HUNDRED) {
682         regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, RK3288_GMAC_RMII_CLK_25M | RK3288_GMAC_SPEED_100M);
683     } else {
684         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
685     }
686 }
687 
688 static const struct rk_gmac_ops rk3288_ops = {
689     .set_to_rgmii = rk3288_set_to_rgmii,
690     .set_to_rmii = rk3288_set_to_rmii,
691     .set_rgmii_speed = rk3288_set_rgmii_speed,
692     .set_rmii_speed = rk3288_set_rmii_speed,
693 };
694 
695 #define RK3308_GRF_MAC_CON0 0x04a0
696 
697 /* Rk3308_GRF_MAC_CON1 */
698 #define RK3308_MAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(2) | GRF_CLR_BIT(3) | GRF_BIT(4))
699 #define RK3308_MAC_SPEED_10M GRF_CLR_BIT(0)
700 #define Rk3308_MAC_SPEED_100M GRF_BIT(0)
701 
rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)702 static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
703 {
704     struct device *dev = &bsp_priv->pdev->dev;
705 
706     if (IS_ERR(bsp_priv->grf)) {
707         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
708         return;
709     }
710 
711     regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0, RK3308_MAC_PHY_INTF_SEL_RMII);
712 }
713 
rk3308_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)714 static void rk3308_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
715 {
716     struct device *dev = &bsp_priv->pdev->dev;
717     int ret;
718 
719     if (IS_ERR(bsp_priv->clk_mac_speed)) {
720         dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
721         return;
722     }
723 
724     if (speed == RK_SPEED_TEN) {
725         regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0, RK3308_MAC_SPEED_10M);
726 
727         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_ONE);
728         if (ret) {
729             dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n", __func__, ret);
730         }
731     } else if (speed == RK_SPEED_ONE_HUNDRED) {
732         regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0, Rk3308_MAC_SPEED_100M);
733 
734         ret = clk_set_rate(bsp_priv->clk_mac_speed, RK_CLK_MAC_SPEED_TWO);
735         if (ret) {
736             dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n", __func__, ret);
737         }
738     } else {
739         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
740     }
741 }
742 
743 static const struct rk_gmac_ops rk3308_ops = {
744     .set_to_rmii = rk3308_set_to_rmii,
745     .set_rmii_speed = rk3308_set_rmii_speed,
746 };
747 
748 #define RK3328_GRF_MAC_CON0 0x0900
749 #define RK3328_GRF_MAC_CON1 0x0904
750 #define RK3328_GRF_MAC_CON2 0x0908
751 #define RK3328_GRF_MACPHY_CON1 0xb04
752 
753 /* RK3328_GRF_MAC_CON0 */
754 #define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
755 #define RK3328_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
756 
757 /* RK3328_GRF_MAC_CON1 */
758 #define RK3328_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
759 #define RK3328_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
760 #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
761 #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
762 #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
763 #define RK3328_GMAC_SPEED_100M GRF_BIT(2)
764 #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
765 #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
766 #define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
767 #define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
768 #define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
769 #define RK3328_GMAC_RMII_MODE GRF_BIT(9)
770 #define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
771 #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
772 #define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
773 #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
774 #define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
775 
776 /* RK3328_GRF_MACPHY_CON1 */
777 #define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
778 
rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)779 static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
780 {
781     struct device *dev = &bsp_priv->pdev->dev;
782 
783     if (IS_ERR(bsp_priv->grf)) {
784         dev_err(dev, "Missing rockchip,grf property\n");
785         return;
786     }
787 
788     regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
789                  RK3328_GMAC_PHY_INTF_SEL_RGMII | RK3328_GMAC_RMII_MODE_CLR | DELAY_ENABLE(RK3328, tx_delay, rx_delay));
790 
791     regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0, DELAY_VALUE(RK3328, tx_delay, rx_delay));
792 }
793 
rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)794 static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
795 {
796     struct device *dev = &bsp_priv->pdev->dev;
797     unsigned int reg;
798 
799     if (IS_ERR(bsp_priv->grf)) {
800         dev_err(dev, "Missing rockchip,grf property\n");
801         return;
802     }
803 
804     reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
805 
806     regmap_write(bsp_priv->grf, reg, RK3328_GMAC_PHY_INTF_SEL_RMII | RK3328_GMAC_RMII_MODE);
807 }
808 
rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)809 static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
810 {
811     struct device *dev = &bsp_priv->pdev->dev;
812 
813     if (IS_ERR(bsp_priv->grf)) {
814         dev_err(dev, "Missing rockchip,grf property\n");
815         return;
816     }
817 
818     if (speed == RK_SPEED_TEN) {
819         regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, RK3328_GMAC_CLK_2_5M);
820     } else if (speed == RK_SPEED_ONE_HUNDRED) {
821         regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, RK3328_GMAC_CLK_25M);
822     } else if (speed == RK_SPEED_ONE_THOUSAND) {
823         regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, RK3328_GMAC_CLK_125M);
824     } else {
825         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
826     }
827 }
828 
rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)829 static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
830 {
831     struct device *dev = &bsp_priv->pdev->dev;
832     unsigned int reg;
833 
834     if (IS_ERR(bsp_priv->grf)) {
835         dev_err(dev, "Missing rockchip,grf property\n");
836         return;
837     }
838 
839     reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
840 
841     if (speed == RK_SPEED_TEN) {
842         regmap_write(bsp_priv->grf, reg, RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_SPEED_10M);
843     } else if (speed == RK_SPEED_ONE_HUNDRED) {
844         regmap_write(bsp_priv->grf, reg, RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_SPEED_100M);
845     } else {
846         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
847     }
848 }
849 
rk3328_integrated_phy_powerup(struct rk_priv_data *priv)850 static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
851 {
852     regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1, RK3328_MACPHY_RMII_MODE);
853 }
854 
855 static const struct rk_gmac_ops rk3328_ops = {
856     .set_to_rgmii = rk3328_set_to_rgmii,
857     .set_to_rmii = rk3328_set_to_rmii,
858     .set_rgmii_speed = rk3328_set_rgmii_speed,
859     .set_rmii_speed = rk3328_set_rmii_speed,
860     .integrated_phy_powerup = rk3328_integrated_phy_powerup,
861 };
862 
863 #define RK3366_GRF_SOC_CON6 0x0418
864 #define RK3366_GRF_SOC_CON7 0x041c
865 
866 /* RK3366_GRF_SOC_CON6 */
867 #define RK3366_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | GRF_CLR_BIT(11))
868 #define RK3366_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | GRF_BIT(11))
869 #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
870 #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
871 #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
872 #define RK3366_GMAC_SPEED_100M GRF_BIT(7)
873 #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
874 #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
875 #define RK3366_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
876 #define RK3366_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
877 #define RK3366_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
878 #define RK3366_GMAC_RMII_MODE GRF_BIT(6)
879 #define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
880 
881 /* RK3366_GRF_SOC_CON7 */
882 #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
883 #define RK3366_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
884 #define RK3366_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
885 #define RK3366_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
886 #define RK3366_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
887 #define RK3366_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
888 
rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)889 static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
890 {
891     struct device *dev = &bsp_priv->pdev->dev;
892 
893     if (IS_ERR(bsp_priv->grf)) {
894         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
895         return;
896     }
897 
898     regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_PHY_INTF_SEL_RGMII | RK3366_GMAC_RMII_MODE_CLR);
899     regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
900                  DELAY_ENABLE(RK3366, tx_delay, rx_delay) | DELAY_VALUE(RK3366, tx_delay, rx_delay));
901 }
902 
rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)903 static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
904 {
905     struct device *dev = &bsp_priv->pdev->dev;
906 
907     if (IS_ERR(bsp_priv->grf)) {
908         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
909         return;
910     }
911 
912     regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
913 }
914 
rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)915 static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
916 {
917     struct device *dev = &bsp_priv->pdev->dev;
918 
919     if (IS_ERR(bsp_priv->grf)) {
920         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
921         return;
922     }
923 
924     if (speed == RK_SPEED_TEN) {
925         regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_CLK_2_5M);
926     } else if (speed == RK_SPEED_ONE_HUNDRED) {
927         regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_CLK_25M);
928     } else if (speed == RK_SPEED_ONE_THOUSAND) {
929         regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_CLK_125M);
930     } else {
931         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
932     }
933 }
934 
rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)935 static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
936 {
937     struct device *dev = &bsp_priv->pdev->dev;
938 
939     if (IS_ERR(bsp_priv->grf)) {
940         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
941         return;
942     }
943 
944     if (speed == RK_SPEED_TEN) {
945         regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_RMII_CLK_2_5M | RK3366_GMAC_SPEED_10M);
946     } else if (speed == RK_SPEED_ONE_HUNDRED) {
947         regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, RK3366_GMAC_RMII_CLK_25M | RK3366_GMAC_SPEED_100M);
948     } else {
949         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
950     }
951 }
952 
953 static const struct rk_gmac_ops rk3366_ops = {
954     .set_to_rgmii = rk3366_set_to_rgmii,
955     .set_to_rmii = rk3366_set_to_rmii,
956     .set_rgmii_speed = rk3366_set_rgmii_speed,
957     .set_rmii_speed = rk3366_set_rmii_speed,
958 };
959 
960 #define RK3368_GRF_SOC_CON15 0x043c
961 #define RK3368_GRF_SOC_CON16 0x0440
962 
963 /* RK3368_GRF_SOC_CON15 */
964 #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | GRF_CLR_BIT(11))
965 #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | GRF_BIT(11))
966 #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
967 #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
968 #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
969 #define RK3368_GMAC_SPEED_100M GRF_BIT(7)
970 #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
971 #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
972 #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
973 #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
974 #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
975 #define RK3368_GMAC_RMII_MODE GRF_BIT(6)
976 #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
977 
978 /* RK3368_GRF_SOC_CON16 */
979 #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
980 #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
981 #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
982 #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
983 #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
984 #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
985 
rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)986 static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
987 {
988     struct device *dev = &bsp_priv->pdev->dev;
989 
990     if (IS_ERR(bsp_priv->grf)) {
991         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
992         return;
993     }
994 
995     regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_PHY_INTF_SEL_RGMII | RK3368_GMAC_RMII_MODE_CLR);
996     regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
997                  DELAY_ENABLE(RK3368, tx_delay, rx_delay) | DELAY_VALUE(RK3368, tx_delay, rx_delay));
998 }
999 
rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)1000 static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
1001 {
1002     struct device *dev = &bsp_priv->pdev->dev;
1003 
1004     if (IS_ERR(bsp_priv->grf)) {
1005         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1006         return;
1007     }
1008 
1009     regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
1010 }
1011 
rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)1012 static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1013 {
1014     struct device *dev = &bsp_priv->pdev->dev;
1015 
1016     if (IS_ERR(bsp_priv->grf)) {
1017         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1018         return;
1019     }
1020 
1021     if (speed == RK_SPEED_TEN) {
1022         regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_CLK_2_5M);
1023     } else if (speed == RK_SPEED_ONE_HUNDRED) {
1024         regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_CLK_25M);
1025     } else if (speed == RK_SPEED_ONE_THOUSAND) {
1026         regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_CLK_125M);
1027     } else {
1028         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
1029     }
1030 }
1031 
rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)1032 static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1033 {
1034     struct device *dev = &bsp_priv->pdev->dev;
1035 
1036     if (IS_ERR(bsp_priv->grf)) {
1037         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1038         return;
1039     }
1040 
1041     if (speed == RK_SPEED_TEN) {
1042         regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_RMII_CLK_2_5M | RK3368_GMAC_SPEED_10M);
1043     } else if (speed == RK_SPEED_ONE_HUNDRED) {
1044         regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, RK3368_GMAC_RMII_CLK_25M | RK3368_GMAC_SPEED_100M);
1045     } else {
1046         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1047     }
1048 }
1049 
1050 static const struct rk_gmac_ops rk3368_ops = {
1051     .set_to_rgmii = rk3368_set_to_rgmii,
1052     .set_to_rmii = rk3368_set_to_rmii,
1053     .set_rgmii_speed = rk3368_set_rgmii_speed,
1054     .set_rmii_speed = rk3368_set_rmii_speed,
1055 };
1056 
1057 #define RK3399_GRF_SOC_CON5 0xc214
1058 #define RK3399_GRF_SOC_CON6 0xc218
1059 
1060 /* RK3399_GRF_SOC_CON5 */
1061 #define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | GRF_CLR_BIT(11))
1062 #define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | GRF_BIT(11))
1063 #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
1064 #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
1065 #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
1066 #define RK3399_GMAC_SPEED_100M GRF_BIT(7)
1067 #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
1068 #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
1069 #define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
1070 #define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
1071 #define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
1072 #define RK3399_GMAC_RMII_MODE GRF_BIT(6)
1073 #define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
1074 
1075 /* RK3399_GRF_SOC_CON6 */
1076 #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
1077 #define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
1078 #define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
1079 #define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
1080 #define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
1081 #define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
1082 
rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)1083 static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
1084 {
1085     struct device *dev = &bsp_priv->pdev->dev;
1086 
1087     if (IS_ERR(bsp_priv->grf)) {
1088         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1089         return;
1090     }
1091 
1092     regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_PHY_INTF_SEL_RGMII | RK3399_GMAC_RMII_MODE_CLR);
1093     regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
1094                  DELAY_ENABLE(RK3399, tx_delay, rx_delay) | DELAY_VALUE(RK3399, tx_delay, rx_delay));
1095 }
1096 
rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)1097 static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
1098 {
1099     struct device *dev = &bsp_priv->pdev->dev;
1100 
1101     if (IS_ERR(bsp_priv->grf)) {
1102         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1103         return;
1104     }
1105 
1106     regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
1107 }
1108 
rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)1109 static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1110 {
1111     struct device *dev = &bsp_priv->pdev->dev;
1112 
1113     if (IS_ERR(bsp_priv->grf)) {
1114         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1115         return;
1116     }
1117 
1118     if (speed == RK_SPEED_TEN) {
1119         regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_CLK_2_5M);
1120     } else if (speed == RK_SPEED_ONE_HUNDRED) {
1121         regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_CLK_25M);
1122     } else if (speed == RK_SPEED_ONE_THOUSAND) {
1123         regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_CLK_125M);
1124     } else {
1125         dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
1126     }
1127 }
1128 
rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)1129 static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1130 {
1131     struct device *dev = &bsp_priv->pdev->dev;
1132 
1133     if (IS_ERR(bsp_priv->grf)) {
1134         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1135         return;
1136     }
1137 
1138     if (speed == RK_SPEED_TEN) {
1139         regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_RMII_CLK_2_5M | RK3399_GMAC_SPEED_10M);
1140     } else if (speed == RK_SPEED_ONE_HUNDRED) {
1141         regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, RK3399_GMAC_RMII_CLK_25M | RK3399_GMAC_SPEED_100M);
1142     } else {
1143         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1144     }
1145 }
1146 
1147 static const struct rk_gmac_ops rk3399_ops = {
1148     .set_to_rgmii = rk3399_set_to_rgmii,
1149     .set_to_rmii = rk3399_set_to_rmii,
1150     .set_rgmii_speed = rk3399_set_rgmii_speed,
1151     .set_rmii_speed = rk3399_set_rmii_speed,
1152 };
1153 
1154 #define RK3568_GRF_GMAC0_CON0 0X0380
1155 #define RK3568_GRF_GMAC0_CON1 0X0384
1156 #define RK3568_GRF_GMAC1_CON0 0X0388
1157 #define RK3568_GRF_GMAC1_CON1 0X038c
1158 
1159 /* RK3568_GRF_GMAC0_CON1 && RK3568_GRF_GMAC1_CON1 */
1160 #define RK3568_GMAC_GMII_MODE GRF_BIT(7)
1161 #define RK3568_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
1162 #define RK3568_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
1163 #define RK3568_GMAC_FLOW_CTRL GRF_BIT(3)
1164 #define RK3568_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
1165 #define RK3568_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
1166 #define RK3568_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
1167 #define RK3568_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
1168 #define RK3568_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
1169 
1170 /* RK3568_GRF_GMAC0_CON0 && RK3568_GRF_GMAC1_CON0 */
1171 #define RK3568_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
1172 #define RK3568_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
1173 
1174 #define RK3568_PIPE_GRF_XPCS_CON0 0X0040
1175 
1176 #define RK3568_PIPE_GRF_XPCS_QGMII_MAC_SEL GRF_BIT(0)
1177 #define RK3568_PIPE_GRF_XPCS_SGMII_MAC_SEL GRF_BIT(1)
1178 #define RK3568_PIPE_GRF_XPCS_PHY_READY GRF_BIT(2)
1179 
rk3568_set_to_sgmii(struct rk_priv_data *bsp_priv)1180 static void rk3568_set_to_sgmii(struct rk_priv_data *bsp_priv)
1181 {
1182     struct device *dev = &bsp_priv->pdev->dev;
1183     u32 offset_con1;
1184 
1185     if (IS_ERR(bsp_priv->grf)) {
1186         dev_err(dev, "%s: Missing rockchip,grfs property\n", __func__);
1187         return;
1188     }
1189 
1190     offset_con1 = bsp_priv->bus_id == 1 ? RK3568_GRF_GMAC1_CON1 : RK3568_GRF_GMAC0_CON1;
1191     regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_GMII_MODE);
1192 
1193     xpcs_setup(bsp_priv, PHY_INTERFACE_MODE_SGMII);
1194 }
1195 
rk3568_set_to_qsgmii(struct rk_priv_data *bsp_priv)1196 static void rk3568_set_to_qsgmii(struct rk_priv_data *bsp_priv)
1197 {
1198     struct device *dev = &bsp_priv->pdev->dev;
1199     u32 offset_con1;
1200 
1201     if (IS_ERR(bsp_priv->grf)) {
1202         dev_err(dev, "%s: Missing rockchip,grfs property\n", __func__);
1203         return;
1204     }
1205 
1206     offset_con1 = bsp_priv->bus_id == 1 ? RK3568_GRF_GMAC1_CON1 : RK3568_GRF_GMAC0_CON1;
1207     regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_GMII_MODE);
1208 
1209     xpcs_setup(bsp_priv, PHY_INTERFACE_MODE_QSGMII);
1210 }
1211 
rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)1212 static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
1213 {
1214     struct device *dev = &bsp_priv->pdev->dev;
1215     u32 offset_con0, offset_con1;
1216 
1217     if (IS_ERR(bsp_priv->grf)) {
1218         dev_err(dev, "Missing rockchip,grf property\n");
1219         return;
1220     }
1221 
1222     offset_con0 = (bsp_priv->bus_id == 1) ? RK3568_GRF_GMAC1_CON0 : RK3568_GRF_GMAC0_CON0;
1223     offset_con1 = (bsp_priv->bus_id == 1) ? RK3568_GRF_GMAC1_CON1 : RK3568_GRF_GMAC0_CON1;
1224 
1225     regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_PHY_INTF_SEL_RGMII | DELAY_ENABLE(RK3568, tx_delay, rx_delay));
1226 
1227     regmap_write(bsp_priv->grf, offset_con0, DELAY_VALUE(RK3568, tx_delay, rx_delay));
1228 }
1229 
rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)1230 static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
1231 {
1232     struct device *dev = &bsp_priv->pdev->dev;
1233     u32 offset_con1;
1234 
1235     if (IS_ERR(bsp_priv->grf)) {
1236         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1237         return;
1238     }
1239 
1240     offset_con1 = (bsp_priv->bus_id == 1) ? RK3568_GRF_GMAC1_CON1 : RK3568_GRF_GMAC0_CON1;
1241 
1242     regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_PHY_INTF_SEL_RMII);
1243 }
1244 
rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)1245 static void rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1246 {
1247     struct device *dev = &bsp_priv->pdev->dev;
1248     unsigned long rate;
1249     int ret;
1250 
1251     switch (speed) {
1252         case RK_SPEED_TEN:
1253             rate = RK_CLK_MAC_SPEED_ONE;
1254             break;
1255         case RK_SPEED_ONE_HUNDRED:
1256             rate = RK_CLK_MAC_SPEED_TWO;
1257             break;
1258         case RK_SPEED_ONE_THOUSAND:
1259             rate = RK_CLK_MAC_SPEED_THREE;
1260             break;
1261         default:
1262             dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1263             return;
1264     }
1265 
1266     ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
1267     if (ret) {
1268         dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n", __func__, rate, ret);
1269     }
1270 }
1271 
1272 static const struct rk_gmac_ops rk3568_ops = {
1273     .set_to_rgmii = rk3568_set_to_rgmii,
1274     .set_to_rmii = rk3568_set_to_rmii,
1275     .set_to_sgmii = rk3568_set_to_sgmii,
1276     .set_to_qsgmii = rk3568_set_to_qsgmii,
1277     .set_rgmii_speed = rk3568_set_gmac_speed,
1278     .set_rmii_speed = rk3568_set_gmac_speed,
1279 };
1280 
1281 /* sys_grf */
1282 #define RK3588_GRF_GMAC_CON7 0X031c
1283 #define RK3588_GRF_GMAC_CON8 0X0320
1284 #define RK3588_GRF_GMAC_CON9 0X0324
1285 
1286 #define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3)
1287 #define RK3588_GMAC_RXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 3)
1288 #define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2)
1289 #define RK3588_GMAC_TXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 2)
1290 
1291 #define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8)
1292 #define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0)
1293 
1294 /* php_grf */
1295 #define RK3588_GRF_GMAC_CON0 0X0008
1296 #define RK3588_GRF_CLK_CON1 0X0070
1297 
1298 #define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) (GRF_BIT(3 + (id)*6) | GRF_CLR_BIT(4 + (id)*6) | GRF_CLR_BIT(5 + (id)*6))
1299 #define RK3588_GMAC_PHY_INTF_SEL_RMII(id) (GRF_CLR_BIT(3 + (id)*6) | GRF_CLR_BIT(4 + (id)*6) | GRF_BIT(5 + (id)*6))
1300 
1301 #define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id))
1302 #define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id))
1303 
1304 #define RK3588_GMAC_CLK_SELET_CRU(id) GRF_BIT(5 * (id) + 4)
1305 #define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4)
1306 
1307 #define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2)
1308 #define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2)
1309 
1310 #define RK3588_GMAC_CLK_RGMII_DIV1(id) (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3))
1311 #define RK3588_GMAC_CLK_RGMII_DIV5(id) (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3))
1312 #define RK3588_GMAC_CLK_RGMII_DIV50(id) (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3))
1313 
1314 #define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
1315 #define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
1316 
rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)1317 static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
1318 {
1319     struct device *dev = &bsp_priv->pdev->dev;
1320     u32 offset_con, id = bsp_priv->bus_id;
1321 
1322     if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
1323         dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n");
1324         return;
1325     }
1326 
1327     offset_con = bsp_priv->bus_id == 1 ? RK3588_GRF_GMAC_CON9 : RK3588_GRF_GMAC_CON8;
1328 
1329     regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0, RK3588_GMAC_PHY_INTF_SEL_RGMII(id));
1330 
1331     regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, RK3588_GMAC_CLK_RGMII_MODE(id));
1332 
1333     regmap_write(bsp_priv->grf, RK3588_GRF_GMAC_CON7, DELAY_ENABLE_BY_ID(RK3588, tx_delay, rx_delay, id));
1334 
1335     regmap_write(bsp_priv->grf, offset_con, DELAY_VALUE(RK3588, tx_delay, rx_delay));
1336 }
1337 
rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)1338 static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
1339 {
1340     struct device *dev = &bsp_priv->pdev->dev;
1341 
1342     if (IS_ERR(bsp_priv->php_grf)) {
1343         dev_err(dev, "%s: Missing rockchip,php_grf property\n", __func__);
1344         return;
1345     }
1346 
1347     regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0, RK3588_GMAC_PHY_INTF_SEL_RMII(bsp_priv->bus_id));
1348 
1349     regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, RK3588_GMAC_CLK_RMII_MODE(bsp_priv->bus_id));
1350 }
1351 
rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)1352 static void rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1353 {
1354     struct device *dev = &bsp_priv->pdev->dev;
1355     unsigned int val = 0, id = bsp_priv->bus_id;
1356 
1357     switch (speed) {
1358         case RK_SPEED_TEN:
1359             if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1360                 val = RK3588_GMA_CLK_RMII_DIV20(id);
1361             } else {
1362                 val = RK3588_GMAC_CLK_RGMII_DIV50(id);
1363             }
1364             break;
1365         case RK_SPEED_ONE_HUNDRED:
1366             if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1367                 val = RK3588_GMA_CLK_RMII_DIV2(id);
1368             } else {
1369                 val = RK3588_GMAC_CLK_RGMII_DIV5(id);
1370             }
1371             break;
1372         case RK_SPEED_ONE_THOUSAND:
1373             if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII) {
1374                 val = RK3588_GMAC_CLK_RGMII_DIV1(id);
1375             } else {
1376                 goto err;
1377             }
1378             break;
1379         default:
1380             goto err;
1381     }
1382 
1383     regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
1384 
1385     return;
1386 err:
1387     dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1388 }
1389 
rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, bool enable)1390 static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, bool enable)
1391 {
1392     unsigned int val = input ? RK3588_GMAC_CLK_SELET_IO(bsp_priv->bus_id) : RK3588_GMAC_CLK_SELET_CRU(bsp_priv->bus_id);
1393 
1394     val |= enable ? RK3588_GMAC_CLK_RMII_NOGATE(bsp_priv->bus_id) : RK3588_GMAC_CLK_RMII_GATE(bsp_priv->bus_id);
1395 
1396     regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
1397 }
1398 
1399 static const struct rk_gmac_ops rk3588_ops = {
1400     .set_to_rgmii = rk3588_set_to_rgmii,
1401     .set_to_rmii = rk3588_set_to_rmii,
1402     .set_rgmii_speed = rk3588_set_gmac_speed,
1403     .set_rmii_speed = rk3588_set_gmac_speed,
1404     .set_clock_selection = rk3588_set_clock_selection,
1405 };
1406 
1407 #define RV1108_GRF_GMAC_CON0 0X0900
1408 
1409 /* RV1108_GRF_GMAC_CON0 */
1410 #define RV1108_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
1411 #define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
1412 #define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
1413 #define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
1414 #define RV1108_GMAC_SPEED_100M GRF_BIT(2)
1415 #define RV1108_GMAC_RMII_CLK_25M GRF_BIT(7)
1416 #define RV1108_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
1417 
rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)1418 static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
1419 {
1420     struct device *dev = &bsp_priv->pdev->dev;
1421 
1422     if (IS_ERR(bsp_priv->grf)) {
1423         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1424         return;
1425     }
1426 
1427     regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0, RV1108_GMAC_PHY_INTF_SEL_RMII);
1428 }
1429 
rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)1430 static void rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1431 {
1432     struct device *dev = &bsp_priv->pdev->dev;
1433 
1434     if (IS_ERR(bsp_priv->grf)) {
1435         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1436         return;
1437     }
1438 
1439     if (speed == RK_SPEED_TEN) {
1440         regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0, RV1108_GMAC_RMII_CLK_2_5M | RV1108_GMAC_SPEED_10M);
1441     } else if (speed == RK_SPEED_ONE_HUNDRED) {
1442         regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0, RV1108_GMAC_RMII_CLK_25M | RV1108_GMAC_SPEED_100M);
1443     } else {
1444         dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1445     }
1446 }
1447 
1448 static const struct rk_gmac_ops rv1108_ops = {
1449     .set_to_rmii = rv1108_set_to_rmii,
1450     .set_rmii_speed = rv1108_set_rmii_speed,
1451 };
1452 
1453 #define RV1126_GRF_GMAC_CON0 0X0070
1454 #define RV1126_GRF_GMAC_CON1 0X0074
1455 #define RV1126_GRF_GMAC_CON2 0X0078
1456 
1457 /* RV1126_GRF_GMAC_CON0 */
1458 #define RV1126_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
1459 #define RV1126_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
1460 #define RV1126_GMAC_FLOW_CTRL GRF_BIT(7)
1461 #define RV1126_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(7)
1462 #define RV1126_M0_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
1463 #define RV1126_M0_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
1464 #define RV1126_M0_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
1465 #define RV1126_M0_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
1466 #define RV1126_M1_GMAC_RXCLK_DLY_ENABLE GRF_BIT(3)
1467 #define RV1126_M1_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(3)
1468 #define RV1126_M1_GMAC_TXCLK_DLY_ENABLE GRF_BIT(2)
1469 #define RV1126_M1_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(2)
1470 
1471 /* RV1126_GRF_GMAC_CON1 && RV1126_GRF_GMAC_CON2 */
1472 #define RV1126_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
1473 #define RV1126_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
1474 
rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)1475 static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay)
1476 {
1477     struct device *dev = &bsp_priv->pdev->dev;
1478 
1479     if (IS_ERR(bsp_priv->grf)) {
1480         dev_err(dev, "Missing rockchip,grf property\n");
1481         return;
1482     }
1483 
1484     regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
1485                  RV1126_GMAC_PHY_INTF_SEL_RGMII | DELAY_ENABLE(RV1126_M0, tx_delay, rx_delay) |
1486                      DELAY_ENABLE(RV1126_M1, tx_delay, rx_delay));
1487 
1488     regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON1, DELAY_VALUE(RV1126, tx_delay, rx_delay));
1489 
1490     regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON2, DELAY_VALUE(RV1126, tx_delay, rx_delay));
1491 }
1492 
rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)1493 static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
1494 {
1495     struct device *dev = &bsp_priv->pdev->dev;
1496 
1497     if (IS_ERR(bsp_priv->grf)) {
1498         dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1499         return;
1500     }
1501 
1502     regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0, RV1126_GMAC_PHY_INTF_SEL_RMII);
1503 }
1504 
rv1126_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)1505 static void rv1126_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1506 {
1507     struct device *dev = &bsp_priv->pdev->dev;
1508     unsigned long rate;
1509     int ret;
1510 
1511     switch (speed) {
1512         case RK_SPEED_TEN:
1513             rate = RK_CLK_MAC_SPEED_ONE;
1514             break;
1515         case RK_SPEED_ONE_HUNDRED:
1516             rate = RK_CLK_MAC_SPEED_TWO;
1517             break;
1518         case RK_SPEED_ONE_THOUSAND:
1519             rate = RK_CLK_MAC_SPEED_THREE;
1520             break;
1521         default:
1522             dev_err(dev, "unknown speed value for RGMII speed=%d", speed);
1523             return;
1524     }
1525 
1526     ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
1527     if (ret) {
1528         dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n", __func__, rate, ret);
1529     }
1530 }
1531 
rv1126_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)1532 static void rv1126_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1533 {
1534     struct device *dev = &bsp_priv->pdev->dev;
1535     unsigned long rate;
1536     int ret;
1537 
1538     switch (speed) {
1539         case RK_SPEED_TEN:
1540             rate = RK_CLK_MAC_SPEED_ONE;
1541             break;
1542         case RK_SPEED_ONE_HUNDRED:
1543             rate = RK_CLK_MAC_SPEED_TWO;
1544             break;
1545         default:
1546             dev_err(dev, "unknown speed value for RGMII speed=%d", speed);
1547             return;
1548     }
1549 
1550     ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
1551     if (ret) {
1552         dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n", __func__, rate, ret);
1553     }
1554 }
1555 
1556 static const struct rk_gmac_ops rv1126_ops = {
1557     .set_to_rgmii = rv1126_set_to_rgmii,
1558     .set_to_rmii = rv1126_set_to_rmii,
1559     .set_rgmii_speed = rv1126_set_rgmii_speed,
1560     .set_rmii_speed = rv1126_set_rmii_speed,
1561 };
1562 
1563 #define RK_GRF_MACPHY_CON0 0xb00
1564 #define RK_GRF_MACPHY_CON1 0xb04
1565 #define RK_GRF_MACPHY_CON2 0xb08
1566 #define RK_GRF_MACPHY_CON3 0xb0c
1567 
1568 #define RK_MACPHY_ENABLE GRF_BIT(0)
1569 #define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
1570 #define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
1571 #define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
1572 #define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
1573 #define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
1574 
rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)1575 static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
1576 {
1577     if (priv->ops->integrated_phy_powerup) {
1578         priv->ops->integrated_phy_powerup(priv);
1579     }
1580 
1581     regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
1582     regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
1583 
1584     regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
1585     regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
1586 
1587     if (priv->phy_reset) {
1588         /* PHY needs to be disabled before trying to reset it */
1589         regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
1590         if (priv->phy_reset) {
1591             reset_control_assert(priv->phy_reset);
1592         }
1593         usleep_range(RK_SLEEP_RANGE_TEN, RK_SLEEP_RANGE_TWENTY);
1594         if (priv->phy_reset) {
1595             reset_control_deassert(priv->phy_reset);
1596         }
1597         usleep_range(RK_SLEEP_RANGE_TEN, RK_SLEEP_RANGE_TWENTY);
1598         regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
1599         msleep(RK_DELAY_COUNT_THIRTY);
1600     }
1601 }
1602 
rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)1603 static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
1604 {
1605     regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
1606     if (priv->phy_reset) {
1607         reset_control_assert(priv->phy_reset);
1608     }
1609 }
1610 
rk_gmac_clk_init(struct plat_stmmacenet_data *plat)1611 static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
1612 {
1613     struct rk_priv_data *bsp_priv = plat->bsp_priv;
1614     struct device *dev = &bsp_priv->pdev->dev;
1615     int ret;
1616 
1617     bsp_priv->clk_enabled = false;
1618 
1619     bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
1620     if (IS_ERR(bsp_priv->mac_clk_rx)) {
1621         dev_err(dev, "cannot get clock %s\n", "mac_clk_rx");
1622     }
1623 
1624     bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
1625     if (IS_ERR(bsp_priv->mac_clk_tx)) {
1626         dev_err(dev, "cannot get clock %s\n", "mac_clk_tx");
1627     }
1628 
1629     bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
1630     if (IS_ERR(bsp_priv->aclk_mac)) {
1631         dev_err(dev, "cannot get clock %s\n", "aclk_mac");
1632     }
1633 
1634     bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
1635     if (IS_ERR(bsp_priv->pclk_mac)) {
1636         dev_err(dev, "cannot get clock %s\n", "pclk_mac");
1637     }
1638 
1639     bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
1640     if (IS_ERR(bsp_priv->clk_mac)) {
1641         dev_err(dev, "cannot get clock %s\n", "stmmaceth");
1642     }
1643 
1644     if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1645         bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
1646         if (IS_ERR(bsp_priv->clk_mac_ref)) {
1647             dev_err(dev, "cannot get clock %s\n", "clk_mac_ref");
1648         }
1649 
1650         if (!bsp_priv->clock_input) {
1651             bsp_priv->clk_mac_refout = devm_clk_get(dev, "clk_mac_refout");
1652             if (IS_ERR(bsp_priv->clk_mac_refout)) {
1653                 dev_err(dev, "cannot get clock %s\n", "clk_mac_refout");
1654             }
1655         }
1656     } else if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_SGMII || bsp_priv->phy_iface == PHY_INTERFACE_MODE_QSGMII) {
1657         bsp_priv->pclk_xpcs = devm_clk_get(dev, "pclk_xpcs");
1658         if (IS_ERR(bsp_priv->pclk_xpcs)) {
1659             dev_err(dev, "cannot get clock %s\n", "pclk_xpcs");
1660         }
1661     }
1662 
1663     bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed");
1664     if (IS_ERR(bsp_priv->clk_mac_speed)) {
1665         dev_err(dev, "cannot get clock %s\n", "clk_mac_speed");
1666     }
1667 
1668     if (bsp_priv->clock_input) {
1669         dev_info(dev, "clock input from PHY\n");
1670     } else {
1671         if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1672             clk_set_rate(bsp_priv->clk_mac, RK_CLK_MAC_SPEED_FOUR);
1673         }
1674     }
1675 
1676     if (plat->phy_node) {
1677         bsp_priv->clk_phy = of_clk_get(plat->phy_node, 0);
1678         /* If it is not integrated_phy, clk_phy is optional */
1679         if (bsp_priv->integrated_phy) {
1680             if (IS_ERR(bsp_priv->clk_phy)) {
1681                 ret = PTR_ERR(bsp_priv->clk_phy);
1682                 dev_err(dev, "Cannot get PHY clock: %d\n", ret);
1683                 return -EINVAL;
1684             }
1685             clk_set_rate(bsp_priv->clk_phy, RK_CLK_MAC_SPEED_FOUR);
1686         }
1687     }
1688 
1689     return 0;
1690 }
1691 
gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)1692 static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
1693 {
1694     int phy_iface = bsp_priv->phy_iface;
1695 
1696     if (enable) {
1697         if (!bsp_priv->clk_enabled) {
1698             if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1699                 if (!IS_ERR(bsp_priv->mac_clk_rx)) {
1700                     clk_prepare_enable(bsp_priv->mac_clk_rx);
1701                 }
1702 
1703                 if (!IS_ERR(bsp_priv->clk_mac_ref)) {
1704                     clk_prepare_enable(bsp_priv->clk_mac_ref);
1705                 }
1706 
1707                 if (!IS_ERR(bsp_priv->clk_mac_refout)) {
1708                     clk_prepare_enable(bsp_priv->clk_mac_refout);
1709                 }
1710             }
1711 
1712             if (!IS_ERR(bsp_priv->clk_phy)) {
1713                 clk_prepare_enable(bsp_priv->clk_phy);
1714             }
1715 
1716             if (!IS_ERR(bsp_priv->aclk_mac)) {
1717                 clk_prepare_enable(bsp_priv->aclk_mac);
1718             }
1719 
1720             if (!IS_ERR(bsp_priv->pclk_mac)) {
1721                 clk_prepare_enable(bsp_priv->pclk_mac);
1722             }
1723 
1724             if (!IS_ERR(bsp_priv->mac_clk_tx)) {
1725                 clk_prepare_enable(bsp_priv->mac_clk_tx);
1726             }
1727 
1728             if (!IS_ERR(bsp_priv->clk_mac_speed)) {
1729                 clk_prepare_enable(bsp_priv->clk_mac_speed);
1730             }
1731 
1732             if (!IS_ERR(bsp_priv->pclk_xpcs)) {
1733                 clk_prepare_enable(bsp_priv->pclk_xpcs);
1734             }
1735 
1736             if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) {
1737                 bsp_priv->ops->set_clock_selection(bsp_priv, bsp_priv->clock_input, true);
1738             }
1739 
1740             /**
1741              * if (!IS_ERR(bsp_priv->clk_mac))
1742              *    clk_prepare_enable(bsp_priv->clk_mac);
1743              */
1744             usleep_range(RK_SLEEP_RANGE_ONE_HUNDRED, RK_SLEEP_RANGE_TWO_HUNDRED);
1745             bsp_priv->clk_enabled = true;
1746         }
1747     } else {
1748         if (bsp_priv->clk_enabled) {
1749             if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1750                 clk_disable_unprepare(bsp_priv->mac_clk_rx);
1751 
1752                 clk_disable_unprepare(bsp_priv->clk_mac_ref);
1753 
1754                 clk_disable_unprepare(bsp_priv->clk_mac_refout);
1755             }
1756 
1757             clk_disable_unprepare(bsp_priv->clk_phy);
1758 
1759             clk_disable_unprepare(bsp_priv->aclk_mac);
1760 
1761             clk_disable_unprepare(bsp_priv->pclk_mac);
1762 
1763             clk_disable_unprepare(bsp_priv->mac_clk_tx);
1764 
1765             clk_disable_unprepare(bsp_priv->clk_mac_speed);
1766 
1767             clk_disable_unprepare(bsp_priv->pclk_xpcs);
1768 
1769             if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) {
1770                 bsp_priv->ops->set_clock_selection(bsp_priv, bsp_priv->clock_input, false);
1771             }
1772             /**
1773              * if (!IS_ERR(bsp_priv->clk_mac))
1774              *    clk_disable_unprepare(bsp_priv->clk_mac);
1775              */
1776             bsp_priv->clk_enabled = false;
1777         }
1778     }
1779 
1780     return 0;
1781 }
1782 
rk_gmac_phy_power_on(struct rk_priv_data *bsp_priv, bool enable)1783 static int rk_gmac_phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
1784 {
1785     struct regulator *ldo = bsp_priv->regulator;
1786     int ret;
1787     struct device *dev = &bsp_priv->pdev->dev;
1788 
1789     if (!ldo) {
1790         return 0;
1791     }
1792 
1793     if (enable) {
1794         ret = regulator_enable(ldo);
1795         if (ret) {
1796             dev_err(dev, "fail to enable phy-supply\n");
1797         }
1798     } else {
1799         ret = regulator_disable(ldo);
1800         if (ret) {
1801             dev_err(dev, "fail to disable phy-supply\n");
1802         }
1803     }
1804 
1805     return 0;
1806 }
1807 
rk_gmac_setup(struct platform_device *pdev, struct plat_stmmacenet_data *plat, const struct rk_gmac_ops *ops)1808 static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev, struct plat_stmmacenet_data *plat,
1809                                           const struct rk_gmac_ops *ops)
1810 {
1811     struct rk_priv_data *bsp_priv;
1812     struct device *dev = &pdev->dev;
1813     int ret;
1814     const char *strings = NULL;
1815     int value;
1816 
1817     bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
1818     if (!bsp_priv) {
1819         return ERR_PTR(-ENOMEM);
1820     }
1821 
1822     of_get_phy_mode(dev->of_node, &bsp_priv->phy_iface);
1823     bsp_priv->ops = ops;
1824     bsp_priv->bus_id = plat->bus_id;
1825 
1826     bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
1827     if (IS_ERR(bsp_priv->regulator)) {
1828         if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
1829             dev_err(dev, "phy regulator is not available yet, deferred probing\n");
1830             return ERR_PTR(-EPROBE_DEFER);
1831         }
1832         dev_err(dev, "no regulator found\n");
1833         bsp_priv->regulator = NULL;
1834     }
1835 
1836     ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
1837     if (ret) {
1838         dev_err(dev, "Can not read property: clock_in_out.\n");
1839         bsp_priv->clock_input = true;
1840     } else {
1841         dev_info(dev, "clock input or output? (%s).\n", strings);
1842         if (!strcmp(strings, "input")) {
1843             bsp_priv->clock_input = true;
1844         } else {
1845             bsp_priv->clock_input = false;
1846         }
1847     }
1848 
1849     ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
1850     if (ret) {
1851         bsp_priv->tx_delay = -1;
1852         dev_err(dev, "Can not read property: tx_delay.");
1853         dev_err(dev, "set tx_delay to 0x%x\n", bsp_priv->tx_delay);
1854     } else {
1855         dev_info(dev, "TX delay(0x%x).\n", value);
1856         bsp_priv->tx_delay = value;
1857     }
1858 
1859     ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
1860     if (ret) {
1861         bsp_priv->rx_delay = -1;
1862         dev_err(dev, "Can not read property: rx_delay.");
1863         dev_err(dev, "set rx_delay to 0x%x\n", bsp_priv->rx_delay);
1864     } else {
1865         dev_info(dev, "RX delay(0x%x).\n", value);
1866         bsp_priv->rx_delay = value;
1867     }
1868 
1869     bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf");
1870     bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,php_grf");
1871     bsp_priv->xpcs = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,xpcs");
1872     if (!IS_ERR(bsp_priv->xpcs)) {
1873         struct phy *comphy;
1874 
1875         comphy = devm_of_phy_get(&pdev->dev, dev->of_node, NULL);
1876         if (IS_ERR(comphy)) {
1877             dev_err(dev, "devm_of_phy_get error\n");
1878         }
1879         ret = phy_init(comphy);
1880         if (ret) {
1881             dev_err(dev, "phy_init error\n");
1882         }
1883     }
1884 
1885     if (plat->phy_node) {
1886         bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node, "phy-is-integrated");
1887         if (bsp_priv->integrated_phy) {
1888             bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
1889             if (IS_ERR(bsp_priv->phy_reset)) {
1890                 dev_err(&pdev->dev, "No PHY reset control found.\n");
1891                 bsp_priv->phy_reset = NULL;
1892             }
1893         }
1894     }
1895     dev_info(dev, "integrated PHY? (%s).\n", bsp_priv->integrated_phy ? "yes" : "no");
1896 
1897     bsp_priv->pdev = pdev;
1898 
1899     return bsp_priv;
1900 }
1901 
rk_gmac_powerup(struct rk_priv_data *bsp_priv)1902 static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
1903 {
1904     int ret;
1905     struct device *dev = &bsp_priv->pdev->dev;
1906 
1907     ret = gmac_clk_enable(bsp_priv, true);
1908     if (ret) {
1909         return ret;
1910     }
1911 
1912     /* rmii or rgmii */
1913     switch (bsp_priv->phy_iface) {
1914         case PHY_INTERFACE_MODE_RGMII:
1915             dev_info(dev, "init for RGMII\n");
1916             if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) {
1917                 bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, bsp_priv->rx_delay);
1918             }
1919             break;
1920         case PHY_INTERFACE_MODE_RGMII_ID:
1921             dev_info(dev, "init for RGMII_ID\n");
1922             if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) {
1923                 bsp_priv->ops->set_to_rgmii(bsp_priv, -1, -1);
1924             }
1925             break;
1926         case PHY_INTERFACE_MODE_RGMII_RXID:
1927             dev_info(dev, "init for RGMII_RXID\n");
1928             if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) {
1929                 bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, -1);
1930             }
1931             break;
1932         case PHY_INTERFACE_MODE_RGMII_TXID:
1933             dev_info(dev, "init for RGMII_TXID\n");
1934             if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) {
1935                 bsp_priv->ops->set_to_rgmii(bsp_priv, -1, bsp_priv->rx_delay);
1936             }
1937             break;
1938         case PHY_INTERFACE_MODE_RMII:
1939             dev_info(dev, "init for RMII\n");
1940             if (bsp_priv->ops && bsp_priv->ops->set_to_rmii) {
1941                 bsp_priv->ops->set_to_rmii(bsp_priv);
1942             }
1943             break;
1944         case PHY_INTERFACE_MODE_SGMII:
1945             dev_info(dev, "init for SGMII\n");
1946             if (bsp_priv->ops && bsp_priv->ops->set_to_sgmii) {
1947                 bsp_priv->ops->set_to_sgmii(bsp_priv);
1948             }
1949             break;
1950         case PHY_INTERFACE_MODE_QSGMII:
1951             dev_info(dev, "init for QSGMII\n");
1952             if (bsp_priv->ops && bsp_priv->ops->set_to_qsgmii) {
1953                 bsp_priv->ops->set_to_qsgmii(bsp_priv);
1954             }
1955             break;
1956         default:
1957             dev_err(dev, "NO interface defined!\n");
1958     }
1959 
1960     ret = rk_gmac_phy_power_on(bsp_priv, true);
1961     if (ret) {
1962         gmac_clk_enable(bsp_priv, false);
1963         return ret;
1964     }
1965 
1966     pm_runtime_get_sync(dev);
1967 
1968     if (bsp_priv->integrated_phy) {
1969         rk_gmac_integrated_phy_powerup(bsp_priv);
1970     }
1971 
1972     return 0;
1973 }
1974 
rk_gmac_powerdown(struct rk_priv_data *gmac)1975 static void rk_gmac_powerdown(struct rk_priv_data *gmac)
1976 {
1977     if (gmac->integrated_phy) {
1978         rk_gmac_integrated_phy_powerdown(gmac);
1979     }
1980     pm_runtime_put_sync(&gmac->pdev->dev);
1981     rk_gmac_phy_power_on(gmac, false);
1982     gmac_clk_enable(gmac, false);
1983 }
1984 
rk_fix_speed(void *priv, unsigned int speed)1985 static void rk_fix_speed(void *priv, unsigned int speed)
1986 {
1987     struct rk_priv_data *bsp_priv = priv;
1988     struct device *dev = &bsp_priv->pdev->dev;
1989 
1990     switch (bsp_priv->phy_iface) {
1991         case PHY_INTERFACE_MODE_RGMII:
1992         case PHY_INTERFACE_MODE_RGMII_ID:
1993         case PHY_INTERFACE_MODE_RGMII_RXID:
1994         case PHY_INTERFACE_MODE_RGMII_TXID:
1995             if (bsp_priv->ops && bsp_priv->ops->set_rgmii_speed) {
1996                 bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
1997             }
1998             break;
1999         case PHY_INTERFACE_MODE_RMII:
2000             if (bsp_priv->ops && bsp_priv->ops->set_rmii_speed) {
2001                 bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
2002             }
2003             break;
2004         case PHY_INTERFACE_MODE_SGMII:
2005         case PHY_INTERFACE_MODE_QSGMII:
2006             break;
2007         default:
2008             dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
2009     }
2010 }
2011 
dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv, int tx_delay, int rx_delay)2012 void dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv, int tx_delay, int rx_delay)
2013 {
2014     struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
2015 
2016     if (bsp_priv->ops->set_to_rgmii) {
2017         bsp_priv->ops->set_to_rgmii(bsp_priv, tx_delay, rx_delay);
2018         bsp_priv->tx_delay = tx_delay;
2019         bsp_priv->rx_delay = rx_delay;
2020     }
2021 }
2022 EXPORT_SYMBOL(dwmac_rk_set_rgmii_delayline);
2023 
dwmac_rk_get_rgmii_delayline(struct stmmac_priv *priv, int *tx_delay, int *rx_delay)2024 void dwmac_rk_get_rgmii_delayline(struct stmmac_priv *priv, int *tx_delay, int *rx_delay)
2025 {
2026     struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
2027 
2028     if (!bsp_priv->ops->set_to_rgmii) {
2029         return;
2030     }
2031 
2032     *tx_delay = bsp_priv->tx_delay;
2033     *rx_delay = bsp_priv->rx_delay;
2034 }
2035 EXPORT_SYMBOL(dwmac_rk_get_rgmii_delayline);
2036 
dwmac_rk_get_phy_interface(struct stmmac_priv *priv)2037 int dwmac_rk_get_phy_interface(struct stmmac_priv *priv)
2038 {
2039     struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
2040 
2041     return bsp_priv->phy_iface;
2042 }
2043 EXPORT_SYMBOL(dwmac_rk_get_phy_interface);
2044 
rk_get_eth_addr(void *priv, unsigned char *addr)2045 static void rk_get_eth_addr(void *priv, unsigned char *addr)
2046 {
2047     struct rk_priv_data *bsp_priv = priv;
2048     struct device *dev = &bsp_priv->pdev->dev;
2049     unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0};
2050     int ret, id = bsp_priv->bus_id;
2051 
2052     if (is_valid_ether_addr(addr)) {
2053         goto out;
2054     }
2055 
2056     if (id < 0 || id >= MAX_ETH) {
2057         dev_err(dev, "%s: Invalid ethernet bus id %d\n", __func__, id);
2058         return;
2059     }
2060 
2061     ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
2062     if (ret <= 0 || !is_valid_ether_addr(&ethaddr[id * ETH_ALEN])) {
2063         dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)\n", __func__, ret);
2064         random_ether_addr(&ethaddr[id * ETH_ALEN]);
2065         memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
2066         dev_err(dev, "%s: generate random eth mac address: %pM\n", __func__, addr);
2067 
2068         ret = rk_vendor_write(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
2069         if (ret != 0) {
2070             dev_err(dev, "%s: rk_vendor_write eth mac address failed (%d)\n", __func__, ret);
2071         }
2072 
2073         ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
2074         if (ret != ETH_ALEN * MAX_ETH) {
2075             dev_err(dev, "%s: id: %d rk_vendor_read eth mac address failed (%d)\n", __func__, id, ret);
2076         }
2077     } else {
2078         memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
2079     }
2080 
2081 out:
2082     dev_err(dev, "%s: mac address: %pM\n", __func__, addr);
2083 }
2084 
rk_gmac_probe(struct platform_device *pdev)2085 static int rk_gmac_probe(struct platform_device *pdev)
2086 {
2087     struct plat_stmmacenet_data *plat_dat;
2088     struct stmmac_resources stmmac_res;
2089     const struct rk_gmac_ops *data;
2090     int ret;
2091 
2092     data = of_device_get_match_data(&pdev->dev);
2093     if (!data) {
2094         dev_err(&pdev->dev, "no of match data provided\n");
2095         return -EINVAL;
2096     }
2097 
2098     ret = stmmac_get_platform_resources(pdev, &stmmac_res);
2099     if (ret) {
2100         return ret;
2101     }
2102 
2103     plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
2104     if (IS_ERR(plat_dat)) {
2105         return PTR_ERR(plat_dat);
2106     }
2107 
2108     if (!of_device_is_compatible(pdev->dev.of_node, "snps,dwmac-4.20a")) {
2109         plat_dat->has_gmac = true;
2110     }
2111 
2112     plat_dat->fix_mac_speed = rk_fix_speed;
2113     plat_dat->get_eth_addr = rk_get_eth_addr;
2114 
2115     plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
2116     if (IS_ERR(plat_dat->bsp_priv)) {
2117         ret = PTR_ERR(plat_dat->bsp_priv);
2118         goto err_remove_config_dt;
2119     }
2120 
2121     ret = rk_gmac_clk_init(plat_dat);
2122     if (ret) {
2123         goto err_remove_config_dt;
2124     }
2125 
2126     ret = rk_gmac_powerup(plat_dat->bsp_priv);
2127     if (ret) {
2128         goto err_remove_config_dt;
2129     }
2130 
2131     ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
2132     if (ret) {
2133         goto err_gmac_powerdown;
2134     }
2135 
2136     ret = dwmac_rk_create_loopback_sysfs(&pdev->dev);
2137     if (ret) {
2138         goto err_gmac_powerdown;
2139     }
2140 
2141     return 0;
2142 
2143 err_gmac_powerdown:
2144     rk_gmac_powerdown(plat_dat->bsp_priv);
2145 err_remove_config_dt:
2146     stmmac_remove_config_dt(pdev, plat_dat);
2147 
2148     return ret;
2149 }
2150 
rk_gmac_remove(struct platform_device *pdev)2151 static int rk_gmac_remove(struct platform_device *pdev)
2152 {
2153     struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
2154     int ret = stmmac_dvr_remove(&pdev->dev);
2155 
2156     rk_gmac_powerdown(bsp_priv);
2157     dwmac_rk_remove_loopback_sysfs(&pdev->dev);
2158 
2159     return ret;
2160 }
2161 
2162 #ifdef CONFIG_PM_SLEEP
rk_gmac_suspend(struct device *dev)2163 static int rk_gmac_suspend(struct device *dev)
2164 {
2165     struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
2166     int ret = stmmac_suspend(dev);
2167 
2168     /* Keep the PHY up if we use Wake-on-Lan. */
2169     if (!device_may_wakeup(dev)) {
2170         rk_gmac_powerdown(bsp_priv);
2171         bsp_priv->suspended = true;
2172     }
2173 
2174     return ret;
2175 }
2176 
rk_gmac_resume(struct device *dev)2177 static int rk_gmac_resume(struct device *dev)
2178 {
2179     struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
2180 
2181     /* The PHY was up for Wake-on-Lan. */
2182     if (bsp_priv->suspended) {
2183         rk_gmac_powerup(bsp_priv);
2184         bsp_priv->suspended = false;
2185     }
2186 
2187     return stmmac_resume(dev);
2188 }
2189 #endif /* CONFIG_PM_SLEEP */
2190 
2191 static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
2192 
2193 static const struct of_device_id rk_gmac_dwmac_match[] = {{.compatible = "rockchip,px30-gmac", .data = &px30_ops},
2194                                                           {.compatible = "rockchip,rk1808-gmac", .data = &rk1808_ops},
2195                                                           {.compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops},
2196                                                           {.compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops},
2197                                                           {.compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops},
2198                                                           {.compatible = "rockchip,rk3308-mac", .data = &rk3308_ops},
2199                                                           {.compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops},
2200                                                           {.compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops},
2201                                                           {.compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops},
2202                                                           {.compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops},
2203                                                           {.compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops},
2204                                                           {.compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops},
2205                                                           {.compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops},
2206                                                           {.compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops},
2207                                                           {}};
2208 MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
2209 
2210 static struct platform_driver rk_gmac_dwmac_driver = {
2211     .probe = rk_gmac_probe,
2212     .remove = rk_gmac_remove,
2213     .driver =
2214         {
2215             .name = "rk_gmac-dwmac",
2216             .pm = &rk_gmac_pm_ops,
2217             .of_match_table = rk_gmac_dwmac_match,
2218         },
2219 };
2220 module_platform_driver(rk_gmac_dwmac_driver);
2221 
2222 MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
2223 MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
2224 MODULE_LICENSE("GPL");
2225