drivers/watchdog/keembay_wdt.c
Source file repositories/reference/linux-study-clean/drivers/watchdog/keembay_wdt.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/watchdog/keembay_wdt.c- Extension
.c- Size
- 7761 bytes
- Lines
- 297
- Domain
- Driver Families
- Bucket
- drivers/watchdog
- 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.
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/arm-smccc.hlinux/bits.hlinux/clk.hlinux/interrupt.hlinux/io.hlinux/limits.hlinux/module.hlinux/mod_devicetable.hlinux/platform_device.hlinux/reboot.hlinux/watchdog.h
Detected Declarations
struct keembay_wdtfunction keembay_wdt_readlfunction keembay_wdt_writelfunction keembay_wdt_set_timeout_regfunction keembay_wdt_set_pretimeout_regfunction keembay_wdt_startfunction keembay_wdt_stopfunction keembay_wdt_pingfunction keembay_wdt_set_timeoutfunction keembay_wdt_set_pretimeoutfunction keembay_wdt_get_timeleftfunction keembay_wdt_to_isrfunction keembay_wdt_th_isrfunction keembay_wdt_probefunction keembay_wdt_suspendfunction keembay_wdt_resume
Annotated Snippet
struct keembay_wdt {
struct watchdog_device wdd;
struct clk *clk;
unsigned int rate;
int to_irq;
int th_irq;
void __iomem *base;
};
static inline u32 keembay_wdt_readl(struct keembay_wdt *wdt, u32 offset)
{
return readl(wdt->base + offset);
}
static inline void keembay_wdt_writel(struct keembay_wdt *wdt, u32 offset, u32 val)
{
writel(WDT_UNLOCK, wdt->base + TIM_SAFE);
writel(val, wdt->base + offset);
}
static void keembay_wdt_set_timeout_reg(struct watchdog_device *wdog)
{
struct keembay_wdt *wdt = watchdog_get_drvdata(wdog);
keembay_wdt_writel(wdt, TIM_WATCHDOG, wdog->timeout * wdt->rate);
}
static void keembay_wdt_set_pretimeout_reg(struct watchdog_device *wdog)
{
struct keembay_wdt *wdt = watchdog_get_drvdata(wdog);
u32 th_val = 0;
if (wdog->pretimeout)
th_val = wdog->timeout - wdog->pretimeout;
keembay_wdt_writel(wdt, TIM_WATCHDOG_INT_THRES, th_val * wdt->rate);
}
static int keembay_wdt_start(struct watchdog_device *wdog)
{
struct keembay_wdt *wdt = watchdog_get_drvdata(wdog);
keembay_wdt_writel(wdt, TIM_WDOG_EN, WDT_ENABLE);
return 0;
}
static int keembay_wdt_stop(struct watchdog_device *wdog)
{
struct keembay_wdt *wdt = watchdog_get_drvdata(wdog);
keembay_wdt_writel(wdt, TIM_WDOG_EN, WDT_DISABLE);
return 0;
}
static int keembay_wdt_ping(struct watchdog_device *wdog)
{
keembay_wdt_set_timeout_reg(wdog);
return 0;
}
static int keembay_wdt_set_timeout(struct watchdog_device *wdog, u32 t)
{
wdog->timeout = t;
keembay_wdt_set_timeout_reg(wdog);
keembay_wdt_set_pretimeout_reg(wdog);
return 0;
}
static int keembay_wdt_set_pretimeout(struct watchdog_device *wdog, u32 t)
{
if (t > wdog->timeout)
return -EINVAL;
wdog->pretimeout = t;
keembay_wdt_set_pretimeout_reg(wdog);
return 0;
}
static unsigned int keembay_wdt_get_timeleft(struct watchdog_device *wdog)
{
struct keembay_wdt *wdt = watchdog_get_drvdata(wdog);
return keembay_wdt_readl(wdt, TIM_WATCHDOG) / wdt->rate;
}
Annotation
- Immediate include surface: `linux/arm-smccc.h`, `linux/bits.h`, `linux/clk.h`, `linux/interrupt.h`, `linux/io.h`, `linux/limits.h`, `linux/module.h`, `linux/mod_devicetable.h`.
- Detected declarations: `struct keembay_wdt`, `function keembay_wdt_readl`, `function keembay_wdt_writel`, `function keembay_wdt_set_timeout_reg`, `function keembay_wdt_set_pretimeout_reg`, `function keembay_wdt_start`, `function keembay_wdt_stop`, `function keembay_wdt_ping`, `function keembay_wdt_set_timeout`, `function keembay_wdt_set_pretimeout`.
- Atlas domain: Driver Families / drivers/watchdog.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.