drivers/clk/bcm/clk-bcm63268-timer.c

Source file repositories/reference/linux-study-clean/drivers/clk/bcm/clk-bcm63268-timer.c

File Facts

System
Linux kernel
Corpus path
drivers/clk/bcm/clk-bcm63268-timer.c
Extension
.c
Size
5170 bytes
Lines
217
Domain
Driver Families
Bucket
drivers/clk
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 bcm63268_tclkrst_hw {
	void __iomem *regs;
	spinlock_t lock;

	struct reset_controller_dev rcdev;
	struct clk_hw_onecell_data data;
};

struct bcm63268_tclk_table_entry {
	const char * const name;
	u8 bit;
};

static const struct bcm63268_tclk_table_entry bcm63268_timer_clocks[] = {
	{
		.name = "ephy1",
		.bit = BCM63268_TCLK_EPHY1,
	}, {
		.name = "ephy2",
		.bit = BCM63268_TCLK_EPHY2,
	}, {
		.name = "ephy3",
		.bit = BCM63268_TCLK_EPHY3,
	}, {
		.name = "gphy1",
		.bit = BCM63268_TCLK_GPHY1,
	}, {
		.name = "dsl",
		.bit = BCM63268_TCLK_DSL,
	}, {
		.name = "wakeon_ephy",
		.bit = BCM63268_TCLK_WAKEON_EPHY,
	}, {
		.name = "wakeon_dsl",
		.bit = BCM63268_TCLK_WAKEON_DSL,
	}, {
		.name = "fap1_pll",
		.bit = BCM63268_TCLK_FAP1,
	}, {
		.name = "fap2_pll",
		.bit = BCM63268_TCLK_FAP2,
	}, {
		.name = "uto_50",
		.bit = BCM63268_TCLK_UTO_50,
	}, {
		.name = "uto_extin",
		.bit = BCM63268_TCLK_UTO_EXTIN,
	}, {
		.name = "usb_ref",
		.bit = BCM63268_TCLK_USB_REF,
	}, {
		/* sentinel */
	}
};

static inline struct bcm63268_tclkrst_hw *
to_bcm63268_timer_reset(struct reset_controller_dev *rcdev)
{
	return container_of(rcdev, struct bcm63268_tclkrst_hw, rcdev);
}

static int bcm63268_timer_reset_update(struct reset_controller_dev *rcdev,
				unsigned long id, bool assert)
{
	struct bcm63268_tclkrst_hw *reset = to_bcm63268_timer_reset(rcdev);
	unsigned long flags;
	uint32_t val;

	spin_lock_irqsave(&reset->lock, flags);
	val = __raw_readl(reset->regs);
	if (assert)
		val &= ~BIT(id);
	else
		val |= BIT(id);
	__raw_writel(val, reset->regs);
	spin_unlock_irqrestore(&reset->lock, flags);

	return 0;
}

static int bcm63268_timer_reset_assert(struct reset_controller_dev *rcdev,
				unsigned long id)
{
	return bcm63268_timer_reset_update(rcdev, id, true);
}

static int bcm63268_timer_reset_deassert(struct reset_controller_dev *rcdev,
				  unsigned long id)
{
	return bcm63268_timer_reset_update(rcdev, id, false);

Annotation

Implementation Notes