Linux Audio

Check our new training course

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