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(ðaddr[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(ðaddr[id * ETH_ALEN]);
2735*4882a593Smuzhiyun memcpy(addr, ðaddr[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, ðaddr[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