drivers/net/dsa/b53/b53_mmap.c

Source file repositories/reference/linux-study-clean/drivers/net/dsa/b53/b53_mmap.c

File Facts

System
Linux kernel
Corpus path
drivers/net/dsa/b53/b53_mmap.c
Extension
.c
Size
12408 bytes
Lines
511
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 b53_phy_info {
	u32 gphy_port_mask;
	u32 ephy_enable_mask;
	u32 ephy_port_mask;
	u32 ephy_bias_bit;
	const u32 *ephy_offset;
};

struct b53_mmap_priv {
	void __iomem *regs;
	struct regmap *gpio_ctrl;
	const struct b53_phy_info *phy_info;
	u32 phys_enabled;
};

static const u32 bcm6318_ephy_offsets[] = {4, 5, 6, 7};

static const struct b53_phy_info bcm6318_ephy_info = {
	.ephy_enable_mask = BIT(0) | BIT(4) | BIT(8) | BIT(12) | BIT(16),
	.ephy_port_mask = GENMASK((ARRAY_SIZE(bcm6318_ephy_offsets) - 1), 0),
	.ephy_bias_bit = 24,
	.ephy_offset = bcm6318_ephy_offsets,
};

static const u32 bcm6368_ephy_offsets[] = {2, 3, 4, 5};

static const struct b53_phy_info bcm6368_ephy_info = {
	.ephy_enable_mask = BIT(0),
	.ephy_port_mask = GENMASK((ARRAY_SIZE(bcm6368_ephy_offsets) - 1), 0),
	.ephy_bias_bit = 0,
	.ephy_offset = bcm6368_ephy_offsets,
};

static const u32 bcm63268_ephy_offsets[] = {4, 9, 14};

static const struct b53_phy_info bcm63268_ephy_info = {
	.gphy_port_mask = BIT(3),
	.ephy_enable_mask = GENMASK(4, 0),
	.ephy_port_mask = GENMASK((ARRAY_SIZE(bcm63268_ephy_offsets) - 1), 0),
	.ephy_bias_bit = 24,
	.ephy_offset = bcm63268_ephy_offsets,
};

static int b53_mmap_read8(struct b53_device *dev, u8 page, u8 reg, u8 *val)
{
	struct b53_mmap_priv *priv = dev->priv;
	void __iomem *regs = priv->regs;

	*val = readb(regs + (page << 8) + reg);

	return 0;
}

static int b53_mmap_read16(struct b53_device *dev, u8 page, u8 reg, u16 *val)
{
	struct b53_mmap_priv *priv = dev->priv;
	void __iomem *regs = priv->regs;

	if (WARN_ON(reg % 2))
		return -EINVAL;

	if (dev->pdata && dev->pdata->big_endian)
		*val = ioread16be(regs + (page << 8) + reg);
	else
		*val = readw(regs + (page << 8) + reg);

	return 0;
}

static int b53_mmap_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val)
{
	struct b53_mmap_priv *priv = dev->priv;
	void __iomem *regs = priv->regs;

	if (WARN_ON(reg % 4))
		return -EINVAL;

	if (dev->pdata && dev->pdata->big_endian)
		*val = ioread32be(regs + (page << 8) + reg);
	else
		*val = readl(regs + (page << 8) + reg);

	return 0;
}

static int b53_mmap_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val)
{
	struct b53_mmap_priv *priv = dev->priv;
	void __iomem *regs = priv->regs;

Annotation

Implementation Notes