drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
Extension
.c
Size
6342 bytes
Lines
237
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 renesas_gbeth_of_data {
	const char * const *clks;
	u8 num_clks;
	u32 stmmac_flags;
	bool handle_reset;
	bool set_clk_tx_rate;
	bool has_pcs;
};

struct renesas_gbeth {
	const struct renesas_gbeth_of_data *of_data;
	struct plat_stmmacenet_data *plat_dat;
	struct reset_control *rstc;
	struct device *dev;
};

static const char *const renesas_gbeth_clks[] = {
	"tx", "tx-180", "rx", "rx-180",
};

static const char *const renesas_gmac_clks[] = {
	"tx",
};

static int renesas_gmac_pcs_init(struct stmmac_priv *priv)
{
	struct device_node *np = priv->device->of_node;
	struct device_node *pcs_node;
	struct phylink_pcs *pcs;

	pcs_node = of_parse_phandle(np, "pcs-handle", 0);
	if (pcs_node) {
		pcs = miic_create(priv->device, pcs_node);
		of_node_put(pcs_node);
		if (IS_ERR(pcs))
			return PTR_ERR(pcs);

		priv->hw->phylink_pcs = pcs;
	}

	return 0;
}

static void renesas_gmac_pcs_exit(struct stmmac_priv *priv)
{
	if (priv->hw->phylink_pcs)
		miic_destroy(priv->hw->phylink_pcs);
}

static struct phylink_pcs *renesas_gmac_select_pcs(struct stmmac_priv *priv,
						   phy_interface_t interface)
{
	return priv->hw->phylink_pcs;
}

static int renesas_gbeth_init(struct device *dev, void *priv)
{
	struct plat_stmmacenet_data *plat_dat;
	struct renesas_gbeth *gbeth = priv;
	int ret;

	plat_dat = gbeth->plat_dat;

	ret = reset_control_deassert(gbeth->rstc);
	if (ret) {
		dev_err(gbeth->dev, "Reset deassert failed\n");
		return ret;
	}

	ret = clk_bulk_prepare_enable(plat_dat->num_clks,
				      plat_dat->clks);
	if (ret)
		reset_control_assert(gbeth->rstc);

	return ret;
}

static void renesas_gbeth_exit(struct device *dev, void *priv)
{
	struct plat_stmmacenet_data *plat_dat;
	struct renesas_gbeth *gbeth = priv;
	int ret;

	plat_dat = gbeth->plat_dat;

	clk_bulk_disable_unprepare(plat_dat->num_clks, plat_dat->clks);

	ret = reset_control_assert(gbeth->rstc);
	if (ret)
		dev_err(gbeth->dev, "Reset assert failed\n");

Annotation

Implementation Notes