1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Rockchip GMAC ethernet IP driver for U-Boot
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <dm.h>
11*4882a593Smuzhiyun #include <clk.h>
12*4882a593Smuzhiyun #include <misc.h>
13*4882a593Smuzhiyun #include <phy.h>
14*4882a593Smuzhiyun #include <reset.h>
15*4882a593Smuzhiyun #include <syscon.h>
16*4882a593Smuzhiyun #include <asm/io.h>
17*4882a593Smuzhiyun #include <asm/arch/periph.h>
18*4882a593Smuzhiyun #include <asm/arch/clock.h>
19*4882a593Smuzhiyun #include <asm/arch/hardware.h>
20*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
21*4882a593Smuzhiyun #include <asm/arch/grf_rk3528.h>
22*4882a593Smuzhiyun #include <asm/arch/grf_rk3562.h>
23*4882a593Smuzhiyun #include <asm/arch/ioc_rk3562.h>
24*4882a593Smuzhiyun #include <asm/arch/grf_rk3568.h>
25*4882a593Smuzhiyun #include <asm/arch/grf_rk3588.h>
26*4882a593Smuzhiyun #include <asm/arch/grf_rv1106.h>
27*4882a593Smuzhiyun #include <asm/arch/grf_rv1126.h>
28*4882a593Smuzhiyun #include "dwc_eth_qos.h"
29*4882a593Smuzhiyun #else
30*4882a593Smuzhiyun #include <asm/arch/grf_px30.h>
31*4882a593Smuzhiyun #include <asm/arch/grf_rk1808.h>
32*4882a593Smuzhiyun #include <asm/arch/grf_rk322x.h>
33*4882a593Smuzhiyun #include <asm/arch/grf_rk3288.h>
34*4882a593Smuzhiyun #include <asm/arch/grf_rk3308.h>
35*4882a593Smuzhiyun #include <asm/arch/grf_rk3328.h>
36*4882a593Smuzhiyun #include <asm/arch/grf_rk3368.h>
37*4882a593Smuzhiyun #include <asm/arch/grf_rk3399.h>
38*4882a593Smuzhiyun #include <asm/arch/grf_rv1108.h>
39*4882a593Smuzhiyun #include "designware.h"
40*4882a593Smuzhiyun #include <dt-bindings/clock/rk3288-cru.h>
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun #include <dm/pinctrl.h>
43*4882a593Smuzhiyun #include <dm/of_access.h>
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun struct rockchip_eth_dev {
48*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
49*4882a593Smuzhiyun struct eqos_priv eqos;
50*4882a593Smuzhiyun #else
51*4882a593Smuzhiyun struct dw_eth_dev dw;
52*4882a593Smuzhiyun #endif
53*4882a593Smuzhiyun int phy_interface;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun * Platform data for the gmac
58*4882a593Smuzhiyun *
59*4882a593Smuzhiyun * dw_eth_pdata: Required platform data for designware driver (must be first)
60*4882a593Smuzhiyun */
61*4882a593Smuzhiyun struct gmac_rockchip_platdata {
62*4882a593Smuzhiyun #ifndef CONFIG_DWC_ETH_QOS
63*4882a593Smuzhiyun struct dw_eth_pdata dw_eth_pdata;
64*4882a593Smuzhiyun #else
65*4882a593Smuzhiyun struct eth_pdata eth_pdata;
66*4882a593Smuzhiyun #endif
67*4882a593Smuzhiyun struct reset_ctl phy_reset;
68*4882a593Smuzhiyun bool integrated_phy;
69*4882a593Smuzhiyun bool clock_input;
70*4882a593Smuzhiyun int phy_interface;
71*4882a593Smuzhiyun int tx_delay;
72*4882a593Smuzhiyun int rx_delay;
73*4882a593Smuzhiyun int bus_id;
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun struct rk_gmac_ops {
77*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
78*4882a593Smuzhiyun const struct eqos_config config;
79*4882a593Smuzhiyun #endif
80*4882a593Smuzhiyun int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
81*4882a593Smuzhiyun struct rockchip_eth_dev *dev);
82*4882a593Smuzhiyun void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
83*4882a593Smuzhiyun void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
84*4882a593Smuzhiyun void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
85*4882a593Smuzhiyun void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
89*4882a593Smuzhiyun static const struct eqos_config eqos_rockchip_config = {
90*4882a593Smuzhiyun .reg_access_always_ok = false,
91*4882a593Smuzhiyun .mdio_wait = 10000,
92*4882a593Smuzhiyun .swr_wait = 200,
93*4882a593Smuzhiyun .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
94*4882a593Smuzhiyun .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
95*4882a593Smuzhiyun .ops = &eqos_rockchip_ops,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun #endif
98*4882a593Smuzhiyun
gmac_set_rgmii(struct udevice * dev,u32 tx_delay,u32 rx_delay)99*4882a593Smuzhiyun void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
102*4882a593Smuzhiyun struct rk_gmac_ops *ops =
103*4882a593Smuzhiyun (struct rk_gmac_ops *)dev_get_driver_data(dev);
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun pdata->tx_delay = tx_delay;
106*4882a593Smuzhiyun pdata->rx_delay = rx_delay;
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun ops->set_to_rgmii(pdata);
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
gmac_rockchip_ofdata_to_platdata(struct udevice * dev)111*4882a593Smuzhiyun static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
114*4882a593Smuzhiyun struct ofnode_phandle_args args;
115*4882a593Smuzhiyun struct udevice *phydev;
116*4882a593Smuzhiyun const char *string;
117*4882a593Smuzhiyun int ret;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun string = dev_read_string(dev, "clock_in_out");
120*4882a593Smuzhiyun if (!strcmp(string, "input"))
121*4882a593Smuzhiyun pdata->clock_input = true;
122*4882a593Smuzhiyun else
123*4882a593Smuzhiyun pdata->clock_input = false;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun /* If phy-handle property is passed from DT, use it as the PHY */
126*4882a593Smuzhiyun ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
127*4882a593Smuzhiyun if (ret) {
128*4882a593Smuzhiyun debug("Cannot get phy phandle: ret=%d\n", ret);
129*4882a593Smuzhiyun pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
130*4882a593Smuzhiyun } else {
131*4882a593Smuzhiyun debug("Found phy-handle subnode\n");
132*4882a593Smuzhiyun pdata->integrated_phy = ofnode_read_bool(args.node,
133*4882a593Smuzhiyun "phy-is-integrated");
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun if (pdata->integrated_phy) {
137*4882a593Smuzhiyun ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
138*4882a593Smuzhiyun if (ret) {
139*4882a593Smuzhiyun ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
140*4882a593Smuzhiyun if (ret) {
141*4882a593Smuzhiyun debug("Get phydev by ofnode failed: err=%d\n", ret);
142*4882a593Smuzhiyun return ret;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
146*4882a593Smuzhiyun if (ret) {
147*4882a593Smuzhiyun debug("No PHY reset control found: ret=%d\n", ret);
148*4882a593Smuzhiyun return ret;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun /* Check the new naming-style first... */
154*4882a593Smuzhiyun pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
155*4882a593Smuzhiyun pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun /* ... and fall back to the old naming style or default, if necessary */
158*4882a593Smuzhiyun if (pdata->tx_delay == -ENOENT)
159*4882a593Smuzhiyun pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
160*4882a593Smuzhiyun if (pdata->rx_delay == -ENOENT)
161*4882a593Smuzhiyun pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
164*4882a593Smuzhiyun return 0;
165*4882a593Smuzhiyun #else
166*4882a593Smuzhiyun return designware_eth_ofdata_to_platdata(dev);
167*4882a593Smuzhiyun #endif
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun #ifndef CONFIG_DWC_ETH_QOS
px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)171*4882a593Smuzhiyun static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
172*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
175*4882a593Smuzhiyun struct px30_grf *grf;
176*4882a593Smuzhiyun struct clk clk_speed;
177*4882a593Smuzhiyun int speed, ret;
178*4882a593Smuzhiyun enum {
179*4882a593Smuzhiyun PX30_GMAC_SPEED_SHIFT = 0x2,
180*4882a593Smuzhiyun PX30_GMAC_SPEED_MASK = BIT(2),
181*4882a593Smuzhiyun PX30_GMAC_SPEED_10M = 0,
182*4882a593Smuzhiyun PX30_GMAC_SPEED_100M = BIT(2),
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
186*4882a593Smuzhiyun &clk_speed);
187*4882a593Smuzhiyun if (ret)
188*4882a593Smuzhiyun return ret;
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun switch (priv->phydev->speed) {
191*4882a593Smuzhiyun case 10:
192*4882a593Smuzhiyun speed = PX30_GMAC_SPEED_10M;
193*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 2500000);
194*4882a593Smuzhiyun if (ret)
195*4882a593Smuzhiyun return ret;
196*4882a593Smuzhiyun break;
197*4882a593Smuzhiyun case 100:
198*4882a593Smuzhiyun speed = PX30_GMAC_SPEED_100M;
199*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 25000000);
200*4882a593Smuzhiyun if (ret)
201*4882a593Smuzhiyun return ret;
202*4882a593Smuzhiyun break;
203*4882a593Smuzhiyun default:
204*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
205*4882a593Smuzhiyun return -EINVAL;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
209*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun return 0;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)214*4882a593Smuzhiyun static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
215*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
218*4882a593Smuzhiyun struct clk clk_speed;
219*4882a593Smuzhiyun int ret;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
222*4882a593Smuzhiyun &clk_speed);
223*4882a593Smuzhiyun if (ret)
224*4882a593Smuzhiyun return ret;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun switch (priv->phydev->speed) {
227*4882a593Smuzhiyun case 10:
228*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 2500000);
229*4882a593Smuzhiyun if (ret)
230*4882a593Smuzhiyun return ret;
231*4882a593Smuzhiyun break;
232*4882a593Smuzhiyun case 100:
233*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 25000000);
234*4882a593Smuzhiyun if (ret)
235*4882a593Smuzhiyun return ret;
236*4882a593Smuzhiyun break;
237*4882a593Smuzhiyun case 1000:
238*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 125000000);
239*4882a593Smuzhiyun if (ret)
240*4882a593Smuzhiyun return ret;
241*4882a593Smuzhiyun break;
242*4882a593Smuzhiyun default:
243*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
244*4882a593Smuzhiyun return -EINVAL;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun return 0;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)250*4882a593Smuzhiyun static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
251*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
254*4882a593Smuzhiyun struct rk322x_grf *grf;
255*4882a593Smuzhiyun int clk;
256*4882a593Smuzhiyun enum {
257*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_SHIFT = 8,
258*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8),
259*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_125M = 0 << 8,
260*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_25M = 3 << 8,
261*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_2_5M = 2 << 8,
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun RK3228_GMAC_RMII_CLK_MASK = BIT(7),
264*4882a593Smuzhiyun RK3228_GMAC_RMII_CLK_2_5M = 0,
265*4882a593Smuzhiyun RK3228_GMAC_RMII_CLK_25M = BIT(7),
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
268*4882a593Smuzhiyun RK3228_GMAC_RMII_SPEED_10 = 0,
269*4882a593Smuzhiyun RK3228_GMAC_RMII_SPEED_100 = BIT(2),
270*4882a593Smuzhiyun };
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun switch (priv->phydev->speed) {
273*4882a593Smuzhiyun case 10:
274*4882a593Smuzhiyun clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
275*4882a593Smuzhiyun (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
276*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_2_5M;
277*4882a593Smuzhiyun break;
278*4882a593Smuzhiyun case 100:
279*4882a593Smuzhiyun clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
280*4882a593Smuzhiyun (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
281*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_25M;
282*4882a593Smuzhiyun break;
283*4882a593Smuzhiyun case 1000:
284*4882a593Smuzhiyun clk = RK3228_GMAC_CLK_SEL_125M;
285*4882a593Smuzhiyun break;
286*4882a593Smuzhiyun default:
287*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
288*4882a593Smuzhiyun return -EINVAL;
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
292*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con[1],
293*4882a593Smuzhiyun RK3228_GMAC_CLK_SEL_MASK |
294*4882a593Smuzhiyun RK3228_GMAC_RMII_CLK_MASK |
295*4882a593Smuzhiyun RK3228_GMAC_RMII_SPEED_MASK,
296*4882a593Smuzhiyun clk);
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun return 0;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)301*4882a593Smuzhiyun static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
302*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
305*4882a593Smuzhiyun struct rk3288_grf *grf;
306*4882a593Smuzhiyun int clk;
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun switch (priv->phydev->speed) {
309*4882a593Smuzhiyun case 10:
310*4882a593Smuzhiyun clk = RK3288_GMAC_CLK_SEL_2_5M;
311*4882a593Smuzhiyun break;
312*4882a593Smuzhiyun case 100:
313*4882a593Smuzhiyun clk = RK3288_GMAC_CLK_SEL_25M;
314*4882a593Smuzhiyun break;
315*4882a593Smuzhiyun case 1000:
316*4882a593Smuzhiyun clk = RK3288_GMAC_CLK_SEL_125M;
317*4882a593Smuzhiyun break;
318*4882a593Smuzhiyun default:
319*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
320*4882a593Smuzhiyun return -EINVAL;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
324*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun return 0;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)329*4882a593Smuzhiyun static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
330*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
333*4882a593Smuzhiyun struct rk3308_grf *grf;
334*4882a593Smuzhiyun struct clk clk_speed;
335*4882a593Smuzhiyun int speed, ret;
336*4882a593Smuzhiyun enum {
337*4882a593Smuzhiyun RK3308_GMAC_SPEED_SHIFT = 0x0,
338*4882a593Smuzhiyun RK3308_GMAC_SPEED_MASK = BIT(0),
339*4882a593Smuzhiyun RK3308_GMAC_SPEED_10M = 0,
340*4882a593Smuzhiyun RK3308_GMAC_SPEED_100M = BIT(0),
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
344*4882a593Smuzhiyun &clk_speed);
345*4882a593Smuzhiyun if (ret)
346*4882a593Smuzhiyun return ret;
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun switch (priv->phydev->speed) {
349*4882a593Smuzhiyun case 10:
350*4882a593Smuzhiyun speed = RK3308_GMAC_SPEED_10M;
351*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 2500000);
352*4882a593Smuzhiyun if (ret)
353*4882a593Smuzhiyun return ret;
354*4882a593Smuzhiyun break;
355*4882a593Smuzhiyun case 100:
356*4882a593Smuzhiyun speed = RK3308_GMAC_SPEED_100M;
357*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 25000000);
358*4882a593Smuzhiyun if (ret)
359*4882a593Smuzhiyun return ret;
360*4882a593Smuzhiyun break;
361*4882a593Smuzhiyun default:
362*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
363*4882a593Smuzhiyun return -EINVAL;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
367*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun return 0;
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun
rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)372*4882a593Smuzhiyun static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
373*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
376*4882a593Smuzhiyun struct rk3328_grf_regs *grf;
377*4882a593Smuzhiyun int clk;
378*4882a593Smuzhiyun enum {
379*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_SHIFT = 11,
380*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11),
381*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_125M = 0 << 11,
382*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_25M = 3 << 11,
383*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_2_5M = 2 << 11,
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun RK3328_GMAC_RMII_CLK_MASK = BIT(7),
386*4882a593Smuzhiyun RK3328_GMAC_RMII_CLK_2_5M = 0,
387*4882a593Smuzhiyun RK3328_GMAC_RMII_CLK_25M = BIT(7),
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
390*4882a593Smuzhiyun RK3328_GMAC_RMII_SPEED_10 = 0,
391*4882a593Smuzhiyun RK3328_GMAC_RMII_SPEED_100 = BIT(2),
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun switch (priv->phydev->speed) {
395*4882a593Smuzhiyun case 10:
396*4882a593Smuzhiyun clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
397*4882a593Smuzhiyun (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
398*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_2_5M;
399*4882a593Smuzhiyun break;
400*4882a593Smuzhiyun case 100:
401*4882a593Smuzhiyun clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
402*4882a593Smuzhiyun (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
403*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_25M;
404*4882a593Smuzhiyun break;
405*4882a593Smuzhiyun case 1000:
406*4882a593Smuzhiyun clk = RK3328_GMAC_CLK_SEL_125M;
407*4882a593Smuzhiyun break;
408*4882a593Smuzhiyun default:
409*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
410*4882a593Smuzhiyun return -EINVAL;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
414*4882a593Smuzhiyun rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
415*4882a593Smuzhiyun RK3328_GMAC_CLK_SEL_MASK |
416*4882a593Smuzhiyun RK3328_GMAC_RMII_CLK_MASK |
417*4882a593Smuzhiyun RK3328_GMAC_RMII_SPEED_MASK,
418*4882a593Smuzhiyun clk);
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun return 0;
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun
rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)423*4882a593Smuzhiyun static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
424*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
427*4882a593Smuzhiyun struct rk3368_grf *grf;
428*4882a593Smuzhiyun int clk;
429*4882a593Smuzhiyun enum {
430*4882a593Smuzhiyun RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
431*4882a593Smuzhiyun RK3368_GMAC_CLK_SEL_25M = 3 << 4,
432*4882a593Smuzhiyun RK3368_GMAC_CLK_SEL_125M = 0 << 4,
433*4882a593Smuzhiyun RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
434*4882a593Smuzhiyun };
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun switch (priv->phydev->speed) {
437*4882a593Smuzhiyun case 10:
438*4882a593Smuzhiyun clk = RK3368_GMAC_CLK_SEL_2_5M;
439*4882a593Smuzhiyun break;
440*4882a593Smuzhiyun case 100:
441*4882a593Smuzhiyun clk = RK3368_GMAC_CLK_SEL_25M;
442*4882a593Smuzhiyun break;
443*4882a593Smuzhiyun case 1000:
444*4882a593Smuzhiyun clk = RK3368_GMAC_CLK_SEL_125M;
445*4882a593Smuzhiyun break;
446*4882a593Smuzhiyun default:
447*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
448*4882a593Smuzhiyun return -EINVAL;
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
452*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun return 0;
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun
rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)457*4882a593Smuzhiyun static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
458*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
461*4882a593Smuzhiyun struct rk3399_grf_regs *grf;
462*4882a593Smuzhiyun int clk;
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun switch (priv->phydev->speed) {
465*4882a593Smuzhiyun case 10:
466*4882a593Smuzhiyun clk = RK3399_GMAC_CLK_SEL_2_5M;
467*4882a593Smuzhiyun break;
468*4882a593Smuzhiyun case 100:
469*4882a593Smuzhiyun clk = RK3399_GMAC_CLK_SEL_25M;
470*4882a593Smuzhiyun break;
471*4882a593Smuzhiyun case 1000:
472*4882a593Smuzhiyun clk = RK3399_GMAC_CLK_SEL_125M;
473*4882a593Smuzhiyun break;
474*4882a593Smuzhiyun default:
475*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
476*4882a593Smuzhiyun return -EINVAL;
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
480*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun return 0;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
rv1108_set_rmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)485*4882a593Smuzhiyun static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
486*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
487*4882a593Smuzhiyun {
488*4882a593Smuzhiyun struct dw_eth_dev *priv = &dev->dw;
489*4882a593Smuzhiyun struct rv1108_grf *grf;
490*4882a593Smuzhiyun int clk, speed;
491*4882a593Smuzhiyun enum {
492*4882a593Smuzhiyun RV1108_GMAC_SPEED_MASK = BIT(2),
493*4882a593Smuzhiyun RV1108_GMAC_SPEED_10M = 0 << 2,
494*4882a593Smuzhiyun RV1108_GMAC_SPEED_100M = 1 << 2,
495*4882a593Smuzhiyun RV1108_GMAC_CLK_SEL_MASK = BIT(7),
496*4882a593Smuzhiyun RV1108_GMAC_CLK_SEL_2_5M = 0 << 7,
497*4882a593Smuzhiyun RV1108_GMAC_CLK_SEL_25M = 1 << 7,
498*4882a593Smuzhiyun };
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun switch (priv->phydev->speed) {
501*4882a593Smuzhiyun case 10:
502*4882a593Smuzhiyun clk = RV1108_GMAC_CLK_SEL_2_5M;
503*4882a593Smuzhiyun speed = RV1108_GMAC_SPEED_10M;
504*4882a593Smuzhiyun break;
505*4882a593Smuzhiyun case 100:
506*4882a593Smuzhiyun clk = RV1108_GMAC_CLK_SEL_25M;
507*4882a593Smuzhiyun speed = RV1108_GMAC_SPEED_100M;
508*4882a593Smuzhiyun break;
509*4882a593Smuzhiyun default:
510*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phydev->speed);
511*4882a593Smuzhiyun return -EINVAL;
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
515*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac_con0,
516*4882a593Smuzhiyun RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
517*4882a593Smuzhiyun clk | speed);
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun return 0;
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun #else
rk3528_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)522*4882a593Smuzhiyun static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
523*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
524*4882a593Smuzhiyun {
525*4882a593Smuzhiyun struct eqos_priv *priv = &dev->eqos;
526*4882a593Smuzhiyun struct rk3528_grf *grf;
527*4882a593Smuzhiyun unsigned int div;
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun enum {
530*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3,
531*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3),
532*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3),
533*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_DIV20 = 0,
534*4882a593Smuzhiyun };
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun enum {
537*4882a593Smuzhiyun RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10,
538*4882a593Smuzhiyun RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10),
539*4882a593Smuzhiyun RK3528_GMAC1_CLK_RGMII_DIV1 = 0,
540*4882a593Smuzhiyun RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10),
541*4882a593Smuzhiyun RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11),
542*4882a593Smuzhiyun RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11),
543*4882a593Smuzhiyun RK3528_GMAC1_CLK_RMII_DIV20 = 0,
544*4882a593Smuzhiyun };
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun switch (priv->phy->speed) {
549*4882a593Smuzhiyun case 10:
550*4882a593Smuzhiyun if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
551*4882a593Smuzhiyun div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 :
552*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_DIV20;
553*4882a593Smuzhiyun else
554*4882a593Smuzhiyun div = RK3528_GMAC1_CLK_RGMII_DIV50;
555*4882a593Smuzhiyun break;
556*4882a593Smuzhiyun case 100:
557*4882a593Smuzhiyun if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
558*4882a593Smuzhiyun div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 :
559*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_DIV2;
560*4882a593Smuzhiyun else
561*4882a593Smuzhiyun div = RK3528_GMAC1_CLK_RGMII_DIV5;
562*4882a593Smuzhiyun break;
563*4882a593Smuzhiyun case 1000:
564*4882a593Smuzhiyun if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
565*4882a593Smuzhiyun div = RK3528_GMAC1_CLK_RGMII_DIV1;
566*4882a593Smuzhiyun else
567*4882a593Smuzhiyun return -EINVAL;
568*4882a593Smuzhiyun break;
569*4882a593Smuzhiyun default:
570*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phy->speed);
571*4882a593Smuzhiyun return -EINVAL;
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun if (pdata->bus_id)
575*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div);
576*4882a593Smuzhiyun else
577*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div);
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun return 0;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun
rk3562_set_gmac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)582*4882a593Smuzhiyun static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata,
583*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun struct eqos_priv *priv = &dev->eqos;
586*4882a593Smuzhiyun struct rk3562_grf *grf;
587*4882a593Smuzhiyun unsigned int div;
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun enum {
590*4882a593Smuzhiyun RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7,
591*4882a593Smuzhiyun RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7),
592*4882a593Smuzhiyun RK3562_GMAC0_CLK_RGMII_DIV1 = 0,
593*4882a593Smuzhiyun RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7),
594*4882a593Smuzhiyun RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8),
595*4882a593Smuzhiyun RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7),
596*4882a593Smuzhiyun RK3562_GMAC0_CLK_RMII_DIV20 = 0,
597*4882a593Smuzhiyun };
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun enum {
600*4882a593Smuzhiyun RK3562_GMAC1_SPEED_SHIFT = 0x0,
601*4882a593Smuzhiyun RK3562_GMAC1_SPEED_MASK = BIT(0),
602*4882a593Smuzhiyun RK3562_GMAC1_SPEED_10M = 0,
603*4882a593Smuzhiyun RK3562_GMAC1_SPEED_100M = BIT(0),
604*4882a593Smuzhiyun };
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun enum {
607*4882a593Smuzhiyun RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13,
608*4882a593Smuzhiyun RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13),
609*4882a593Smuzhiyun RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13),
610*4882a593Smuzhiyun RK3562_GMAC1_CLK_RMII_DIV20 = 0,
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun switch (priv->phy->speed) {
616*4882a593Smuzhiyun case 10:
617*4882a593Smuzhiyun if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
618*4882a593Smuzhiyun if (pdata->bus_id > 0) {
619*4882a593Smuzhiyun div = RK3562_GMAC1_CLK_RMII_DIV20;
620*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[0],
621*4882a593Smuzhiyun RK3562_GMAC1_SPEED_MASK,
622*4882a593Smuzhiyun RK3562_GMAC1_SPEED_10M);
623*4882a593Smuzhiyun } else {
624*4882a593Smuzhiyun div = RK3562_GMAC0_CLK_RMII_DIV20;
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun } else {
627*4882a593Smuzhiyun div = RK3562_GMAC0_CLK_RGMII_DIV50;
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun break;
630*4882a593Smuzhiyun case 100:
631*4882a593Smuzhiyun if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
632*4882a593Smuzhiyun if (pdata->bus_id > 0) {
633*4882a593Smuzhiyun div = RK3562_GMAC1_CLK_RMII_DIV2;
634*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[0],
635*4882a593Smuzhiyun RK3562_GMAC1_SPEED_MASK,
636*4882a593Smuzhiyun RK3562_GMAC1_SPEED_100M);
637*4882a593Smuzhiyun } else {
638*4882a593Smuzhiyun div = RK3562_GMAC0_CLK_RMII_DIV2;
639*4882a593Smuzhiyun }
640*4882a593Smuzhiyun } else {
641*4882a593Smuzhiyun div = RK3562_GMAC0_CLK_RGMII_DIV5;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun break;
644*4882a593Smuzhiyun case 1000:
645*4882a593Smuzhiyun if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
646*4882a593Smuzhiyun div = RK3562_GMAC0_CLK_RGMII_DIV1;
647*4882a593Smuzhiyun else
648*4882a593Smuzhiyun return -EINVAL;
649*4882a593Smuzhiyun break;
650*4882a593Smuzhiyun default:
651*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phy->speed);
652*4882a593Smuzhiyun return -EINVAL;
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun if (pdata->bus_id)
656*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div);
657*4882a593Smuzhiyun else
658*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div);
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun return 0;
661*4882a593Smuzhiyun }
662*4882a593Smuzhiyun
rk3588_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)663*4882a593Smuzhiyun static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
664*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
665*4882a593Smuzhiyun {
666*4882a593Smuzhiyun struct eqos_priv *priv = &dev->eqos;
667*4882a593Smuzhiyun struct rk3588_php_grf *php_grf;
668*4882a593Smuzhiyun unsigned int div, div_mask;
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun enum {
671*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
672*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
673*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_DIV1 = 0,
674*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
675*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
676*4882a593Smuzhiyun RK3588_GMAC_CLK_RMII_DIV2 = BIT(2),
677*4882a593Smuzhiyun RK3588_GMAC_CLK_RMII_DIV20 = 0,
678*4882a593Smuzhiyun RK3588_GMAC1_ID_SHIFT = 5,
679*4882a593Smuzhiyun };
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun switch (priv->phy->speed) {
684*4882a593Smuzhiyun case 10:
685*4882a593Smuzhiyun if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
686*4882a593Smuzhiyun div = RK3588_GMAC_CLK_RMII_DIV20;
687*4882a593Smuzhiyun else
688*4882a593Smuzhiyun div = RK3588_GMAC_CLK_RGMII_DIV50;
689*4882a593Smuzhiyun break;
690*4882a593Smuzhiyun case 100:
691*4882a593Smuzhiyun if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
692*4882a593Smuzhiyun div = RK3588_GMAC_CLK_RMII_DIV2;
693*4882a593Smuzhiyun else
694*4882a593Smuzhiyun div = RK3588_GMAC_CLK_RGMII_DIV5;
695*4882a593Smuzhiyun break;
696*4882a593Smuzhiyun case 1000:
697*4882a593Smuzhiyun if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
698*4882a593Smuzhiyun div = RK3588_GMAC_CLK_RGMII_DIV1;
699*4882a593Smuzhiyun else
700*4882a593Smuzhiyun return -EINVAL;
701*4882a593Smuzhiyun break;
702*4882a593Smuzhiyun default:
703*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phy->speed);
704*4882a593Smuzhiyun return -EINVAL;
705*4882a593Smuzhiyun }
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun if (pdata->bus_id == 1) {
708*4882a593Smuzhiyun div <<= 5;
709*4882a593Smuzhiyun div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0;
713*4882a593Smuzhiyun div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) :
714*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_DIV_MASK;
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun return 0;
719*4882a593Smuzhiyun }
720*4882a593Smuzhiyun
rv1106_set_rmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)721*4882a593Smuzhiyun static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
722*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun struct eqos_priv *priv = &dev->eqos;
725*4882a593Smuzhiyun struct rv1106_grf *grf;
726*4882a593Smuzhiyun unsigned int div;
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun enum {
729*4882a593Smuzhiyun RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
730*4882a593Smuzhiyun RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
731*4882a593Smuzhiyun RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
732*4882a593Smuzhiyun RV1106_GMAC_CLK_RMII_DIV20 = 0,
733*4882a593Smuzhiyun };
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun switch (priv->phy->speed) {
738*4882a593Smuzhiyun case 10:
739*4882a593Smuzhiyun div = RV1106_GMAC_CLK_RMII_DIV20;
740*4882a593Smuzhiyun break;
741*4882a593Smuzhiyun case 100:
742*4882a593Smuzhiyun div = RV1106_GMAC_CLK_RMII_DIV2;
743*4882a593Smuzhiyun break;
744*4882a593Smuzhiyun default:
745*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phy->speed);
746*4882a593Smuzhiyun return -EINVAL;
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun return 0;
752*4882a593Smuzhiyun }
753*4882a593Smuzhiyun
rv1126_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)754*4882a593Smuzhiyun static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
755*4882a593Smuzhiyun struct rockchip_eth_dev *dev)
756*4882a593Smuzhiyun {
757*4882a593Smuzhiyun struct eqos_priv *priv = &dev->eqos;
758*4882a593Smuzhiyun struct clk clk_speed;
759*4882a593Smuzhiyun int ret;
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
762*4882a593Smuzhiyun &clk_speed);
763*4882a593Smuzhiyun if (ret) {
764*4882a593Smuzhiyun printf("%s can't get clk_mac_speed clock (ret=%d):\n",
765*4882a593Smuzhiyun __func__, ret);
766*4882a593Smuzhiyun return ret;
767*4882a593Smuzhiyun }
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun switch ( priv->phy->speed) {
770*4882a593Smuzhiyun case 10:
771*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 2500000);
772*4882a593Smuzhiyun if (ret)
773*4882a593Smuzhiyun return ret;
774*4882a593Smuzhiyun break;
775*4882a593Smuzhiyun case 100:
776*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 25000000);
777*4882a593Smuzhiyun if (ret)
778*4882a593Smuzhiyun return ret;
779*4882a593Smuzhiyun break;
780*4882a593Smuzhiyun case 1000:
781*4882a593Smuzhiyun ret = clk_set_rate(&clk_speed, 125000000);
782*4882a593Smuzhiyun if (ret)
783*4882a593Smuzhiyun return ret;
784*4882a593Smuzhiyun break;
785*4882a593Smuzhiyun default:
786*4882a593Smuzhiyun debug("Unknown phy speed: %d\n", priv->phy->speed);
787*4882a593Smuzhiyun return -EINVAL;
788*4882a593Smuzhiyun }
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun return 0;
791*4882a593Smuzhiyun }
792*4882a593Smuzhiyun #endif
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun #ifndef CONFIG_DWC_ETH_QOS
px30_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)795*4882a593Smuzhiyun static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun struct px30_grf *grf;
798*4882a593Smuzhiyun enum {
799*4882a593Smuzhiyun px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
800*4882a593Smuzhiyun px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6),
801*4882a593Smuzhiyun px30_GMAC_PHY_INTF_SEL_RMII = BIT(6),
802*4882a593Smuzhiyun };
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con1,
807*4882a593Smuzhiyun px30_GMAC_PHY_INTF_SEL_MASK,
808*4882a593Smuzhiyun px30_GMAC_PHY_INTF_SEL_RMII);
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun
rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)811*4882a593Smuzhiyun static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
812*4882a593Smuzhiyun {
813*4882a593Smuzhiyun struct rk1808_grf *grf;
814*4882a593Smuzhiyun enum {
815*4882a593Smuzhiyun RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
816*4882a593Smuzhiyun RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
817*4882a593Smuzhiyun RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
820*4882a593Smuzhiyun RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
821*4882a593Smuzhiyun RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
824*4882a593Smuzhiyun RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
825*4882a593Smuzhiyun RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
826*4882a593Smuzhiyun };
827*4882a593Smuzhiyun enum {
828*4882a593Smuzhiyun RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
829*4882a593Smuzhiyun RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
830*4882a593Smuzhiyun
831*4882a593Smuzhiyun RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
832*4882a593Smuzhiyun RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
833*4882a593Smuzhiyun };
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
836*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con1,
837*4882a593Smuzhiyun RK1808_GMAC_PHY_INTF_SEL_MASK |
838*4882a593Smuzhiyun RK1808_RXCLK_DLY_ENA_GMAC_MASK |
839*4882a593Smuzhiyun RK1808_TXCLK_DLY_ENA_GMAC_MASK,
840*4882a593Smuzhiyun RK1808_GMAC_PHY_INTF_SEL_RGMII |
841*4882a593Smuzhiyun RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
842*4882a593Smuzhiyun RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con0,
845*4882a593Smuzhiyun RK1808_CLK_RX_DL_CFG_GMAC_MASK |
846*4882a593Smuzhiyun RK1808_CLK_TX_DL_CFG_GMAC_MASK,
847*4882a593Smuzhiyun (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) |
848*4882a593Smuzhiyun (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT));
849*4882a593Smuzhiyun }
850*4882a593Smuzhiyun
rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)851*4882a593Smuzhiyun static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
852*4882a593Smuzhiyun {
853*4882a593Smuzhiyun struct rk322x_grf *grf;
854*4882a593Smuzhiyun enum {
855*4882a593Smuzhiyun RK3228_RMII_MODE_SHIFT = 10,
856*4882a593Smuzhiyun RK3228_RMII_MODE_MASK = BIT(10),
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
859*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
860*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
863*4882a593Smuzhiyun RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
864*4882a593Smuzhiyun RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
867*4882a593Smuzhiyun RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
868*4882a593Smuzhiyun RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
869*4882a593Smuzhiyun };
870*4882a593Smuzhiyun enum {
871*4882a593Smuzhiyun RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
872*4882a593Smuzhiyun RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
875*4882a593Smuzhiyun RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
876*4882a593Smuzhiyun };
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
879*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con[1],
880*4882a593Smuzhiyun RK3228_RMII_MODE_MASK |
881*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_MASK |
882*4882a593Smuzhiyun RK3228_RXCLK_DLY_ENA_GMAC_MASK |
883*4882a593Smuzhiyun RK3228_TXCLK_DLY_ENA_GMAC_MASK,
884*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_RGMII |
885*4882a593Smuzhiyun RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
886*4882a593Smuzhiyun RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
887*4882a593Smuzhiyun
888*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con[0],
889*4882a593Smuzhiyun RK3228_CLK_RX_DL_CFG_GMAC_MASK |
890*4882a593Smuzhiyun RK3228_CLK_TX_DL_CFG_GMAC_MASK,
891*4882a593Smuzhiyun pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
892*4882a593Smuzhiyun pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
893*4882a593Smuzhiyun }
894*4882a593Smuzhiyun
rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)895*4882a593Smuzhiyun static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun struct rk322x_grf *grf;
898*4882a593Smuzhiyun enum {
899*4882a593Smuzhiyun RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
900*4882a593Smuzhiyun RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
901*4882a593Smuzhiyun RK3228_RMII_MODE_MASK = BIT(10),
902*4882a593Smuzhiyun RK3228_RMII_MODE_SEL = BIT(10),
903*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
904*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
905*4882a593Smuzhiyun };
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
908*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con[1],
909*4882a593Smuzhiyun RK3228_GRF_CON_RMII_MODE_MASK |
910*4882a593Smuzhiyun RK3228_RMII_MODE_MASK |
911*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_MASK,
912*4882a593Smuzhiyun RK3228_GRF_CON_RMII_MODE_SEL |
913*4882a593Smuzhiyun RK3228_RMII_MODE_SEL |
914*4882a593Smuzhiyun RK3228_GMAC_PHY_INTF_SEL_RMII);
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun
rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)917*4882a593Smuzhiyun static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
918*4882a593Smuzhiyun {
919*4882a593Smuzhiyun struct rk3288_grf *grf;
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
922*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con1,
923*4882a593Smuzhiyun RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
924*4882a593Smuzhiyun RK3288_GMAC_PHY_INTF_SEL_RGMII);
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con3,
927*4882a593Smuzhiyun RK3288_RXCLK_DLY_ENA_GMAC_MASK |
928*4882a593Smuzhiyun RK3288_TXCLK_DLY_ENA_GMAC_MASK |
929*4882a593Smuzhiyun RK3288_CLK_RX_DL_CFG_GMAC_MASK |
930*4882a593Smuzhiyun RK3288_CLK_TX_DL_CFG_GMAC_MASK,
931*4882a593Smuzhiyun RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
932*4882a593Smuzhiyun RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
933*4882a593Smuzhiyun pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
934*4882a593Smuzhiyun pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
935*4882a593Smuzhiyun }
936*4882a593Smuzhiyun
rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)937*4882a593Smuzhiyun static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
938*4882a593Smuzhiyun {
939*4882a593Smuzhiyun struct rk3308_grf *grf;
940*4882a593Smuzhiyun enum {
941*4882a593Smuzhiyun RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
942*4882a593Smuzhiyun RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2),
943*4882a593Smuzhiyun RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4),
944*4882a593Smuzhiyun };
945*4882a593Smuzhiyun
946*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
947*4882a593Smuzhiyun
948*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con0,
949*4882a593Smuzhiyun RK3308_GMAC_PHY_INTF_SEL_MASK,
950*4882a593Smuzhiyun RK3308_GMAC_PHY_INTF_SEL_RMII);
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun
rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)953*4882a593Smuzhiyun static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
954*4882a593Smuzhiyun {
955*4882a593Smuzhiyun struct rk3328_grf_regs *grf;
956*4882a593Smuzhiyun enum {
957*4882a593Smuzhiyun RK3328_RMII_MODE_SHIFT = 9,
958*4882a593Smuzhiyun RK3328_RMII_MODE_MASK = BIT(9),
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
961*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
962*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
965*4882a593Smuzhiyun RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
966*4882a593Smuzhiyun RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
967*4882a593Smuzhiyun
968*4882a593Smuzhiyun RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
969*4882a593Smuzhiyun RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
970*4882a593Smuzhiyun RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
971*4882a593Smuzhiyun };
972*4882a593Smuzhiyun enum {
973*4882a593Smuzhiyun RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
974*4882a593Smuzhiyun RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
977*4882a593Smuzhiyun RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
978*4882a593Smuzhiyun };
979*4882a593Smuzhiyun
980*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
981*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con[1],
982*4882a593Smuzhiyun RK3328_RMII_MODE_MASK |
983*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_MASK |
984*4882a593Smuzhiyun RK3328_RXCLK_DLY_ENA_GMAC_MASK |
985*4882a593Smuzhiyun RK3328_TXCLK_DLY_ENA_GMAC_MASK,
986*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_RGMII |
987*4882a593Smuzhiyun RK3328_RXCLK_DLY_ENA_GMAC_MASK |
988*4882a593Smuzhiyun RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con[0],
991*4882a593Smuzhiyun RK3328_CLK_RX_DL_CFG_GMAC_MASK |
992*4882a593Smuzhiyun RK3328_CLK_TX_DL_CFG_GMAC_MASK,
993*4882a593Smuzhiyun pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
994*4882a593Smuzhiyun pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
995*4882a593Smuzhiyun }
996*4882a593Smuzhiyun
rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)997*4882a593Smuzhiyun static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
998*4882a593Smuzhiyun {
999*4882a593Smuzhiyun struct rk3328_grf_regs *grf;
1000*4882a593Smuzhiyun enum {
1001*4882a593Smuzhiyun RK3328_RMII_MODE_MASK = BIT(9),
1002*4882a593Smuzhiyun RK3328_RMII_MODE = BIT(9),
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
1005*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1006*4882a593Smuzhiyun };
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1009*4882a593Smuzhiyun rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
1010*4882a593Smuzhiyun RK3328_RMII_MODE_MASK |
1011*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_MASK,
1012*4882a593Smuzhiyun RK3328_GMAC_PHY_INTF_SEL_RMII |
1013*4882a593Smuzhiyun RK3328_RMII_MODE);
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun
rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1016*4882a593Smuzhiyun static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1017*4882a593Smuzhiyun {
1018*4882a593Smuzhiyun struct rk3368_grf *grf;
1019*4882a593Smuzhiyun enum {
1020*4882a593Smuzhiyun RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
1021*4882a593Smuzhiyun RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
1022*4882a593Smuzhiyun RK3368_RMII_MODE_MASK = BIT(6),
1023*4882a593Smuzhiyun RK3368_RMII_MODE = BIT(6),
1024*4882a593Smuzhiyun };
1025*4882a593Smuzhiyun enum {
1026*4882a593Smuzhiyun RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
1027*4882a593Smuzhiyun RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1028*4882a593Smuzhiyun RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
1029*4882a593Smuzhiyun RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
1030*4882a593Smuzhiyun RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1031*4882a593Smuzhiyun RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
1032*4882a593Smuzhiyun RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
1033*4882a593Smuzhiyun RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1034*4882a593Smuzhiyun RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
1035*4882a593Smuzhiyun RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1036*4882a593Smuzhiyun };
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1039*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con15,
1040*4882a593Smuzhiyun RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
1041*4882a593Smuzhiyun RK3368_GMAC_PHY_INTF_SEL_RGMII);
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con16,
1044*4882a593Smuzhiyun RK3368_RXCLK_DLY_ENA_GMAC_MASK |
1045*4882a593Smuzhiyun RK3368_TXCLK_DLY_ENA_GMAC_MASK |
1046*4882a593Smuzhiyun RK3368_CLK_RX_DL_CFG_GMAC_MASK |
1047*4882a593Smuzhiyun RK3368_CLK_TX_DL_CFG_GMAC_MASK,
1048*4882a593Smuzhiyun RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
1049*4882a593Smuzhiyun RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
1050*4882a593Smuzhiyun (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) |
1051*4882a593Smuzhiyun (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT));
1052*4882a593Smuzhiyun }
1053*4882a593Smuzhiyun
rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1054*4882a593Smuzhiyun static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1055*4882a593Smuzhiyun {
1056*4882a593Smuzhiyun struct rk3399_grf_regs *grf;
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con5,
1061*4882a593Smuzhiyun RK3399_GMAC_PHY_INTF_SEL_MASK,
1062*4882a593Smuzhiyun RK3399_GMAC_PHY_INTF_SEL_RGMII);
1063*4882a593Smuzhiyun
1064*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con6,
1065*4882a593Smuzhiyun RK3399_RXCLK_DLY_ENA_GMAC_MASK |
1066*4882a593Smuzhiyun RK3399_TXCLK_DLY_ENA_GMAC_MASK |
1067*4882a593Smuzhiyun RK3399_CLK_RX_DL_CFG_GMAC_MASK |
1068*4882a593Smuzhiyun RK3399_CLK_TX_DL_CFG_GMAC_MASK,
1069*4882a593Smuzhiyun RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
1070*4882a593Smuzhiyun RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
1071*4882a593Smuzhiyun (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) |
1072*4882a593Smuzhiyun (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT));
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun
rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)1075*4882a593Smuzhiyun static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1076*4882a593Smuzhiyun {
1077*4882a593Smuzhiyun struct rv1108_grf *grf;
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun enum {
1080*4882a593Smuzhiyun RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
1081*4882a593Smuzhiyun RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4,
1082*4882a593Smuzhiyun };
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1085*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac_con0,
1086*4882a593Smuzhiyun RV1108_GMAC_PHY_INTF_SEL_MASK,
1087*4882a593Smuzhiyun RV1108_GMAC_PHY_INTF_SEL_RMII);
1088*4882a593Smuzhiyun }
1089*4882a593Smuzhiyun
rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1090*4882a593Smuzhiyun static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1091*4882a593Smuzhiyun {
1092*4882a593Smuzhiyun struct rk322x_grf *grf;
1093*4882a593Smuzhiyun enum {
1094*4882a593Smuzhiyun RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
1095*4882a593Smuzhiyun RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
1096*4882a593Smuzhiyun };
1097*4882a593Smuzhiyun enum {
1098*4882a593Smuzhiyun RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1099*4882a593Smuzhiyun RK3228_MACPHY_CFG_CLK_50M = BIT(14),
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1102*4882a593Smuzhiyun RK3228_MACPHY_RMII_MODE = BIT(6),
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun RK3228_MACPHY_ENABLE_MASK = BIT(0),
1105*4882a593Smuzhiyun RK3228_MACPHY_DISENABLE = 0,
1106*4882a593Smuzhiyun RK3228_MACPHY_ENABLE = BIT(0),
1107*4882a593Smuzhiyun };
1108*4882a593Smuzhiyun enum {
1109*4882a593Smuzhiyun RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1110*4882a593Smuzhiyun RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
1111*4882a593Smuzhiyun };
1112*4882a593Smuzhiyun enum {
1113*4882a593Smuzhiyun RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1114*4882a593Smuzhiyun RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
1115*4882a593Smuzhiyun };
1116*4882a593Smuzhiyun
1117*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1118*4882a593Smuzhiyun rk_clrsetreg(&grf->con_iomux,
1119*4882a593Smuzhiyun RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
1120*4882a593Smuzhiyun RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[2],
1123*4882a593Smuzhiyun RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
1124*4882a593Smuzhiyun RK3228_RK_GRF_CON2_MACPHY_ID);
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[3],
1127*4882a593Smuzhiyun RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
1128*4882a593Smuzhiyun RK3228_RK_GRF_CON3_MACPHY_ID);
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun /* disabled before trying to reset it &*/
1131*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[0],
1132*4882a593Smuzhiyun RK3228_MACPHY_CFG_CLK_50M_MASK |
1133*4882a593Smuzhiyun RK3228_MACPHY_RMII_MODE_MASK |
1134*4882a593Smuzhiyun RK3228_MACPHY_ENABLE_MASK,
1135*4882a593Smuzhiyun RK3228_MACPHY_CFG_CLK_50M |
1136*4882a593Smuzhiyun RK3228_MACPHY_RMII_MODE |
1137*4882a593Smuzhiyun RK3228_MACPHY_DISENABLE);
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun reset_assert(&pdata->phy_reset);
1140*4882a593Smuzhiyun udelay(10);
1141*4882a593Smuzhiyun reset_deassert(&pdata->phy_reset);
1142*4882a593Smuzhiyun udelay(10);
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[0],
1145*4882a593Smuzhiyun RK3228_MACPHY_ENABLE_MASK,
1146*4882a593Smuzhiyun RK3228_MACPHY_ENABLE);
1147*4882a593Smuzhiyun udelay(30 * 1000);
1148*4882a593Smuzhiyun }
1149*4882a593Smuzhiyun
rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1150*4882a593Smuzhiyun static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1151*4882a593Smuzhiyun {
1152*4882a593Smuzhiyun struct rk3328_grf_regs *grf;
1153*4882a593Smuzhiyun enum {
1154*4882a593Smuzhiyun RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1155*4882a593Smuzhiyun RK3328_GRF_CON_RMII_MODE = BIT(9),
1156*4882a593Smuzhiyun };
1157*4882a593Smuzhiyun enum {
1158*4882a593Smuzhiyun RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1159*4882a593Smuzhiyun RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1160*4882a593Smuzhiyun
1161*4882a593Smuzhiyun RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1162*4882a593Smuzhiyun RK3328_MACPHY_RMII_MODE = BIT(6),
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun RK3328_MACPHY_ENABLE_MASK = BIT(0),
1165*4882a593Smuzhiyun RK3328_MACPHY_DISENABLE = 0,
1166*4882a593Smuzhiyun RK3328_MACPHY_ENABLE = BIT(0),
1167*4882a593Smuzhiyun };
1168*4882a593Smuzhiyun enum {
1169*4882a593Smuzhiyun RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1170*4882a593Smuzhiyun RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1171*4882a593Smuzhiyun };
1172*4882a593Smuzhiyun enum {
1173*4882a593Smuzhiyun RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1174*4882a593Smuzhiyun RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1175*4882a593Smuzhiyun };
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1178*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[1],
1179*4882a593Smuzhiyun RK3328_GRF_CON_RMII_MODE_MASK,
1180*4882a593Smuzhiyun RK3328_GRF_CON_RMII_MODE);
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[2],
1183*4882a593Smuzhiyun RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1184*4882a593Smuzhiyun RK3328_RK_GRF_CON2_MACPHY_ID);
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[3],
1187*4882a593Smuzhiyun RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1188*4882a593Smuzhiyun RK3328_RK_GRF_CON3_MACPHY_ID);
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun /* disabled before trying to reset it &*/
1191*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[0],
1192*4882a593Smuzhiyun RK3328_MACPHY_CFG_CLK_50M_MASK |
1193*4882a593Smuzhiyun RK3328_MACPHY_RMII_MODE_MASK |
1194*4882a593Smuzhiyun RK3328_MACPHY_ENABLE_MASK,
1195*4882a593Smuzhiyun RK3328_MACPHY_CFG_CLK_50M |
1196*4882a593Smuzhiyun RK3328_MACPHY_RMII_MODE |
1197*4882a593Smuzhiyun RK3328_MACPHY_DISENABLE);
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun reset_assert(&pdata->phy_reset);
1200*4882a593Smuzhiyun udelay(10);
1201*4882a593Smuzhiyun reset_deassert(&pdata->phy_reset);
1202*4882a593Smuzhiyun udelay(10);
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con[0],
1205*4882a593Smuzhiyun RK3328_MACPHY_ENABLE_MASK,
1206*4882a593Smuzhiyun RK3328_MACPHY_ENABLE);
1207*4882a593Smuzhiyun udelay(30 * 1000);
1208*4882a593Smuzhiyun }
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun #else
rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1211*4882a593Smuzhiyun static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1212*4882a593Smuzhiyun {
1213*4882a593Smuzhiyun struct rk3528_grf *grf;
1214*4882a593Smuzhiyun unsigned char bgs[1] = {0};
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun enum {
1217*4882a593Smuzhiyun RK3528_MACPHY_ENABLE_MASK = BIT(1),
1218*4882a593Smuzhiyun RK3528_MACPHY_DISENABLE = BIT(1),
1219*4882a593Smuzhiyun RK3528_MACPHY_ENABLE = 0,
1220*4882a593Smuzhiyun RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
1221*4882a593Smuzhiyun RK3528_MACPHY_XMII_SEL = BIT(6),
1222*4882a593Smuzhiyun RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
1223*4882a593Smuzhiyun RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
1224*4882a593Smuzhiyun RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
1225*4882a593Smuzhiyun RK3528_MACPHY_PHY_ID = BIT(11),
1226*4882a593Smuzhiyun };
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun enum {
1229*4882a593Smuzhiyun RK3528_MACPHY_BGS_MASK = GENMASK(3, 0),
1230*4882a593Smuzhiyun };
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1233*4882a593Smuzhiyun struct udevice *dev;
1234*4882a593Smuzhiyun u32 regs[2] = {0};
1235*4882a593Smuzhiyun ofnode node;
1236*4882a593Smuzhiyun int ret = 0;
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun /* retrieve the device */
1239*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1240*4882a593Smuzhiyun ret = uclass_get_device_by_driver(UCLASS_MISC,
1241*4882a593Smuzhiyun DM_GET_DRIVER(rockchip_efuse),
1242*4882a593Smuzhiyun &dev);
1243*4882a593Smuzhiyun else
1244*4882a593Smuzhiyun ret = uclass_get_device_by_driver(UCLASS_MISC,
1245*4882a593Smuzhiyun DM_GET_DRIVER(rockchip_otp),
1246*4882a593Smuzhiyun &dev);
1247*4882a593Smuzhiyun if (!ret) {
1248*4882a593Smuzhiyun node = dev_read_subnode(dev, "macphy-bgs");
1249*4882a593Smuzhiyun if (ofnode_valid(node)) {
1250*4882a593Smuzhiyun if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1251*4882a593Smuzhiyun /* read the bgs from the efuses */
1252*4882a593Smuzhiyun ret = misc_read(dev, regs[0], &bgs, 1);
1253*4882a593Smuzhiyun if (ret) {
1254*4882a593Smuzhiyun printf("read bgs from efuse/otp failed, ret=%d\n",
1255*4882a593Smuzhiyun ret);
1256*4882a593Smuzhiyun bgs[0] = 0;
1257*4882a593Smuzhiyun }
1258*4882a593Smuzhiyun }
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun }
1261*4882a593Smuzhiyun #endif
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun reset_assert(&pdata->phy_reset);
1266*4882a593Smuzhiyun udelay(20);
1267*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con0,
1268*4882a593Smuzhiyun RK3528_MACPHY_ENABLE_MASK |
1269*4882a593Smuzhiyun RK3528_MACPHY_XMII_SEL_MASK |
1270*4882a593Smuzhiyun RK3528_MACPHY_24M_CLK_SEL_MASK |
1271*4882a593Smuzhiyun RK3528_MACPHY_PHY_ID_MASK,
1272*4882a593Smuzhiyun RK3528_MACPHY_ENABLE |
1273*4882a593Smuzhiyun RK3528_MACPHY_XMII_SEL |
1274*4882a593Smuzhiyun RK3528_MACPHY_24M_CLK_SEL_24M |
1275*4882a593Smuzhiyun RK3528_MACPHY_PHY_ID);
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con1,
1278*4882a593Smuzhiyun RK3528_MACPHY_BGS_MASK,
1279*4882a593Smuzhiyun bgs[0]);
1280*4882a593Smuzhiyun udelay(20);
1281*4882a593Smuzhiyun reset_deassert(&pdata->phy_reset);
1282*4882a593Smuzhiyun udelay(30 * 1000);
1283*4882a593Smuzhiyun }
1284*4882a593Smuzhiyun
rk3528_set_to_rmii(struct gmac_rockchip_platdata * pdata)1285*4882a593Smuzhiyun static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1286*4882a593Smuzhiyun {
1287*4882a593Smuzhiyun unsigned int clk_mode;
1288*4882a593Smuzhiyun struct rk3528_grf *grf;
1289*4882a593Smuzhiyun
1290*4882a593Smuzhiyun enum {
1291*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1,
1292*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1),
1293*4882a593Smuzhiyun RK3528_GMAC0_CLK_RMII_MODE = 0x1,
1294*4882a593Smuzhiyun };
1295*4882a593Smuzhiyun
1296*4882a593Smuzhiyun enum {
1297*4882a593Smuzhiyun RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8,
1298*4882a593Smuzhiyun RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8),
1299*4882a593Smuzhiyun RK3528_GMAC1_CLK_RMII_MODE = 0x1,
1300*4882a593Smuzhiyun };
1301*4882a593Smuzhiyun
1302*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1303*4882a593Smuzhiyun
1304*4882a593Smuzhiyun if (pdata->bus_id == 1) {
1305*4882a593Smuzhiyun clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT;
1306*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode);
1307*4882a593Smuzhiyun } else {
1308*4882a593Smuzhiyun clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT;
1309*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode);
1310*4882a593Smuzhiyun }
1311*4882a593Smuzhiyun }
1312*4882a593Smuzhiyun
rk3528_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1313*4882a593Smuzhiyun static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1314*4882a593Smuzhiyun {
1315*4882a593Smuzhiyun unsigned int rx_enable;
1316*4882a593Smuzhiyun unsigned int rx_delay;
1317*4882a593Smuzhiyun struct rk3528_grf *grf;
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun enum {
1320*4882a593Smuzhiyun RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8,
1321*4882a593Smuzhiyun RK3528_GMAC1_RGMII_MODE_MASK = BIT(8),
1322*4882a593Smuzhiyun RK3528_GMAC1_RGMII_MODE = 0x0,
1323*4882a593Smuzhiyun
1324*4882a593Smuzhiyun RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14),
1325*4882a593Smuzhiyun RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0,
1326*4882a593Smuzhiyun RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14),
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15),
1329*4882a593Smuzhiyun RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0,
1330*4882a593Smuzhiyun RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15),
1331*4882a593Smuzhiyun };
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun enum {
1334*4882a593Smuzhiyun RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8,
1335*4882a593Smuzhiyun RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8),
1336*4882a593Smuzhiyun
1337*4882a593Smuzhiyun RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0,
1338*4882a593Smuzhiyun RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0),
1339*4882a593Smuzhiyun };
1340*4882a593Smuzhiyun
1341*4882a593Smuzhiyun if (!pdata->bus_id)
1342*4882a593Smuzhiyun return;
1343*4882a593Smuzhiyun
1344*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1345*4882a593Smuzhiyun
1346*4882a593Smuzhiyun if (pdata->rx_delay < 0) {
1347*4882a593Smuzhiyun rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE;
1348*4882a593Smuzhiyun rx_delay = 0;
1349*4882a593Smuzhiyun } else {
1350*4882a593Smuzhiyun rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE;
1351*4882a593Smuzhiyun rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT;
1352*4882a593Smuzhiyun }
1353*4882a593Smuzhiyun
1354*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac1_con0,
1355*4882a593Smuzhiyun RK3528_GMAC1_TXCLK_DLY_ENA_MASK |
1356*4882a593Smuzhiyun RK3528_GMAC1_RXCLK_DLY_ENA_MASK |
1357*4882a593Smuzhiyun RK3528_GMAC1_RGMII_MODE_MASK,
1358*4882a593Smuzhiyun rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE |
1359*4882a593Smuzhiyun (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT));
1360*4882a593Smuzhiyun
1361*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac1_con1,
1362*4882a593Smuzhiyun RK3528_GMAC1_RX_DL_CFG_MASK |
1363*4882a593Smuzhiyun RK3528_GMAC1_TX_DL_CFG_MASK,
1364*4882a593Smuzhiyun (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) |
1365*4882a593Smuzhiyun rx_delay);
1366*4882a593Smuzhiyun }
1367*4882a593Smuzhiyun
rk3562_set_to_rmii(struct gmac_rockchip_platdata * pdata)1368*4882a593Smuzhiyun static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1369*4882a593Smuzhiyun {
1370*4882a593Smuzhiyun struct rk3562_grf *grf;
1371*4882a593Smuzhiyun unsigned int mode;
1372*4882a593Smuzhiyun
1373*4882a593Smuzhiyun enum {
1374*4882a593Smuzhiyun RK3562_GMAC0_RMII_MODE_SHIFT = 0x5,
1375*4882a593Smuzhiyun RK3562_GMAC0_RMII_MODE_MASK = BIT(5),
1376*4882a593Smuzhiyun RK3562_GMAC0_RMII_MODE = 0x1,
1377*4882a593Smuzhiyun };
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1380*4882a593Smuzhiyun
1381*4882a593Smuzhiyun if (!pdata->bus_id) {
1382*4882a593Smuzhiyun mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT;
1383*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode);
1384*4882a593Smuzhiyun }
1385*4882a593Smuzhiyun }
1386*4882a593Smuzhiyun
rk3562_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1387*4882a593Smuzhiyun static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1388*4882a593Smuzhiyun {
1389*4882a593Smuzhiyun struct rk3562_grf *grf;
1390*4882a593Smuzhiyun struct rk3562_ioc *ioc;
1391*4882a593Smuzhiyun unsigned int rx_enable;
1392*4882a593Smuzhiyun unsigned int rx_delay;
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun enum {
1395*4882a593Smuzhiyun RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5,
1396*4882a593Smuzhiyun RK3562_GMAC0_RGMII_MODE_MASK = BIT(5),
1397*4882a593Smuzhiyun RK3562_GMAC0_RGMII_MODE = 0x0,
1398*4882a593Smuzhiyun
1399*4882a593Smuzhiyun RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0),
1400*4882a593Smuzhiyun RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0,
1401*4882a593Smuzhiyun RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0),
1402*4882a593Smuzhiyun
1403*4882a593Smuzhiyun RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1),
1404*4882a593Smuzhiyun RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0,
1405*4882a593Smuzhiyun RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1),
1406*4882a593Smuzhiyun };
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun enum {
1409*4882a593Smuzhiyun RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8,
1410*4882a593Smuzhiyun RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8),
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0,
1413*4882a593Smuzhiyun RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0),
1414*4882a593Smuzhiyun };
1415*4882a593Smuzhiyun
1416*4882a593Smuzhiyun if (pdata->bus_id)
1417*4882a593Smuzhiyun return;
1418*4882a593Smuzhiyun
1419*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1420*4882a593Smuzhiyun ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK,
1423*4882a593Smuzhiyun RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT);
1424*4882a593Smuzhiyun
1425*4882a593Smuzhiyun if (pdata->rx_delay < 0) {
1426*4882a593Smuzhiyun rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE;
1427*4882a593Smuzhiyun rx_delay = 0;
1428*4882a593Smuzhiyun } else {
1429*4882a593Smuzhiyun rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE;
1430*4882a593Smuzhiyun rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT;
1431*4882a593Smuzhiyun }
1432*4882a593Smuzhiyun
1433*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac0_io_con1,
1434*4882a593Smuzhiyun RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
1435*4882a593Smuzhiyun RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
1436*4882a593Smuzhiyun rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
1437*4882a593Smuzhiyun
1438*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac0_io_con0,
1439*4882a593Smuzhiyun RK3562_GMAC0_RX_DL_CFG_MASK |
1440*4882a593Smuzhiyun RK3562_GMAC0_TX_DL_CFG_MASK,
1441*4882a593Smuzhiyun (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
1442*4882a593Smuzhiyun rx_delay);
1443*4882a593Smuzhiyun
1444*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac1_io_con1,
1445*4882a593Smuzhiyun RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
1446*4882a593Smuzhiyun RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
1447*4882a593Smuzhiyun rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
1448*4882a593Smuzhiyun
1449*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac1_io_con0,
1450*4882a593Smuzhiyun RK3562_GMAC0_RX_DL_CFG_MASK |
1451*4882a593Smuzhiyun RK3562_GMAC0_TX_DL_CFG_MASK,
1452*4882a593Smuzhiyun (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
1453*4882a593Smuzhiyun rx_delay);
1454*4882a593Smuzhiyun }
1455*4882a593Smuzhiyun
rk3568_set_to_rmii(struct gmac_rockchip_platdata * pdata)1456*4882a593Smuzhiyun static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1457*4882a593Smuzhiyun {
1458*4882a593Smuzhiyun struct rk3568_grf *grf;
1459*4882a593Smuzhiyun void *con1;
1460*4882a593Smuzhiyun
1461*4882a593Smuzhiyun enum {
1462*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
1463*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
1464*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1465*4882a593Smuzhiyun };
1466*4882a593Smuzhiyun
1467*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1468*4882a593Smuzhiyun
1469*4882a593Smuzhiyun if (pdata->bus_id == 1)
1470*4882a593Smuzhiyun con1 = &grf->mac1_con1;
1471*4882a593Smuzhiyun else
1472*4882a593Smuzhiyun con1 = &grf->mac0_con1;
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun rk_clrsetreg(con1,
1475*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_MASK,
1476*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_RMII);
1477*4882a593Smuzhiyun }
1478*4882a593Smuzhiyun
rk3568_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1479*4882a593Smuzhiyun static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1480*4882a593Smuzhiyun {
1481*4882a593Smuzhiyun struct rk3568_grf *grf;
1482*4882a593Smuzhiyun void *con0, *con1;
1483*4882a593Smuzhiyun
1484*4882a593Smuzhiyun enum {
1485*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
1486*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
1487*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1488*4882a593Smuzhiyun
1489*4882a593Smuzhiyun RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
1490*4882a593Smuzhiyun RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1491*4882a593Smuzhiyun RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
1492*4882a593Smuzhiyun
1493*4882a593Smuzhiyun RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
1494*4882a593Smuzhiyun RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1495*4882a593Smuzhiyun RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
1496*4882a593Smuzhiyun };
1497*4882a593Smuzhiyun
1498*4882a593Smuzhiyun enum {
1499*4882a593Smuzhiyun RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1500*4882a593Smuzhiyun RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1501*4882a593Smuzhiyun
1502*4882a593Smuzhiyun RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1503*4882a593Smuzhiyun RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1504*4882a593Smuzhiyun };
1505*4882a593Smuzhiyun
1506*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun if (pdata->bus_id == 1) {
1509*4882a593Smuzhiyun con0 = &grf->mac1_con0;
1510*4882a593Smuzhiyun con1 = &grf->mac1_con1;
1511*4882a593Smuzhiyun } else {
1512*4882a593Smuzhiyun con0 = &grf->mac0_con0;
1513*4882a593Smuzhiyun con1 = &grf->mac0_con1;
1514*4882a593Smuzhiyun }
1515*4882a593Smuzhiyun
1516*4882a593Smuzhiyun rk_clrsetreg(con0,
1517*4882a593Smuzhiyun RK3568_CLK_RX_DL_CFG_GMAC_MASK |
1518*4882a593Smuzhiyun RK3568_CLK_TX_DL_CFG_GMAC_MASK,
1519*4882a593Smuzhiyun (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) |
1520*4882a593Smuzhiyun (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT));
1521*4882a593Smuzhiyun
1522*4882a593Smuzhiyun rk_clrsetreg(con1,
1523*4882a593Smuzhiyun RK3568_TXCLK_DLY_ENA_GMAC_MASK |
1524*4882a593Smuzhiyun RK3568_RXCLK_DLY_ENA_GMAC_MASK |
1525*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_MASK,
1526*4882a593Smuzhiyun RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
1527*4882a593Smuzhiyun RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
1528*4882a593Smuzhiyun RK3568_GMAC_PHY_INTF_SEL_RGMII);
1529*4882a593Smuzhiyun }
1530*4882a593Smuzhiyun
rk3588_set_to_rmii(struct gmac_rockchip_platdata * pdata)1531*4882a593Smuzhiyun static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1532*4882a593Smuzhiyun {
1533*4882a593Smuzhiyun unsigned int intf_sel, intf_sel_mask;
1534*4882a593Smuzhiyun unsigned int clk_mode, clk_mode_mask;
1535*4882a593Smuzhiyun struct rk3588_php_grf *php_grf;
1536*4882a593Smuzhiyun
1537*4882a593Smuzhiyun enum {
1538*4882a593Smuzhiyun RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1539*4882a593Smuzhiyun RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1540*4882a593Smuzhiyun RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1541*4882a593Smuzhiyun };
1542*4882a593Smuzhiyun
1543*4882a593Smuzhiyun enum {
1544*4882a593Smuzhiyun RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1545*4882a593Smuzhiyun RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1546*4882a593Smuzhiyun RK3588_GMAC_CLK_RMII_MODE = 0x1,
1547*4882a593Smuzhiyun };
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1550*4882a593Smuzhiyun
1551*4882a593Smuzhiyun if (pdata->bus_id == 1) {
1552*4882a593Smuzhiyun intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1553*4882a593Smuzhiyun intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1554*4882a593Smuzhiyun clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1555*4882a593Smuzhiyun clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1556*4882a593Smuzhiyun } else {
1557*4882a593Smuzhiyun intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1558*4882a593Smuzhiyun intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1559*4882a593Smuzhiyun clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1560*4882a593Smuzhiyun clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1561*4882a593Smuzhiyun }
1562*4882a593Smuzhiyun
1563*4882a593Smuzhiyun rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1564*4882a593Smuzhiyun rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1565*4882a593Smuzhiyun }
1566*4882a593Smuzhiyun
rk3588_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1567*4882a593Smuzhiyun static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1568*4882a593Smuzhiyun {
1569*4882a593Smuzhiyun unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1570*4882a593Smuzhiyun unsigned int intf_sel, intf_sel_mask;
1571*4882a593Smuzhiyun unsigned int clk_mode, clk_mode_mask;
1572*4882a593Smuzhiyun unsigned int rx_delay;
1573*4882a593Smuzhiyun struct rk3588_php_grf *php_grf;
1574*4882a593Smuzhiyun struct rk3588_sys_grf *grf;
1575*4882a593Smuzhiyun void *offset_con;
1576*4882a593Smuzhiyun
1577*4882a593Smuzhiyun enum {
1578*4882a593Smuzhiyun RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1579*4882a593Smuzhiyun RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1580*4882a593Smuzhiyun RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1581*4882a593Smuzhiyun
1582*4882a593Smuzhiyun RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1583*4882a593Smuzhiyun RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1584*4882a593Smuzhiyun RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1585*4882a593Smuzhiyun
1586*4882a593Smuzhiyun RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1587*4882a593Smuzhiyun RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1588*4882a593Smuzhiyun RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1589*4882a593Smuzhiyun };
1590*4882a593Smuzhiyun
1591*4882a593Smuzhiyun enum {
1592*4882a593Smuzhiyun RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1593*4882a593Smuzhiyun RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1594*4882a593Smuzhiyun
1595*4882a593Smuzhiyun RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1596*4882a593Smuzhiyun RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1597*4882a593Smuzhiyun };
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun enum {
1600*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1601*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1602*4882a593Smuzhiyun RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1603*4882a593Smuzhiyun };
1604*4882a593Smuzhiyun
1605*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1606*4882a593Smuzhiyun php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1607*4882a593Smuzhiyun
1608*4882a593Smuzhiyun if (pdata->rx_delay < 0) {
1609*4882a593Smuzhiyun rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1610*4882a593Smuzhiyun rx_delay = 0;
1611*4882a593Smuzhiyun } else {
1612*4882a593Smuzhiyun rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1613*4882a593Smuzhiyun rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1614*4882a593Smuzhiyun }
1615*4882a593Smuzhiyun
1616*4882a593Smuzhiyun if (pdata->bus_id == 1) {
1617*4882a593Smuzhiyun offset_con = &grf->soc_con9;
1618*4882a593Smuzhiyun rx_enable = rx_delay << 2;
1619*4882a593Smuzhiyun rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1620*4882a593Smuzhiyun tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1621*4882a593Smuzhiyun tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1622*4882a593Smuzhiyun intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1623*4882a593Smuzhiyun intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1624*4882a593Smuzhiyun clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1625*4882a593Smuzhiyun clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1626*4882a593Smuzhiyun } else {
1627*4882a593Smuzhiyun offset_con = &grf->soc_con8;
1628*4882a593Smuzhiyun rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1629*4882a593Smuzhiyun tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1630*4882a593Smuzhiyun tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1631*4882a593Smuzhiyun intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1632*4882a593Smuzhiyun intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1633*4882a593Smuzhiyun clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1634*4882a593Smuzhiyun clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1635*4882a593Smuzhiyun }
1636*4882a593Smuzhiyun
1637*4882a593Smuzhiyun rk_clrsetreg(offset_con,
1638*4882a593Smuzhiyun RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1639*4882a593Smuzhiyun RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1640*4882a593Smuzhiyun (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) |
1641*4882a593Smuzhiyun rx_delay);
1642*4882a593Smuzhiyun
1643*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1644*4882a593Smuzhiyun tx_enable | rx_enable);
1645*4882a593Smuzhiyun
1646*4882a593Smuzhiyun rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1647*4882a593Smuzhiyun rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1648*4882a593Smuzhiyun }
1649*4882a593Smuzhiyun
rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1650*4882a593Smuzhiyun static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1651*4882a593Smuzhiyun {
1652*4882a593Smuzhiyun struct rv1106_grf *grf;
1653*4882a593Smuzhiyun unsigned char bgs[1] = {0};
1654*4882a593Smuzhiyun
1655*4882a593Smuzhiyun enum {
1656*4882a593Smuzhiyun RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1657*4882a593Smuzhiyun RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1658*4882a593Smuzhiyun };
1659*4882a593Smuzhiyun
1660*4882a593Smuzhiyun enum {
1661*4882a593Smuzhiyun RV1106_MACPHY_ENABLE_MASK = BIT(1),
1662*4882a593Smuzhiyun RV1106_MACPHY_DISENABLE = BIT(1),
1663*4882a593Smuzhiyun RV1106_MACPHY_ENABLE = 0,
1664*4882a593Smuzhiyun RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
1665*4882a593Smuzhiyun RV1106_MACPHY_XMII_SEL = BIT(6),
1666*4882a593Smuzhiyun RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
1667*4882a593Smuzhiyun RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
1668*4882a593Smuzhiyun RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
1669*4882a593Smuzhiyun RV1106_MACPHY_PHY_ID = BIT(11),
1670*4882a593Smuzhiyun };
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun enum {
1673*4882a593Smuzhiyun RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
1674*4882a593Smuzhiyun RV1106_MACPHY_BGS = BIT(2),
1675*4882a593Smuzhiyun };
1676*4882a593Smuzhiyun
1677*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1678*4882a593Smuzhiyun struct udevice *dev;
1679*4882a593Smuzhiyun u32 regs[2] = {0};
1680*4882a593Smuzhiyun ofnode node;
1681*4882a593Smuzhiyun int ret = 0;
1682*4882a593Smuzhiyun
1683*4882a593Smuzhiyun /* retrieve the device */
1684*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1685*4882a593Smuzhiyun ret = uclass_get_device_by_driver(UCLASS_MISC,
1686*4882a593Smuzhiyun DM_GET_DRIVER(rockchip_efuse),
1687*4882a593Smuzhiyun &dev);
1688*4882a593Smuzhiyun else
1689*4882a593Smuzhiyun ret = uclass_get_device_by_driver(UCLASS_MISC,
1690*4882a593Smuzhiyun DM_GET_DRIVER(rockchip_otp),
1691*4882a593Smuzhiyun &dev);
1692*4882a593Smuzhiyun if (!ret) {
1693*4882a593Smuzhiyun node = dev_read_subnode(dev, "macphy-bgs");
1694*4882a593Smuzhiyun if (ofnode_valid(node)) {
1695*4882a593Smuzhiyun if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1696*4882a593Smuzhiyun /* read the bgs from the efuses */
1697*4882a593Smuzhiyun ret = misc_read(dev, regs[0], &bgs, 1);
1698*4882a593Smuzhiyun if (ret) {
1699*4882a593Smuzhiyun printf("read bgs from efuse/otp failed, ret=%d\n",
1700*4882a593Smuzhiyun ret);
1701*4882a593Smuzhiyun bgs[0] = 0;
1702*4882a593Smuzhiyun }
1703*4882a593Smuzhiyun }
1704*4882a593Smuzhiyun }
1705*4882a593Smuzhiyun }
1706*4882a593Smuzhiyun #endif
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1709*4882a593Smuzhiyun
1710*4882a593Smuzhiyun reset_assert(&pdata->phy_reset);
1711*4882a593Smuzhiyun udelay(20);
1712*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con0,
1713*4882a593Smuzhiyun RV1106_MACPHY_ENABLE_MASK |
1714*4882a593Smuzhiyun RV1106_MACPHY_XMII_SEL_MASK |
1715*4882a593Smuzhiyun RV1106_MACPHY_24M_CLK_SEL_MASK |
1716*4882a593Smuzhiyun RV1106_MACPHY_PHY_ID_MASK,
1717*4882a593Smuzhiyun RV1106_MACPHY_ENABLE |
1718*4882a593Smuzhiyun RV1106_MACPHY_XMII_SEL |
1719*4882a593Smuzhiyun RV1106_MACPHY_24M_CLK_SEL_24M |
1720*4882a593Smuzhiyun RV1106_MACPHY_PHY_ID);
1721*4882a593Smuzhiyun
1722*4882a593Smuzhiyun rk_clrsetreg(&grf->macphy_con1,
1723*4882a593Smuzhiyun RV1106_MACPHY_BGS_MASK,
1724*4882a593Smuzhiyun bgs[0]);
1725*4882a593Smuzhiyun udelay(20);
1726*4882a593Smuzhiyun reset_deassert(&pdata->phy_reset);
1727*4882a593Smuzhiyun udelay(30 * 1000);
1728*4882a593Smuzhiyun }
1729*4882a593Smuzhiyun
rv1106_set_to_rmii(struct gmac_rockchip_platdata * pdata)1730*4882a593Smuzhiyun static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1731*4882a593Smuzhiyun {
1732*4882a593Smuzhiyun struct rv1106_grf *grf;
1733*4882a593Smuzhiyun enum {
1734*4882a593Smuzhiyun RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1735*4882a593Smuzhiyun RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1736*4882a593Smuzhiyun };
1737*4882a593Smuzhiyun
1738*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1739*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac_clk_con,
1740*4882a593Smuzhiyun RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
1741*4882a593Smuzhiyun RV1106_VOGRF_GMAC_CLK_RMII_MODE);
1742*4882a593Smuzhiyun };
1743*4882a593Smuzhiyun
rv1126_set_to_rmii(struct gmac_rockchip_platdata * pdata)1744*4882a593Smuzhiyun static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1745*4882a593Smuzhiyun {
1746*4882a593Smuzhiyun struct rv1126_grf *grf;
1747*4882a593Smuzhiyun
1748*4882a593Smuzhiyun enum {
1749*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1750*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
1751*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1752*4882a593Smuzhiyun };
1753*4882a593Smuzhiyun
1754*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1755*4882a593Smuzhiyun
1756*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con0,
1757*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_MASK,
1758*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_RMII);
1759*4882a593Smuzhiyun }
1760*4882a593Smuzhiyun
rv1126_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1761*4882a593Smuzhiyun static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1762*4882a593Smuzhiyun {
1763*4882a593Smuzhiyun struct rv1126_grf *grf;
1764*4882a593Smuzhiyun
1765*4882a593Smuzhiyun enum {
1766*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1767*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
1768*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1769*4882a593Smuzhiyun
1770*4882a593Smuzhiyun RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1771*4882a593Smuzhiyun RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1772*4882a593Smuzhiyun RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1773*4882a593Smuzhiyun
1774*4882a593Smuzhiyun RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1775*4882a593Smuzhiyun RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1776*4882a593Smuzhiyun RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1777*4882a593Smuzhiyun
1778*4882a593Smuzhiyun RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1779*4882a593Smuzhiyun RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1780*4882a593Smuzhiyun RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1781*4882a593Smuzhiyun
1782*4882a593Smuzhiyun RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1783*4882a593Smuzhiyun RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1784*4882a593Smuzhiyun RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1785*4882a593Smuzhiyun };
1786*4882a593Smuzhiyun enum {
1787*4882a593Smuzhiyun RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1788*4882a593Smuzhiyun RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1789*4882a593Smuzhiyun
1790*4882a593Smuzhiyun RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1791*4882a593Smuzhiyun RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1792*4882a593Smuzhiyun };
1793*4882a593Smuzhiyun enum {
1794*4882a593Smuzhiyun RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1795*4882a593Smuzhiyun RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1796*4882a593Smuzhiyun
1797*4882a593Smuzhiyun RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1798*4882a593Smuzhiyun RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1799*4882a593Smuzhiyun };
1800*4882a593Smuzhiyun
1801*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1802*4882a593Smuzhiyun
1803*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con0,
1804*4882a593Smuzhiyun RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1805*4882a593Smuzhiyun RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1806*4882a593Smuzhiyun RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1807*4882a593Smuzhiyun RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1808*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_MASK,
1809*4882a593Smuzhiyun RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1810*4882a593Smuzhiyun RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1811*4882a593Smuzhiyun RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1812*4882a593Smuzhiyun RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1813*4882a593Smuzhiyun RV1126_GMAC_PHY_INTF_SEL_RGMII);
1814*4882a593Smuzhiyun
1815*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con1,
1816*4882a593Smuzhiyun RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1817*4882a593Smuzhiyun RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1818*4882a593Smuzhiyun (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) |
1819*4882a593Smuzhiyun (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT));
1820*4882a593Smuzhiyun
1821*4882a593Smuzhiyun rk_clrsetreg(&grf->mac_con2,
1822*4882a593Smuzhiyun RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1823*4882a593Smuzhiyun RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1824*4882a593Smuzhiyun (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) |
1825*4882a593Smuzhiyun (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT));
1826*4882a593Smuzhiyun }
1827*4882a593Smuzhiyun #endif
1828*4882a593Smuzhiyun
1829*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
rk3528_set_clock_selection(struct gmac_rockchip_platdata * pdata)1830*4882a593Smuzhiyun static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1831*4882a593Smuzhiyun {
1832*4882a593Smuzhiyun struct rk3528_grf *grf;
1833*4882a593Smuzhiyun unsigned int val;
1834*4882a593Smuzhiyun
1835*4882a593Smuzhiyun enum {
1836*4882a593Smuzhiyun RK3528_GMAC1_CLK_SELET_SHIFT = 0x12,
1837*4882a593Smuzhiyun RK3528_GMAC1_CLK_SELET_MASK = BIT(12),
1838*4882a593Smuzhiyun RK3528_GMAC1_CLK_SELET_CRU = 0,
1839*4882a593Smuzhiyun RK3528_GMAC1_CLK_SELET_IO = BIT(12),
1840*4882a593Smuzhiyun };
1841*4882a593Smuzhiyun
1842*4882a593Smuzhiyun if (!pdata->bus_id)
1843*4882a593Smuzhiyun return;
1844*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1845*4882a593Smuzhiyun
1846*4882a593Smuzhiyun val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO :
1847*4882a593Smuzhiyun RK3528_GMAC1_CLK_SELET_CRU;
1848*4882a593Smuzhiyun rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val);
1849*4882a593Smuzhiyun }
1850*4882a593Smuzhiyun
rk3562_set_clock_selection(struct gmac_rockchip_platdata * pdata)1851*4882a593Smuzhiyun static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1852*4882a593Smuzhiyun {
1853*4882a593Smuzhiyun struct rk3562_grf *grf;
1854*4882a593Smuzhiyun struct rk3562_ioc *ioc;
1855*4882a593Smuzhiyun unsigned int val;
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun enum {
1858*4882a593Smuzhiyun RK3562_GMAC0_CLK_SELET_SHIFT = 0x9,
1859*4882a593Smuzhiyun RK3562_GMAC0_CLK_SELET_MASK = BIT(9),
1860*4882a593Smuzhiyun RK3562_GMAC0_CLK_SELET_CRU = 0,
1861*4882a593Smuzhiyun RK3562_GMAC0_CLK_SELET_IO = BIT(9),
1862*4882a593Smuzhiyun };
1863*4882a593Smuzhiyun
1864*4882a593Smuzhiyun enum {
1865*4882a593Smuzhiyun RK3562_GMAC1_CLK_SELET_SHIFT = 15,
1866*4882a593Smuzhiyun RK3562_GMAC1_CLK_SELET_MASK = BIT(15),
1867*4882a593Smuzhiyun RK3562_GMAC1_CLK_SELET_CRU = 0,
1868*4882a593Smuzhiyun RK3562_GMAC1_CLK_SELET_IO = BIT(15),
1869*4882a593Smuzhiyun };
1870*4882a593Smuzhiyun
1871*4882a593Smuzhiyun enum {
1872*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2,
1873*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2),
1874*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0,
1875*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2),
1876*4882a593Smuzhiyun };
1877*4882a593Smuzhiyun
1878*4882a593Smuzhiyun enum {
1879*4882a593Smuzhiyun RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3,
1880*4882a593Smuzhiyun RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3),
1881*4882a593Smuzhiyun RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0,
1882*4882a593Smuzhiyun RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3),
1883*4882a593Smuzhiyun };
1884*4882a593Smuzhiyun
1885*4882a593Smuzhiyun grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1886*4882a593Smuzhiyun ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
1887*4882a593Smuzhiyun
1888*4882a593Smuzhiyun if (!pdata->bus_id) {
1889*4882a593Smuzhiyun val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO :
1890*4882a593Smuzhiyun RK3562_GMAC0_CLK_SELET_CRU;
1891*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val);
1892*4882a593Smuzhiyun val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO :
1893*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_CRU;
1894*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac1_io_con1,
1895*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
1896*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac0_io_con1,
1897*4882a593Smuzhiyun RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
1898*4882a593Smuzhiyun
1899*4882a593Smuzhiyun } else {
1900*4882a593Smuzhiyun val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO :
1901*4882a593Smuzhiyun RK3562_GMAC1_CLK_SELET_CRU;
1902*4882a593Smuzhiyun rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val);
1903*4882a593Smuzhiyun val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO :
1904*4882a593Smuzhiyun RK3562_GMAC1_IO_EXTCLK_SELET_CRU;
1905*4882a593Smuzhiyun rk_clrsetreg(&ioc->mac1_io_con1,
1906*4882a593Smuzhiyun RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val);
1907*4882a593Smuzhiyun }
1908*4882a593Smuzhiyun }
1909*4882a593Smuzhiyun
rk3588_set_clock_selection(struct gmac_rockchip_platdata * pdata)1910*4882a593Smuzhiyun static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1911*4882a593Smuzhiyun {
1912*4882a593Smuzhiyun struct rk3588_php_grf *php_grf;
1913*4882a593Smuzhiyun unsigned int val, mask;
1914*4882a593Smuzhiyun
1915*4882a593Smuzhiyun enum {
1916*4882a593Smuzhiyun RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
1917*4882a593Smuzhiyun RK3588_GMAC_CLK_SELET_MASK = BIT(4),
1918*4882a593Smuzhiyun RK3588_GMAC_CLK_SELET_CRU = BIT(4),
1919*4882a593Smuzhiyun RK3588_GMAC_CLK_SELET_IO = 0,
1920*4882a593Smuzhiyun };
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1923*4882a593Smuzhiyun val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
1924*4882a593Smuzhiyun RK3588_GMAC_CLK_SELET_CRU;
1925*4882a593Smuzhiyun mask = RK3588_GMAC_CLK_SELET_MASK;
1926*4882a593Smuzhiyun
1927*4882a593Smuzhiyun if (pdata->bus_id == 1) {
1928*4882a593Smuzhiyun val <<= 5;
1929*4882a593Smuzhiyun mask <<= 5;
1930*4882a593Smuzhiyun }
1931*4882a593Smuzhiyun
1932*4882a593Smuzhiyun rk_clrsetreg(&php_grf->clk_con1, mask, val);
1933*4882a593Smuzhiyun }
1934*4882a593Smuzhiyun #endif
1935*4882a593Smuzhiyun
gmac_rockchip_probe(struct udevice * dev)1936*4882a593Smuzhiyun static int gmac_rockchip_probe(struct udevice *dev)
1937*4882a593Smuzhiyun {
1938*4882a593Smuzhiyun struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1939*4882a593Smuzhiyun struct rk_gmac_ops *ops =
1940*4882a593Smuzhiyun (struct rk_gmac_ops *)dev_get_driver_data(dev);
1941*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
1942*4882a593Smuzhiyun struct eqos_config *config;
1943*4882a593Smuzhiyun #else
1944*4882a593Smuzhiyun struct dw_eth_pdata *dw_pdata;
1945*4882a593Smuzhiyun #endif
1946*4882a593Smuzhiyun struct eth_pdata *eth_pdata;
1947*4882a593Smuzhiyun struct clk clk;
1948*4882a593Smuzhiyun ulong rate;
1949*4882a593Smuzhiyun int ret;
1950*4882a593Smuzhiyun
1951*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
1952*4882a593Smuzhiyun eth_pdata = &pdata->eth_pdata;
1953*4882a593Smuzhiyun config = (struct eqos_config *)&ops->config;
1954*4882a593Smuzhiyun memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
1955*4882a593Smuzhiyun eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
1956*4882a593Smuzhiyun #else
1957*4882a593Smuzhiyun dw_pdata = &pdata->dw_eth_pdata;
1958*4882a593Smuzhiyun eth_pdata = &dw_pdata->eth_pdata;
1959*4882a593Smuzhiyun #endif
1960*4882a593Smuzhiyun pdata->bus_id = dev->seq;
1961*4882a593Smuzhiyun
1962*4882a593Smuzhiyun /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1963*4882a593Smuzhiyun ret = clk_set_defaults(dev);
1964*4882a593Smuzhiyun if (ret)
1965*4882a593Smuzhiyun debug("%s clk_set_defaults failed %d\n", __func__, ret);
1966*4882a593Smuzhiyun
1967*4882a593Smuzhiyun ret = clk_get_by_index(dev, 0, &clk);
1968*4882a593Smuzhiyun if (ret)
1969*4882a593Smuzhiyun return ret;
1970*4882a593Smuzhiyun
1971*4882a593Smuzhiyun pdata->phy_interface = eth_pdata->phy_interface;
1972*4882a593Smuzhiyun
1973*4882a593Smuzhiyun if (ops->set_clock_selection)
1974*4882a593Smuzhiyun ops->set_clock_selection(pdata);
1975*4882a593Smuzhiyun
1976*4882a593Smuzhiyun if (pdata->integrated_phy && ops->integrated_phy_powerup)
1977*4882a593Smuzhiyun ops->integrated_phy_powerup(pdata);
1978*4882a593Smuzhiyun
1979*4882a593Smuzhiyun switch (eth_pdata->phy_interface) {
1980*4882a593Smuzhiyun case PHY_INTERFACE_MODE_RGMII:
1981*4882a593Smuzhiyun case PHY_INTERFACE_MODE_RGMII_RXID:
1982*4882a593Smuzhiyun /*
1983*4882a593Smuzhiyun * If the gmac clock is from internal pll, need to set and
1984*4882a593Smuzhiyun * check the return value for gmac clock at RGMII mode. If
1985*4882a593Smuzhiyun * the gmac clock is from external source, the clock rate
1986*4882a593Smuzhiyun * is not set, because of it is bypassed.
1987*4882a593Smuzhiyun */
1988*4882a593Smuzhiyun if (!pdata->clock_input) {
1989*4882a593Smuzhiyun rate = clk_set_rate(&clk, 125000000);
1990*4882a593Smuzhiyun if (rate != 125000000)
1991*4882a593Smuzhiyun return -EINVAL;
1992*4882a593Smuzhiyun }
1993*4882a593Smuzhiyun
1994*4882a593Smuzhiyun if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
1995*4882a593Smuzhiyun pdata->rx_delay = -1;
1996*4882a593Smuzhiyun
1997*4882a593Smuzhiyun /* Set to RGMII mode */
1998*4882a593Smuzhiyun if (ops->set_to_rgmii)
1999*4882a593Smuzhiyun ops->set_to_rgmii(pdata);
2000*4882a593Smuzhiyun else
2001*4882a593Smuzhiyun return -EPERM;
2002*4882a593Smuzhiyun
2003*4882a593Smuzhiyun break;
2004*4882a593Smuzhiyun case PHY_INTERFACE_MODE_RMII:
2005*4882a593Smuzhiyun /* The commet is the same as RGMII mode */
2006*4882a593Smuzhiyun if (!pdata->clock_input) {
2007*4882a593Smuzhiyun rate = clk_set_rate(&clk, 50000000);
2008*4882a593Smuzhiyun if (rate != 50000000)
2009*4882a593Smuzhiyun return -EINVAL;
2010*4882a593Smuzhiyun }
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun /* Set to RMII mode */
2013*4882a593Smuzhiyun if (ops->set_to_rmii)
2014*4882a593Smuzhiyun ops->set_to_rmii(pdata);
2015*4882a593Smuzhiyun
2016*4882a593Smuzhiyun break;
2017*4882a593Smuzhiyun default:
2018*4882a593Smuzhiyun debug("NO interface defined!\n");
2019*4882a593Smuzhiyun return -ENXIO;
2020*4882a593Smuzhiyun }
2021*4882a593Smuzhiyun
2022*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2023*4882a593Smuzhiyun return eqos_probe(dev);
2024*4882a593Smuzhiyun #else
2025*4882a593Smuzhiyun return designware_eth_probe(dev);
2026*4882a593Smuzhiyun #endif
2027*4882a593Smuzhiyun }
2028*4882a593Smuzhiyun
gmac_rockchip_eth_write_hwaddr(struct udevice * dev)2029*4882a593Smuzhiyun static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
2030*4882a593Smuzhiyun {
2031*4882a593Smuzhiyun #if defined(CONFIG_DWC_ETH_QOS)
2032*4882a593Smuzhiyun return eqos_write_hwaddr(dev);
2033*4882a593Smuzhiyun #else
2034*4882a593Smuzhiyun return designware_eth_write_hwaddr(dev);
2035*4882a593Smuzhiyun #endif
2036*4882a593Smuzhiyun }
2037*4882a593Smuzhiyun
gmac_rockchip_eth_free_pkt(struct udevice * dev,uchar * packet,int length)2038*4882a593Smuzhiyun static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
2039*4882a593Smuzhiyun int length)
2040*4882a593Smuzhiyun {
2041*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2042*4882a593Smuzhiyun return eqos_free_pkt(dev, packet, length);
2043*4882a593Smuzhiyun #else
2044*4882a593Smuzhiyun return designware_eth_free_pkt(dev, packet, length);
2045*4882a593Smuzhiyun #endif
2046*4882a593Smuzhiyun }
2047*4882a593Smuzhiyun
gmac_rockchip_eth_send(struct udevice * dev,void * packet,int length)2048*4882a593Smuzhiyun static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
2049*4882a593Smuzhiyun int length)
2050*4882a593Smuzhiyun {
2051*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2052*4882a593Smuzhiyun return eqos_send(dev, packet, length);
2053*4882a593Smuzhiyun #else
2054*4882a593Smuzhiyun return designware_eth_send(dev, packet, length);
2055*4882a593Smuzhiyun #endif
2056*4882a593Smuzhiyun }
2057*4882a593Smuzhiyun
gmac_rockchip_eth_recv(struct udevice * dev,int flags,uchar ** packetp)2058*4882a593Smuzhiyun static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
2059*4882a593Smuzhiyun uchar **packetp)
2060*4882a593Smuzhiyun {
2061*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2062*4882a593Smuzhiyun return eqos_recv(dev, flags, packetp);
2063*4882a593Smuzhiyun #else
2064*4882a593Smuzhiyun return designware_eth_recv(dev, flags, packetp);
2065*4882a593Smuzhiyun #endif
2066*4882a593Smuzhiyun }
2067*4882a593Smuzhiyun
gmac_rockchip_eth_start(struct udevice * dev)2068*4882a593Smuzhiyun static int gmac_rockchip_eth_start(struct udevice *dev)
2069*4882a593Smuzhiyun {
2070*4882a593Smuzhiyun struct rockchip_eth_dev *priv = dev_get_priv(dev);
2071*4882a593Smuzhiyun struct rk_gmac_ops *ops =
2072*4882a593Smuzhiyun (struct rk_gmac_ops *)dev_get_driver_data(dev);
2073*4882a593Smuzhiyun struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
2074*4882a593Smuzhiyun #ifndef CONFIG_DWC_ETH_QOS
2075*4882a593Smuzhiyun struct dw_eth_pdata *dw_pdata;
2076*4882a593Smuzhiyun struct eth_pdata *eth_pdata;
2077*4882a593Smuzhiyun #endif
2078*4882a593Smuzhiyun int ret;
2079*4882a593Smuzhiyun
2080*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2081*4882a593Smuzhiyun ret = eqos_init(dev);
2082*4882a593Smuzhiyun #else
2083*4882a593Smuzhiyun dw_pdata = &pdata->dw_eth_pdata;
2084*4882a593Smuzhiyun eth_pdata = &dw_pdata->eth_pdata;
2085*4882a593Smuzhiyun ret = designware_eth_init((struct dw_eth_dev *)priv,
2086*4882a593Smuzhiyun eth_pdata->enetaddr);
2087*4882a593Smuzhiyun #endif
2088*4882a593Smuzhiyun if (ret)
2089*4882a593Smuzhiyun return ret;
2090*4882a593Smuzhiyun ret = ops->fix_mac_speed(pdata, priv);
2091*4882a593Smuzhiyun if (ret)
2092*4882a593Smuzhiyun return ret;
2093*4882a593Smuzhiyun
2094*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2095*4882a593Smuzhiyun eqos_enable(dev);
2096*4882a593Smuzhiyun #else
2097*4882a593Smuzhiyun ret = designware_eth_enable((struct dw_eth_dev *)priv);
2098*4882a593Smuzhiyun if (ret)
2099*4882a593Smuzhiyun return ret;
2100*4882a593Smuzhiyun #endif
2101*4882a593Smuzhiyun
2102*4882a593Smuzhiyun return 0;
2103*4882a593Smuzhiyun }
2104*4882a593Smuzhiyun
gmac_rockchip_eth_stop(struct udevice * dev)2105*4882a593Smuzhiyun static void gmac_rockchip_eth_stop(struct udevice *dev)
2106*4882a593Smuzhiyun {
2107*4882a593Smuzhiyun #ifdef CONFIG_DWC_ETH_QOS
2108*4882a593Smuzhiyun eqos_stop(dev);
2109*4882a593Smuzhiyun #else
2110*4882a593Smuzhiyun designware_eth_stop(dev);
2111*4882a593Smuzhiyun #endif
2112*4882a593Smuzhiyun }
2113*4882a593Smuzhiyun
2114*4882a593Smuzhiyun const struct eth_ops gmac_rockchip_eth_ops = {
2115*4882a593Smuzhiyun .start = gmac_rockchip_eth_start,
2116*4882a593Smuzhiyun .send = gmac_rockchip_eth_send,
2117*4882a593Smuzhiyun .recv = gmac_rockchip_eth_recv,
2118*4882a593Smuzhiyun .free_pkt = gmac_rockchip_eth_free_pkt,
2119*4882a593Smuzhiyun .stop = gmac_rockchip_eth_stop,
2120*4882a593Smuzhiyun .write_hwaddr = gmac_rockchip_eth_write_hwaddr,
2121*4882a593Smuzhiyun };
2122*4882a593Smuzhiyun
2123*4882a593Smuzhiyun #ifndef CONFIG_DWC_ETH_QOS
2124*4882a593Smuzhiyun const struct rk_gmac_ops px30_gmac_ops = {
2125*4882a593Smuzhiyun .fix_mac_speed = px30_gmac_fix_mac_speed,
2126*4882a593Smuzhiyun .set_to_rmii = px30_gmac_set_to_rmii,
2127*4882a593Smuzhiyun };
2128*4882a593Smuzhiyun
2129*4882a593Smuzhiyun const struct rk_gmac_ops rk1808_gmac_ops = {
2130*4882a593Smuzhiyun .fix_mac_speed = rk1808_gmac_fix_mac_speed,
2131*4882a593Smuzhiyun .set_to_rgmii = rk1808_gmac_set_to_rgmii,
2132*4882a593Smuzhiyun };
2133*4882a593Smuzhiyun
2134*4882a593Smuzhiyun const struct rk_gmac_ops rk3228_gmac_ops = {
2135*4882a593Smuzhiyun .fix_mac_speed = rk3228_gmac_fix_mac_speed,
2136*4882a593Smuzhiyun .set_to_rmii = rk3228_gmac_set_to_rmii,
2137*4882a593Smuzhiyun .set_to_rgmii = rk3228_gmac_set_to_rgmii,
2138*4882a593Smuzhiyun .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
2139*4882a593Smuzhiyun };
2140*4882a593Smuzhiyun
2141*4882a593Smuzhiyun const struct rk_gmac_ops rk3288_gmac_ops = {
2142*4882a593Smuzhiyun .fix_mac_speed = rk3288_gmac_fix_mac_speed,
2143*4882a593Smuzhiyun .set_to_rgmii = rk3288_gmac_set_to_rgmii,
2144*4882a593Smuzhiyun };
2145*4882a593Smuzhiyun
2146*4882a593Smuzhiyun const struct rk_gmac_ops rk3308_gmac_ops = {
2147*4882a593Smuzhiyun .fix_mac_speed = rk3308_gmac_fix_mac_speed,
2148*4882a593Smuzhiyun .set_to_rmii = rk3308_gmac_set_to_rmii,
2149*4882a593Smuzhiyun };
2150*4882a593Smuzhiyun
2151*4882a593Smuzhiyun const struct rk_gmac_ops rk3328_gmac_ops = {
2152*4882a593Smuzhiyun .fix_mac_speed = rk3328_gmac_fix_mac_speed,
2153*4882a593Smuzhiyun .set_to_rmii = rk3328_gmac_set_to_rmii,
2154*4882a593Smuzhiyun .set_to_rgmii = rk3328_gmac_set_to_rgmii,
2155*4882a593Smuzhiyun .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
2156*4882a593Smuzhiyun };
2157*4882a593Smuzhiyun
2158*4882a593Smuzhiyun const struct rk_gmac_ops rk3368_gmac_ops = {
2159*4882a593Smuzhiyun .fix_mac_speed = rk3368_gmac_fix_mac_speed,
2160*4882a593Smuzhiyun .set_to_rgmii = rk3368_gmac_set_to_rgmii,
2161*4882a593Smuzhiyun };
2162*4882a593Smuzhiyun
2163*4882a593Smuzhiyun const struct rk_gmac_ops rk3399_gmac_ops = {
2164*4882a593Smuzhiyun .fix_mac_speed = rk3399_gmac_fix_mac_speed,
2165*4882a593Smuzhiyun .set_to_rgmii = rk3399_gmac_set_to_rgmii,
2166*4882a593Smuzhiyun };
2167*4882a593Smuzhiyun
2168*4882a593Smuzhiyun const struct rk_gmac_ops rv1108_gmac_ops = {
2169*4882a593Smuzhiyun .fix_mac_speed = rv1108_set_rmii_speed,
2170*4882a593Smuzhiyun .set_to_rmii = rv1108_gmac_set_to_rmii,
2171*4882a593Smuzhiyun };
2172*4882a593Smuzhiyun #else
2173*4882a593Smuzhiyun const struct rk_gmac_ops rk3528_gmac_ops = {
2174*4882a593Smuzhiyun .fix_mac_speed = rk3528_set_rgmii_speed,
2175*4882a593Smuzhiyun .set_to_rgmii = rk3528_set_to_rgmii,
2176*4882a593Smuzhiyun .set_to_rmii = rk3528_set_to_rmii,
2177*4882a593Smuzhiyun .set_clock_selection = rk3528_set_clock_selection,
2178*4882a593Smuzhiyun .integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup,
2179*4882a593Smuzhiyun };
2180*4882a593Smuzhiyun
2181*4882a593Smuzhiyun const struct rk_gmac_ops rk3562_gmac_ops = {
2182*4882a593Smuzhiyun .fix_mac_speed = rk3562_set_gmac_speed,
2183*4882a593Smuzhiyun .set_to_rgmii = rk3562_set_to_rgmii,
2184*4882a593Smuzhiyun .set_to_rmii = rk3562_set_to_rmii,
2185*4882a593Smuzhiyun .set_clock_selection = rk3562_set_clock_selection,
2186*4882a593Smuzhiyun };
2187*4882a593Smuzhiyun
2188*4882a593Smuzhiyun const struct rk_gmac_ops rk3568_gmac_ops = {
2189*4882a593Smuzhiyun .fix_mac_speed = rv1126_set_rgmii_speed,
2190*4882a593Smuzhiyun .set_to_rgmii = rk3568_set_to_rgmii,
2191*4882a593Smuzhiyun .set_to_rmii = rk3568_set_to_rmii,
2192*4882a593Smuzhiyun };
2193*4882a593Smuzhiyun
2194*4882a593Smuzhiyun const struct rk_gmac_ops rk3588_gmac_ops = {
2195*4882a593Smuzhiyun .fix_mac_speed = rk3588_set_rgmii_speed,
2196*4882a593Smuzhiyun .set_to_rgmii = rk3588_set_to_rgmii,
2197*4882a593Smuzhiyun .set_to_rmii = rk3588_set_to_rmii,
2198*4882a593Smuzhiyun .set_clock_selection = rk3588_set_clock_selection,
2199*4882a593Smuzhiyun };
2200*4882a593Smuzhiyun
2201*4882a593Smuzhiyun const struct rk_gmac_ops rv1106_gmac_ops = {
2202*4882a593Smuzhiyun .fix_mac_speed = rv1106_set_rmii_speed,
2203*4882a593Smuzhiyun .set_to_rmii = rv1106_set_to_rmii,
2204*4882a593Smuzhiyun .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
2205*4882a593Smuzhiyun };
2206*4882a593Smuzhiyun
2207*4882a593Smuzhiyun const struct rk_gmac_ops rv1126_gmac_ops = {
2208*4882a593Smuzhiyun .fix_mac_speed = rv1126_set_rgmii_speed,
2209*4882a593Smuzhiyun .set_to_rgmii = rv1126_set_to_rgmii,
2210*4882a593Smuzhiyun .set_to_rmii = rv1126_set_to_rmii,
2211*4882a593Smuzhiyun };
2212*4882a593Smuzhiyun #endif
2213*4882a593Smuzhiyun
2214*4882a593Smuzhiyun static const struct udevice_id rockchip_gmac_ids[] = {
2215*4882a593Smuzhiyun #ifndef CONFIG_DWC_ETH_QOS
2216*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_PX30
2217*4882a593Smuzhiyun { .compatible = "rockchip,px30-gmac",
2218*4882a593Smuzhiyun .data = (ulong)&px30_gmac_ops },
2219*4882a593Smuzhiyun #endif
2220*4882a593Smuzhiyun
2221*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK1808
2222*4882a593Smuzhiyun { .compatible = "rockchip,rk1808-gmac",
2223*4882a593Smuzhiyun .data = (ulong)&rk1808_gmac_ops },
2224*4882a593Smuzhiyun #endif
2225*4882a593Smuzhiyun
2226*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3228
2227*4882a593Smuzhiyun { .compatible = "rockchip,rk3228-gmac",
2228*4882a593Smuzhiyun .data = (ulong)&rk3228_gmac_ops },
2229*4882a593Smuzhiyun #endif
2230*4882a593Smuzhiyun
2231*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3288
2232*4882a593Smuzhiyun { .compatible = "rockchip,rk3288-gmac",
2233*4882a593Smuzhiyun .data = (ulong)&rk3288_gmac_ops },
2234*4882a593Smuzhiyun #endif
2235*4882a593Smuzhiyun
2236*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3308
2237*4882a593Smuzhiyun { .compatible = "rockchip,rk3308-mac",
2238*4882a593Smuzhiyun .data = (ulong)&rk3308_gmac_ops },
2239*4882a593Smuzhiyun #endif
2240*4882a593Smuzhiyun
2241*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3328
2242*4882a593Smuzhiyun { .compatible = "rockchip,rk3328-gmac",
2243*4882a593Smuzhiyun .data = (ulong)&rk3328_gmac_ops },
2244*4882a593Smuzhiyun #endif
2245*4882a593Smuzhiyun
2246*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3368
2247*4882a593Smuzhiyun { .compatible = "rockchip,rk3368-gmac",
2248*4882a593Smuzhiyun .data = (ulong)&rk3368_gmac_ops },
2249*4882a593Smuzhiyun #endif
2250*4882a593Smuzhiyun
2251*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3399
2252*4882a593Smuzhiyun { .compatible = "rockchip,rk3399-gmac",
2253*4882a593Smuzhiyun .data = (ulong)&rk3399_gmac_ops },
2254*4882a593Smuzhiyun #endif
2255*4882a593Smuzhiyun
2256*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RV1108
2257*4882a593Smuzhiyun { .compatible = "rockchip,rv1108-gmac",
2258*4882a593Smuzhiyun .data = (ulong)&rv1108_gmac_ops },
2259*4882a593Smuzhiyun #endif
2260*4882a593Smuzhiyun #else
2261*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3528
2262*4882a593Smuzhiyun { .compatible = "rockchip,rk3528-gmac",
2263*4882a593Smuzhiyun .data = (ulong)&rk3528_gmac_ops },
2264*4882a593Smuzhiyun #endif
2265*4882a593Smuzhiyun
2266*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3562
2267*4882a593Smuzhiyun { .compatible = "rockchip,rk3562-gmac",
2268*4882a593Smuzhiyun .data = (ulong)&rk3562_gmac_ops },
2269*4882a593Smuzhiyun #endif
2270*4882a593Smuzhiyun
2271*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3568
2272*4882a593Smuzhiyun { .compatible = "rockchip,rk3568-gmac",
2273*4882a593Smuzhiyun .data = (ulong)&rk3568_gmac_ops },
2274*4882a593Smuzhiyun #endif
2275*4882a593Smuzhiyun
2276*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RK3588
2277*4882a593Smuzhiyun { .compatible = "rockchip,rk3588-gmac",
2278*4882a593Smuzhiyun .data = (ulong)&rk3588_gmac_ops },
2279*4882a593Smuzhiyun #endif
2280*4882a593Smuzhiyun
2281*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RV1106
2282*4882a593Smuzhiyun { .compatible = "rockchip,rv1106-gmac",
2283*4882a593Smuzhiyun .data = (ulong)&rv1106_gmac_ops },
2284*4882a593Smuzhiyun #endif
2285*4882a593Smuzhiyun
2286*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RV1126
2287*4882a593Smuzhiyun { .compatible = "rockchip,rv1126-gmac",
2288*4882a593Smuzhiyun .data = (ulong)&rv1126_gmac_ops },
2289*4882a593Smuzhiyun #endif
2290*4882a593Smuzhiyun #endif
2291*4882a593Smuzhiyun { }
2292*4882a593Smuzhiyun };
2293*4882a593Smuzhiyun
2294*4882a593Smuzhiyun U_BOOT_DRIVER(eth_gmac_rockchip) = {
2295*4882a593Smuzhiyun .name = "gmac_rockchip",
2296*4882a593Smuzhiyun .id = UCLASS_ETH,
2297*4882a593Smuzhiyun .of_match = rockchip_gmac_ids,
2298*4882a593Smuzhiyun .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
2299*4882a593Smuzhiyun .probe = gmac_rockchip_probe,
2300*4882a593Smuzhiyun .ops = &gmac_rockchip_eth_ops,
2301*4882a593Smuzhiyun .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
2302*4882a593Smuzhiyun .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
2303*4882a593Smuzhiyun .flags = DM_FLAG_ALLOC_PRIV_DMA,
2304*4882a593Smuzhiyun };
2305