drivers/net/phy/realtek/realtek_main.c

Source file repositories/reference/linux-study-clean/drivers/net/phy/realtek/realtek_main.c

File Facts

System
Linux kernel
Corpus path
drivers/net/phy/realtek/realtek_main.c
Extension
.c
Size
78685 bytes
Lines
3015
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct rtl821x_priv {
	bool enable_aldps;
	bool disable_clk_out;
	bool enable_clkout_ssc;
	bool enable_rxc_ssc;
	bool enable_sysclk_ssc;
	struct clk *clk;
	/* rtl8211f */
	u16 iner;
};

static int rtl821x_read_page(struct phy_device *phydev)
{
	return __phy_read(phydev, RTL821x_PAGE_SELECT);
}

static int rtl821x_write_page(struct phy_device *phydev, int page)
{
	return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
}

static int rtl821x_read_ext_page(struct phy_device *phydev, u16 ext_page,
				 u32 regnum)
{
	int oldpage, ret = 0;

	oldpage = phy_select_page(phydev, RTL821x_SET_EXT_PAGE);
	if (oldpage >= 0) {
		ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, ext_page);
		if (ret == 0)
			ret = __phy_read(phydev, regnum);
	}

	return phy_restore_page(phydev, oldpage, ret);
}

static int rtl821x_modify_ext_page(struct phy_device *phydev, u16 ext_page,
				   u32 regnum, u16 mask, u16 set)
{
	int oldpage, ret = 0;

	oldpage = phy_select_page(phydev, RTL821x_SET_EXT_PAGE);
	if (oldpage >= 0) {
		ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, ext_page);
		if (ret == 0)
			ret = __phy_modify(phydev, regnum, mask, set);
	}

	return phy_restore_page(phydev, oldpage, ret);
}

static int rtl821x_probe(struct phy_device *phydev)
{
	struct device *dev = &phydev->mdio.dev;
	struct rtl821x_priv *priv;

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->clk = devm_clk_get_optional_enabled(dev, NULL);
	if (IS_ERR(priv->clk))
		return dev_err_probe(dev, PTR_ERR(priv->clk),
				     "failed to get phy clock\n");

	priv->enable_aldps = of_property_read_bool(dev->of_node,
						   "realtek,aldps-enable");
	priv->disable_clk_out = of_property_read_bool(dev->of_node,
						      "realtek,clkout-disable");
	priv->enable_clkout_ssc = of_property_read_bool(dev->of_node,
							"realtek,clkout-ssc-enable");
	priv->enable_rxc_ssc = of_property_read_bool(dev->of_node,
						     "realtek,rxc-ssc-enable");
	priv->enable_sysclk_ssc = of_property_read_bool(dev->of_node,
							"realtek,sysclk-ssc-enable");

	phydev->priv = priv;

	return 0;
}

static int rtl8211f_probe(struct phy_device *phydev)
{
	struct device *dev = &phydev->mdio.dev;
	int ret;

	ret = rtl821x_probe(phydev);
	if (ret < 0)
		return ret;

Annotation

Implementation Notes