Commit bb726b75 authored by Clark Wang's avatar Clark Wang Committed by David S. Miller
Browse files

net: phy: realtek: add support for RTL8211F(D)(I)-VD-CG



RTL8211F(D)(I)-VD-CG is the pin-to-pin upgrade chip from
RTL8211F(D)(I)-CG.

Add new PHY ID for this chip.
It does not support RTL8211F_PHYCR2 anymore, so remove the w/r operation
of this register.

Signed-off-by: default avatarClark Wang <xiaoning.wang@nxp.com>
Signed-off-by: default avatarWei Fang <wei.fang@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent de437089
Loading
Loading
Loading
Loading
+32 −12
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@
#define RTLGEN_SPEED_MASK			0x0630

#define RTL_GENERIC_PHYID			0x001cc800
#define RTL_8211FVD_PHYID			0x001cc878

MODULE_DESCRIPTION("Realtek PHY driver");
MODULE_AUTHOR("Johnson Leung");
@@ -78,6 +79,7 @@ MODULE_LICENSE("GPL");
struct rtl821x_priv {
	u16 phycr1;
	u16 phycr2;
	bool has_phycr2;
};

static int rtl821x_read_page(struct phy_device *phydev)
@@ -94,6 +96,7 @@ static int rtl821x_probe(struct phy_device *phydev)
{
	struct device *dev = &phydev->mdio.dev;
	struct rtl821x_priv *priv;
	u32 phy_id = phydev->drv->phy_id;
	int ret;

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -108,6 +111,8 @@ static int rtl821x_probe(struct phy_device *phydev)
	if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
		priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;

	priv->has_phycr2 = !(phy_id == RTL_8211FVD_PHYID);
	if (priv->has_phycr2) {
		ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
		if (ret < 0)
			return ret;
@@ -115,6 +120,7 @@ static int rtl821x_probe(struct phy_device *phydev)
		priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
		if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
			priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
	}

	phydev->priv = priv;

@@ -400,6 +406,7 @@ static int rtl8211f_config_init(struct phy_device *phydev)
			val_rxdly ? "enabled" : "disabled");
	}

	if (priv->has_phycr2) {
		ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
				       RTL8211F_CLKOUT_EN, priv->phycr2);
		if (ret < 0) {
@@ -407,6 +414,7 @@ static int rtl8211f_config_init(struct phy_device *phydev)
				ERR_PTR(ret));
			return ret;
		}
	}

	return genphy_soft_reset(phydev);
}
@@ -923,6 +931,18 @@ static struct phy_driver realtek_drvs[] = {
		.resume		= rtl821x_resume,
		.read_page	= rtl821x_read_page,
		.write_page	= rtl821x_write_page,
	}, {
		PHY_ID_MATCH_EXACT(RTL_8211FVD_PHYID),
		.name		= "RTL8211F-VD Gigabit Ethernet",
		.probe		= rtl821x_probe,
		.config_init	= &rtl8211f_config_init,
		.read_status	= rtlgen_read_status,
		.config_intr	= &rtl8211f_config_intr,
		.handle_interrupt = rtl8211f_handle_interrupt,
		.suspend	= genphy_suspend,
		.resume		= rtl821x_resume,
		.read_page	= rtl821x_read_page,
		.write_page	= rtl821x_write_page,
	}, {
		.name		= "Generic FE-GE Realtek PHY",
		.match_phy_device = rtlgen_match_phy_device,