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(ðaddr[id * ETH_ALEN])) {
2063 dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)\n", __func__, ret);
2064 random_ether_addr(ðaddr[id * ETH_ALEN]);
2065 memcpy(addr, ðaddr[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, ðaddr[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