drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c

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

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
Extension
.c
Size
44972 bytes
Lines
1650
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 rk_clock_fields {
	/* io_clksel_cru_mask - io_clksel bit in clock GRF register which,
	 * when set, selects the tx clock from CRU.
	 */
	u16 io_clksel_cru_mask;
	/* io_clksel_io_mask - io_clksel bit in clock GRF register which,
	 * when set, selects the tx clock from IO.
	 */
	u16 io_clksel_io_mask;
	u16 gmii_clk_sel_mask;
	u16 rmii_clk_sel_mask;
	u16 rmii_gate_en_mask;
	u16 rmii_mode_mask;
	u16 mac_speed_mask;
};

struct rk_gmac_ops {
	int (*init)(struct rk_priv_data *bsp_priv);
	void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
			     int tx_delay, int rx_delay);
	void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
	int (*set_speed)(struct rk_priv_data *bsp_priv,
			 phy_interface_t interface, int speed);
	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
	void (*integrated_phy_powerdown)(struct rk_priv_data *bsp_priv);

	u16 gmac_grf_reg;
	u16 gmac_phy_intf_sel_mask;
	u16 gmac_rmii_mode_mask;

	u16 clock_grf_reg;
	struct rk_clock_fields clock;

	bool gmac_grf_reg_in_php;
	bool clock_grf_reg_in_php;
	bool supports_rgmii;
	bool supports_rmii;
	bool php_grf_required;
	bool regs_valid;
	u32 regs[];
};

static const char * const rk_clocks[] = {
	"aclk_mac", "pclk_mac", "mac_clk_tx", "clk_mac_speed",
};

static const char * const rk_rmii_clocks[] = {
	"mac_clk_rx", "clk_mac_ref", "clk_mac_refout",
};

enum rk_clocks_index {
	RK_ACLK_MAC = 0,
	RK_PCLK_MAC,
	RK_MAC_CLK_TX,
	RK_CLK_MAC_SPEED,
	RK_MAC_CLK_RX,
	RK_CLK_MAC_REF,
	RK_CLK_MAC_REFOUT,
};

struct rk_priv_data {
	struct device *dev;
	phy_interface_t phy_iface;
	int id;
	struct regulator *regulator;
	const struct rk_gmac_ops *ops;

	bool clk_enabled;
	bool clock_input;
	bool integrated_phy;
	bool supports_rgmii;
	bool supports_rmii;

	struct clk_bulk_data *clks;
	int num_clks;
	struct clk *clk_phy;

	struct reset_control *phy_reset;

	int tx_delay;
	int rx_delay;

	struct regmap *grf;
	struct regmap *php_grf;

	u16 gmac_grf_reg;
	u16 gmac_phy_intf_sel_mask;
	u16 gmac_rmii_mode_mask;

	u16 clock_grf_reg;

Annotation

Implementation Notes