xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /**
3*4882a593Smuzhiyun  * DOC: dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2014 Chen-Zhi (Roger Chen)
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Chen-Zhi (Roger Chen)  <roger.chen@rock-chips.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/stmmac.h>
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <linux/clk.h>
13*4882a593Smuzhiyun #include <linux/phy.h>
14*4882a593Smuzhiyun #include <linux/phy/phy.h>
15*4882a593Smuzhiyun #include <linux/of_net.h>
16*4882a593Smuzhiyun #include <linux/gpio.h>
17*4882a593Smuzhiyun #include <linux/module.h>
18*4882a593Smuzhiyun #include <linux/nvmem-consumer.h>
19*4882a593Smuzhiyun #include <linux/of_gpio.h>
20*4882a593Smuzhiyun #include <linux/of_device.h>
21*4882a593Smuzhiyun #include <linux/platform_device.h>
22*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
23*4882a593Smuzhiyun #include <linux/delay.h>
24*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
25*4882a593Smuzhiyun #include <linux/regmap.h>
26*4882a593Smuzhiyun #include <linux/pm_runtime.h>
27*4882a593Smuzhiyun #include <linux/soc/rockchip/rk_vendor_storage.h>
28*4882a593Smuzhiyun #include "stmmac_platform.h"
29*4882a593Smuzhiyun #include "dwmac-rk-tool.h"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define MAX_ETH		2
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun struct rk_priv_data;
34*4882a593Smuzhiyun struct rk_gmac_ops {
35*4882a593Smuzhiyun 	void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
36*4882a593Smuzhiyun 			     int tx_delay, int rx_delay);
37*4882a593Smuzhiyun 	void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
38*4882a593Smuzhiyun 	void (*set_to_sgmii)(struct rk_priv_data *bsp_priv);
39*4882a593Smuzhiyun 	void (*set_to_qsgmii)(struct rk_priv_data *bsp_priv);
40*4882a593Smuzhiyun 	void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
41*4882a593Smuzhiyun 	void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
42*4882a593Smuzhiyun 	void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input,
43*4882a593Smuzhiyun 				    bool enable);
44*4882a593Smuzhiyun 	void (*integrated_phy_power)(struct rk_priv_data *bsp_priv, bool up);
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun struct rk_priv_data {
48*4882a593Smuzhiyun 	struct platform_device *pdev;
49*4882a593Smuzhiyun 	phy_interface_t phy_iface;
50*4882a593Smuzhiyun 	int bus_id;
51*4882a593Smuzhiyun 	struct regulator *regulator;
52*4882a593Smuzhiyun 	bool suspended;
53*4882a593Smuzhiyun 	const struct rk_gmac_ops *ops;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	bool clk_enabled;
56*4882a593Smuzhiyun 	bool clock_input;
57*4882a593Smuzhiyun 	bool integrated_phy;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	struct clk *clk_mac;
60*4882a593Smuzhiyun 	struct clk *gmac_clkin;
61*4882a593Smuzhiyun 	struct clk *mac_clk_rx;
62*4882a593Smuzhiyun 	struct clk *mac_clk_tx;
63*4882a593Smuzhiyun 	struct clk *clk_mac_ref;
64*4882a593Smuzhiyun 	struct clk *clk_mac_refout;
65*4882a593Smuzhiyun 	struct clk *clk_mac_speed;
66*4882a593Smuzhiyun 	struct clk *aclk_mac;
67*4882a593Smuzhiyun 	struct clk *pclk_mac;
68*4882a593Smuzhiyun 	struct clk *clk_phy;
69*4882a593Smuzhiyun 	struct clk *pclk_xpcs;
70*4882a593Smuzhiyun 	struct clk *clk_xpcs_eee;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	struct reset_control *phy_reset;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	int tx_delay;
75*4882a593Smuzhiyun 	int rx_delay;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	struct regmap *grf;
78*4882a593Smuzhiyun 	struct regmap *php_grf;
79*4882a593Smuzhiyun 	struct regmap *xpcs;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	unsigned char otp_data;
82*4882a593Smuzhiyun 	unsigned int bgs_increment;
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* XPCS */
86*4882a593Smuzhiyun #define XPCS_APB_INCREMENT		(0x4)
87*4882a593Smuzhiyun #define XPCS_APB_MASK			GENMASK_ULL(20, 0)
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define SR_MII_BASE			(0x1F0000)
90*4882a593Smuzhiyun #define SR_MII1_BASE			(0x1A0000)
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define VR_MII_DIG_CTRL1		(0x8000)
93*4882a593Smuzhiyun #define VR_MII_AN_CTRL			(0x8001)
94*4882a593Smuzhiyun #define VR_MII_AN_INTR_STS		(0x8002)
95*4882a593Smuzhiyun #define VR_MII_LINK_TIMER_CTRL		(0x800A)
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #define SR_MII_CTRL_AN_ENABLE		\
98*4882a593Smuzhiyun 	(BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000)
99*4882a593Smuzhiyun #define MII_MAC_AUTO_SW			(0x0200)
100*4882a593Smuzhiyun #define PCS_MODE_OFFSET			(0x1)
101*4882a593Smuzhiyun #define MII_AN_INTR_EN			(0x1)
102*4882a593Smuzhiyun #define PCS_SGMII_MODE			(0x2 << PCS_MODE_OFFSET)
103*4882a593Smuzhiyun #define PCS_QSGMII_MODE			(0X3 << PCS_MODE_OFFSET)
104*4882a593Smuzhiyun #define VR_MII_CTRL_SGMII_AN_EN		(PCS_SGMII_MODE | MII_AN_INTR_EN)
105*4882a593Smuzhiyun #define VR_MII_CTRL_QSGMII_AN_EN	(PCS_QSGMII_MODE | MII_AN_INTR_EN)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define SR_MII_OFFSET(_x) ({		\
108*4882a593Smuzhiyun 	typeof(_x) (x) = (_x); \
109*4882a593Smuzhiyun 	(((x) == 0) ? SR_MII_BASE : (SR_MII1_BASE + ((x) - 1) * 0x10000)); \
110*4882a593Smuzhiyun }) \
111*4882a593Smuzhiyun 
xpcs_read(void * priv,int reg)112*4882a593Smuzhiyun static int xpcs_read(void *priv, int reg)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = (struct rk_priv_data *)priv;
115*4882a593Smuzhiyun 	int ret, val;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	ret = regmap_read(bsp_priv->xpcs,
118*4882a593Smuzhiyun 			  (u32)(reg * XPCS_APB_INCREMENT) & XPCS_APB_MASK,
119*4882a593Smuzhiyun 			  &val);
120*4882a593Smuzhiyun 	if (ret)
121*4882a593Smuzhiyun 		return ret;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	return val;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
xpcs_write(void * priv,int reg,u16 value)126*4882a593Smuzhiyun static int xpcs_write(void *priv, int reg, u16 value)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = (struct rk_priv_data *)priv;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	return regmap_write(bsp_priv->xpcs,
131*4882a593Smuzhiyun 			    (reg * XPCS_APB_INCREMENT) & XPCS_APB_MASK, value);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
xpcs_poll_reset(struct rk_priv_data * bsp_priv,int dev)134*4882a593Smuzhiyun static int xpcs_poll_reset(struct rk_priv_data *bsp_priv, int dev)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	/* Poll until the reset bit clears (50ms per retry == 0.6 sec) */
137*4882a593Smuzhiyun 	unsigned int retries = 12;
138*4882a593Smuzhiyun 	int ret;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	do {
141*4882a593Smuzhiyun 		msleep(50);
142*4882a593Smuzhiyun 		ret = xpcs_read(bsp_priv, SR_MII_OFFSET(dev) + MDIO_CTRL1);
143*4882a593Smuzhiyun 		if (ret < 0)
144*4882a593Smuzhiyun 			return ret;
145*4882a593Smuzhiyun 	} while (ret & MDIO_CTRL1_RESET && --retries);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	return (ret & MDIO_CTRL1_RESET) ? -ETIMEDOUT : 0;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
xpcs_soft_reset(struct rk_priv_data * bsp_priv,int dev)150*4882a593Smuzhiyun static int xpcs_soft_reset(struct rk_priv_data *bsp_priv, int dev)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun 	int ret;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	ret = xpcs_write(bsp_priv, SR_MII_OFFSET(dev) + MDIO_CTRL1,
155*4882a593Smuzhiyun 			 MDIO_CTRL1_RESET);
156*4882a593Smuzhiyun 	if (ret < 0)
157*4882a593Smuzhiyun 		return ret;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	return xpcs_poll_reset(bsp_priv, dev);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
xpcs_setup(struct rk_priv_data * bsp_priv,int mode)162*4882a593Smuzhiyun static int xpcs_setup(struct rk_priv_data *bsp_priv, int mode)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	int ret, i, id = bsp_priv->bus_id;
165*4882a593Smuzhiyun 	u32 val;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	if (mode == PHY_INTERFACE_MODE_QSGMII && id > 0)
168*4882a593Smuzhiyun 		return 0;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	ret = xpcs_soft_reset(bsp_priv, id);
171*4882a593Smuzhiyun 	if (ret) {
172*4882a593Smuzhiyun 		dev_err(&bsp_priv->pdev->dev, "xpcs_soft_reset fail %d\n", ret);
173*4882a593Smuzhiyun 		return ret;
174*4882a593Smuzhiyun 	}
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_AN_INTR_STS, 0x0);
177*4882a593Smuzhiyun 	xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_LINK_TIMER_CTRL, 0x1);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	if (mode == PHY_INTERFACE_MODE_SGMII)
180*4882a593Smuzhiyun 		xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_AN_CTRL,
181*4882a593Smuzhiyun 			   VR_MII_CTRL_SGMII_AN_EN);
182*4882a593Smuzhiyun 	else
183*4882a593Smuzhiyun 		xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_AN_CTRL,
184*4882a593Smuzhiyun 			   VR_MII_CTRL_QSGMII_AN_EN);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	if (mode == PHY_INTERFACE_MODE_QSGMII) {
187*4882a593Smuzhiyun 		for (i = 0; i < 4; i++) {
188*4882a593Smuzhiyun 			val = xpcs_read(bsp_priv,
189*4882a593Smuzhiyun 					SR_MII_OFFSET(i) + VR_MII_DIG_CTRL1);
190*4882a593Smuzhiyun 			xpcs_write(bsp_priv,
191*4882a593Smuzhiyun 				   SR_MII_OFFSET(i) + VR_MII_DIG_CTRL1,
192*4882a593Smuzhiyun 				   val | MII_MAC_AUTO_SW);
193*4882a593Smuzhiyun 			xpcs_write(bsp_priv, SR_MII_OFFSET(i) + MII_BMCR,
194*4882a593Smuzhiyun 				   SR_MII_CTRL_AN_ENABLE);
195*4882a593Smuzhiyun 		}
196*4882a593Smuzhiyun 	} else {
197*4882a593Smuzhiyun 		val = xpcs_read(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1);
198*4882a593Smuzhiyun 		xpcs_write(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1,
199*4882a593Smuzhiyun 			   val | MII_MAC_AUTO_SW);
200*4882a593Smuzhiyun 		xpcs_write(bsp_priv, SR_MII_OFFSET(id) + MII_BMCR,
201*4882a593Smuzhiyun 			   SR_MII_CTRL_AN_ENABLE);
202*4882a593Smuzhiyun 	}
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	return ret;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #define HIWORD_UPDATE(val, mask, shift) \
208*4882a593Smuzhiyun 		((val) << (shift) | (mask) << ((shift) + 16))
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun #define GRF_BIT(nr)	(BIT(nr) | BIT(nr+16))
211*4882a593Smuzhiyun #define GRF_CLR_BIT(nr)	(BIT(nr+16))
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #define DELAY_ENABLE(soc, tx, rx) \
214*4882a593Smuzhiyun 	((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
215*4882a593Smuzhiyun 	 (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun #define DELAY_ENABLE_BY_ID(soc, tx, rx, id) \
218*4882a593Smuzhiyun 	((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE(id) : soc##_GMAC_TXCLK_DLY_DISABLE(id)) | \
219*4882a593Smuzhiyun 	 (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE(id) : soc##_GMAC_RXCLK_DLY_DISABLE(id)))
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun #define DELAY_VALUE(soc, tx, rx) \
222*4882a593Smuzhiyun 	((((tx) >= 0) ? soc##_GMAC_CLK_TX_DL_CFG(tx) : 0) | \
223*4882a593Smuzhiyun 	 (((rx) >= 0) ? soc##_GMAC_CLK_RX_DL_CFG(rx) : 0))
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun #define GMAC_RGMII_CLK_DIV_BY_ID(soc, id, div) \
226*4882a593Smuzhiyun 		(soc##_GMAC##id##_CLK_RGMII_DIV##div)
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define GMAC_RMII_CLK_DIV_BY_ID(soc, id, div) \
229*4882a593Smuzhiyun 		(soc##_GMAC##id##_CLK_RMII_DIV##div)
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun /* Integrated EPHY */
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #define RK_GRF_MACPHY_CON0		0xb00
234*4882a593Smuzhiyun #define RK_GRF_MACPHY_CON1		0xb04
235*4882a593Smuzhiyun #define RK_GRF_MACPHY_CON2		0xb08
236*4882a593Smuzhiyun #define RK_GRF_MACPHY_CON3		0xb0c
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun #define RK_MACPHY_ENABLE		GRF_BIT(0)
239*4882a593Smuzhiyun #define RK_MACPHY_DISABLE		GRF_CLR_BIT(0)
240*4882a593Smuzhiyun #define RK_MACPHY_CFG_CLK_50M		GRF_BIT(14)
241*4882a593Smuzhiyun #define RK_GMAC2PHY_RMII_MODE		(GRF_BIT(6) | GRF_CLR_BIT(7))
242*4882a593Smuzhiyun #define RK_GRF_CON2_MACPHY_ID		HIWORD_UPDATE(0x1234, 0xffff, 0)
243*4882a593Smuzhiyun #define RK_GRF_CON3_MACPHY_ID		HIWORD_UPDATE(0x35, 0x3f, 0)
244*4882a593Smuzhiyun 
rk_gmac_integrated_ephy_powerup(struct rk_priv_data * priv)245*4882a593Smuzhiyun static void rk_gmac_integrated_ephy_powerup(struct rk_priv_data *priv)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
248*4882a593Smuzhiyun 	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
251*4882a593Smuzhiyun 	regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	if (priv->phy_reset) {
254*4882a593Smuzhiyun 		/* PHY needs to be disabled before trying to reset it */
255*4882a593Smuzhiyun 		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
256*4882a593Smuzhiyun 		if (priv->phy_reset)
257*4882a593Smuzhiyun 			reset_control_assert(priv->phy_reset);
258*4882a593Smuzhiyun 		usleep_range(10, 20);
259*4882a593Smuzhiyun 		if (priv->phy_reset)
260*4882a593Smuzhiyun 			reset_control_deassert(priv->phy_reset);
261*4882a593Smuzhiyun 		usleep_range(10, 20);
262*4882a593Smuzhiyun 		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
263*4882a593Smuzhiyun 		msleep(30);
264*4882a593Smuzhiyun 	}
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
rk_gmac_integrated_ephy_powerdown(struct rk_priv_data * priv)267*4882a593Smuzhiyun static void rk_gmac_integrated_ephy_powerdown(struct rk_priv_data *priv)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
270*4882a593Smuzhiyun 	if (priv->phy_reset)
271*4882a593Smuzhiyun 		reset_control_assert(priv->phy_reset);
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun /* Integrated FEPHY */
275*4882a593Smuzhiyun #define RK_FEPHY_SHUTDOWN		GRF_BIT(1)
276*4882a593Smuzhiyun #define RK_FEPHY_POWERUP		GRF_CLR_BIT(1)
277*4882a593Smuzhiyun #define RK_FEPHY_INTERNAL_RMII_SEL	GRF_BIT(6)
278*4882a593Smuzhiyun #define RK_FEPHY_24M_CLK_SEL		(GRF_BIT(8) | GRF_BIT(9))
279*4882a593Smuzhiyun #define RK_FEPHY_PHY_ID			GRF_BIT(11)
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun #define RK_FEPHY_BGS			HIWORD_UPDATE(0x0, 0xf, 0)
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun #define RK_FEPHY_BGS_MAX		7
284*4882a593Smuzhiyun 
rk_gmac_integrated_fephy_power(struct rk_priv_data * priv,unsigned int ctrl_offset,unsigned int bgs_offset,bool up)285*4882a593Smuzhiyun static void rk_gmac_integrated_fephy_power(struct rk_priv_data *priv,
286*4882a593Smuzhiyun 					   unsigned int ctrl_offset,
287*4882a593Smuzhiyun 					   unsigned int bgs_offset,
288*4882a593Smuzhiyun 					   bool up)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun 	struct device *dev = &priv->pdev->dev;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	if (IS_ERR(priv->grf) || !priv->phy_reset) {
293*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf or phy_reset property\n",
294*4882a593Smuzhiyun 			__func__);
295*4882a593Smuzhiyun 		return;
296*4882a593Smuzhiyun 	}
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	if (up) {
299*4882a593Smuzhiyun 		unsigned int bgs = priv->otp_data;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 		reset_control_assert(priv->phy_reset);
302*4882a593Smuzhiyun 		udelay(20);
303*4882a593Smuzhiyun 		regmap_write(priv->grf, ctrl_offset,
304*4882a593Smuzhiyun 			     RK_FEPHY_POWERUP |
305*4882a593Smuzhiyun 			     RK_FEPHY_INTERNAL_RMII_SEL |
306*4882a593Smuzhiyun 			     RK_FEPHY_24M_CLK_SEL |
307*4882a593Smuzhiyun 			     RK_FEPHY_PHY_ID);
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 		if (bgs > (RK_FEPHY_BGS_MAX - priv->bgs_increment) &&
310*4882a593Smuzhiyun 		    bgs <= RK_FEPHY_BGS_MAX) {
311*4882a593Smuzhiyun 			bgs = HIWORD_UPDATE(RK_FEPHY_BGS_MAX, 0xf, 0);
312*4882a593Smuzhiyun 		} else {
313*4882a593Smuzhiyun 			bgs += priv->bgs_increment;
314*4882a593Smuzhiyun 			bgs &= 0xf;
315*4882a593Smuzhiyun 			bgs = HIWORD_UPDATE(bgs, 0xf, 0);
316*4882a593Smuzhiyun 		}
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 		regmap_write(priv->grf, bgs_offset, bgs);
319*4882a593Smuzhiyun 		usleep_range(10 * 1000, 12 * 1000);
320*4882a593Smuzhiyun 		reset_control_deassert(priv->phy_reset);
321*4882a593Smuzhiyun 		usleep_range(50 * 1000, 60 * 1000);
322*4882a593Smuzhiyun 	} else {
323*4882a593Smuzhiyun 		regmap_write(priv->grf, ctrl_offset,
324*4882a593Smuzhiyun 			     RK_FEPHY_SHUTDOWN);
325*4882a593Smuzhiyun 	}
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun #define PX30_GRF_GMAC_CON1		0x0904
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /* PX30_GRF_GMAC_CON1 */
331*4882a593Smuzhiyun #define PX30_GMAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
332*4882a593Smuzhiyun 					 GRF_BIT(6))
333*4882a593Smuzhiyun #define PX30_GMAC_SPEED_10M		GRF_CLR_BIT(2)
334*4882a593Smuzhiyun #define PX30_GMAC_SPEED_100M		GRF_BIT(2)
335*4882a593Smuzhiyun 
px30_set_to_rmii(struct rk_priv_data * bsp_priv)336*4882a593Smuzhiyun static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
341*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
342*4882a593Smuzhiyun 		return;
343*4882a593Smuzhiyun 	}
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
346*4882a593Smuzhiyun 		     PX30_GMAC_PHY_INTF_SEL_RMII);
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun 
px30_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)349*4882a593Smuzhiyun static void px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
352*4882a593Smuzhiyun 	int ret;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->clk_mac_speed)) {
355*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
356*4882a593Smuzhiyun 		return;
357*4882a593Smuzhiyun 	}
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	if (speed == 10) {
360*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
361*4882a593Smuzhiyun 			     PX30_GMAC_SPEED_10M);
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000);
364*4882a593Smuzhiyun 		if (ret)
365*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
366*4882a593Smuzhiyun 				__func__, ret);
367*4882a593Smuzhiyun 	} else if (speed == 100) {
368*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
369*4882a593Smuzhiyun 			     PX30_GMAC_SPEED_100M);
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000);
372*4882a593Smuzhiyun 		if (ret)
373*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
374*4882a593Smuzhiyun 				__func__, ret);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	} else {
377*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
378*4882a593Smuzhiyun 	}
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun static const struct rk_gmac_ops px30_ops = {
382*4882a593Smuzhiyun 	.set_to_rmii = px30_set_to_rmii,
383*4882a593Smuzhiyun 	.set_rmii_speed = px30_set_rmii_speed,
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun #define RK1808_GRF_GMAC_CON0		0X0900
387*4882a593Smuzhiyun #define RK1808_GRF_GMAC_CON1		0X0904
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun /* RK1808_GRF_GMAC_CON0 */
390*4882a593Smuzhiyun #define RK1808_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
391*4882a593Smuzhiyun #define RK1808_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun /* RK1808_GRF_GMAC_CON1 */
394*4882a593Smuzhiyun #define RK1808_GMAC_PHY_INTF_SEL_RGMII	\
395*4882a593Smuzhiyun 		(GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
396*4882a593Smuzhiyun #define RK1808_GMAC_PHY_INTF_SEL_RMII	\
397*4882a593Smuzhiyun 		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
398*4882a593Smuzhiyun #define RK1808_GMAC_FLOW_CTRL		GRF_BIT(3)
399*4882a593Smuzhiyun #define RK1808_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(3)
400*4882a593Smuzhiyun #define RK1808_GMAC_SPEED_10M		GRF_CLR_BIT(2)
401*4882a593Smuzhiyun #define RK1808_GMAC_SPEED_100M		GRF_BIT(2)
402*4882a593Smuzhiyun #define RK1808_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(1)
403*4882a593Smuzhiyun #define RK1808_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(1)
404*4882a593Smuzhiyun #define RK1808_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(0)
405*4882a593Smuzhiyun #define RK1808_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
406*4882a593Smuzhiyun 
rk1808_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)407*4882a593Smuzhiyun static void rk1808_set_to_rgmii(struct rk_priv_data *bsp_priv,
408*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
413*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
414*4882a593Smuzhiyun 		return;
415*4882a593Smuzhiyun 	}
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1,
418*4882a593Smuzhiyun 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
419*4882a593Smuzhiyun 		     DELAY_ENABLE(RK1808, tx_delay, rx_delay));
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON0,
422*4882a593Smuzhiyun 		     DELAY_VALUE(RK1808, tx_delay, rx_delay));
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun 
rk1808_set_to_rmii(struct rk_priv_data * bsp_priv)425*4882a593Smuzhiyun static void rk1808_set_to_rmii(struct rk_priv_data *bsp_priv)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
430*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
431*4882a593Smuzhiyun 		return;
432*4882a593Smuzhiyun 	}
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1,
435*4882a593Smuzhiyun 		     RK1808_GMAC_PHY_INTF_SEL_RMII);
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun 
rk1808_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)438*4882a593Smuzhiyun static void rk1808_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
441*4882a593Smuzhiyun 	int ret;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
444*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
445*4882a593Smuzhiyun 		return;
446*4882a593Smuzhiyun 	}
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	if (speed == 10) {
449*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000);
450*4882a593Smuzhiyun 		if (ret)
451*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
452*4882a593Smuzhiyun 				__func__, ret);
453*4882a593Smuzhiyun 	} else if (speed == 100) {
454*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000);
455*4882a593Smuzhiyun 		if (ret)
456*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
457*4882a593Smuzhiyun 				__func__, ret);
458*4882a593Smuzhiyun 	} else if (speed == 1000) {
459*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 125000000);
460*4882a593Smuzhiyun 		if (ret)
461*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 125000000 failed: %d\n",
462*4882a593Smuzhiyun 				__func__, ret);
463*4882a593Smuzhiyun 	} else {
464*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
465*4882a593Smuzhiyun 	}
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun 
rk1808_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)468*4882a593Smuzhiyun static void rk1808_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
471*4882a593Smuzhiyun 	int ret;
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->clk_mac_speed)) {
474*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
475*4882a593Smuzhiyun 		return;
476*4882a593Smuzhiyun 	}
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	if (speed == 10) {
479*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1,
480*4882a593Smuzhiyun 			     RK1808_GMAC_SPEED_10M);
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000);
483*4882a593Smuzhiyun 		if (ret)
484*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
485*4882a593Smuzhiyun 				__func__, ret);
486*4882a593Smuzhiyun 	} else if (speed == 100) {
487*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1,
488*4882a593Smuzhiyun 			     RK1808_GMAC_SPEED_100M);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000);
491*4882a593Smuzhiyun 		if (ret)
492*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
493*4882a593Smuzhiyun 				__func__, ret);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	} else {
496*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
497*4882a593Smuzhiyun 	}
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun static const struct rk_gmac_ops rk1808_ops = {
501*4882a593Smuzhiyun 	.set_to_rgmii = rk1808_set_to_rgmii,
502*4882a593Smuzhiyun 	.set_to_rmii = rk1808_set_to_rmii,
503*4882a593Smuzhiyun 	.set_rgmii_speed = rk1808_set_rgmii_speed,
504*4882a593Smuzhiyun 	.set_rmii_speed = rk1808_set_rmii_speed,
505*4882a593Smuzhiyun };
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun #define RK3128_GRF_MAC_CON0	0x0168
508*4882a593Smuzhiyun #define RK3128_GRF_MAC_CON1	0x016c
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun /* RK3128_GRF_MAC_CON0 */
511*4882a593Smuzhiyun #define RK3128_GMAC_TXCLK_DLY_ENABLE   GRF_BIT(14)
512*4882a593Smuzhiyun #define RK3128_GMAC_TXCLK_DLY_DISABLE  GRF_CLR_BIT(14)
513*4882a593Smuzhiyun #define RK3128_GMAC_RXCLK_DLY_ENABLE   GRF_BIT(15)
514*4882a593Smuzhiyun #define RK3128_GMAC_RXCLK_DLY_DISABLE  GRF_CLR_BIT(15)
515*4882a593Smuzhiyun #define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
516*4882a593Smuzhiyun #define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun /* RK3128_GRF_MAC_CON1 */
519*4882a593Smuzhiyun #define RK3128_GMAC_PHY_INTF_SEL_RGMII	\
520*4882a593Smuzhiyun 		(GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
521*4882a593Smuzhiyun #define RK3128_GMAC_PHY_INTF_SEL_RMII	\
522*4882a593Smuzhiyun 		(GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
523*4882a593Smuzhiyun #define RK3128_GMAC_FLOW_CTRL          GRF_BIT(9)
524*4882a593Smuzhiyun #define RK3128_GMAC_FLOW_CTRL_CLR      GRF_CLR_BIT(9)
525*4882a593Smuzhiyun #define RK3128_GMAC_SPEED_10M          GRF_CLR_BIT(10)
526*4882a593Smuzhiyun #define RK3128_GMAC_SPEED_100M         GRF_BIT(10)
527*4882a593Smuzhiyun #define RK3128_GMAC_RMII_CLK_25M       GRF_BIT(11)
528*4882a593Smuzhiyun #define RK3128_GMAC_RMII_CLK_2_5M      GRF_CLR_BIT(11)
529*4882a593Smuzhiyun #define RK3128_GMAC_CLK_125M           (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
530*4882a593Smuzhiyun #define RK3128_GMAC_CLK_25M            (GRF_BIT(12) | GRF_BIT(13))
531*4882a593Smuzhiyun #define RK3128_GMAC_CLK_2_5M           (GRF_CLR_BIT(12) | GRF_BIT(13))
532*4882a593Smuzhiyun #define RK3128_GMAC_RMII_MODE          GRF_BIT(14)
533*4882a593Smuzhiyun #define RK3128_GMAC_RMII_MODE_CLR      GRF_CLR_BIT(14)
534*4882a593Smuzhiyun 
rk3128_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)535*4882a593Smuzhiyun static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
536*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
537*4882a593Smuzhiyun {
538*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
541*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
542*4882a593Smuzhiyun 		return;
543*4882a593Smuzhiyun 	}
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
546*4882a593Smuzhiyun 		     RK3128_GMAC_PHY_INTF_SEL_RGMII |
547*4882a593Smuzhiyun 		     RK3128_GMAC_RMII_MODE_CLR);
548*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
549*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
550*4882a593Smuzhiyun 		     DELAY_VALUE(RK3128, tx_delay, rx_delay));
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun 
rk3128_set_to_rmii(struct rk_priv_data * bsp_priv)553*4882a593Smuzhiyun static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
554*4882a593Smuzhiyun {
555*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
558*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
559*4882a593Smuzhiyun 		return;
560*4882a593Smuzhiyun 	}
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
563*4882a593Smuzhiyun 		     RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
564*4882a593Smuzhiyun }
565*4882a593Smuzhiyun 
rk3128_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)566*4882a593Smuzhiyun static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
571*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
572*4882a593Smuzhiyun 		return;
573*4882a593Smuzhiyun 	}
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	if (speed == 10)
576*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
577*4882a593Smuzhiyun 			     RK3128_GMAC_CLK_2_5M);
578*4882a593Smuzhiyun 	else if (speed == 100)
579*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
580*4882a593Smuzhiyun 			     RK3128_GMAC_CLK_25M);
581*4882a593Smuzhiyun 	else if (speed == 1000)
582*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
583*4882a593Smuzhiyun 			     RK3128_GMAC_CLK_125M);
584*4882a593Smuzhiyun 	else
585*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun 
rk3128_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)588*4882a593Smuzhiyun static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
589*4882a593Smuzhiyun {
590*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
593*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
594*4882a593Smuzhiyun 		return;
595*4882a593Smuzhiyun 	}
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	if (speed == 10) {
598*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
599*4882a593Smuzhiyun 			     RK3128_GMAC_RMII_CLK_2_5M |
600*4882a593Smuzhiyun 			     RK3128_GMAC_SPEED_10M);
601*4882a593Smuzhiyun 	} else if (speed == 100) {
602*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
603*4882a593Smuzhiyun 			     RK3128_GMAC_RMII_CLK_25M |
604*4882a593Smuzhiyun 			     RK3128_GMAC_SPEED_100M);
605*4882a593Smuzhiyun 	} else {
606*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
607*4882a593Smuzhiyun 	}
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun static const struct rk_gmac_ops rk3128_ops = {
611*4882a593Smuzhiyun 	.set_to_rgmii = rk3128_set_to_rgmii,
612*4882a593Smuzhiyun 	.set_to_rmii = rk3128_set_to_rmii,
613*4882a593Smuzhiyun 	.set_rgmii_speed = rk3128_set_rgmii_speed,
614*4882a593Smuzhiyun 	.set_rmii_speed = rk3128_set_rmii_speed,
615*4882a593Smuzhiyun };
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun #define RK3228_GRF_MAC_CON0	0x0900
618*4882a593Smuzhiyun #define RK3228_GRF_MAC_CON1	0x0904
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun #define RK3228_GRF_CON_MUX	0x50
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun /* RK3228_GRF_MAC_CON0 */
623*4882a593Smuzhiyun #define RK3228_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 7)
624*4882a593Smuzhiyun #define RK3228_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun /* RK3228_GRF_MAC_CON1 */
627*4882a593Smuzhiyun #define RK3228_GMAC_PHY_INTF_SEL_RGMII	\
628*4882a593Smuzhiyun 		(GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
629*4882a593Smuzhiyun #define RK3228_GMAC_PHY_INTF_SEL_RMII	\
630*4882a593Smuzhiyun 		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
631*4882a593Smuzhiyun #define RK3228_GMAC_FLOW_CTRL		GRF_BIT(3)
632*4882a593Smuzhiyun #define RK3228_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(3)
633*4882a593Smuzhiyun #define RK3228_GMAC_SPEED_10M		GRF_CLR_BIT(2)
634*4882a593Smuzhiyun #define RK3228_GMAC_SPEED_100M		GRF_BIT(2)
635*4882a593Smuzhiyun #define RK3228_GMAC_RMII_CLK_25M	GRF_BIT(7)
636*4882a593Smuzhiyun #define RK3228_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(7)
637*4882a593Smuzhiyun #define RK3228_GMAC_CLK_125M		(GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
638*4882a593Smuzhiyun #define RK3228_GMAC_CLK_25M		(GRF_BIT(8) | GRF_BIT(9))
639*4882a593Smuzhiyun #define RK3228_GMAC_CLK_2_5M		(GRF_CLR_BIT(8) | GRF_BIT(9))
640*4882a593Smuzhiyun #define RK3228_GMAC_RMII_MODE		GRF_BIT(10)
641*4882a593Smuzhiyun #define RK3228_GMAC_RMII_MODE_CLR	GRF_CLR_BIT(10)
642*4882a593Smuzhiyun #define RK3228_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(0)
643*4882a593Smuzhiyun #define RK3228_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
644*4882a593Smuzhiyun #define RK3228_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(1)
645*4882a593Smuzhiyun #define RK3228_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(1)
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun /* RK3228_GRF_COM_MUX */
648*4882a593Smuzhiyun #define RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY	GRF_BIT(15)
649*4882a593Smuzhiyun 
rk3228_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)650*4882a593Smuzhiyun static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
651*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
652*4882a593Smuzhiyun {
653*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
656*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
657*4882a593Smuzhiyun 		return;
658*4882a593Smuzhiyun 	}
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
661*4882a593Smuzhiyun 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
662*4882a593Smuzhiyun 		     RK3228_GMAC_RMII_MODE_CLR |
663*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3228, tx_delay, rx_delay));
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
666*4882a593Smuzhiyun 		     DELAY_VALUE(RK3128, tx_delay, rx_delay));
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun 
rk3228_set_to_rmii(struct rk_priv_data * bsp_priv)669*4882a593Smuzhiyun static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
670*4882a593Smuzhiyun {
671*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
674*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
675*4882a593Smuzhiyun 		return;
676*4882a593Smuzhiyun 	}
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
679*4882a593Smuzhiyun 		     RK3228_GMAC_PHY_INTF_SEL_RMII |
680*4882a593Smuzhiyun 		     RK3228_GMAC_RMII_MODE);
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	/* set MAC to RMII mode */
683*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
684*4882a593Smuzhiyun }
685*4882a593Smuzhiyun 
rk3228_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)686*4882a593Smuzhiyun static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
687*4882a593Smuzhiyun {
688*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
691*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
692*4882a593Smuzhiyun 		return;
693*4882a593Smuzhiyun 	}
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	if (speed == 10)
696*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
697*4882a593Smuzhiyun 			     RK3228_GMAC_CLK_2_5M);
698*4882a593Smuzhiyun 	else if (speed == 100)
699*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
700*4882a593Smuzhiyun 			     RK3228_GMAC_CLK_25M);
701*4882a593Smuzhiyun 	else if (speed == 1000)
702*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
703*4882a593Smuzhiyun 			     RK3228_GMAC_CLK_125M);
704*4882a593Smuzhiyun 	else
705*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun 
rk3228_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)708*4882a593Smuzhiyun static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
709*4882a593Smuzhiyun {
710*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
713*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
714*4882a593Smuzhiyun 		return;
715*4882a593Smuzhiyun 	}
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	if (speed == 10)
718*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
719*4882a593Smuzhiyun 			     RK3228_GMAC_RMII_CLK_2_5M |
720*4882a593Smuzhiyun 			     RK3228_GMAC_SPEED_10M);
721*4882a593Smuzhiyun 	else if (speed == 100)
722*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
723*4882a593Smuzhiyun 			     RK3228_GMAC_RMII_CLK_25M |
724*4882a593Smuzhiyun 			     RK3228_GMAC_SPEED_100M);
725*4882a593Smuzhiyun 	else
726*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
727*4882a593Smuzhiyun }
728*4882a593Smuzhiyun 
rk3228_integrated_phy_power(struct rk_priv_data * priv,bool up)729*4882a593Smuzhiyun static void rk3228_integrated_phy_power(struct rk_priv_data *priv, bool up)
730*4882a593Smuzhiyun {
731*4882a593Smuzhiyun 	if (up) {
732*4882a593Smuzhiyun 		regmap_write(priv->grf, RK3228_GRF_CON_MUX,
733*4882a593Smuzhiyun 			     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 		rk_gmac_integrated_ephy_powerup(priv);
736*4882a593Smuzhiyun 	} else {
737*4882a593Smuzhiyun 		rk_gmac_integrated_ephy_powerdown(priv);
738*4882a593Smuzhiyun 	}
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun static const struct rk_gmac_ops rk3228_ops = {
742*4882a593Smuzhiyun 	.set_to_rgmii = rk3228_set_to_rgmii,
743*4882a593Smuzhiyun 	.set_to_rmii = rk3228_set_to_rmii,
744*4882a593Smuzhiyun 	.set_rgmii_speed = rk3228_set_rgmii_speed,
745*4882a593Smuzhiyun 	.set_rmii_speed = rk3228_set_rmii_speed,
746*4882a593Smuzhiyun 	.integrated_phy_power =  rk3228_integrated_phy_power,
747*4882a593Smuzhiyun };
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun #define RK3288_GRF_SOC_CON1	0x0248
750*4882a593Smuzhiyun #define RK3288_GRF_SOC_CON3	0x0250
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun /*RK3288_GRF_SOC_CON1*/
753*4882a593Smuzhiyun #define RK3288_GMAC_PHY_INTF_SEL_RGMII	(GRF_BIT(6) | GRF_CLR_BIT(7) | \
754*4882a593Smuzhiyun 					 GRF_CLR_BIT(8))
755*4882a593Smuzhiyun #define RK3288_GMAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
756*4882a593Smuzhiyun 					 GRF_BIT(8))
757*4882a593Smuzhiyun #define RK3288_GMAC_FLOW_CTRL		GRF_BIT(9)
758*4882a593Smuzhiyun #define RK3288_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(9)
759*4882a593Smuzhiyun #define RK3288_GMAC_SPEED_10M		GRF_CLR_BIT(10)
760*4882a593Smuzhiyun #define RK3288_GMAC_SPEED_100M		GRF_BIT(10)
761*4882a593Smuzhiyun #define RK3288_GMAC_RMII_CLK_25M	GRF_BIT(11)
762*4882a593Smuzhiyun #define RK3288_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(11)
763*4882a593Smuzhiyun #define RK3288_GMAC_CLK_125M		(GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
764*4882a593Smuzhiyun #define RK3288_GMAC_CLK_25M		(GRF_BIT(12) | GRF_BIT(13))
765*4882a593Smuzhiyun #define RK3288_GMAC_CLK_2_5M		(GRF_CLR_BIT(12) | GRF_BIT(13))
766*4882a593Smuzhiyun #define RK3288_GMAC_RMII_MODE		GRF_BIT(14)
767*4882a593Smuzhiyun #define RK3288_GMAC_RMII_MODE_CLR	GRF_CLR_BIT(14)
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun /*RK3288_GRF_SOC_CON3*/
770*4882a593Smuzhiyun #define RK3288_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(14)
771*4882a593Smuzhiyun #define RK3288_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(14)
772*4882a593Smuzhiyun #define RK3288_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
773*4882a593Smuzhiyun #define RK3288_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
774*4882a593Smuzhiyun #define RK3288_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 7)
775*4882a593Smuzhiyun #define RK3288_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
776*4882a593Smuzhiyun 
rk3288_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)777*4882a593Smuzhiyun static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
778*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
779*4882a593Smuzhiyun {
780*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
783*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
784*4882a593Smuzhiyun 		return;
785*4882a593Smuzhiyun 	}
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
788*4882a593Smuzhiyun 		     RK3288_GMAC_PHY_INTF_SEL_RGMII |
789*4882a593Smuzhiyun 		     RK3288_GMAC_RMII_MODE_CLR);
790*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
791*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
792*4882a593Smuzhiyun 		     DELAY_VALUE(RK3288, tx_delay, rx_delay));
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun 
rk3288_set_to_rmii(struct rk_priv_data * bsp_priv)795*4882a593Smuzhiyun static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
800*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
801*4882a593Smuzhiyun 		return;
802*4882a593Smuzhiyun 	}
803*4882a593Smuzhiyun 
804*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
805*4882a593Smuzhiyun 		     RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun 
rk3288_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)808*4882a593Smuzhiyun static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
809*4882a593Smuzhiyun {
810*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
813*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
814*4882a593Smuzhiyun 		return;
815*4882a593Smuzhiyun 	}
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	if (speed == 10)
818*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
819*4882a593Smuzhiyun 			     RK3288_GMAC_CLK_2_5M);
820*4882a593Smuzhiyun 	else if (speed == 100)
821*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
822*4882a593Smuzhiyun 			     RK3288_GMAC_CLK_25M);
823*4882a593Smuzhiyun 	else if (speed == 1000)
824*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
825*4882a593Smuzhiyun 			     RK3288_GMAC_CLK_125M);
826*4882a593Smuzhiyun 	else
827*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun 
rk3288_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)830*4882a593Smuzhiyun static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
831*4882a593Smuzhiyun {
832*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
835*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
836*4882a593Smuzhiyun 		return;
837*4882a593Smuzhiyun 	}
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	if (speed == 10) {
840*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
841*4882a593Smuzhiyun 			     RK3288_GMAC_RMII_CLK_2_5M |
842*4882a593Smuzhiyun 			     RK3288_GMAC_SPEED_10M);
843*4882a593Smuzhiyun 	} else if (speed == 100) {
844*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
845*4882a593Smuzhiyun 			     RK3288_GMAC_RMII_CLK_25M |
846*4882a593Smuzhiyun 			     RK3288_GMAC_SPEED_100M);
847*4882a593Smuzhiyun 	} else {
848*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
849*4882a593Smuzhiyun 	}
850*4882a593Smuzhiyun }
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun static const struct rk_gmac_ops rk3288_ops = {
853*4882a593Smuzhiyun 	.set_to_rgmii = rk3288_set_to_rgmii,
854*4882a593Smuzhiyun 	.set_to_rmii = rk3288_set_to_rmii,
855*4882a593Smuzhiyun 	.set_rgmii_speed = rk3288_set_rgmii_speed,
856*4882a593Smuzhiyun 	.set_rmii_speed = rk3288_set_rmii_speed,
857*4882a593Smuzhiyun };
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun #define RK3308_GRF_MAC_CON0		0x04a0
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun /* Rk3308_GRF_MAC_CON1 */
862*4882a593Smuzhiyun #define RK3308_MAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(2) | GRF_CLR_BIT(3) | \
863*4882a593Smuzhiyun 					GRF_BIT(4))
864*4882a593Smuzhiyun #define RK3308_MAC_SPEED_10M		GRF_CLR_BIT(0)
865*4882a593Smuzhiyun #define Rk3308_MAC_SPEED_100M		GRF_BIT(0)
866*4882a593Smuzhiyun 
rk3308_set_to_rmii(struct rk_priv_data * bsp_priv)867*4882a593Smuzhiyun static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
868*4882a593Smuzhiyun {
869*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
872*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
873*4882a593Smuzhiyun 		return;
874*4882a593Smuzhiyun 	}
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
877*4882a593Smuzhiyun 		     RK3308_MAC_PHY_INTF_SEL_RMII);
878*4882a593Smuzhiyun }
879*4882a593Smuzhiyun 
rk3308_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)880*4882a593Smuzhiyun static void rk3308_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
881*4882a593Smuzhiyun {
882*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
883*4882a593Smuzhiyun 	int ret;
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->clk_mac_speed)) {
886*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
887*4882a593Smuzhiyun 		return;
888*4882a593Smuzhiyun 	}
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	if (speed == 10) {
891*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
892*4882a593Smuzhiyun 			     RK3308_MAC_SPEED_10M);
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000);
895*4882a593Smuzhiyun 		if (ret)
896*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
897*4882a593Smuzhiyun 				__func__, ret);
898*4882a593Smuzhiyun 	} else if (speed == 100) {
899*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
900*4882a593Smuzhiyun 			     Rk3308_MAC_SPEED_100M);
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 		ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000);
903*4882a593Smuzhiyun 		if (ret)
904*4882a593Smuzhiyun 			dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
905*4882a593Smuzhiyun 				__func__, ret);
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 	} else {
908*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
909*4882a593Smuzhiyun 	}
910*4882a593Smuzhiyun }
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun static const struct rk_gmac_ops rk3308_ops = {
913*4882a593Smuzhiyun 	.set_to_rmii = rk3308_set_to_rmii,
914*4882a593Smuzhiyun 	.set_rmii_speed = rk3308_set_rmii_speed,
915*4882a593Smuzhiyun };
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun #define RK3328_GRF_MAC_CON0	0x0900
918*4882a593Smuzhiyun #define RK3328_GRF_MAC_CON1	0x0904
919*4882a593Smuzhiyun #define RK3328_GRF_MAC_CON2	0x0908
920*4882a593Smuzhiyun #define RK3328_GRF_MACPHY_CON1	0xb04
921*4882a593Smuzhiyun 
922*4882a593Smuzhiyun /* RK3328_GRF_MAC_CON0 */
923*4882a593Smuzhiyun #define RK3328_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 7)
924*4882a593Smuzhiyun #define RK3328_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun /* RK3328_GRF_MAC_CON1 */
927*4882a593Smuzhiyun #define RK3328_GMAC_PHY_INTF_SEL_RGMII	\
928*4882a593Smuzhiyun 		(GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
929*4882a593Smuzhiyun #define RK3328_GMAC_PHY_INTF_SEL_RMII	\
930*4882a593Smuzhiyun 		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
931*4882a593Smuzhiyun #define RK3328_GMAC_FLOW_CTRL		GRF_BIT(3)
932*4882a593Smuzhiyun #define RK3328_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(3)
933*4882a593Smuzhiyun #define RK3328_GMAC_SPEED_10M		GRF_CLR_BIT(2)
934*4882a593Smuzhiyun #define RK3328_GMAC_SPEED_100M		GRF_BIT(2)
935*4882a593Smuzhiyun #define RK3328_GMAC_RMII_CLK_25M	GRF_BIT(7)
936*4882a593Smuzhiyun #define RK3328_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(7)
937*4882a593Smuzhiyun #define RK3328_GMAC_CLK_125M		(GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
938*4882a593Smuzhiyun #define RK3328_GMAC_CLK_25M		(GRF_BIT(11) | GRF_BIT(12))
939*4882a593Smuzhiyun #define RK3328_GMAC_CLK_2_5M		(GRF_CLR_BIT(11) | GRF_BIT(12))
940*4882a593Smuzhiyun #define RK3328_GMAC_RMII_MODE		GRF_BIT(9)
941*4882a593Smuzhiyun #define RK3328_GMAC_RMII_MODE_CLR	GRF_CLR_BIT(9)
942*4882a593Smuzhiyun #define RK3328_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(0)
943*4882a593Smuzhiyun #define RK3328_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
944*4882a593Smuzhiyun #define RK3328_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(1)
945*4882a593Smuzhiyun #define RK3328_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun /* RK3328_GRF_MACPHY_CON1 */
948*4882a593Smuzhiyun #define RK3328_MACPHY_RMII_MODE		GRF_BIT(9)
949*4882a593Smuzhiyun 
rk3328_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)950*4882a593Smuzhiyun static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
951*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
952*4882a593Smuzhiyun {
953*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
956*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
957*4882a593Smuzhiyun 		return;
958*4882a593Smuzhiyun 	}
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
961*4882a593Smuzhiyun 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
962*4882a593Smuzhiyun 		     RK3328_GMAC_RMII_MODE_CLR |
963*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3328, tx_delay, rx_delay));
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
966*4882a593Smuzhiyun 		     DELAY_VALUE(RK3328, tx_delay, rx_delay));
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun 
rk3328_set_to_rmii(struct rk_priv_data * bsp_priv)969*4882a593Smuzhiyun static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
970*4882a593Smuzhiyun {
971*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
972*4882a593Smuzhiyun 	unsigned int reg;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
975*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
976*4882a593Smuzhiyun 		return;
977*4882a593Smuzhiyun 	}
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
980*4882a593Smuzhiyun 		  RK3328_GRF_MAC_CON1;
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, reg,
983*4882a593Smuzhiyun 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
984*4882a593Smuzhiyun 		     RK3328_GMAC_RMII_MODE);
985*4882a593Smuzhiyun }
986*4882a593Smuzhiyun 
rk3328_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)987*4882a593Smuzhiyun static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
988*4882a593Smuzhiyun {
989*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
992*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
993*4882a593Smuzhiyun 		return;
994*4882a593Smuzhiyun 	}
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 	if (speed == 10)
997*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
998*4882a593Smuzhiyun 			     RK3328_GMAC_CLK_2_5M);
999*4882a593Smuzhiyun 	else if (speed == 100)
1000*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
1001*4882a593Smuzhiyun 			     RK3328_GMAC_CLK_25M);
1002*4882a593Smuzhiyun 	else if (speed == 1000)
1003*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
1004*4882a593Smuzhiyun 			     RK3328_GMAC_CLK_125M);
1005*4882a593Smuzhiyun 	else
1006*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
1007*4882a593Smuzhiyun }
1008*4882a593Smuzhiyun 
rk3328_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)1009*4882a593Smuzhiyun static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1010*4882a593Smuzhiyun {
1011*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1012*4882a593Smuzhiyun 	unsigned int reg;
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1015*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
1016*4882a593Smuzhiyun 		return;
1017*4882a593Smuzhiyun 	}
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 	reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
1020*4882a593Smuzhiyun 		  RK3328_GRF_MAC_CON1;
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun 	if (speed == 10)
1023*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, reg,
1024*4882a593Smuzhiyun 			     RK3328_GMAC_RMII_CLK_2_5M |
1025*4882a593Smuzhiyun 			     RK3328_GMAC_SPEED_10M);
1026*4882a593Smuzhiyun 	else if (speed == 100)
1027*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, reg,
1028*4882a593Smuzhiyun 			     RK3328_GMAC_RMII_CLK_25M |
1029*4882a593Smuzhiyun 			     RK3328_GMAC_SPEED_100M);
1030*4882a593Smuzhiyun 	else
1031*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1032*4882a593Smuzhiyun }
1033*4882a593Smuzhiyun 
rk3328_integrated_phy_power(struct rk_priv_data * priv,bool up)1034*4882a593Smuzhiyun static void rk3328_integrated_phy_power(struct rk_priv_data *priv, bool up)
1035*4882a593Smuzhiyun {
1036*4882a593Smuzhiyun 	if (up) {
1037*4882a593Smuzhiyun 		regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
1038*4882a593Smuzhiyun 			     RK3328_MACPHY_RMII_MODE);
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun 		rk_gmac_integrated_ephy_powerup(priv);
1041*4882a593Smuzhiyun 	} else {
1042*4882a593Smuzhiyun 		rk_gmac_integrated_ephy_powerdown(priv);
1043*4882a593Smuzhiyun 	}
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun static const struct rk_gmac_ops rk3328_ops = {
1047*4882a593Smuzhiyun 	.set_to_rgmii = rk3328_set_to_rgmii,
1048*4882a593Smuzhiyun 	.set_to_rmii = rk3328_set_to_rmii,
1049*4882a593Smuzhiyun 	.set_rgmii_speed = rk3328_set_rgmii_speed,
1050*4882a593Smuzhiyun 	.set_rmii_speed = rk3328_set_rmii_speed,
1051*4882a593Smuzhiyun 	.integrated_phy_power =  rk3328_integrated_phy_power,
1052*4882a593Smuzhiyun };
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun #define RK3366_GRF_SOC_CON6	0x0418
1055*4882a593Smuzhiyun #define RK3366_GRF_SOC_CON7	0x041c
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun /* RK3366_GRF_SOC_CON6 */
1058*4882a593Smuzhiyun #define RK3366_GMAC_PHY_INTF_SEL_RGMII	(GRF_BIT(9) | GRF_CLR_BIT(10) | \
1059*4882a593Smuzhiyun 					 GRF_CLR_BIT(11))
1060*4882a593Smuzhiyun #define RK3366_GMAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
1061*4882a593Smuzhiyun 					 GRF_BIT(11))
1062*4882a593Smuzhiyun #define RK3366_GMAC_FLOW_CTRL		GRF_BIT(8)
1063*4882a593Smuzhiyun #define RK3366_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(8)
1064*4882a593Smuzhiyun #define RK3366_GMAC_SPEED_10M		GRF_CLR_BIT(7)
1065*4882a593Smuzhiyun #define RK3366_GMAC_SPEED_100M		GRF_BIT(7)
1066*4882a593Smuzhiyun #define RK3366_GMAC_RMII_CLK_25M	GRF_BIT(3)
1067*4882a593Smuzhiyun #define RK3366_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(3)
1068*4882a593Smuzhiyun #define RK3366_GMAC_CLK_125M		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
1069*4882a593Smuzhiyun #define RK3366_GMAC_CLK_25M		(GRF_BIT(4) | GRF_BIT(5))
1070*4882a593Smuzhiyun #define RK3366_GMAC_CLK_2_5M		(GRF_CLR_BIT(4) | GRF_BIT(5))
1071*4882a593Smuzhiyun #define RK3366_GMAC_RMII_MODE		GRF_BIT(6)
1072*4882a593Smuzhiyun #define RK3366_GMAC_RMII_MODE_CLR	GRF_CLR_BIT(6)
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun /* RK3366_GRF_SOC_CON7 */
1075*4882a593Smuzhiyun #define RK3366_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(7)
1076*4882a593Smuzhiyun #define RK3366_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(7)
1077*4882a593Smuzhiyun #define RK3366_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
1078*4882a593Smuzhiyun #define RK3366_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
1079*4882a593Smuzhiyun #define RK3366_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
1080*4882a593Smuzhiyun #define RK3366_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
1081*4882a593Smuzhiyun 
rk3366_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1082*4882a593Smuzhiyun static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
1083*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1084*4882a593Smuzhiyun {
1085*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1088*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1089*4882a593Smuzhiyun 		return;
1090*4882a593Smuzhiyun 	}
1091*4882a593Smuzhiyun 
1092*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1093*4882a593Smuzhiyun 		     RK3366_GMAC_PHY_INTF_SEL_RGMII |
1094*4882a593Smuzhiyun 		     RK3366_GMAC_RMII_MODE_CLR);
1095*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
1096*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
1097*4882a593Smuzhiyun 		     DELAY_VALUE(RK3366, tx_delay, rx_delay));
1098*4882a593Smuzhiyun }
1099*4882a593Smuzhiyun 
rk3366_set_to_rmii(struct rk_priv_data * bsp_priv)1100*4882a593Smuzhiyun static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
1101*4882a593Smuzhiyun {
1102*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1103*4882a593Smuzhiyun 
1104*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1105*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1106*4882a593Smuzhiyun 		return;
1107*4882a593Smuzhiyun 	}
1108*4882a593Smuzhiyun 
1109*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1110*4882a593Smuzhiyun 		     RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun 
rk3366_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)1113*4882a593Smuzhiyun static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1114*4882a593Smuzhiyun {
1115*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1118*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1119*4882a593Smuzhiyun 		return;
1120*4882a593Smuzhiyun 	}
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 	if (speed == 10)
1123*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1124*4882a593Smuzhiyun 			     RK3366_GMAC_CLK_2_5M);
1125*4882a593Smuzhiyun 	else if (speed == 100)
1126*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1127*4882a593Smuzhiyun 			     RK3366_GMAC_CLK_25M);
1128*4882a593Smuzhiyun 	else if (speed == 1000)
1129*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1130*4882a593Smuzhiyun 			     RK3366_GMAC_CLK_125M);
1131*4882a593Smuzhiyun 	else
1132*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
1133*4882a593Smuzhiyun }
1134*4882a593Smuzhiyun 
rk3366_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)1135*4882a593Smuzhiyun static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1136*4882a593Smuzhiyun {
1137*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1140*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1141*4882a593Smuzhiyun 		return;
1142*4882a593Smuzhiyun 	}
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun 	if (speed == 10) {
1145*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1146*4882a593Smuzhiyun 			     RK3366_GMAC_RMII_CLK_2_5M |
1147*4882a593Smuzhiyun 			     RK3366_GMAC_SPEED_10M);
1148*4882a593Smuzhiyun 	} else if (speed == 100) {
1149*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
1150*4882a593Smuzhiyun 			     RK3366_GMAC_RMII_CLK_25M |
1151*4882a593Smuzhiyun 			     RK3366_GMAC_SPEED_100M);
1152*4882a593Smuzhiyun 	} else {
1153*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1154*4882a593Smuzhiyun 	}
1155*4882a593Smuzhiyun }
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun static const struct rk_gmac_ops rk3366_ops = {
1158*4882a593Smuzhiyun 	.set_to_rgmii = rk3366_set_to_rgmii,
1159*4882a593Smuzhiyun 	.set_to_rmii = rk3366_set_to_rmii,
1160*4882a593Smuzhiyun 	.set_rgmii_speed = rk3366_set_rgmii_speed,
1161*4882a593Smuzhiyun 	.set_rmii_speed = rk3366_set_rmii_speed,
1162*4882a593Smuzhiyun };
1163*4882a593Smuzhiyun 
1164*4882a593Smuzhiyun #define RK3368_GRF_SOC_CON15	0x043c
1165*4882a593Smuzhiyun #define RK3368_GRF_SOC_CON16	0x0440
1166*4882a593Smuzhiyun 
1167*4882a593Smuzhiyun /* RK3368_GRF_SOC_CON15 */
1168*4882a593Smuzhiyun #define RK3368_GMAC_PHY_INTF_SEL_RGMII	(GRF_BIT(9) | GRF_CLR_BIT(10) | \
1169*4882a593Smuzhiyun 					 GRF_CLR_BIT(11))
1170*4882a593Smuzhiyun #define RK3368_GMAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
1171*4882a593Smuzhiyun 					 GRF_BIT(11))
1172*4882a593Smuzhiyun #define RK3368_GMAC_FLOW_CTRL		GRF_BIT(8)
1173*4882a593Smuzhiyun #define RK3368_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(8)
1174*4882a593Smuzhiyun #define RK3368_GMAC_SPEED_10M		GRF_CLR_BIT(7)
1175*4882a593Smuzhiyun #define RK3368_GMAC_SPEED_100M		GRF_BIT(7)
1176*4882a593Smuzhiyun #define RK3368_GMAC_RMII_CLK_25M	GRF_BIT(3)
1177*4882a593Smuzhiyun #define RK3368_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(3)
1178*4882a593Smuzhiyun #define RK3368_GMAC_CLK_125M		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
1179*4882a593Smuzhiyun #define RK3368_GMAC_CLK_25M		(GRF_BIT(4) | GRF_BIT(5))
1180*4882a593Smuzhiyun #define RK3368_GMAC_CLK_2_5M		(GRF_CLR_BIT(4) | GRF_BIT(5))
1181*4882a593Smuzhiyun #define RK3368_GMAC_RMII_MODE		GRF_BIT(6)
1182*4882a593Smuzhiyun #define RK3368_GMAC_RMII_MODE_CLR	GRF_CLR_BIT(6)
1183*4882a593Smuzhiyun 
1184*4882a593Smuzhiyun /* RK3368_GRF_SOC_CON16 */
1185*4882a593Smuzhiyun #define RK3368_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(7)
1186*4882a593Smuzhiyun #define RK3368_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(7)
1187*4882a593Smuzhiyun #define RK3368_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
1188*4882a593Smuzhiyun #define RK3368_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
1189*4882a593Smuzhiyun #define RK3368_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
1190*4882a593Smuzhiyun #define RK3368_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
1191*4882a593Smuzhiyun 
rk3368_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1192*4882a593Smuzhiyun static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
1193*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1194*4882a593Smuzhiyun {
1195*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1198*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1199*4882a593Smuzhiyun 		return;
1200*4882a593Smuzhiyun 	}
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1203*4882a593Smuzhiyun 		     RK3368_GMAC_PHY_INTF_SEL_RGMII |
1204*4882a593Smuzhiyun 		     RK3368_GMAC_RMII_MODE_CLR);
1205*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
1206*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
1207*4882a593Smuzhiyun 		     DELAY_VALUE(RK3368, tx_delay, rx_delay));
1208*4882a593Smuzhiyun }
1209*4882a593Smuzhiyun 
rk3368_set_to_rmii(struct rk_priv_data * bsp_priv)1210*4882a593Smuzhiyun static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
1211*4882a593Smuzhiyun {
1212*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1215*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1216*4882a593Smuzhiyun 		return;
1217*4882a593Smuzhiyun 	}
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1220*4882a593Smuzhiyun 		     RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
1221*4882a593Smuzhiyun }
1222*4882a593Smuzhiyun 
rk3368_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)1223*4882a593Smuzhiyun static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1224*4882a593Smuzhiyun {
1225*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1228*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1229*4882a593Smuzhiyun 		return;
1230*4882a593Smuzhiyun 	}
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 	if (speed == 10)
1233*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1234*4882a593Smuzhiyun 			     RK3368_GMAC_CLK_2_5M);
1235*4882a593Smuzhiyun 	else if (speed == 100)
1236*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1237*4882a593Smuzhiyun 			     RK3368_GMAC_CLK_25M);
1238*4882a593Smuzhiyun 	else if (speed == 1000)
1239*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1240*4882a593Smuzhiyun 			     RK3368_GMAC_CLK_125M);
1241*4882a593Smuzhiyun 	else
1242*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun 
rk3368_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)1245*4882a593Smuzhiyun static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1246*4882a593Smuzhiyun {
1247*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1250*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1251*4882a593Smuzhiyun 		return;
1252*4882a593Smuzhiyun 	}
1253*4882a593Smuzhiyun 
1254*4882a593Smuzhiyun 	if (speed == 10) {
1255*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1256*4882a593Smuzhiyun 			     RK3368_GMAC_RMII_CLK_2_5M |
1257*4882a593Smuzhiyun 			     RK3368_GMAC_SPEED_10M);
1258*4882a593Smuzhiyun 	} else if (speed == 100) {
1259*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
1260*4882a593Smuzhiyun 			     RK3368_GMAC_RMII_CLK_25M |
1261*4882a593Smuzhiyun 			     RK3368_GMAC_SPEED_100M);
1262*4882a593Smuzhiyun 	} else {
1263*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1264*4882a593Smuzhiyun 	}
1265*4882a593Smuzhiyun }
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun static const struct rk_gmac_ops rk3368_ops = {
1268*4882a593Smuzhiyun 	.set_to_rgmii = rk3368_set_to_rgmii,
1269*4882a593Smuzhiyun 	.set_to_rmii = rk3368_set_to_rmii,
1270*4882a593Smuzhiyun 	.set_rgmii_speed = rk3368_set_rgmii_speed,
1271*4882a593Smuzhiyun 	.set_rmii_speed = rk3368_set_rmii_speed,
1272*4882a593Smuzhiyun };
1273*4882a593Smuzhiyun 
1274*4882a593Smuzhiyun #define RK3399_GRF_SOC_CON5	0xc214
1275*4882a593Smuzhiyun #define RK3399_GRF_SOC_CON6	0xc218
1276*4882a593Smuzhiyun 
1277*4882a593Smuzhiyun /* RK3399_GRF_SOC_CON5 */
1278*4882a593Smuzhiyun #define RK3399_GMAC_PHY_INTF_SEL_RGMII	(GRF_BIT(9) | GRF_CLR_BIT(10) | \
1279*4882a593Smuzhiyun 					 GRF_CLR_BIT(11))
1280*4882a593Smuzhiyun #define RK3399_GMAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
1281*4882a593Smuzhiyun 					 GRF_BIT(11))
1282*4882a593Smuzhiyun #define RK3399_GMAC_FLOW_CTRL		GRF_BIT(8)
1283*4882a593Smuzhiyun #define RK3399_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(8)
1284*4882a593Smuzhiyun #define RK3399_GMAC_SPEED_10M		GRF_CLR_BIT(7)
1285*4882a593Smuzhiyun #define RK3399_GMAC_SPEED_100M		GRF_BIT(7)
1286*4882a593Smuzhiyun #define RK3399_GMAC_RMII_CLK_25M	GRF_BIT(3)
1287*4882a593Smuzhiyun #define RK3399_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(3)
1288*4882a593Smuzhiyun #define RK3399_GMAC_CLK_125M		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
1289*4882a593Smuzhiyun #define RK3399_GMAC_CLK_25M		(GRF_BIT(4) | GRF_BIT(5))
1290*4882a593Smuzhiyun #define RK3399_GMAC_CLK_2_5M		(GRF_CLR_BIT(4) | GRF_BIT(5))
1291*4882a593Smuzhiyun #define RK3399_GMAC_RMII_MODE		GRF_BIT(6)
1292*4882a593Smuzhiyun #define RK3399_GMAC_RMII_MODE_CLR	GRF_CLR_BIT(6)
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun /* RK3399_GRF_SOC_CON6 */
1295*4882a593Smuzhiyun #define RK3399_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(7)
1296*4882a593Smuzhiyun #define RK3399_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(7)
1297*4882a593Smuzhiyun #define RK3399_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
1298*4882a593Smuzhiyun #define RK3399_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
1299*4882a593Smuzhiyun #define RK3399_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
1300*4882a593Smuzhiyun #define RK3399_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
1301*4882a593Smuzhiyun 
rk3399_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1302*4882a593Smuzhiyun static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
1303*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1304*4882a593Smuzhiyun {
1305*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1308*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1309*4882a593Smuzhiyun 		return;
1310*4882a593Smuzhiyun 	}
1311*4882a593Smuzhiyun 
1312*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1313*4882a593Smuzhiyun 		     RK3399_GMAC_PHY_INTF_SEL_RGMII |
1314*4882a593Smuzhiyun 		     RK3399_GMAC_RMII_MODE_CLR);
1315*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
1316*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
1317*4882a593Smuzhiyun 		     DELAY_VALUE(RK3399, tx_delay, rx_delay));
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun 
rk3399_set_to_rmii(struct rk_priv_data * bsp_priv)1320*4882a593Smuzhiyun static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
1321*4882a593Smuzhiyun {
1322*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1323*4882a593Smuzhiyun 
1324*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1325*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1326*4882a593Smuzhiyun 		return;
1327*4882a593Smuzhiyun 	}
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1330*4882a593Smuzhiyun 		     RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
1331*4882a593Smuzhiyun }
1332*4882a593Smuzhiyun 
rk3399_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)1333*4882a593Smuzhiyun static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1334*4882a593Smuzhiyun {
1335*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1336*4882a593Smuzhiyun 
1337*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1338*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1339*4882a593Smuzhiyun 		return;
1340*4882a593Smuzhiyun 	}
1341*4882a593Smuzhiyun 
1342*4882a593Smuzhiyun 	if (speed == 10)
1343*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1344*4882a593Smuzhiyun 			     RK3399_GMAC_CLK_2_5M);
1345*4882a593Smuzhiyun 	else if (speed == 100)
1346*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1347*4882a593Smuzhiyun 			     RK3399_GMAC_CLK_25M);
1348*4882a593Smuzhiyun 	else if (speed == 1000)
1349*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1350*4882a593Smuzhiyun 			     RK3399_GMAC_CLK_125M);
1351*4882a593Smuzhiyun 	else
1352*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
1353*4882a593Smuzhiyun }
1354*4882a593Smuzhiyun 
rk3399_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)1355*4882a593Smuzhiyun static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1356*4882a593Smuzhiyun {
1357*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1358*4882a593Smuzhiyun 
1359*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1360*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1361*4882a593Smuzhiyun 		return;
1362*4882a593Smuzhiyun 	}
1363*4882a593Smuzhiyun 
1364*4882a593Smuzhiyun 	if (speed == 10) {
1365*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1366*4882a593Smuzhiyun 			     RK3399_GMAC_RMII_CLK_2_5M |
1367*4882a593Smuzhiyun 			     RK3399_GMAC_SPEED_10M);
1368*4882a593Smuzhiyun 	} else if (speed == 100) {
1369*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
1370*4882a593Smuzhiyun 			     RK3399_GMAC_RMII_CLK_25M |
1371*4882a593Smuzhiyun 			     RK3399_GMAC_SPEED_100M);
1372*4882a593Smuzhiyun 	} else {
1373*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1374*4882a593Smuzhiyun 	}
1375*4882a593Smuzhiyun }
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun static const struct rk_gmac_ops rk3399_ops = {
1378*4882a593Smuzhiyun 	.set_to_rgmii = rk3399_set_to_rgmii,
1379*4882a593Smuzhiyun 	.set_to_rmii = rk3399_set_to_rmii,
1380*4882a593Smuzhiyun 	.set_rgmii_speed = rk3399_set_rgmii_speed,
1381*4882a593Smuzhiyun 	.set_rmii_speed = rk3399_set_rmii_speed,
1382*4882a593Smuzhiyun };
1383*4882a593Smuzhiyun 
1384*4882a593Smuzhiyun #define RK3528_VO_GRF_GMAC_CON		0X60018
1385*4882a593Smuzhiyun #define RK3528_VPU_GRF_GMAC_CON5	0X40018
1386*4882a593Smuzhiyun #define RK3528_VPU_GRF_GMAC_CON6	0X4001c
1387*4882a593Smuzhiyun 
1388*4882a593Smuzhiyun #define RK3528_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
1389*4882a593Smuzhiyun #define RK3528_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
1390*4882a593Smuzhiyun #define RK3528_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(14)
1391*4882a593Smuzhiyun #define RK3528_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(14)
1392*4882a593Smuzhiyun 
1393*4882a593Smuzhiyun #define RK3528_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0xFF, 8)
1394*4882a593Smuzhiyun #define RK3528_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0xFF, 0)
1395*4882a593Smuzhiyun 
1396*4882a593Smuzhiyun #define RK3528_GMAC0_PHY_INTF_SEL_RMII	GRF_BIT(1)
1397*4882a593Smuzhiyun #define RK3528_GMAC1_PHY_INTF_SEL_RGMII	GRF_CLR_BIT(8)
1398*4882a593Smuzhiyun #define RK3528_GMAC1_PHY_INTF_SEL_RMII	GRF_BIT(8)
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_SELET_CRU	GRF_CLR_BIT(12)
1401*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_SELET_IO	GRF_BIT(12)
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun #define RK3528_GMAC0_CLK_RMII_DIV2	GRF_BIT(3)
1404*4882a593Smuzhiyun #define RK3528_GMAC0_CLK_RMII_DIV20	GRF_CLR_BIT(3)
1405*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RMII_DIV2	GRF_BIT(10)
1406*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RMII_DIV20	GRF_CLR_BIT(10)
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RGMII_DIV1		\
1409*4882a593Smuzhiyun 			(GRF_CLR_BIT(11) | GRF_CLR_BIT(10))
1410*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RGMII_DIV5		\
1411*4882a593Smuzhiyun 			(GRF_BIT(11) | GRF_BIT(10))
1412*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RGMII_DIV50		\
1413*4882a593Smuzhiyun 			(GRF_BIT(11) | GRF_CLR_BIT(10))
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun #define RK3528_GMAC0_CLK_RMII_GATE	GRF_BIT(2)
1416*4882a593Smuzhiyun #define RK3528_GMAC0_CLK_RMII_NOGATE	GRF_CLR_BIT(2)
1417*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RMII_GATE	GRF_BIT(9)
1418*4882a593Smuzhiyun #define RK3528_GMAC1_CLK_RMII_NOGATE	GRF_CLR_BIT(9)
1419*4882a593Smuzhiyun 
1420*4882a593Smuzhiyun #define RK3528_VO_GRF_MACPHY_CON0		0X6001c
1421*4882a593Smuzhiyun #define RK3528_VO_GRF_MACPHY_CON1		0X60020
1422*4882a593Smuzhiyun 
rk3528_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1423*4882a593Smuzhiyun static void rk3528_set_to_rgmii(struct rk_priv_data *bsp_priv,
1424*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1425*4882a593Smuzhiyun {
1426*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1427*4882a593Smuzhiyun 
1428*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1429*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
1430*4882a593Smuzhiyun 		return;
1431*4882a593Smuzhiyun 	}
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
1434*4882a593Smuzhiyun 		     RK3528_GMAC1_PHY_INTF_SEL_RGMII);
1435*4882a593Smuzhiyun 
1436*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
1437*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3528, tx_delay, rx_delay));
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON6,
1440*4882a593Smuzhiyun 		     DELAY_VALUE(RK3528, tx_delay, rx_delay));
1441*4882a593Smuzhiyun }
1442*4882a593Smuzhiyun 
rk3528_set_to_rmii(struct rk_priv_data * bsp_priv)1443*4882a593Smuzhiyun static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv)
1444*4882a593Smuzhiyun {
1445*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1446*4882a593Smuzhiyun 	unsigned int id = bsp_priv->bus_id;
1447*4882a593Smuzhiyun 
1448*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1449*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1450*4882a593Smuzhiyun 		return;
1451*4882a593Smuzhiyun 	}
1452*4882a593Smuzhiyun 
1453*4882a593Smuzhiyun 	if (id == 1)
1454*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
1455*4882a593Smuzhiyun 			     RK3528_GMAC1_PHY_INTF_SEL_RMII);
1456*4882a593Smuzhiyun 	else
1457*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON,
1458*4882a593Smuzhiyun 			     RK3528_GMAC0_PHY_INTF_SEL_RMII |
1459*4882a593Smuzhiyun 			     RK3528_GMAC0_CLK_RMII_DIV2);
1460*4882a593Smuzhiyun }
1461*4882a593Smuzhiyun 
rk3528_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)1462*4882a593Smuzhiyun static void rk3528_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
1463*4882a593Smuzhiyun {
1464*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1465*4882a593Smuzhiyun 	unsigned int val = 0;
1466*4882a593Smuzhiyun 
1467*4882a593Smuzhiyun 	switch (speed) {
1468*4882a593Smuzhiyun 	case 10:
1469*4882a593Smuzhiyun 		val = RK3528_GMAC1_CLK_RGMII_DIV50;
1470*4882a593Smuzhiyun 		break;
1471*4882a593Smuzhiyun 	case 100:
1472*4882a593Smuzhiyun 		val = RK3528_GMAC1_CLK_RGMII_DIV5;
1473*4882a593Smuzhiyun 		break;
1474*4882a593Smuzhiyun 	case 1000:
1475*4882a593Smuzhiyun 		val = RK3528_GMAC1_CLK_RGMII_DIV1;
1476*4882a593Smuzhiyun 		break;
1477*4882a593Smuzhiyun 	default:
1478*4882a593Smuzhiyun 		goto err;
1479*4882a593Smuzhiyun 	}
1480*4882a593Smuzhiyun 
1481*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, val);
1482*4882a593Smuzhiyun 	return;
1483*4882a593Smuzhiyun err:
1484*4882a593Smuzhiyun 	dev_err(dev, "unknown RGMII speed value for GMAC speed=%d", speed);
1485*4882a593Smuzhiyun }
1486*4882a593Smuzhiyun 
rk3528_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)1487*4882a593Smuzhiyun static void rk3528_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1488*4882a593Smuzhiyun {
1489*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1490*4882a593Smuzhiyun 	unsigned int val, offset, id = bsp_priv->bus_id;
1491*4882a593Smuzhiyun 
1492*4882a593Smuzhiyun 	switch (speed) {
1493*4882a593Smuzhiyun 	case 10:
1494*4882a593Smuzhiyun 		val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV20 :
1495*4882a593Smuzhiyun 				  RK3528_GMAC0_CLK_RMII_DIV20;
1496*4882a593Smuzhiyun 		break;
1497*4882a593Smuzhiyun 	case 100:
1498*4882a593Smuzhiyun 		val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV2 :
1499*4882a593Smuzhiyun 				  RK3528_GMAC0_CLK_RMII_DIV2;
1500*4882a593Smuzhiyun 		break;
1501*4882a593Smuzhiyun 	default:
1502*4882a593Smuzhiyun 		goto err;
1503*4882a593Smuzhiyun 	}
1504*4882a593Smuzhiyun 
1505*4882a593Smuzhiyun 	offset = (id == 1) ? RK3528_VPU_GRF_GMAC_CON5 : RK3528_VO_GRF_GMAC_CON;
1506*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset, val);
1507*4882a593Smuzhiyun 
1508*4882a593Smuzhiyun 	return;
1509*4882a593Smuzhiyun err:
1510*4882a593Smuzhiyun 	dev_err(dev, "unknown RMII speed value for GMAC speed=%d", speed);
1511*4882a593Smuzhiyun }
1512*4882a593Smuzhiyun 
rk3528_set_clock_selection(struct rk_priv_data * bsp_priv,bool input,bool enable)1513*4882a593Smuzhiyun static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv,
1514*4882a593Smuzhiyun 				       bool input, bool enable)
1515*4882a593Smuzhiyun {
1516*4882a593Smuzhiyun 	unsigned int value, id = bsp_priv->bus_id;
1517*4882a593Smuzhiyun 
1518*4882a593Smuzhiyun 	if (id == 1) {
1519*4882a593Smuzhiyun 		value = input ? RK3528_GMAC1_CLK_SELET_IO :
1520*4882a593Smuzhiyun 				RK3528_GMAC1_CLK_SELET_CRU;
1521*4882a593Smuzhiyun 		value |= enable ? RK3528_GMAC1_CLK_RMII_NOGATE :
1522*4882a593Smuzhiyun 				  RK3528_GMAC1_CLK_RMII_GATE;
1523*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, value);
1524*4882a593Smuzhiyun 	} else {
1525*4882a593Smuzhiyun 		value = enable ? RK3528_GMAC0_CLK_RMII_NOGATE :
1526*4882a593Smuzhiyun 				 RK3528_GMAC0_CLK_RMII_GATE;
1527*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, value);
1528*4882a593Smuzhiyun 	}
1529*4882a593Smuzhiyun }
1530*4882a593Smuzhiyun 
rk3528_integrated_sphy_power(struct rk_priv_data * priv,bool up)1531*4882a593Smuzhiyun static void rk3528_integrated_sphy_power(struct rk_priv_data *priv, bool up)
1532*4882a593Smuzhiyun {
1533*4882a593Smuzhiyun 	rk_gmac_integrated_fephy_power(priv, RK3528_VO_GRF_MACPHY_CON0,
1534*4882a593Smuzhiyun 				       RK3528_VO_GRF_MACPHY_CON1, up);
1535*4882a593Smuzhiyun }
1536*4882a593Smuzhiyun 
1537*4882a593Smuzhiyun static const struct rk_gmac_ops rk3528_ops = {
1538*4882a593Smuzhiyun 	.set_to_rgmii = rk3528_set_to_rgmii,
1539*4882a593Smuzhiyun 	.set_to_rmii = rk3528_set_to_rmii,
1540*4882a593Smuzhiyun 	.set_rgmii_speed = rk3528_set_rgmii_speed,
1541*4882a593Smuzhiyun 	.set_rmii_speed = rk3528_set_rmii_speed,
1542*4882a593Smuzhiyun 	.set_clock_selection = rk3528_set_clock_selection,
1543*4882a593Smuzhiyun 	.integrated_phy_power = rk3528_integrated_sphy_power,
1544*4882a593Smuzhiyun };
1545*4882a593Smuzhiyun 
1546*4882a593Smuzhiyun /* sys_grf */
1547*4882a593Smuzhiyun #define RK3562_GRF_SYS_SOC_CON0			0X0400
1548*4882a593Smuzhiyun #define RK3562_GRF_SYS_SOC_CON1			0X0404
1549*4882a593Smuzhiyun 
1550*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_MODE		GRF_BIT(5)
1551*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RGMII_MODE		GRF_CLR_BIT(5)
1552*4882a593Smuzhiyun 
1553*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_GATE		GRF_BIT(6)
1554*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_NOGATE		GRF_CLR_BIT(6)
1555*4882a593Smuzhiyun 
1556*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_DIV2		GRF_BIT(7)
1557*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_DIV20		GRF_CLR_BIT(7)
1558*4882a593Smuzhiyun 
1559*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RGMII_DIV1		\
1560*4882a593Smuzhiyun 				(GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
1561*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RGMII_DIV5		\
1562*4882a593Smuzhiyun 				(GRF_BIT(7) | GRF_BIT(8))
1563*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RGMII_DIV50		\
1564*4882a593Smuzhiyun 				(GRF_CLR_BIT(7) | GRF_BIT(8))
1565*4882a593Smuzhiyun 
1566*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_DIV2		GRF_BIT(7)
1567*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_RMII_DIV20		GRF_CLR_BIT(7)
1568*4882a593Smuzhiyun 
1569*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_SELET_CRU		GRF_CLR_BIT(9)
1570*4882a593Smuzhiyun #define RK3562_GMAC0_CLK_SELET_IO		GRF_BIT(9)
1571*4882a593Smuzhiyun 
1572*4882a593Smuzhiyun #define RK3562_GMAC1_CLK_RMII_GATE		GRF_BIT(12)
1573*4882a593Smuzhiyun #define RK3562_GMAC1_CLK_RMII_NOGATE		GRF_CLR_BIT(12)
1574*4882a593Smuzhiyun 
1575*4882a593Smuzhiyun #define RK3562_GMAC1_CLK_RMII_DIV2		GRF_BIT(13)
1576*4882a593Smuzhiyun #define RK3562_GMAC1_CLK_RMII_DIV20		GRF_CLR_BIT(13)
1577*4882a593Smuzhiyun 
1578*4882a593Smuzhiyun #define RK3562_GMAC1_RMII_SPEED100		GRF_BIT(11)
1579*4882a593Smuzhiyun #define RK3562_GMAC1_RMII_SPEED10		GRF_CLR_BIT(11)
1580*4882a593Smuzhiyun 
1581*4882a593Smuzhiyun #define RK3562_GMAC1_CLK_SELET_CRU		GRF_CLR_BIT(15)
1582*4882a593Smuzhiyun #define RK3562_GMAC1_CLK_SELET_IO		GRF_BIT(15)
1583*4882a593Smuzhiyun 
1584*4882a593Smuzhiyun /* ioc_grf */
1585*4882a593Smuzhiyun #define RK3562_GRF_IOC_GMAC_IOFUNC0_CON0	0X10400
1586*4882a593Smuzhiyun #define RK3562_GRF_IOC_GMAC_IOFUNC0_CON1	0X10404
1587*4882a593Smuzhiyun #define RK3562_GRF_IOC_GMAC_IOFUNC1_CON0	0X00400
1588*4882a593Smuzhiyun #define RK3562_GRF_IOC_GMAC_IOFUNC1_CON1	0X00404
1589*4882a593Smuzhiyun 
1590*4882a593Smuzhiyun #define RK3562_GMAC_RXCLK_DLY_ENABLE		GRF_BIT(1)
1591*4882a593Smuzhiyun #define RK3562_GMAC_RXCLK_DLY_DISABLE		GRF_CLR_BIT(1)
1592*4882a593Smuzhiyun #define RK3562_GMAC_TXCLK_DLY_ENABLE		GRF_BIT(0)
1593*4882a593Smuzhiyun #define RK3562_GMAC_TXCLK_DLY_DISABLE		GRF_CLR_BIT(0)
1594*4882a593Smuzhiyun 
1595*4882a593Smuzhiyun #define RK3562_GMAC_CLK_RX_DL_CFG(val)		HIWORD_UPDATE(val, 0xFF, 8)
1596*4882a593Smuzhiyun #define RK3562_GMAC_CLK_TX_DL_CFG(val)		HIWORD_UPDATE(val, 0xFF, 0)
1597*4882a593Smuzhiyun 
1598*4882a593Smuzhiyun #define RK3562_GMAC0_IO_EXTCLK_SELET_CRU	GRF_CLR_BIT(2)
1599*4882a593Smuzhiyun #define RK3562_GMAC0_IO_EXTCLK_SELET_IO		GRF_BIT(2)
1600*4882a593Smuzhiyun 
1601*4882a593Smuzhiyun #define RK3562_GMAC1_IO_EXTCLK_SELET_CRU	GRF_CLR_BIT(3)
1602*4882a593Smuzhiyun #define RK3562_GMAC1_IO_EXTCLK_SELET_IO		GRF_BIT(3)
1603*4882a593Smuzhiyun 
rk3562_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1604*4882a593Smuzhiyun static void rk3562_set_to_rgmii(struct rk_priv_data *bsp_priv,
1605*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1606*4882a593Smuzhiyun {
1607*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1608*4882a593Smuzhiyun 
1609*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
1610*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n");
1611*4882a593Smuzhiyun 		return;
1612*4882a593Smuzhiyun 	}
1613*4882a593Smuzhiyun 
1614*4882a593Smuzhiyun 	if (bsp_priv->bus_id > 0)
1615*4882a593Smuzhiyun 		return;
1616*4882a593Smuzhiyun 
1617*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0,
1618*4882a593Smuzhiyun 		     RK3562_GMAC0_CLK_RGMII_MODE);
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC0_CON1,
1621*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3562, tx_delay, rx_delay));
1622*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC0_CON0,
1623*4882a593Smuzhiyun 		     DELAY_VALUE(RK3562, tx_delay, rx_delay));
1624*4882a593Smuzhiyun 
1625*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON1,
1626*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3562, tx_delay, rx_delay));
1627*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON0,
1628*4882a593Smuzhiyun 		     DELAY_VALUE(RK3562, tx_delay, rx_delay));
1629*4882a593Smuzhiyun }
1630*4882a593Smuzhiyun 
rk3562_set_to_rmii(struct rk_priv_data * bsp_priv)1631*4882a593Smuzhiyun static void rk3562_set_to_rmii(struct rk_priv_data *bsp_priv)
1632*4882a593Smuzhiyun {
1633*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1634*4882a593Smuzhiyun 
1635*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1636*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1637*4882a593Smuzhiyun 		return;
1638*4882a593Smuzhiyun 	}
1639*4882a593Smuzhiyun 
1640*4882a593Smuzhiyun 	if (!bsp_priv->bus_id)
1641*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0,
1642*4882a593Smuzhiyun 			     RK3562_GMAC0_CLK_RMII_MODE);
1643*4882a593Smuzhiyun }
1644*4882a593Smuzhiyun 
rk3562_set_gmac_speed(struct rk_priv_data * bsp_priv,int speed)1645*4882a593Smuzhiyun static void rk3562_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1646*4882a593Smuzhiyun {
1647*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1648*4882a593Smuzhiyun 	unsigned int val = 0, offset, id = bsp_priv->bus_id;
1649*4882a593Smuzhiyun 
1650*4882a593Smuzhiyun 	switch (speed) {
1651*4882a593Smuzhiyun 	case 10:
1652*4882a593Smuzhiyun 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1653*4882a593Smuzhiyun 			if (id > 0) {
1654*4882a593Smuzhiyun 				val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 1, 20);
1655*4882a593Smuzhiyun 				regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0,
1656*4882a593Smuzhiyun 					     RK3562_GMAC1_RMII_SPEED10);
1657*4882a593Smuzhiyun 			} else {
1658*4882a593Smuzhiyun 				val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 0, 20);
1659*4882a593Smuzhiyun 			}
1660*4882a593Smuzhiyun 		} else {
1661*4882a593Smuzhiyun 			val = GMAC_RGMII_CLK_DIV_BY_ID(RK3562, 0, 50);
1662*4882a593Smuzhiyun 		}
1663*4882a593Smuzhiyun 		break;
1664*4882a593Smuzhiyun 	case 100:
1665*4882a593Smuzhiyun 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1666*4882a593Smuzhiyun 			if (id > 0) {
1667*4882a593Smuzhiyun 				val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 1, 2);
1668*4882a593Smuzhiyun 				regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0,
1669*4882a593Smuzhiyun 					     RK3562_GMAC1_RMII_SPEED100);
1670*4882a593Smuzhiyun 			} else {
1671*4882a593Smuzhiyun 				val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 0, 2);
1672*4882a593Smuzhiyun 			}
1673*4882a593Smuzhiyun 		} else {
1674*4882a593Smuzhiyun 			val = GMAC_RGMII_CLK_DIV_BY_ID(RK3562, 0, 5);
1675*4882a593Smuzhiyun 		}
1676*4882a593Smuzhiyun 		break;
1677*4882a593Smuzhiyun 	case 1000:
1678*4882a593Smuzhiyun 		if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
1679*4882a593Smuzhiyun 			val = GMAC_RGMII_CLK_DIV_BY_ID(RK3562, 0, 1);
1680*4882a593Smuzhiyun 		else
1681*4882a593Smuzhiyun 			goto err;
1682*4882a593Smuzhiyun 		break;
1683*4882a593Smuzhiyun 	default:
1684*4882a593Smuzhiyun 		goto err;
1685*4882a593Smuzhiyun 	}
1686*4882a593Smuzhiyun 
1687*4882a593Smuzhiyun 	offset = (bsp_priv->bus_id > 0) ? RK3562_GRF_SYS_SOC_CON1 :
1688*4882a593Smuzhiyun 					  RK3562_GRF_SYS_SOC_CON0;
1689*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset, val);
1690*4882a593Smuzhiyun 
1691*4882a593Smuzhiyun 	return;
1692*4882a593Smuzhiyun err:
1693*4882a593Smuzhiyun 	dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1694*4882a593Smuzhiyun }
1695*4882a593Smuzhiyun 
rk3562_set_clock_selection(struct rk_priv_data * bsp_priv,bool input,bool enable)1696*4882a593Smuzhiyun static void rk3562_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
1697*4882a593Smuzhiyun 				       bool enable)
1698*4882a593Smuzhiyun {
1699*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1700*4882a593Smuzhiyun 	unsigned int value;
1701*4882a593Smuzhiyun 
1702*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
1703*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n");
1704*4882a593Smuzhiyun 		return;
1705*4882a593Smuzhiyun 	}
1706*4882a593Smuzhiyun 
1707*4882a593Smuzhiyun 	if (!bsp_priv->bus_id) {
1708*4882a593Smuzhiyun 		value = input ? RK3562_GMAC0_CLK_SELET_IO :
1709*4882a593Smuzhiyun 				RK3562_GMAC0_CLK_SELET_CRU;
1710*4882a593Smuzhiyun 		value |= enable ? RK3562_GMAC0_CLK_RMII_NOGATE :
1711*4882a593Smuzhiyun 				  RK3562_GMAC0_CLK_RMII_GATE;
1712*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0, value);
1713*4882a593Smuzhiyun 
1714*4882a593Smuzhiyun 		value = input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO :
1715*4882a593Smuzhiyun 				RK3562_GMAC0_IO_EXTCLK_SELET_CRU;
1716*4882a593Smuzhiyun 		regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC0_CON1, value);
1717*4882a593Smuzhiyun 		regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON1, value);
1718*4882a593Smuzhiyun 	} else {
1719*4882a593Smuzhiyun 		value = input ? RK3562_GMAC1_CLK_SELET_IO :
1720*4882a593Smuzhiyun 				RK3562_GMAC1_CLK_SELET_CRU;
1721*4882a593Smuzhiyun 		value |= enable ? RK3562_GMAC1_CLK_RMII_NOGATE :
1722*4882a593Smuzhiyun 				 RK3562_GMAC1_CLK_RMII_GATE;
1723*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON1, value);
1724*4882a593Smuzhiyun 
1725*4882a593Smuzhiyun 		value = input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO :
1726*4882a593Smuzhiyun 				RK3562_GMAC1_IO_EXTCLK_SELET_CRU;
1727*4882a593Smuzhiyun 		regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON1, value);
1728*4882a593Smuzhiyun 	}
1729*4882a593Smuzhiyun }
1730*4882a593Smuzhiyun 
1731*4882a593Smuzhiyun static const struct rk_gmac_ops rk3562_ops = {
1732*4882a593Smuzhiyun 	.set_to_rgmii = rk3562_set_to_rgmii,
1733*4882a593Smuzhiyun 	.set_to_rmii = rk3562_set_to_rmii,
1734*4882a593Smuzhiyun 	.set_rgmii_speed = rk3562_set_gmac_speed,
1735*4882a593Smuzhiyun 	.set_rmii_speed = rk3562_set_gmac_speed,
1736*4882a593Smuzhiyun 	.set_clock_selection = rk3562_set_clock_selection,
1737*4882a593Smuzhiyun };
1738*4882a593Smuzhiyun 
1739*4882a593Smuzhiyun #define RK3568_GRF_GMAC0_CON0		0X0380
1740*4882a593Smuzhiyun #define RK3568_GRF_GMAC0_CON1		0X0384
1741*4882a593Smuzhiyun #define RK3568_GRF_GMAC1_CON0		0X0388
1742*4882a593Smuzhiyun #define RK3568_GRF_GMAC1_CON1		0X038c
1743*4882a593Smuzhiyun 
1744*4882a593Smuzhiyun /* RK3568_GRF_GMAC0_CON1 && RK3568_GRF_GMAC1_CON1 */
1745*4882a593Smuzhiyun #define RK3568_GMAC_GMII_MODE			GRF_BIT(7)
1746*4882a593Smuzhiyun #define RK3568_GMAC_PHY_INTF_SEL_RGMII	\
1747*4882a593Smuzhiyun 		(GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
1748*4882a593Smuzhiyun #define RK3568_GMAC_PHY_INTF_SEL_RMII	\
1749*4882a593Smuzhiyun 		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
1750*4882a593Smuzhiyun #define RK3568_GMAC_FLOW_CTRL			GRF_BIT(3)
1751*4882a593Smuzhiyun #define RK3568_GMAC_FLOW_CTRL_CLR		GRF_CLR_BIT(3)
1752*4882a593Smuzhiyun #define RK3568_GMAC_RXCLK_DLY_ENABLE		GRF_BIT(1)
1753*4882a593Smuzhiyun #define RK3568_GMAC_RXCLK_DLY_DISABLE		GRF_CLR_BIT(1)
1754*4882a593Smuzhiyun #define RK3568_GMAC_TXCLK_DLY_ENABLE		GRF_BIT(0)
1755*4882a593Smuzhiyun #define RK3568_GMAC_TXCLK_DLY_DISABLE		GRF_CLR_BIT(0)
1756*4882a593Smuzhiyun 
1757*4882a593Smuzhiyun /* RK3568_GRF_GMAC0_CON0 && RK3568_GRF_GMAC1_CON0 */
1758*4882a593Smuzhiyun #define RK3568_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
1759*4882a593Smuzhiyun #define RK3568_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
1760*4882a593Smuzhiyun 
1761*4882a593Smuzhiyun #define RK3568_PIPE_GRF_XPCS_CON0	0X0040
1762*4882a593Smuzhiyun 
1763*4882a593Smuzhiyun #define RK3568_PIPE_GRF_XPCS_QGMII_MAC_SEL	GRF_BIT(0)
1764*4882a593Smuzhiyun #define RK3568_PIPE_GRF_XPCS_SGMII_MAC_SEL	GRF_BIT(1)
1765*4882a593Smuzhiyun #define RK3568_PIPE_GRF_XPCS_PHY_READY		GRF_BIT(2)
1766*4882a593Smuzhiyun 
rk3568_set_to_sgmii(struct rk_priv_data * bsp_priv)1767*4882a593Smuzhiyun static void rk3568_set_to_sgmii(struct rk_priv_data *bsp_priv)
1768*4882a593Smuzhiyun {
1769*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1770*4882a593Smuzhiyun 	u32 offset_con1;
1771*4882a593Smuzhiyun 
1772*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1773*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grfs property\n", __func__);
1774*4882a593Smuzhiyun 		return;
1775*4882a593Smuzhiyun 	}
1776*4882a593Smuzhiyun 
1777*4882a593Smuzhiyun 	offset_con1 = bsp_priv->bus_id == 1 ? RK3568_GRF_GMAC1_CON1 :
1778*4882a593Smuzhiyun 					      RK3568_GRF_GMAC0_CON1;
1779*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_GMII_MODE);
1780*4882a593Smuzhiyun 
1781*4882a593Smuzhiyun 	xpcs_setup(bsp_priv, PHY_INTERFACE_MODE_SGMII);
1782*4882a593Smuzhiyun }
1783*4882a593Smuzhiyun 
rk3568_set_to_qsgmii(struct rk_priv_data * bsp_priv)1784*4882a593Smuzhiyun static void rk3568_set_to_qsgmii(struct rk_priv_data *bsp_priv)
1785*4882a593Smuzhiyun {
1786*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1787*4882a593Smuzhiyun 	u32 offset_con1;
1788*4882a593Smuzhiyun 
1789*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1790*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grfs property\n", __func__);
1791*4882a593Smuzhiyun 		return;
1792*4882a593Smuzhiyun 	}
1793*4882a593Smuzhiyun 
1794*4882a593Smuzhiyun 	offset_con1 = bsp_priv->bus_id == 1 ? RK3568_GRF_GMAC1_CON1 :
1795*4882a593Smuzhiyun 					      RK3568_GRF_GMAC0_CON1;
1796*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_GMII_MODE);
1797*4882a593Smuzhiyun 
1798*4882a593Smuzhiyun 	xpcs_setup(bsp_priv, PHY_INTERFACE_MODE_QSGMII);
1799*4882a593Smuzhiyun }
1800*4882a593Smuzhiyun 
rk3568_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1801*4882a593Smuzhiyun static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
1802*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1803*4882a593Smuzhiyun {
1804*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1805*4882a593Smuzhiyun 	u32 offset_con0, offset_con1;
1806*4882a593Smuzhiyun 
1807*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1808*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
1809*4882a593Smuzhiyun 		return;
1810*4882a593Smuzhiyun 	}
1811*4882a593Smuzhiyun 
1812*4882a593Smuzhiyun 	offset_con0 = (bsp_priv->bus_id == 1) ? RK3568_GRF_GMAC1_CON0 :
1813*4882a593Smuzhiyun 						RK3568_GRF_GMAC0_CON0;
1814*4882a593Smuzhiyun 	offset_con1 = (bsp_priv->bus_id == 1) ? RK3568_GRF_GMAC1_CON1 :
1815*4882a593Smuzhiyun 						RK3568_GRF_GMAC0_CON1;
1816*4882a593Smuzhiyun 
1817*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset_con1,
1818*4882a593Smuzhiyun 		     RK3568_GMAC_PHY_INTF_SEL_RGMII |
1819*4882a593Smuzhiyun 		     DELAY_ENABLE(RK3568, tx_delay, rx_delay));
1820*4882a593Smuzhiyun 
1821*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset_con0,
1822*4882a593Smuzhiyun 		     DELAY_VALUE(RK3568, tx_delay, rx_delay));
1823*4882a593Smuzhiyun }
1824*4882a593Smuzhiyun 
rk3568_set_to_rmii(struct rk_priv_data * bsp_priv)1825*4882a593Smuzhiyun static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
1826*4882a593Smuzhiyun {
1827*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1828*4882a593Smuzhiyun 	u32 offset_con1;
1829*4882a593Smuzhiyun 
1830*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
1831*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1832*4882a593Smuzhiyun 		return;
1833*4882a593Smuzhiyun 	}
1834*4882a593Smuzhiyun 
1835*4882a593Smuzhiyun 	offset_con1 = (bsp_priv->bus_id == 1) ? RK3568_GRF_GMAC1_CON1 :
1836*4882a593Smuzhiyun 						RK3568_GRF_GMAC0_CON1;
1837*4882a593Smuzhiyun 
1838*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_PHY_INTF_SEL_RMII);
1839*4882a593Smuzhiyun }
1840*4882a593Smuzhiyun 
rk3568_set_gmac_speed(struct rk_priv_data * bsp_priv,int speed)1841*4882a593Smuzhiyun static void rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1842*4882a593Smuzhiyun {
1843*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1844*4882a593Smuzhiyun 	unsigned long rate;
1845*4882a593Smuzhiyun 	int ret;
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun 	switch (speed) {
1848*4882a593Smuzhiyun 	case 10:
1849*4882a593Smuzhiyun 		rate = 2500000;
1850*4882a593Smuzhiyun 		break;
1851*4882a593Smuzhiyun 	case 100:
1852*4882a593Smuzhiyun 		rate = 25000000;
1853*4882a593Smuzhiyun 		break;
1854*4882a593Smuzhiyun 	case 1000:
1855*4882a593Smuzhiyun 		rate = 125000000;
1856*4882a593Smuzhiyun 		break;
1857*4882a593Smuzhiyun 	default:
1858*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1859*4882a593Smuzhiyun 		return;
1860*4882a593Smuzhiyun 	}
1861*4882a593Smuzhiyun 
1862*4882a593Smuzhiyun 	ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
1863*4882a593Smuzhiyun 	if (ret)
1864*4882a593Smuzhiyun 		dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
1865*4882a593Smuzhiyun 			__func__, rate, ret);
1866*4882a593Smuzhiyun }
1867*4882a593Smuzhiyun 
1868*4882a593Smuzhiyun static const struct rk_gmac_ops rk3568_ops = {
1869*4882a593Smuzhiyun 	.set_to_rgmii = rk3568_set_to_rgmii,
1870*4882a593Smuzhiyun 	.set_to_rmii = rk3568_set_to_rmii,
1871*4882a593Smuzhiyun 	.set_to_sgmii = rk3568_set_to_sgmii,
1872*4882a593Smuzhiyun 	.set_to_qsgmii = rk3568_set_to_qsgmii,
1873*4882a593Smuzhiyun 	.set_rgmii_speed = rk3568_set_gmac_speed,
1874*4882a593Smuzhiyun 	.set_rmii_speed = rk3568_set_gmac_speed,
1875*4882a593Smuzhiyun };
1876*4882a593Smuzhiyun 
1877*4882a593Smuzhiyun /* sys_grf */
1878*4882a593Smuzhiyun #define RK3588_GRF_GMAC_CON7			0X031c
1879*4882a593Smuzhiyun #define RK3588_GRF_GMAC_CON8			0X0320
1880*4882a593Smuzhiyun #define RK3588_GRF_GMAC_CON9			0X0324
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun #define RK3588_GMAC_RXCLK_DLY_ENABLE(id)	GRF_BIT(2 * (id) + 3)
1883*4882a593Smuzhiyun #define RK3588_GMAC_RXCLK_DLY_DISABLE(id)	GRF_CLR_BIT(2 * (id) + 3)
1884*4882a593Smuzhiyun #define RK3588_GMAC_TXCLK_DLY_ENABLE(id)	GRF_BIT(2 * (id) + 2)
1885*4882a593Smuzhiyun #define RK3588_GMAC_TXCLK_DLY_DISABLE(id)	GRF_CLR_BIT(2 * (id) + 2)
1886*4882a593Smuzhiyun 
1887*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RX_DL_CFG(val)		HIWORD_UPDATE(val, 0xFF, 8)
1888*4882a593Smuzhiyun #define RK3588_GMAC_CLK_TX_DL_CFG(val)		HIWORD_UPDATE(val, 0xFF, 0)
1889*4882a593Smuzhiyun 
1890*4882a593Smuzhiyun /* php_grf */
1891*4882a593Smuzhiyun #define RK3588_GRF_GMAC_CON0			0X0008
1892*4882a593Smuzhiyun #define RK3588_GRF_CLK_CON1			0X0070
1893*4882a593Smuzhiyun 
1894*4882a593Smuzhiyun #define RK3588_GMAC_PHY_INTF_SEL_RGMII(id)	\
1895*4882a593Smuzhiyun 	(GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + (id) * 6))
1896*4882a593Smuzhiyun #define RK3588_GMAC_PHY_INTF_SEL_RMII(id)	\
1897*4882a593Smuzhiyun 	(GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + (id) * 6))
1898*4882a593Smuzhiyun 
1899*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RMII_MODE(id)		GRF_BIT(5 * (id))
1900*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RGMII_MODE(id)		GRF_CLR_BIT(5 * (id))
1901*4882a593Smuzhiyun 
1902*4882a593Smuzhiyun #define RK3588_GMAC_CLK_SELET_CRU(id)		GRF_BIT(5 * (id) + 4)
1903*4882a593Smuzhiyun #define RK3588_GMAC_CLK_SELET_IO(id)		GRF_CLR_BIT(5 * (id) + 4)
1904*4882a593Smuzhiyun 
1905*4882a593Smuzhiyun #define RK3588_GMA_CLK_RMII_DIV2(id)		GRF_BIT(5 * (id) + 2)
1906*4882a593Smuzhiyun #define RK3588_GMA_CLK_RMII_DIV20(id)		GRF_CLR_BIT(5 * (id) + 2)
1907*4882a593Smuzhiyun 
1908*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RGMII_DIV1(id)		\
1909*4882a593Smuzhiyun 			(GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3))
1910*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RGMII_DIV5(id)		\
1911*4882a593Smuzhiyun 			(GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3))
1912*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RGMII_DIV50(id)		\
1913*4882a593Smuzhiyun 			(GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3))
1914*4882a593Smuzhiyun 
1915*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RMII_GATE(id)		GRF_BIT(5 * (id) + 1)
1916*4882a593Smuzhiyun #define RK3588_GMAC_CLK_RMII_NOGATE(id)		GRF_CLR_BIT(5 * (id) + 1)
1917*4882a593Smuzhiyun 
rk3588_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)1918*4882a593Smuzhiyun static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
1919*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
1920*4882a593Smuzhiyun {
1921*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1922*4882a593Smuzhiyun 	u32 offset_con, id = bsp_priv->bus_id;
1923*4882a593Smuzhiyun 
1924*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
1925*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n");
1926*4882a593Smuzhiyun 		return;
1927*4882a593Smuzhiyun 	}
1928*4882a593Smuzhiyun 
1929*4882a593Smuzhiyun 	offset_con = bsp_priv->bus_id == 1 ? RK3588_GRF_GMAC_CON9 :
1930*4882a593Smuzhiyun 					     RK3588_GRF_GMAC_CON8;
1931*4882a593Smuzhiyun 
1932*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
1933*4882a593Smuzhiyun 		     RK3588_GMAC_PHY_INTF_SEL_RGMII(id));
1934*4882a593Smuzhiyun 
1935*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
1936*4882a593Smuzhiyun 		     RK3588_GMAC_CLK_RGMII_MODE(id));
1937*4882a593Smuzhiyun 
1938*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RK3588_GRF_GMAC_CON7,
1939*4882a593Smuzhiyun 		     DELAY_ENABLE_BY_ID(RK3588, tx_delay, rx_delay, id));
1940*4882a593Smuzhiyun 
1941*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, offset_con,
1942*4882a593Smuzhiyun 		     DELAY_VALUE(RK3588, tx_delay, rx_delay));
1943*4882a593Smuzhiyun }
1944*4882a593Smuzhiyun 
rk3588_set_to_rmii(struct rk_priv_data * bsp_priv)1945*4882a593Smuzhiyun static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
1946*4882a593Smuzhiyun {
1947*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1948*4882a593Smuzhiyun 
1949*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->php_grf)) {
1950*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,php_grf property\n", __func__);
1951*4882a593Smuzhiyun 		return;
1952*4882a593Smuzhiyun 	}
1953*4882a593Smuzhiyun 
1954*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
1955*4882a593Smuzhiyun 		     RK3588_GMAC_PHY_INTF_SEL_RMII(bsp_priv->bus_id));
1956*4882a593Smuzhiyun 
1957*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
1958*4882a593Smuzhiyun 		     RK3588_GMAC_CLK_RMII_MODE(bsp_priv->bus_id));
1959*4882a593Smuzhiyun }
1960*4882a593Smuzhiyun 
rk3588_set_gmac_speed(struct rk_priv_data * bsp_priv,int speed)1961*4882a593Smuzhiyun static void rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1962*4882a593Smuzhiyun {
1963*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
1964*4882a593Smuzhiyun 	unsigned int val = 0, id = bsp_priv->bus_id;
1965*4882a593Smuzhiyun 
1966*4882a593Smuzhiyun 	switch (speed) {
1967*4882a593Smuzhiyun 	case 10:
1968*4882a593Smuzhiyun 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
1969*4882a593Smuzhiyun 			val = RK3588_GMA_CLK_RMII_DIV20(id);
1970*4882a593Smuzhiyun 		else
1971*4882a593Smuzhiyun 			val = RK3588_GMAC_CLK_RGMII_DIV50(id);
1972*4882a593Smuzhiyun 		break;
1973*4882a593Smuzhiyun 	case 100:
1974*4882a593Smuzhiyun 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
1975*4882a593Smuzhiyun 			val = RK3588_GMA_CLK_RMII_DIV2(id);
1976*4882a593Smuzhiyun 		else
1977*4882a593Smuzhiyun 			val = RK3588_GMAC_CLK_RGMII_DIV5(id);
1978*4882a593Smuzhiyun 		break;
1979*4882a593Smuzhiyun 	case 1000:
1980*4882a593Smuzhiyun 		if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
1981*4882a593Smuzhiyun 			val = RK3588_GMAC_CLK_RGMII_DIV1(id);
1982*4882a593Smuzhiyun 		else
1983*4882a593Smuzhiyun 			goto err;
1984*4882a593Smuzhiyun 		break;
1985*4882a593Smuzhiyun 	default:
1986*4882a593Smuzhiyun 		goto err;
1987*4882a593Smuzhiyun 	}
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
1990*4882a593Smuzhiyun 
1991*4882a593Smuzhiyun 	return;
1992*4882a593Smuzhiyun err:
1993*4882a593Smuzhiyun 	dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1994*4882a593Smuzhiyun }
1995*4882a593Smuzhiyun 
rk3588_set_clock_selection(struct rk_priv_data * bsp_priv,bool input,bool enable)1996*4882a593Smuzhiyun static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
1997*4882a593Smuzhiyun 				       bool enable)
1998*4882a593Smuzhiyun {
1999*4882a593Smuzhiyun 	unsigned int val = input ? RK3588_GMAC_CLK_SELET_IO(bsp_priv->bus_id) :
2000*4882a593Smuzhiyun 				   RK3588_GMAC_CLK_SELET_CRU(bsp_priv->bus_id);
2001*4882a593Smuzhiyun 
2002*4882a593Smuzhiyun 	val |= enable ? RK3588_GMAC_CLK_RMII_NOGATE(bsp_priv->bus_id) :
2003*4882a593Smuzhiyun 			RK3588_GMAC_CLK_RMII_GATE(bsp_priv->bus_id);
2004*4882a593Smuzhiyun 
2005*4882a593Smuzhiyun 	regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
2006*4882a593Smuzhiyun }
2007*4882a593Smuzhiyun 
2008*4882a593Smuzhiyun static const struct rk_gmac_ops rk3588_ops = {
2009*4882a593Smuzhiyun 	.set_to_rgmii = rk3588_set_to_rgmii,
2010*4882a593Smuzhiyun 	.set_to_rmii = rk3588_set_to_rmii,
2011*4882a593Smuzhiyun 	.set_rgmii_speed = rk3588_set_gmac_speed,
2012*4882a593Smuzhiyun 	.set_rmii_speed = rk3588_set_gmac_speed,
2013*4882a593Smuzhiyun 	.set_clock_selection = rk3588_set_clock_selection,
2014*4882a593Smuzhiyun };
2015*4882a593Smuzhiyun 
2016*4882a593Smuzhiyun #define RV1106_VOGRF_GMAC_CLK_CON		0X60004
2017*4882a593Smuzhiyun 
2018*4882a593Smuzhiyun #define RV1106_VOGRF_MACPHY_RMII_MODE		GRF_BIT(0)
2019*4882a593Smuzhiyun #define RV1106_VOGRF_GMAC_CLK_RMII_DIV2		GRF_BIT(2)
2020*4882a593Smuzhiyun #define RV1106_VOGRF_GMAC_CLK_RMII_DIV20	GRF_CLR_BIT(2)
2021*4882a593Smuzhiyun 
2022*4882a593Smuzhiyun #define RV1106_VOGRF_MACPHY_CON0		0X60028
2023*4882a593Smuzhiyun #define RV1106_VOGRF_MACPHY_CON1		0X6002C
2024*4882a593Smuzhiyun 
rv1106_set_to_rmii(struct rk_priv_data * bsp_priv)2025*4882a593Smuzhiyun static void rv1106_set_to_rmii(struct rk_priv_data *bsp_priv)
2026*4882a593Smuzhiyun {
2027*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2028*4882a593Smuzhiyun 
2029*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
2030*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
2031*4882a593Smuzhiyun 		return;
2032*4882a593Smuzhiyun 	}
2033*4882a593Smuzhiyun 
2034*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1106_VOGRF_GMAC_CLK_CON,
2035*4882a593Smuzhiyun 		     RV1106_VOGRF_MACPHY_RMII_MODE |
2036*4882a593Smuzhiyun 		     RV1106_VOGRF_GMAC_CLK_RMII_DIV2);
2037*4882a593Smuzhiyun }
2038*4882a593Smuzhiyun 
rv1106_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)2039*4882a593Smuzhiyun static void rv1106_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
2040*4882a593Smuzhiyun {
2041*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2042*4882a593Smuzhiyun 	unsigned int val = 0;
2043*4882a593Smuzhiyun 
2044*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
2045*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
2046*4882a593Smuzhiyun 		return;
2047*4882a593Smuzhiyun 	}
2048*4882a593Smuzhiyun 
2049*4882a593Smuzhiyun 	if (speed == 10) {
2050*4882a593Smuzhiyun 		val = RV1106_VOGRF_GMAC_CLK_RMII_DIV20;
2051*4882a593Smuzhiyun 	} else if (speed == 100) {
2052*4882a593Smuzhiyun 		val = RV1106_VOGRF_GMAC_CLK_RMII_DIV2;
2053*4882a593Smuzhiyun 	} else {
2054*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
2055*4882a593Smuzhiyun 		return;
2056*4882a593Smuzhiyun 	}
2057*4882a593Smuzhiyun 
2058*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1106_VOGRF_GMAC_CLK_CON, val);
2059*4882a593Smuzhiyun }
2060*4882a593Smuzhiyun 
rv1106_integrated_sphy_power(struct rk_priv_data * priv,bool up)2061*4882a593Smuzhiyun static void rv1106_integrated_sphy_power(struct rk_priv_data *priv, bool up)
2062*4882a593Smuzhiyun {
2063*4882a593Smuzhiyun 	rk_gmac_integrated_fephy_power(priv, RV1106_VOGRF_MACPHY_CON0,
2064*4882a593Smuzhiyun 				       RV1106_VOGRF_MACPHY_CON1, up);
2065*4882a593Smuzhiyun }
2066*4882a593Smuzhiyun 
2067*4882a593Smuzhiyun static const struct rk_gmac_ops rv1106_ops = {
2068*4882a593Smuzhiyun 	.set_to_rmii = rv1106_set_to_rmii,
2069*4882a593Smuzhiyun 	.set_rmii_speed = rv1106_set_rmii_speed,
2070*4882a593Smuzhiyun 	.integrated_phy_power = rv1106_integrated_sphy_power,
2071*4882a593Smuzhiyun };
2072*4882a593Smuzhiyun 
2073*4882a593Smuzhiyun #define RV1108_GRF_GMAC_CON0		0X0900
2074*4882a593Smuzhiyun 
2075*4882a593Smuzhiyun /* RV1108_GRF_GMAC_CON0 */
2076*4882a593Smuzhiyun #define RV1108_GMAC_PHY_INTF_SEL_RMII	(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
2077*4882a593Smuzhiyun 					GRF_BIT(6))
2078*4882a593Smuzhiyun #define RV1108_GMAC_FLOW_CTRL		GRF_BIT(3)
2079*4882a593Smuzhiyun #define RV1108_GMAC_FLOW_CTRL_CLR	GRF_CLR_BIT(3)
2080*4882a593Smuzhiyun #define RV1108_GMAC_SPEED_10M		GRF_CLR_BIT(2)
2081*4882a593Smuzhiyun #define RV1108_GMAC_SPEED_100M		GRF_BIT(2)
2082*4882a593Smuzhiyun #define RV1108_GMAC_RMII_CLK_25M	GRF_BIT(7)
2083*4882a593Smuzhiyun #define RV1108_GMAC_RMII_CLK_2_5M	GRF_CLR_BIT(7)
2084*4882a593Smuzhiyun 
rv1108_set_to_rmii(struct rk_priv_data * bsp_priv)2085*4882a593Smuzhiyun static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
2086*4882a593Smuzhiyun {
2087*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2088*4882a593Smuzhiyun 
2089*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
2090*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
2091*4882a593Smuzhiyun 		return;
2092*4882a593Smuzhiyun 	}
2093*4882a593Smuzhiyun 
2094*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
2095*4882a593Smuzhiyun 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
2096*4882a593Smuzhiyun }
2097*4882a593Smuzhiyun 
rv1108_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)2098*4882a593Smuzhiyun static void rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
2099*4882a593Smuzhiyun {
2100*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2101*4882a593Smuzhiyun 
2102*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
2103*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
2104*4882a593Smuzhiyun 		return;
2105*4882a593Smuzhiyun 	}
2106*4882a593Smuzhiyun 
2107*4882a593Smuzhiyun 	if (speed == 10) {
2108*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
2109*4882a593Smuzhiyun 			     RV1108_GMAC_RMII_CLK_2_5M |
2110*4882a593Smuzhiyun 			     RV1108_GMAC_SPEED_10M);
2111*4882a593Smuzhiyun 	} else if (speed == 100) {
2112*4882a593Smuzhiyun 		regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
2113*4882a593Smuzhiyun 			     RV1108_GMAC_RMII_CLK_25M |
2114*4882a593Smuzhiyun 			     RV1108_GMAC_SPEED_100M);
2115*4882a593Smuzhiyun 	} else {
2116*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
2117*4882a593Smuzhiyun 	}
2118*4882a593Smuzhiyun }
2119*4882a593Smuzhiyun 
2120*4882a593Smuzhiyun static const struct rk_gmac_ops rv1108_ops = {
2121*4882a593Smuzhiyun 	.set_to_rmii = rv1108_set_to_rmii,
2122*4882a593Smuzhiyun 	.set_rmii_speed = rv1108_set_rmii_speed,
2123*4882a593Smuzhiyun };
2124*4882a593Smuzhiyun 
2125*4882a593Smuzhiyun #define RV1126_GRF_GMAC_CON0		0X0070
2126*4882a593Smuzhiyun #define RV1126_GRF_GMAC_CON1		0X0074
2127*4882a593Smuzhiyun #define RV1126_GRF_GMAC_CON2		0X0078
2128*4882a593Smuzhiyun 
2129*4882a593Smuzhiyun /* RV1126_GRF_GMAC_CON0 */
2130*4882a593Smuzhiyun #define RV1126_GMAC_PHY_INTF_SEL_RGMII	\
2131*4882a593Smuzhiyun 		(GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
2132*4882a593Smuzhiyun #define RV1126_GMAC_PHY_INTF_SEL_RMII	\
2133*4882a593Smuzhiyun 		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
2134*4882a593Smuzhiyun #define RV1126_GMAC_FLOW_CTRL			GRF_BIT(7)
2135*4882a593Smuzhiyun #define RV1126_GMAC_FLOW_CTRL_CLR		GRF_CLR_BIT(7)
2136*4882a593Smuzhiyun #define RV1126_M0_GMAC_RXCLK_DLY_ENABLE		GRF_BIT(1)
2137*4882a593Smuzhiyun #define RV1126_M0_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(1)
2138*4882a593Smuzhiyun #define RV1126_M0_GMAC_TXCLK_DLY_ENABLE		GRF_BIT(0)
2139*4882a593Smuzhiyun #define RV1126_M0_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
2140*4882a593Smuzhiyun #define RV1126_M1_GMAC_RXCLK_DLY_ENABLE		GRF_BIT(3)
2141*4882a593Smuzhiyun #define RV1126_M1_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(3)
2142*4882a593Smuzhiyun #define RV1126_M1_GMAC_TXCLK_DLY_ENABLE		GRF_BIT(2)
2143*4882a593Smuzhiyun #define RV1126_M1_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(2)
2144*4882a593Smuzhiyun 
2145*4882a593Smuzhiyun /* RV1126_GRF_GMAC_CON1 && RV1126_GRF_GMAC_CON2 */
2146*4882a593Smuzhiyun #define RV1126_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
2147*4882a593Smuzhiyun #define RV1126_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
2148*4882a593Smuzhiyun 
rv1126_set_to_rgmii(struct rk_priv_data * bsp_priv,int tx_delay,int rx_delay)2149*4882a593Smuzhiyun static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
2150*4882a593Smuzhiyun 				int tx_delay, int rx_delay)
2151*4882a593Smuzhiyun {
2152*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2153*4882a593Smuzhiyun 
2154*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
2155*4882a593Smuzhiyun 		dev_err(dev, "Missing rockchip,grf property\n");
2156*4882a593Smuzhiyun 		return;
2157*4882a593Smuzhiyun 	}
2158*4882a593Smuzhiyun 
2159*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
2160*4882a593Smuzhiyun 		     RV1126_GMAC_PHY_INTF_SEL_RGMII |
2161*4882a593Smuzhiyun 		     DELAY_ENABLE(RV1126_M0, tx_delay, rx_delay) |
2162*4882a593Smuzhiyun 		     DELAY_ENABLE(RV1126_M1, tx_delay, rx_delay));
2163*4882a593Smuzhiyun 
2164*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON1,
2165*4882a593Smuzhiyun 		     DELAY_VALUE(RV1126, tx_delay, rx_delay));
2166*4882a593Smuzhiyun 
2167*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON2,
2168*4882a593Smuzhiyun 		     DELAY_VALUE(RV1126, tx_delay, rx_delay));
2169*4882a593Smuzhiyun }
2170*4882a593Smuzhiyun 
rv1126_set_to_rmii(struct rk_priv_data * bsp_priv)2171*4882a593Smuzhiyun static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
2172*4882a593Smuzhiyun {
2173*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2174*4882a593Smuzhiyun 
2175*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->grf)) {
2176*4882a593Smuzhiyun 		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
2177*4882a593Smuzhiyun 		return;
2178*4882a593Smuzhiyun 	}
2179*4882a593Smuzhiyun 
2180*4882a593Smuzhiyun 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
2181*4882a593Smuzhiyun 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
2182*4882a593Smuzhiyun }
2183*4882a593Smuzhiyun 
rv1126_set_rgmii_speed(struct rk_priv_data * bsp_priv,int speed)2184*4882a593Smuzhiyun static void rv1126_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
2185*4882a593Smuzhiyun {
2186*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2187*4882a593Smuzhiyun 	unsigned long rate;
2188*4882a593Smuzhiyun 	int ret;
2189*4882a593Smuzhiyun 
2190*4882a593Smuzhiyun 	switch (speed) {
2191*4882a593Smuzhiyun 	case 10:
2192*4882a593Smuzhiyun 		rate = 2500000;
2193*4882a593Smuzhiyun 		break;
2194*4882a593Smuzhiyun 	case 100:
2195*4882a593Smuzhiyun 		rate = 25000000;
2196*4882a593Smuzhiyun 		break;
2197*4882a593Smuzhiyun 	case 1000:
2198*4882a593Smuzhiyun 		rate = 125000000;
2199*4882a593Smuzhiyun 		break;
2200*4882a593Smuzhiyun 	default:
2201*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII speed=%d", speed);
2202*4882a593Smuzhiyun 		return;
2203*4882a593Smuzhiyun 	}
2204*4882a593Smuzhiyun 
2205*4882a593Smuzhiyun 	ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
2206*4882a593Smuzhiyun 	if (ret)
2207*4882a593Smuzhiyun 		dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
2208*4882a593Smuzhiyun 			__func__, rate, ret);
2209*4882a593Smuzhiyun }
2210*4882a593Smuzhiyun 
rv1126_set_rmii_speed(struct rk_priv_data * bsp_priv,int speed)2211*4882a593Smuzhiyun static void rv1126_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
2212*4882a593Smuzhiyun {
2213*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2214*4882a593Smuzhiyun 	unsigned long rate;
2215*4882a593Smuzhiyun 	int ret;
2216*4882a593Smuzhiyun 
2217*4882a593Smuzhiyun 	switch (speed) {
2218*4882a593Smuzhiyun 	case 10:
2219*4882a593Smuzhiyun 		rate = 2500000;
2220*4882a593Smuzhiyun 		break;
2221*4882a593Smuzhiyun 	case 100:
2222*4882a593Smuzhiyun 		rate = 25000000;
2223*4882a593Smuzhiyun 		break;
2224*4882a593Smuzhiyun 	default:
2225*4882a593Smuzhiyun 		dev_err(dev, "unknown speed value for RGMII speed=%d", speed);
2226*4882a593Smuzhiyun 		return;
2227*4882a593Smuzhiyun 	}
2228*4882a593Smuzhiyun 
2229*4882a593Smuzhiyun 	ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
2230*4882a593Smuzhiyun 	if (ret)
2231*4882a593Smuzhiyun 		dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
2232*4882a593Smuzhiyun 			__func__, rate, ret);
2233*4882a593Smuzhiyun }
2234*4882a593Smuzhiyun 
2235*4882a593Smuzhiyun static const struct rk_gmac_ops rv1126_ops = {
2236*4882a593Smuzhiyun 	.set_to_rgmii = rv1126_set_to_rgmii,
2237*4882a593Smuzhiyun 	.set_to_rmii = rv1126_set_to_rmii,
2238*4882a593Smuzhiyun 	.set_rgmii_speed = rv1126_set_rgmii_speed,
2239*4882a593Smuzhiyun 	.set_rmii_speed = rv1126_set_rmii_speed,
2240*4882a593Smuzhiyun };
2241*4882a593Smuzhiyun 
rk_gmac_clk_init(struct plat_stmmacenet_data * plat)2242*4882a593Smuzhiyun static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
2243*4882a593Smuzhiyun {
2244*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = plat->bsp_priv;
2245*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2246*4882a593Smuzhiyun 	int ret;
2247*4882a593Smuzhiyun 
2248*4882a593Smuzhiyun 	bsp_priv->clk_enabled = false;
2249*4882a593Smuzhiyun 
2250*4882a593Smuzhiyun 	bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
2251*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->mac_clk_rx))
2252*4882a593Smuzhiyun 		dev_err(dev, "cannot get clock %s\n",
2253*4882a593Smuzhiyun 			"mac_clk_rx");
2254*4882a593Smuzhiyun 
2255*4882a593Smuzhiyun 	bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
2256*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->mac_clk_tx))
2257*4882a593Smuzhiyun 		dev_err(dev, "cannot get clock %s\n",
2258*4882a593Smuzhiyun 			"mac_clk_tx");
2259*4882a593Smuzhiyun 
2260*4882a593Smuzhiyun 	bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
2261*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->aclk_mac))
2262*4882a593Smuzhiyun 		dev_err(dev, "cannot get clock %s\n",
2263*4882a593Smuzhiyun 			"aclk_mac");
2264*4882a593Smuzhiyun 
2265*4882a593Smuzhiyun 	bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
2266*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->pclk_mac))
2267*4882a593Smuzhiyun 		dev_err(dev, "cannot get clock %s\n",
2268*4882a593Smuzhiyun 			"pclk_mac");
2269*4882a593Smuzhiyun 
2270*4882a593Smuzhiyun 	bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
2271*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->clk_mac))
2272*4882a593Smuzhiyun 		dev_err(dev, "cannot get clock %s\n",
2273*4882a593Smuzhiyun 			"stmmaceth");
2274*4882a593Smuzhiyun 
2275*4882a593Smuzhiyun 	if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
2276*4882a593Smuzhiyun 		bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
2277*4882a593Smuzhiyun 		if (IS_ERR(bsp_priv->clk_mac_ref))
2278*4882a593Smuzhiyun 			dev_err(dev, "cannot get clock %s\n",
2279*4882a593Smuzhiyun 				"clk_mac_ref");
2280*4882a593Smuzhiyun 
2281*4882a593Smuzhiyun 		if (!bsp_priv->clock_input) {
2282*4882a593Smuzhiyun 			bsp_priv->clk_mac_refout =
2283*4882a593Smuzhiyun 				devm_clk_get(dev, "clk_mac_refout");
2284*4882a593Smuzhiyun 			if (IS_ERR(bsp_priv->clk_mac_refout))
2285*4882a593Smuzhiyun 				dev_err(dev, "cannot get clock %s\n",
2286*4882a593Smuzhiyun 					"clk_mac_refout");
2287*4882a593Smuzhiyun 		}
2288*4882a593Smuzhiyun 	} else if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_SGMII ||
2289*4882a593Smuzhiyun 		   bsp_priv->phy_iface == PHY_INTERFACE_MODE_QSGMII) {
2290*4882a593Smuzhiyun 		bsp_priv->pclk_xpcs = devm_clk_get(dev, "pclk_xpcs");
2291*4882a593Smuzhiyun 		if (IS_ERR(bsp_priv->pclk_xpcs))
2292*4882a593Smuzhiyun 			dev_err(dev, "cannot get clock %s\n", "pclk_xpcs");
2293*4882a593Smuzhiyun 		bsp_priv->clk_xpcs_eee = devm_clk_get(dev, "clk_xpcs_eee");
2294*4882a593Smuzhiyun 		if (IS_ERR(bsp_priv->clk_xpcs_eee))
2295*4882a593Smuzhiyun 			dev_err(dev, "cannot get clock %s\n", "clk_xpcs_eee");
2296*4882a593Smuzhiyun 	}
2297*4882a593Smuzhiyun 
2298*4882a593Smuzhiyun 	bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed");
2299*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->clk_mac_speed))
2300*4882a593Smuzhiyun 		dev_err(dev, "cannot get clock %s\n", "clk_mac_speed");
2301*4882a593Smuzhiyun 
2302*4882a593Smuzhiyun 	if (bsp_priv->clock_input) {
2303*4882a593Smuzhiyun 		dev_info(dev, "clock input from PHY\n");
2304*4882a593Smuzhiyun 	} else {
2305*4882a593Smuzhiyun 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
2306*4882a593Smuzhiyun 			clk_set_rate(bsp_priv->clk_mac, 50000000);
2307*4882a593Smuzhiyun 	}
2308*4882a593Smuzhiyun 
2309*4882a593Smuzhiyun 	if (plat->phy_node) {
2310*4882a593Smuzhiyun 		bsp_priv->clk_phy = of_clk_get(plat->phy_node, 0);
2311*4882a593Smuzhiyun 		/* If it is not integrated_phy, clk_phy is optional */
2312*4882a593Smuzhiyun 		if (bsp_priv->integrated_phy) {
2313*4882a593Smuzhiyun 			if (IS_ERR(bsp_priv->clk_phy)) {
2314*4882a593Smuzhiyun 				ret = PTR_ERR(bsp_priv->clk_phy);
2315*4882a593Smuzhiyun 				dev_err(dev, "Cannot get PHY clock: %d\n", ret);
2316*4882a593Smuzhiyun 				return -EINVAL;
2317*4882a593Smuzhiyun 			}
2318*4882a593Smuzhiyun 			clk_set_rate(bsp_priv->clk_phy, 50000000);
2319*4882a593Smuzhiyun 		}
2320*4882a593Smuzhiyun 	}
2321*4882a593Smuzhiyun 
2322*4882a593Smuzhiyun 	return 0;
2323*4882a593Smuzhiyun }
2324*4882a593Smuzhiyun 
gmac_clk_enable(struct rk_priv_data * bsp_priv,bool enable)2325*4882a593Smuzhiyun static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
2326*4882a593Smuzhiyun {
2327*4882a593Smuzhiyun 	int phy_iface = bsp_priv->phy_iface;
2328*4882a593Smuzhiyun 
2329*4882a593Smuzhiyun 	if (enable) {
2330*4882a593Smuzhiyun 		if (!bsp_priv->clk_enabled) {
2331*4882a593Smuzhiyun 			if (phy_iface == PHY_INTERFACE_MODE_RMII) {
2332*4882a593Smuzhiyun 				if (!IS_ERR(bsp_priv->mac_clk_rx))
2333*4882a593Smuzhiyun 					clk_prepare_enable(
2334*4882a593Smuzhiyun 						bsp_priv->mac_clk_rx);
2335*4882a593Smuzhiyun 
2336*4882a593Smuzhiyun 				if (!IS_ERR(bsp_priv->clk_mac_ref))
2337*4882a593Smuzhiyun 					clk_prepare_enable(
2338*4882a593Smuzhiyun 						bsp_priv->clk_mac_ref);
2339*4882a593Smuzhiyun 
2340*4882a593Smuzhiyun 				if (!IS_ERR(bsp_priv->clk_mac_refout))
2341*4882a593Smuzhiyun 					clk_prepare_enable(
2342*4882a593Smuzhiyun 						bsp_priv->clk_mac_refout);
2343*4882a593Smuzhiyun 			}
2344*4882a593Smuzhiyun 
2345*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->clk_phy))
2346*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->clk_phy);
2347*4882a593Smuzhiyun 
2348*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->aclk_mac))
2349*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->aclk_mac);
2350*4882a593Smuzhiyun 
2351*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->pclk_mac))
2352*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->pclk_mac);
2353*4882a593Smuzhiyun 
2354*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->mac_clk_tx))
2355*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->mac_clk_tx);
2356*4882a593Smuzhiyun 
2357*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->clk_mac_speed))
2358*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->clk_mac_speed);
2359*4882a593Smuzhiyun 
2360*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->pclk_xpcs))
2361*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->pclk_xpcs);
2362*4882a593Smuzhiyun 
2363*4882a593Smuzhiyun 			if (!IS_ERR(bsp_priv->clk_xpcs_eee))
2364*4882a593Smuzhiyun 				clk_prepare_enable(bsp_priv->clk_xpcs_eee);
2365*4882a593Smuzhiyun 
2366*4882a593Smuzhiyun 			if (bsp_priv->ops && bsp_priv->ops->set_clock_selection)
2367*4882a593Smuzhiyun 				bsp_priv->ops->set_clock_selection(bsp_priv,
2368*4882a593Smuzhiyun 					       bsp_priv->clock_input, true);
2369*4882a593Smuzhiyun 
2370*4882a593Smuzhiyun 			/**
2371*4882a593Smuzhiyun 			 * if (!IS_ERR(bsp_priv->clk_mac))
2372*4882a593Smuzhiyun 			 *	clk_prepare_enable(bsp_priv->clk_mac);
2373*4882a593Smuzhiyun 			 */
2374*4882a593Smuzhiyun 			usleep_range(100, 200);
2375*4882a593Smuzhiyun 			bsp_priv->clk_enabled = true;
2376*4882a593Smuzhiyun 		}
2377*4882a593Smuzhiyun 	} else {
2378*4882a593Smuzhiyun 		if (bsp_priv->clk_enabled) {
2379*4882a593Smuzhiyun 			if (bsp_priv->ops && bsp_priv->ops->set_clock_selection)
2380*4882a593Smuzhiyun 				bsp_priv->ops->set_clock_selection(bsp_priv,
2381*4882a593Smuzhiyun 					      bsp_priv->clock_input, false);
2382*4882a593Smuzhiyun 
2383*4882a593Smuzhiyun 			if (phy_iface == PHY_INTERFACE_MODE_RMII) {
2384*4882a593Smuzhiyun 				clk_disable_unprepare(bsp_priv->mac_clk_rx);
2385*4882a593Smuzhiyun 
2386*4882a593Smuzhiyun 				clk_disable_unprepare(bsp_priv->clk_mac_ref);
2387*4882a593Smuzhiyun 
2388*4882a593Smuzhiyun 				clk_disable_unprepare(bsp_priv->clk_mac_refout);
2389*4882a593Smuzhiyun 			}
2390*4882a593Smuzhiyun 
2391*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->clk_phy);
2392*4882a593Smuzhiyun 
2393*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->aclk_mac);
2394*4882a593Smuzhiyun 
2395*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->pclk_mac);
2396*4882a593Smuzhiyun 
2397*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->mac_clk_tx);
2398*4882a593Smuzhiyun 
2399*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->clk_mac_speed);
2400*4882a593Smuzhiyun 
2401*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->pclk_xpcs);
2402*4882a593Smuzhiyun 
2403*4882a593Smuzhiyun 			clk_disable_unprepare(bsp_priv->clk_xpcs_eee);
2404*4882a593Smuzhiyun 
2405*4882a593Smuzhiyun 			/**
2406*4882a593Smuzhiyun 			 * if (!IS_ERR(bsp_priv->clk_mac))
2407*4882a593Smuzhiyun 			 *	clk_disable_unprepare(bsp_priv->clk_mac);
2408*4882a593Smuzhiyun 			 */
2409*4882a593Smuzhiyun 			bsp_priv->clk_enabled = false;
2410*4882a593Smuzhiyun 		}
2411*4882a593Smuzhiyun 	}
2412*4882a593Smuzhiyun 
2413*4882a593Smuzhiyun 	return 0;
2414*4882a593Smuzhiyun }
2415*4882a593Smuzhiyun 
rk_gmac_phy_power_on(struct rk_priv_data * bsp_priv,bool enable)2416*4882a593Smuzhiyun static int rk_gmac_phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
2417*4882a593Smuzhiyun {
2418*4882a593Smuzhiyun 	struct regulator *ldo = bsp_priv->regulator;
2419*4882a593Smuzhiyun 	int ret;
2420*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2421*4882a593Smuzhiyun 
2422*4882a593Smuzhiyun 	if (!ldo)
2423*4882a593Smuzhiyun 		return 0;
2424*4882a593Smuzhiyun 
2425*4882a593Smuzhiyun 	if (enable) {
2426*4882a593Smuzhiyun 		ret = regulator_enable(ldo);
2427*4882a593Smuzhiyun 		if (ret)
2428*4882a593Smuzhiyun 			dev_err(dev, "fail to enable phy-supply\n");
2429*4882a593Smuzhiyun 	} else {
2430*4882a593Smuzhiyun 		ret = regulator_disable(ldo);
2431*4882a593Smuzhiyun 		if (ret)
2432*4882a593Smuzhiyun 			dev_err(dev, "fail to disable phy-supply\n");
2433*4882a593Smuzhiyun 	}
2434*4882a593Smuzhiyun 
2435*4882a593Smuzhiyun 	return 0;
2436*4882a593Smuzhiyun }
2437*4882a593Smuzhiyun 
rk_gmac_setup(struct platform_device * pdev,struct plat_stmmacenet_data * plat,const struct rk_gmac_ops * ops)2438*4882a593Smuzhiyun static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
2439*4882a593Smuzhiyun 					  struct plat_stmmacenet_data *plat,
2440*4882a593Smuzhiyun 					  const struct rk_gmac_ops *ops)
2441*4882a593Smuzhiyun {
2442*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv;
2443*4882a593Smuzhiyun 	struct device *dev = &pdev->dev;
2444*4882a593Smuzhiyun 	int ret;
2445*4882a593Smuzhiyun 	const char *strings = NULL;
2446*4882a593Smuzhiyun 	int value;
2447*4882a593Smuzhiyun 
2448*4882a593Smuzhiyun 	bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
2449*4882a593Smuzhiyun 	if (!bsp_priv)
2450*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
2451*4882a593Smuzhiyun 
2452*4882a593Smuzhiyun 	of_get_phy_mode(dev->of_node, &bsp_priv->phy_iface);
2453*4882a593Smuzhiyun 	bsp_priv->ops = ops;
2454*4882a593Smuzhiyun 	bsp_priv->bus_id = plat->bus_id;
2455*4882a593Smuzhiyun 
2456*4882a593Smuzhiyun 	bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
2457*4882a593Smuzhiyun 	if (IS_ERR(bsp_priv->regulator)) {
2458*4882a593Smuzhiyun 		if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
2459*4882a593Smuzhiyun 			dev_err(dev, "phy regulator is not available yet, deferred probing\n");
2460*4882a593Smuzhiyun 			return ERR_PTR(-EPROBE_DEFER);
2461*4882a593Smuzhiyun 		}
2462*4882a593Smuzhiyun 		dev_err(dev, "no regulator found\n");
2463*4882a593Smuzhiyun 		bsp_priv->regulator = NULL;
2464*4882a593Smuzhiyun 	}
2465*4882a593Smuzhiyun 
2466*4882a593Smuzhiyun 	ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
2467*4882a593Smuzhiyun 	if (ret) {
2468*4882a593Smuzhiyun 		dev_err(dev, "Can not read property: clock_in_out.\n");
2469*4882a593Smuzhiyun 		bsp_priv->clock_input = true;
2470*4882a593Smuzhiyun 	} else {
2471*4882a593Smuzhiyun 		dev_info(dev, "clock input or output? (%s).\n",
2472*4882a593Smuzhiyun 			 strings);
2473*4882a593Smuzhiyun 		if (!strcmp(strings, "input"))
2474*4882a593Smuzhiyun 			bsp_priv->clock_input = true;
2475*4882a593Smuzhiyun 		else
2476*4882a593Smuzhiyun 			bsp_priv->clock_input = false;
2477*4882a593Smuzhiyun 	}
2478*4882a593Smuzhiyun 
2479*4882a593Smuzhiyun 	ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
2480*4882a593Smuzhiyun 	if (ret) {
2481*4882a593Smuzhiyun 		bsp_priv->tx_delay = -1;
2482*4882a593Smuzhiyun 		dev_err(dev, "Can not read property: tx_delay.");
2483*4882a593Smuzhiyun 		dev_err(dev, "set tx_delay to 0x%x\n",
2484*4882a593Smuzhiyun 			bsp_priv->tx_delay);
2485*4882a593Smuzhiyun 	} else {
2486*4882a593Smuzhiyun 		dev_info(dev, "TX delay(0x%x).\n", value);
2487*4882a593Smuzhiyun 		bsp_priv->tx_delay = value;
2488*4882a593Smuzhiyun 	}
2489*4882a593Smuzhiyun 
2490*4882a593Smuzhiyun 	ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
2491*4882a593Smuzhiyun 	if (ret) {
2492*4882a593Smuzhiyun 		bsp_priv->rx_delay = -1;
2493*4882a593Smuzhiyun 		dev_err(dev, "Can not read property: rx_delay.");
2494*4882a593Smuzhiyun 		dev_err(dev, "set rx_delay to 0x%x\n",
2495*4882a593Smuzhiyun 			bsp_priv->rx_delay);
2496*4882a593Smuzhiyun 	} else {
2497*4882a593Smuzhiyun 		dev_info(dev, "RX delay(0x%x).\n", value);
2498*4882a593Smuzhiyun 		bsp_priv->rx_delay = value;
2499*4882a593Smuzhiyun 	}
2500*4882a593Smuzhiyun 
2501*4882a593Smuzhiyun 	bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
2502*4882a593Smuzhiyun 							"rockchip,grf");
2503*4882a593Smuzhiyun 	bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node,
2504*4882a593Smuzhiyun 							    "rockchip,php_grf");
2505*4882a593Smuzhiyun 	bsp_priv->xpcs = syscon_regmap_lookup_by_phandle(dev->of_node,
2506*4882a593Smuzhiyun 							 "rockchip,xpcs");
2507*4882a593Smuzhiyun 	if (!IS_ERR(bsp_priv->xpcs)) {
2508*4882a593Smuzhiyun 		struct phy *comphy;
2509*4882a593Smuzhiyun 
2510*4882a593Smuzhiyun 		comphy = devm_of_phy_get(&pdev->dev, dev->of_node, NULL);
2511*4882a593Smuzhiyun 		if (IS_ERR(comphy))
2512*4882a593Smuzhiyun 			dev_err(dev, "devm_of_phy_get error\n");
2513*4882a593Smuzhiyun 		ret = phy_init(comphy);
2514*4882a593Smuzhiyun 		if (ret)
2515*4882a593Smuzhiyun 			dev_err(dev, "phy_init error\n");
2516*4882a593Smuzhiyun 	}
2517*4882a593Smuzhiyun 
2518*4882a593Smuzhiyun 	if (plat->phy_node) {
2519*4882a593Smuzhiyun 		bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
2520*4882a593Smuzhiyun 								 "phy-is-integrated");
2521*4882a593Smuzhiyun 		if (bsp_priv->integrated_phy) {
2522*4882a593Smuzhiyun 			unsigned char *efuse_buf;
2523*4882a593Smuzhiyun 			struct nvmem_cell *cell;
2524*4882a593Smuzhiyun 			size_t len;
2525*4882a593Smuzhiyun 
2526*4882a593Smuzhiyun 			bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
2527*4882a593Smuzhiyun 			if (IS_ERR(bsp_priv->phy_reset)) {
2528*4882a593Smuzhiyun 				dev_err(&pdev->dev, "No PHY reset control found.\n");
2529*4882a593Smuzhiyun 				bsp_priv->phy_reset = NULL;
2530*4882a593Smuzhiyun 			}
2531*4882a593Smuzhiyun 
2532*4882a593Smuzhiyun 			if (of_property_read_u32(plat->phy_node, "bgs,increment",
2533*4882a593Smuzhiyun 						 &bsp_priv->bgs_increment)) {
2534*4882a593Smuzhiyun 				bsp_priv->bgs_increment = 0;
2535*4882a593Smuzhiyun 			} else {
2536*4882a593Smuzhiyun 				if (bsp_priv->bgs_increment > RK_FEPHY_BGS_MAX) {
2537*4882a593Smuzhiyun 					dev_err(dev, "%s: error bgs increment: %d\n",
2538*4882a593Smuzhiyun 						__func__, bsp_priv->bgs_increment);
2539*4882a593Smuzhiyun 					bsp_priv->bgs_increment = RK_FEPHY_BGS_MAX;
2540*4882a593Smuzhiyun 				}
2541*4882a593Smuzhiyun 			}
2542*4882a593Smuzhiyun 
2543*4882a593Smuzhiyun 			/* Read bgs from OTP if it exists */
2544*4882a593Smuzhiyun 			cell = nvmem_cell_get(dev, "bgs");
2545*4882a593Smuzhiyun 			if (IS_ERR(cell)) {
2546*4882a593Smuzhiyun 				if (PTR_ERR(cell) != -EPROBE_DEFER)
2547*4882a593Smuzhiyun 					dev_info(dev, "failed to get bgs cell: %ld, use default\n",
2548*4882a593Smuzhiyun 						 PTR_ERR(cell));
2549*4882a593Smuzhiyun 				else
2550*4882a593Smuzhiyun 					return ERR_CAST(cell);
2551*4882a593Smuzhiyun 			} else {
2552*4882a593Smuzhiyun 				efuse_buf = nvmem_cell_read(cell, &len);
2553*4882a593Smuzhiyun 				nvmem_cell_put(cell);
2554*4882a593Smuzhiyun 				if (!IS_ERR(efuse_buf)) {
2555*4882a593Smuzhiyun 					if (len == 1)
2556*4882a593Smuzhiyun 						bsp_priv->otp_data = efuse_buf[0];
2557*4882a593Smuzhiyun 					kfree(efuse_buf);
2558*4882a593Smuzhiyun 				} else {
2559*4882a593Smuzhiyun 					dev_err(dev, "failed to get efuse buf, use default\n");
2560*4882a593Smuzhiyun 				}
2561*4882a593Smuzhiyun 			}
2562*4882a593Smuzhiyun 		}
2563*4882a593Smuzhiyun 	}
2564*4882a593Smuzhiyun 	dev_info(dev, "integrated PHY? (%s).\n",
2565*4882a593Smuzhiyun 		 bsp_priv->integrated_phy ? "yes" : "no");
2566*4882a593Smuzhiyun 
2567*4882a593Smuzhiyun 	bsp_priv->pdev = pdev;
2568*4882a593Smuzhiyun 
2569*4882a593Smuzhiyun 	return bsp_priv;
2570*4882a593Smuzhiyun }
2571*4882a593Smuzhiyun 
rk_gmac_powerup(struct rk_priv_data * bsp_priv)2572*4882a593Smuzhiyun static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
2573*4882a593Smuzhiyun {
2574*4882a593Smuzhiyun 	int ret;
2575*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2576*4882a593Smuzhiyun 
2577*4882a593Smuzhiyun 	ret = gmac_clk_enable(bsp_priv, true);
2578*4882a593Smuzhiyun 	if (ret)
2579*4882a593Smuzhiyun 		return ret;
2580*4882a593Smuzhiyun 
2581*4882a593Smuzhiyun 	/*rmii or rgmii*/
2582*4882a593Smuzhiyun 	switch (bsp_priv->phy_iface) {
2583*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII:
2584*4882a593Smuzhiyun 		dev_info(dev, "init for RGMII\n");
2585*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
2586*4882a593Smuzhiyun 			bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
2587*4882a593Smuzhiyun 						    bsp_priv->rx_delay);
2588*4882a593Smuzhiyun 		break;
2589*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII_ID:
2590*4882a593Smuzhiyun 		dev_info(dev, "init for RGMII_ID\n");
2591*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
2592*4882a593Smuzhiyun 			bsp_priv->ops->set_to_rgmii(bsp_priv, -1, -1);
2593*4882a593Smuzhiyun 		break;
2594*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII_RXID:
2595*4882a593Smuzhiyun 		dev_info(dev, "init for RGMII_RXID\n");
2596*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
2597*4882a593Smuzhiyun 			bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, -1);
2598*4882a593Smuzhiyun 		break;
2599*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII_TXID:
2600*4882a593Smuzhiyun 		dev_info(dev, "init for RGMII_TXID\n");
2601*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
2602*4882a593Smuzhiyun 			bsp_priv->ops->set_to_rgmii(bsp_priv, -1, bsp_priv->rx_delay);
2603*4882a593Smuzhiyun 		break;
2604*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RMII:
2605*4882a593Smuzhiyun 		dev_info(dev, "init for RMII\n");
2606*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_rmii)
2607*4882a593Smuzhiyun 			bsp_priv->ops->set_to_rmii(bsp_priv);
2608*4882a593Smuzhiyun 		break;
2609*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_SGMII:
2610*4882a593Smuzhiyun 		dev_info(dev, "init for SGMII\n");
2611*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_sgmii)
2612*4882a593Smuzhiyun 			bsp_priv->ops->set_to_sgmii(bsp_priv);
2613*4882a593Smuzhiyun 		break;
2614*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_QSGMII:
2615*4882a593Smuzhiyun 		dev_info(dev, "init for QSGMII\n");
2616*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_to_qsgmii)
2617*4882a593Smuzhiyun 			bsp_priv->ops->set_to_qsgmii(bsp_priv);
2618*4882a593Smuzhiyun 		break;
2619*4882a593Smuzhiyun 	default:
2620*4882a593Smuzhiyun 		dev_err(dev, "NO interface defined!\n");
2621*4882a593Smuzhiyun 	}
2622*4882a593Smuzhiyun 
2623*4882a593Smuzhiyun 	ret = rk_gmac_phy_power_on(bsp_priv, true);
2624*4882a593Smuzhiyun 	if (ret) {
2625*4882a593Smuzhiyun 		gmac_clk_enable(bsp_priv, false);
2626*4882a593Smuzhiyun 		return ret;
2627*4882a593Smuzhiyun 	}
2628*4882a593Smuzhiyun 
2629*4882a593Smuzhiyun 	pm_runtime_get_sync(dev);
2630*4882a593Smuzhiyun 
2631*4882a593Smuzhiyun 	return 0;
2632*4882a593Smuzhiyun }
2633*4882a593Smuzhiyun 
rk_gmac_powerdown(struct rk_priv_data * gmac)2634*4882a593Smuzhiyun static void rk_gmac_powerdown(struct rk_priv_data *gmac)
2635*4882a593Smuzhiyun {
2636*4882a593Smuzhiyun 	pm_runtime_put_sync(&gmac->pdev->dev);
2637*4882a593Smuzhiyun 
2638*4882a593Smuzhiyun 	rk_gmac_phy_power_on(gmac, false);
2639*4882a593Smuzhiyun 	gmac_clk_enable(gmac, false);
2640*4882a593Smuzhiyun }
2641*4882a593Smuzhiyun 
rk_fix_speed(void * priv,unsigned int speed)2642*4882a593Smuzhiyun static void rk_fix_speed(void *priv, unsigned int speed)
2643*4882a593Smuzhiyun {
2644*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = priv;
2645*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2646*4882a593Smuzhiyun 
2647*4882a593Smuzhiyun 	switch (bsp_priv->phy_iface) {
2648*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII:
2649*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII_ID:
2650*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII_RXID:
2651*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RGMII_TXID:
2652*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_rgmii_speed)
2653*4882a593Smuzhiyun 			bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
2654*4882a593Smuzhiyun 		break;
2655*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_RMII:
2656*4882a593Smuzhiyun 		if (bsp_priv->ops && bsp_priv->ops->set_rmii_speed)
2657*4882a593Smuzhiyun 			bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
2658*4882a593Smuzhiyun 		break;
2659*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_SGMII:
2660*4882a593Smuzhiyun 	case PHY_INTERFACE_MODE_QSGMII:
2661*4882a593Smuzhiyun 		break;
2662*4882a593Smuzhiyun 	default:
2663*4882a593Smuzhiyun 		dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
2664*4882a593Smuzhiyun 	}
2665*4882a593Smuzhiyun }
2666*4882a593Smuzhiyun 
rk_integrated_phy_power(void * priv,bool up)2667*4882a593Smuzhiyun static int rk_integrated_phy_power(void *priv, bool up)
2668*4882a593Smuzhiyun {
2669*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = priv;
2670*4882a593Smuzhiyun 
2671*4882a593Smuzhiyun 	if (!bsp_priv->integrated_phy || !bsp_priv->ops ||
2672*4882a593Smuzhiyun 	    !bsp_priv->ops->integrated_phy_power)
2673*4882a593Smuzhiyun 		return 0;
2674*4882a593Smuzhiyun 
2675*4882a593Smuzhiyun 	bsp_priv->ops->integrated_phy_power(bsp_priv, up);
2676*4882a593Smuzhiyun 
2677*4882a593Smuzhiyun 	return 0;
2678*4882a593Smuzhiyun }
2679*4882a593Smuzhiyun 
dwmac_rk_set_rgmii_delayline(struct stmmac_priv * priv,int tx_delay,int rx_delay)2680*4882a593Smuzhiyun void dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv,
2681*4882a593Smuzhiyun 				  int tx_delay, int rx_delay)
2682*4882a593Smuzhiyun {
2683*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
2684*4882a593Smuzhiyun 
2685*4882a593Smuzhiyun 	if (bsp_priv->ops->set_to_rgmii) {
2686*4882a593Smuzhiyun 		bsp_priv->ops->set_to_rgmii(bsp_priv, tx_delay, rx_delay);
2687*4882a593Smuzhiyun 		bsp_priv->tx_delay = tx_delay;
2688*4882a593Smuzhiyun 		bsp_priv->rx_delay = rx_delay;
2689*4882a593Smuzhiyun 	}
2690*4882a593Smuzhiyun }
2691*4882a593Smuzhiyun EXPORT_SYMBOL(dwmac_rk_set_rgmii_delayline);
2692*4882a593Smuzhiyun 
dwmac_rk_get_rgmii_delayline(struct stmmac_priv * priv,int * tx_delay,int * rx_delay)2693*4882a593Smuzhiyun void dwmac_rk_get_rgmii_delayline(struct stmmac_priv *priv,
2694*4882a593Smuzhiyun 				  int *tx_delay, int *rx_delay)
2695*4882a593Smuzhiyun {
2696*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
2697*4882a593Smuzhiyun 
2698*4882a593Smuzhiyun 	if (!bsp_priv->ops->set_to_rgmii)
2699*4882a593Smuzhiyun 		return;
2700*4882a593Smuzhiyun 
2701*4882a593Smuzhiyun 	*tx_delay = bsp_priv->tx_delay;
2702*4882a593Smuzhiyun 	*rx_delay = bsp_priv->rx_delay;
2703*4882a593Smuzhiyun }
2704*4882a593Smuzhiyun EXPORT_SYMBOL(dwmac_rk_get_rgmii_delayline);
2705*4882a593Smuzhiyun 
dwmac_rk_get_phy_interface(struct stmmac_priv * priv)2706*4882a593Smuzhiyun int dwmac_rk_get_phy_interface(struct stmmac_priv *priv)
2707*4882a593Smuzhiyun {
2708*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
2709*4882a593Smuzhiyun 
2710*4882a593Smuzhiyun 	return bsp_priv->phy_iface;
2711*4882a593Smuzhiyun }
2712*4882a593Smuzhiyun EXPORT_SYMBOL(dwmac_rk_get_phy_interface);
2713*4882a593Smuzhiyun 
rk_get_eth_addr(void * priv,unsigned char * addr)2714*4882a593Smuzhiyun static void rk_get_eth_addr(void *priv, unsigned char *addr)
2715*4882a593Smuzhiyun {
2716*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = priv;
2717*4882a593Smuzhiyun 	struct device *dev = &bsp_priv->pdev->dev;
2718*4882a593Smuzhiyun 	unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0};
2719*4882a593Smuzhiyun 	int ret, id = bsp_priv->bus_id;
2720*4882a593Smuzhiyun 
2721*4882a593Smuzhiyun 	if (is_valid_ether_addr(addr))
2722*4882a593Smuzhiyun 		goto out;
2723*4882a593Smuzhiyun 
2724*4882a593Smuzhiyun 	if (id < 0 || id >= MAX_ETH) {
2725*4882a593Smuzhiyun 		dev_err(dev, "%s: Invalid ethernet bus id %d\n", __func__, id);
2726*4882a593Smuzhiyun 		return;
2727*4882a593Smuzhiyun 	}
2728*4882a593Smuzhiyun 
2729*4882a593Smuzhiyun 	ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
2730*4882a593Smuzhiyun 	if (ret <= 0 ||
2731*4882a593Smuzhiyun 	    !is_valid_ether_addr(&ethaddr[id * ETH_ALEN])) {
2732*4882a593Smuzhiyun 		dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)\n",
2733*4882a593Smuzhiyun 			__func__, ret);
2734*4882a593Smuzhiyun 		random_ether_addr(&ethaddr[id * ETH_ALEN]);
2735*4882a593Smuzhiyun 		memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
2736*4882a593Smuzhiyun 		dev_err(dev, "%s: generate random eth mac address: %pM\n", __func__, addr);
2737*4882a593Smuzhiyun 
2738*4882a593Smuzhiyun 		ret = rk_vendor_write(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
2739*4882a593Smuzhiyun 		if (ret != 0)
2740*4882a593Smuzhiyun 			dev_err(dev, "%s: rk_vendor_write eth mac address failed (%d)\n",
2741*4882a593Smuzhiyun 				__func__, ret);
2742*4882a593Smuzhiyun 
2743*4882a593Smuzhiyun 		ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
2744*4882a593Smuzhiyun 		if (ret != ETH_ALEN * MAX_ETH)
2745*4882a593Smuzhiyun 			dev_err(dev, "%s: id: %d rk_vendor_read eth mac address failed (%d)\n",
2746*4882a593Smuzhiyun 				__func__, id, ret);
2747*4882a593Smuzhiyun 	} else {
2748*4882a593Smuzhiyun 		memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
2749*4882a593Smuzhiyun 	}
2750*4882a593Smuzhiyun 
2751*4882a593Smuzhiyun out:
2752*4882a593Smuzhiyun 	dev_err(dev, "%s: mac address: %pM\n", __func__, addr);
2753*4882a593Smuzhiyun }
2754*4882a593Smuzhiyun 
rk_gmac_probe(struct platform_device * pdev)2755*4882a593Smuzhiyun static int rk_gmac_probe(struct platform_device *pdev)
2756*4882a593Smuzhiyun {
2757*4882a593Smuzhiyun 	struct plat_stmmacenet_data *plat_dat;
2758*4882a593Smuzhiyun 	struct stmmac_resources stmmac_res;
2759*4882a593Smuzhiyun 	const struct rk_gmac_ops *data;
2760*4882a593Smuzhiyun 	int ret;
2761*4882a593Smuzhiyun 
2762*4882a593Smuzhiyun 	data = of_device_get_match_data(&pdev->dev);
2763*4882a593Smuzhiyun 	if (!data) {
2764*4882a593Smuzhiyun 		dev_err(&pdev->dev, "no of match data provided\n");
2765*4882a593Smuzhiyun 		return -EINVAL;
2766*4882a593Smuzhiyun 	}
2767*4882a593Smuzhiyun 
2768*4882a593Smuzhiyun 	ret = stmmac_get_platform_resources(pdev, &stmmac_res);
2769*4882a593Smuzhiyun 	if (ret)
2770*4882a593Smuzhiyun 		return ret;
2771*4882a593Smuzhiyun 
2772*4882a593Smuzhiyun 	plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
2773*4882a593Smuzhiyun 	if (IS_ERR(plat_dat))
2774*4882a593Smuzhiyun 		return PTR_ERR(plat_dat);
2775*4882a593Smuzhiyun 
2776*4882a593Smuzhiyun 	if (!of_device_is_compatible(pdev->dev.of_node, "snps,dwmac-4.20a"))
2777*4882a593Smuzhiyun 		plat_dat->has_gmac = true;
2778*4882a593Smuzhiyun 
2779*4882a593Smuzhiyun 	plat_dat->sph_disable = true;
2780*4882a593Smuzhiyun 	plat_dat->fix_mac_speed = rk_fix_speed;
2781*4882a593Smuzhiyun 	plat_dat->get_eth_addr = rk_get_eth_addr;
2782*4882a593Smuzhiyun 	plat_dat->integrated_phy_power = rk_integrated_phy_power;
2783*4882a593Smuzhiyun 
2784*4882a593Smuzhiyun 	plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
2785*4882a593Smuzhiyun 	if (IS_ERR(plat_dat->bsp_priv)) {
2786*4882a593Smuzhiyun 		ret = PTR_ERR(plat_dat->bsp_priv);
2787*4882a593Smuzhiyun 		goto err_remove_config_dt;
2788*4882a593Smuzhiyun 	}
2789*4882a593Smuzhiyun 
2790*4882a593Smuzhiyun 	ret = rk_gmac_clk_init(plat_dat);
2791*4882a593Smuzhiyun 	if (ret)
2792*4882a593Smuzhiyun 		goto err_remove_config_dt;
2793*4882a593Smuzhiyun 
2794*4882a593Smuzhiyun 	ret = rk_gmac_powerup(plat_dat->bsp_priv);
2795*4882a593Smuzhiyun 	if (ret)
2796*4882a593Smuzhiyun 		goto err_remove_config_dt;
2797*4882a593Smuzhiyun 
2798*4882a593Smuzhiyun 	ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
2799*4882a593Smuzhiyun 	if (ret)
2800*4882a593Smuzhiyun 		goto err_gmac_powerdown;
2801*4882a593Smuzhiyun 
2802*4882a593Smuzhiyun 	ret = dwmac_rk_create_loopback_sysfs(&pdev->dev);
2803*4882a593Smuzhiyun 	if (ret)
2804*4882a593Smuzhiyun 		goto err_gmac_powerdown;
2805*4882a593Smuzhiyun 
2806*4882a593Smuzhiyun 	return 0;
2807*4882a593Smuzhiyun 
2808*4882a593Smuzhiyun err_gmac_powerdown:
2809*4882a593Smuzhiyun 	rk_gmac_powerdown(plat_dat->bsp_priv);
2810*4882a593Smuzhiyun err_remove_config_dt:
2811*4882a593Smuzhiyun 	stmmac_remove_config_dt(pdev, plat_dat);
2812*4882a593Smuzhiyun 
2813*4882a593Smuzhiyun 	return ret;
2814*4882a593Smuzhiyun }
2815*4882a593Smuzhiyun 
rk_gmac_remove(struct platform_device * pdev)2816*4882a593Smuzhiyun static int rk_gmac_remove(struct platform_device *pdev)
2817*4882a593Smuzhiyun {
2818*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
2819*4882a593Smuzhiyun 	int ret = stmmac_dvr_remove(&pdev->dev);
2820*4882a593Smuzhiyun 
2821*4882a593Smuzhiyun 	rk_gmac_powerdown(bsp_priv);
2822*4882a593Smuzhiyun 	dwmac_rk_remove_loopback_sysfs(&pdev->dev);
2823*4882a593Smuzhiyun 
2824*4882a593Smuzhiyun 	return ret;
2825*4882a593Smuzhiyun }
2826*4882a593Smuzhiyun 
2827*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
rk_gmac_suspend(struct device * dev)2828*4882a593Smuzhiyun static int rk_gmac_suspend(struct device *dev)
2829*4882a593Smuzhiyun {
2830*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
2831*4882a593Smuzhiyun 	int ret = stmmac_suspend(dev);
2832*4882a593Smuzhiyun 
2833*4882a593Smuzhiyun 	/* Keep the PHY up if we use Wake-on-Lan. */
2834*4882a593Smuzhiyun 	if (!device_may_wakeup(dev)) {
2835*4882a593Smuzhiyun 		rk_gmac_powerdown(bsp_priv);
2836*4882a593Smuzhiyun 		bsp_priv->suspended = true;
2837*4882a593Smuzhiyun 	}
2838*4882a593Smuzhiyun 
2839*4882a593Smuzhiyun 	return ret;
2840*4882a593Smuzhiyun }
2841*4882a593Smuzhiyun 
rk_gmac_resume(struct device * dev)2842*4882a593Smuzhiyun static int rk_gmac_resume(struct device *dev)
2843*4882a593Smuzhiyun {
2844*4882a593Smuzhiyun 	struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
2845*4882a593Smuzhiyun 
2846*4882a593Smuzhiyun 	/* The PHY was up for Wake-on-Lan. */
2847*4882a593Smuzhiyun 	if (bsp_priv->suspended) {
2848*4882a593Smuzhiyun 		rk_gmac_powerup(bsp_priv);
2849*4882a593Smuzhiyun 		bsp_priv->suspended = false;
2850*4882a593Smuzhiyun 	}
2851*4882a593Smuzhiyun 
2852*4882a593Smuzhiyun 	return stmmac_resume(dev);
2853*4882a593Smuzhiyun }
2854*4882a593Smuzhiyun #endif /* CONFIG_PM_SLEEP */
2855*4882a593Smuzhiyun 
2856*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
2857*4882a593Smuzhiyun 
2858*4882a593Smuzhiyun static const struct of_device_id rk_gmac_dwmac_match[] = {
2859*4882a593Smuzhiyun #ifdef CONFIG_CPU_PX30
2860*4882a593Smuzhiyun 	{ .compatible = "rockchip,px30-gmac",	.data = &px30_ops   },
2861*4882a593Smuzhiyun #endif
2862*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK1808
2863*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk1808-gmac", .data = &rk1808_ops },
2864*4882a593Smuzhiyun #endif
2865*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK312X
2866*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
2867*4882a593Smuzhiyun #endif
2868*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK322X
2869*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
2870*4882a593Smuzhiyun #endif
2871*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3288
2872*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
2873*4882a593Smuzhiyun #endif
2874*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3308
2875*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3308-mac",  .data = &rk3308_ops },
2876*4882a593Smuzhiyun #endif
2877*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3328
2878*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
2879*4882a593Smuzhiyun #endif
2880*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3366
2881*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
2882*4882a593Smuzhiyun #endif
2883*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3368
2884*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
2885*4882a593Smuzhiyun #endif
2886*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3399
2887*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
2888*4882a593Smuzhiyun #endif
2889*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3528
2890*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops },
2891*4882a593Smuzhiyun #endif
2892*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3562
2893*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3562-gmac", .data = &rk3562_ops },
2894*4882a593Smuzhiyun #endif
2895*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3568
2896*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
2897*4882a593Smuzhiyun #endif
2898*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3588
2899*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops },
2900*4882a593Smuzhiyun #endif
2901*4882a593Smuzhiyun #ifdef CONFIG_CPU_RV1106
2902*4882a593Smuzhiyun 	{ .compatible = "rockchip,rv1106-gmac", .data = &rv1106_ops },
2903*4882a593Smuzhiyun #endif
2904*4882a593Smuzhiyun #ifdef CONFIG_CPU_RV1108
2905*4882a593Smuzhiyun 	{ .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
2906*4882a593Smuzhiyun #endif
2907*4882a593Smuzhiyun #ifdef CONFIG_CPU_RV1126
2908*4882a593Smuzhiyun 	{ .compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops },
2909*4882a593Smuzhiyun #endif
2910*4882a593Smuzhiyun 	{ }
2911*4882a593Smuzhiyun };
2912*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
2913*4882a593Smuzhiyun 
2914*4882a593Smuzhiyun static struct platform_driver rk_gmac_dwmac_driver = {
2915*4882a593Smuzhiyun 	.probe  = rk_gmac_probe,
2916*4882a593Smuzhiyun 	.remove = rk_gmac_remove,
2917*4882a593Smuzhiyun 	.driver = {
2918*4882a593Smuzhiyun 		.name           = "rk_gmac-dwmac",
2919*4882a593Smuzhiyun 		.pm		= &rk_gmac_pm_ops,
2920*4882a593Smuzhiyun 		.of_match_table = rk_gmac_dwmac_match,
2921*4882a593Smuzhiyun 	},
2922*4882a593Smuzhiyun };
2923*4882a593Smuzhiyun module_platform_driver(rk_gmac_dwmac_driver);
2924*4882a593Smuzhiyun 
2925*4882a593Smuzhiyun MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
2926*4882a593Smuzhiyun MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
2927*4882a593Smuzhiyun MODULE_LICENSE("GPL");
2928