Lines Matching +full:bcm2835 +full:- +full:pm +full:- +full:wdt

1 // SPDX-License-Identifier: GPL-2.0+
3 * Watchdog driver for Broadcom BCM2835
6 * branch "rpi-3.6.y" of git://github.com/raspberrypi/linux.git was used
7 * as a hardware reference for the Broadcom BCM2835 watchdog timer.
15 #include <linux/mfd/bcm2835-pm.h>
56 static bool bcm2835_wdt_is_running(struct bcm2835_wdt *wdt) in bcm2835_wdt_is_running() argument
60 cur = readl(wdt->base + PM_RSTC); in bcm2835_wdt_is_running()
67 struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); in bcm2835_wdt_start() local
71 spin_lock_irqsave(&wdt->lock, flags); in bcm2835_wdt_start()
73 writel_relaxed(PM_PASSWORD | (SECS_TO_WDOG_TICKS(wdog->timeout) & in bcm2835_wdt_start()
74 PM_WDOG_TIME_SET), wdt->base + PM_WDOG); in bcm2835_wdt_start()
75 cur = readl_relaxed(wdt->base + PM_RSTC); in bcm2835_wdt_start()
77 PM_RSTC_WRCFG_FULL_RESET, wdt->base + PM_RSTC); in bcm2835_wdt_start()
79 spin_unlock_irqrestore(&wdt->lock, flags); in bcm2835_wdt_start()
86 struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); in bcm2835_wdt_stop() local
88 writel_relaxed(PM_PASSWORD | PM_RSTC_RESET, wdt->base + PM_RSTC); in bcm2835_wdt_stop()
94 struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); in bcm2835_wdt_get_timeleft() local
96 uint32_t ret = readl_relaxed(wdt->base + PM_WDOG); in bcm2835_wdt_get_timeleft()
100 static void __bcm2835_restart(struct bcm2835_wdt *wdt) in __bcm2835_restart() argument
105 writel_relaxed(10 | PM_PASSWORD, wdt->base + PM_WDOG); in __bcm2835_restart()
106 val = readl_relaxed(wdt->base + PM_RSTC); in __bcm2835_restart()
109 writel_relaxed(val, wdt->base + PM_RSTC); in __bcm2835_restart()
118 struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); in bcm2835_restart() local
120 __bcm2835_restart(wdt); in bcm2835_restart()
136 .identity = "Broadcom BCM2835 Watchdog timer",
154 struct bcm2835_wdt *wdt = bcm2835_power_off_wdt; in bcm2835_power_off() local
162 val = readl_relaxed(wdt->base + PM_RSTS); in bcm2835_power_off()
164 writel_relaxed(val, wdt->base + PM_RSTS); in bcm2835_power_off()
167 __bcm2835_restart(wdt); in bcm2835_power_off()
172 struct bcm2835_pm *pm = dev_get_drvdata(pdev->dev.parent); in bcm2835_wdt_probe() local
173 struct device *dev = &pdev->dev; in bcm2835_wdt_probe()
174 struct bcm2835_wdt *wdt; in bcm2835_wdt_probe() local
177 wdt = devm_kzalloc(dev, sizeof(struct bcm2835_wdt), GFP_KERNEL); in bcm2835_wdt_probe()
178 if (!wdt) in bcm2835_wdt_probe()
179 return -ENOMEM; in bcm2835_wdt_probe()
181 spin_lock_init(&wdt->lock); in bcm2835_wdt_probe()
183 wdt->base = pm->base; in bcm2835_wdt_probe()
185 watchdog_set_drvdata(&bcm2835_wdt_wdd, wdt); in bcm2835_wdt_probe()
189 if (bcm2835_wdt_is_running(wdt)) { in bcm2835_wdt_probe()
208 if (of_device_is_system_power_controller(pdev->dev.parent->of_node)) { in bcm2835_wdt_probe()
211 bcm2835_power_off_wdt = wdt; in bcm2835_wdt_probe()
217 dev_info(dev, "Broadcom BCM2835 watchdog timer"); in bcm2835_wdt_probe()
231 .name = "bcm2835-wdt",
243 MODULE_ALIAS("platform:bcm2835-wdt");
245 MODULE_DESCRIPTION("Driver for Broadcom BCM2835 watchdog timer");