1 // SPDX-License-Identifier: GPL-2.0-only
3 * drivers/watchdog/orion_wdt.c
5 * Watchdog driver for Orion/Kirkwood processors
7 * Author: Sylver Bruneau <sylver.bruneau@googlemail.com>
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13 #include <linux/module.h>
14 #include <linux/moduleparam.h>
15 #include <linux/types.h>
16 #include <linux/kernel.h>
17 #include <linux/platform_device.h>
18 #include <linux/watchdog.h>
19 #include <linux/interrupt.h>
21 #include <linux/clk.h>
22 #include <linux/err.h>
24 #include <linux/of_device.h>
26 /* RSTOUT mask register physical address for Orion5x, Kirkwood and Dove */
27 #define ORION_RSTOUT_MASK_OFFSET 0x20108
29 /* Internal registers can be configured at any 1 MiB aligned address */
30 #define INTERNAL_REGS_MASK ~(SZ_1M - 1)
33 * Watchdog timer block registers.
35 #define TIMER_CTRL 0x0000
36 #define TIMER1_FIXED_ENABLE_BIT BIT(12)
37 #define WDT_AXP_FIXED_ENABLE_BIT BIT(10)
38 #define TIMER1_ENABLE_BIT BIT(2)
40 #define TIMER_A370_STATUS 0x0004
41 #define WDT_A370_EXPIRED BIT(31)
42 #define TIMER1_STATUS_BIT BIT(8)
44 #define TIMER1_VAL_OFF 0x001c
46 #define WDT_MAX_CYCLE_COUNT 0xffffffff
48 #define WDT_A370_RATIO_MASK(v) ((v) << 16)
49 #define WDT_A370_RATIO_SHIFT 5
50 #define WDT_A370_RATIO (1 << WDT_A370_RATIO_SHIFT)
52 static bool nowayout
= WATCHDOG_NOWAYOUT
;
53 static int heartbeat
; /* module parameter (seconds) */
55 struct orion_watchdog
;
57 struct orion_watchdog_data
{
58 int wdt_counter_offset
;
60 int rstout_enable_bit
;
62 int (*clock_init
)(struct platform_device
*,
63 struct orion_watchdog
*);
64 int (*enabled
)(struct orion_watchdog
*);
65 int (*start
)(struct watchdog_device
*);
66 int (*stop
)(struct watchdog_device
*);
69 struct orion_watchdog
{
70 struct watchdog_device wdt
;
73 void __iomem
*rstout_mask
;
74 unsigned long clk_rate
;
76 const struct orion_watchdog_data
*data
;
79 static int orion_wdt_clock_init(struct platform_device
*pdev
,
80 struct orion_watchdog
*dev
)
84 dev
->clk
= clk_get(&pdev
->dev
, NULL
);
86 return PTR_ERR(dev
->clk
);
87 ret
= clk_prepare_enable(dev
->clk
);
93 dev
->clk_rate
= clk_get_rate(dev
->clk
);
97 static int armada370_wdt_clock_init(struct platform_device
*pdev
,
98 struct orion_watchdog
*dev
)
102 dev
->clk
= clk_get(&pdev
->dev
, NULL
);
103 if (IS_ERR(dev
->clk
))
104 return PTR_ERR(dev
->clk
);
105 ret
= clk_prepare_enable(dev
->clk
);
111 /* Setup watchdog input clock */
112 atomic_io_modify(dev
->reg
+ TIMER_CTRL
,
113 WDT_A370_RATIO_MASK(WDT_A370_RATIO_SHIFT
),
114 WDT_A370_RATIO_MASK(WDT_A370_RATIO_SHIFT
));
116 dev
->clk_rate
= clk_get_rate(dev
->clk
) / WDT_A370_RATIO
;
120 static int armada375_wdt_clock_init(struct platform_device
*pdev
,
121 struct orion_watchdog
*dev
)
125 dev
->clk
= of_clk_get_by_name(pdev
->dev
.of_node
, "fixed");
126 if (!IS_ERR(dev
->clk
)) {
127 ret
= clk_prepare_enable(dev
->clk
);
133 atomic_io_modify(dev
->reg
+ TIMER_CTRL
,
134 WDT_AXP_FIXED_ENABLE_BIT
,
135 WDT_AXP_FIXED_ENABLE_BIT
);
136 dev
->clk_rate
= clk_get_rate(dev
->clk
);
141 /* Mandatory fallback for proper devicetree backward compatibility */
142 dev
->clk
= clk_get(&pdev
->dev
, NULL
);
143 if (IS_ERR(dev
->clk
))
144 return PTR_ERR(dev
->clk
);
146 ret
= clk_prepare_enable(dev
->clk
);
152 atomic_io_modify(dev
->reg
+ TIMER_CTRL
,
153 WDT_A370_RATIO_MASK(WDT_A370_RATIO_SHIFT
),
154 WDT_A370_RATIO_MASK(WDT_A370_RATIO_SHIFT
));
155 dev
->clk_rate
= clk_get_rate(dev
->clk
) / WDT_A370_RATIO
;
160 static int armadaxp_wdt_clock_init(struct platform_device
*pdev
,
161 struct orion_watchdog
*dev
)
166 dev
->clk
= of_clk_get_by_name(pdev
->dev
.of_node
, "fixed");
167 if (IS_ERR(dev
->clk
))
168 return PTR_ERR(dev
->clk
);
169 ret
= clk_prepare_enable(dev
->clk
);
175 /* Fix the wdt and timer1 clock frequency to 25MHz */
176 val
= WDT_AXP_FIXED_ENABLE_BIT
| TIMER1_FIXED_ENABLE_BIT
;
177 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, val
, val
);
179 dev
->clk_rate
= clk_get_rate(dev
->clk
);
183 static int orion_wdt_ping(struct watchdog_device
*wdt_dev
)
185 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
186 /* Reload watchdog duration */
187 writel(dev
->clk_rate
* wdt_dev
->timeout
,
188 dev
->reg
+ dev
->data
->wdt_counter_offset
);
189 if (dev
->wdt
.info
->options
& WDIOF_PRETIMEOUT
)
190 writel(dev
->clk_rate
* (wdt_dev
->timeout
- wdt_dev
->pretimeout
),
191 dev
->reg
+ TIMER1_VAL_OFF
);
196 static int armada375_start(struct watchdog_device
*wdt_dev
)
198 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
201 /* Set watchdog duration */
202 writel(dev
->clk_rate
* wdt_dev
->timeout
,
203 dev
->reg
+ dev
->data
->wdt_counter_offset
);
204 if (dev
->wdt
.info
->options
& WDIOF_PRETIMEOUT
)
205 writel(dev
->clk_rate
* (wdt_dev
->timeout
- wdt_dev
->pretimeout
),
206 dev
->reg
+ TIMER1_VAL_OFF
);
208 /* Clear the watchdog expiration bit */
209 atomic_io_modify(dev
->reg
+ TIMER_A370_STATUS
, WDT_A370_EXPIRED
, 0);
211 /* Enable watchdog timer */
212 reg
= dev
->data
->wdt_enable_bit
;
213 if (dev
->wdt
.info
->options
& WDIOF_PRETIMEOUT
)
214 reg
|= TIMER1_ENABLE_BIT
;
215 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, reg
, reg
);
217 /* Enable reset on watchdog */
218 reg
= readl(dev
->rstout
);
219 reg
|= dev
->data
->rstout_enable_bit
;
220 writel(reg
, dev
->rstout
);
222 atomic_io_modify(dev
->rstout_mask
, dev
->data
->rstout_mask_bit
, 0);
226 static int armada370_start(struct watchdog_device
*wdt_dev
)
228 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
231 /* Set watchdog duration */
232 writel(dev
->clk_rate
* wdt_dev
->timeout
,
233 dev
->reg
+ dev
->data
->wdt_counter_offset
);
235 /* Clear the watchdog expiration bit */
236 atomic_io_modify(dev
->reg
+ TIMER_A370_STATUS
, WDT_A370_EXPIRED
, 0);
238 /* Enable watchdog timer */
239 reg
= dev
->data
->wdt_enable_bit
;
240 if (dev
->wdt
.info
->options
& WDIOF_PRETIMEOUT
)
241 reg
|= TIMER1_ENABLE_BIT
;
242 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, reg
, reg
);
244 /* Enable reset on watchdog */
245 reg
= readl(dev
->rstout
);
246 reg
|= dev
->data
->rstout_enable_bit
;
247 writel(reg
, dev
->rstout
);
251 static int orion_start(struct watchdog_device
*wdt_dev
)
253 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
255 /* Set watchdog duration */
256 writel(dev
->clk_rate
* wdt_dev
->timeout
,
257 dev
->reg
+ dev
->data
->wdt_counter_offset
);
259 /* Enable watchdog timer */
260 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, dev
->data
->wdt_enable_bit
,
261 dev
->data
->wdt_enable_bit
);
263 /* Enable reset on watchdog */
264 atomic_io_modify(dev
->rstout
, dev
->data
->rstout_enable_bit
,
265 dev
->data
->rstout_enable_bit
);
270 static int orion_wdt_start(struct watchdog_device
*wdt_dev
)
272 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
274 /* There are some per-SoC quirks to handle */
275 return dev
->data
->start(wdt_dev
);
278 static int orion_stop(struct watchdog_device
*wdt_dev
)
280 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
282 /* Disable reset on watchdog */
283 atomic_io_modify(dev
->rstout
, dev
->data
->rstout_enable_bit
, 0);
285 /* Disable watchdog timer */
286 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, dev
->data
->wdt_enable_bit
, 0);
291 static int armada375_stop(struct watchdog_device
*wdt_dev
)
293 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
296 /* Disable reset on watchdog */
297 atomic_io_modify(dev
->rstout_mask
, dev
->data
->rstout_mask_bit
,
298 dev
->data
->rstout_mask_bit
);
299 reg
= readl(dev
->rstout
);
300 reg
&= ~dev
->data
->rstout_enable_bit
;
301 writel(reg
, dev
->rstout
);
303 /* Disable watchdog timer */
304 mask
= dev
->data
->wdt_enable_bit
;
305 if (wdt_dev
->info
->options
& WDIOF_PRETIMEOUT
)
306 mask
|= TIMER1_ENABLE_BIT
;
307 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, mask
, 0);
312 static int armada370_stop(struct watchdog_device
*wdt_dev
)
314 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
317 /* Disable reset on watchdog */
318 reg
= readl(dev
->rstout
);
319 reg
&= ~dev
->data
->rstout_enable_bit
;
320 writel(reg
, dev
->rstout
);
322 /* Disable watchdog timer */
323 mask
= dev
->data
->wdt_enable_bit
;
324 if (wdt_dev
->info
->options
& WDIOF_PRETIMEOUT
)
325 mask
|= TIMER1_ENABLE_BIT
;
326 atomic_io_modify(dev
->reg
+ TIMER_CTRL
, mask
, 0);
331 static int orion_wdt_stop(struct watchdog_device
*wdt_dev
)
333 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
335 return dev
->data
->stop(wdt_dev
);
338 static int orion_enabled(struct orion_watchdog
*dev
)
340 bool enabled
, running
;
342 enabled
= readl(dev
->rstout
) & dev
->data
->rstout_enable_bit
;
343 running
= readl(dev
->reg
+ TIMER_CTRL
) & dev
->data
->wdt_enable_bit
;
345 return enabled
&& running
;
348 static int armada375_enabled(struct orion_watchdog
*dev
)
350 bool masked
, enabled
, running
;
352 masked
= readl(dev
->rstout_mask
) & dev
->data
->rstout_mask_bit
;
353 enabled
= readl(dev
->rstout
) & dev
->data
->rstout_enable_bit
;
354 running
= readl(dev
->reg
+ TIMER_CTRL
) & dev
->data
->wdt_enable_bit
;
356 return !masked
&& enabled
&& running
;
359 static int orion_wdt_enabled(struct watchdog_device
*wdt_dev
)
361 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
363 return dev
->data
->enabled(dev
);
366 static unsigned int orion_wdt_get_timeleft(struct watchdog_device
*wdt_dev
)
368 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
369 return readl(dev
->reg
+ dev
->data
->wdt_counter_offset
) / dev
->clk_rate
;
372 static struct watchdog_info orion_wdt_info
= {
373 .options
= WDIOF_SETTIMEOUT
| WDIOF_KEEPALIVEPING
| WDIOF_MAGICCLOSE
,
374 .identity
= "Orion Watchdog",
377 static const struct watchdog_ops orion_wdt_ops
= {
378 .owner
= THIS_MODULE
,
379 .start
= orion_wdt_start
,
380 .stop
= orion_wdt_stop
,
381 .ping
= orion_wdt_ping
,
382 .get_timeleft
= orion_wdt_get_timeleft
,
385 static irqreturn_t
orion_wdt_irq(int irq
, void *devid
)
387 panic("Watchdog Timeout");
391 static irqreturn_t
orion_wdt_pre_irq(int irq
, void *devid
)
393 struct orion_watchdog
*dev
= devid
;
395 atomic_io_modify(dev
->reg
+ TIMER_A370_STATUS
,
396 TIMER1_STATUS_BIT
, 0);
397 watchdog_notify_pretimeout(&dev
->wdt
);
402 * The original devicetree binding for this driver specified only
403 * one memory resource, so in order to keep DT backwards compatibility
404 * we try to fallback to a hardcoded register address, if the resource
405 * is missing from the devicetree.
407 static void __iomem
*orion_wdt_ioremap_rstout(struct platform_device
*pdev
,
408 phys_addr_t internal_regs
)
410 struct resource
*res
;
413 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
415 return devm_ioremap(&pdev
->dev
, res
->start
,
418 rstout
= internal_regs
+ ORION_RSTOUT_MASK_OFFSET
;
420 WARN(1, FW_BUG
"falling back to hardcoded RSTOUT reg %pa\n", &rstout
);
421 return devm_ioremap(&pdev
->dev
, rstout
, 0x4);
424 static const struct orion_watchdog_data orion_data
= {
425 .rstout_enable_bit
= BIT(1),
426 .wdt_enable_bit
= BIT(4),
427 .wdt_counter_offset
= 0x24,
428 .clock_init
= orion_wdt_clock_init
,
429 .enabled
= orion_enabled
,
430 .start
= orion_start
,
434 static const struct orion_watchdog_data armada370_data
= {
435 .rstout_enable_bit
= BIT(8),
436 .wdt_enable_bit
= BIT(8),
437 .wdt_counter_offset
= 0x34,
438 .clock_init
= armada370_wdt_clock_init
,
439 .enabled
= orion_enabled
,
440 .start
= armada370_start
,
441 .stop
= armada370_stop
,
444 static const struct orion_watchdog_data armadaxp_data
= {
445 .rstout_enable_bit
= BIT(8),
446 .wdt_enable_bit
= BIT(8),
447 .wdt_counter_offset
= 0x34,
448 .clock_init
= armadaxp_wdt_clock_init
,
449 .enabled
= orion_enabled
,
450 .start
= armada370_start
,
451 .stop
= armada370_stop
,
454 static const struct orion_watchdog_data armada375_data
= {
455 .rstout_enable_bit
= BIT(8),
456 .rstout_mask_bit
= BIT(10),
457 .wdt_enable_bit
= BIT(8),
458 .wdt_counter_offset
= 0x34,
459 .clock_init
= armada375_wdt_clock_init
,
460 .enabled
= armada375_enabled
,
461 .start
= armada375_start
,
462 .stop
= armada375_stop
,
465 static const struct orion_watchdog_data armada380_data
= {
466 .rstout_enable_bit
= BIT(8),
467 .rstout_mask_bit
= BIT(10),
468 .wdt_enable_bit
= BIT(8),
469 .wdt_counter_offset
= 0x34,
470 .clock_init
= armadaxp_wdt_clock_init
,
471 .enabled
= armada375_enabled
,
472 .start
= armada375_start
,
473 .stop
= armada375_stop
,
476 static const struct of_device_id orion_wdt_of_match_table
[] = {
478 .compatible
= "marvell,orion-wdt",
482 .compatible
= "marvell,armada-370-wdt",
483 .data
= &armada370_data
,
486 .compatible
= "marvell,armada-xp-wdt",
487 .data
= &armadaxp_data
,
490 .compatible
= "marvell,armada-375-wdt",
491 .data
= &armada375_data
,
494 .compatible
= "marvell,armada-380-wdt",
495 .data
= &armada380_data
,
499 MODULE_DEVICE_TABLE(of
, orion_wdt_of_match_table
);
501 static int orion_wdt_get_regs(struct platform_device
*pdev
,
502 struct orion_watchdog
*dev
)
504 struct device_node
*node
= pdev
->dev
.of_node
;
505 struct resource
*res
;
507 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
510 dev
->reg
= devm_ioremap(&pdev
->dev
, res
->start
,
515 /* Each supported compatible has some RSTOUT register quirk */
516 if (of_device_is_compatible(node
, "marvell,orion-wdt")) {
518 dev
->rstout
= orion_wdt_ioremap_rstout(pdev
, res
->start
&
523 } else if (of_device_is_compatible(node
, "marvell,armada-370-wdt") ||
524 of_device_is_compatible(node
, "marvell,armada-xp-wdt")) {
526 /* Dedicated RSTOUT register, can be requested. */
527 dev
->rstout
= devm_platform_ioremap_resource(pdev
, 1);
528 if (IS_ERR(dev
->rstout
))
529 return PTR_ERR(dev
->rstout
);
531 } else if (of_device_is_compatible(node
, "marvell,armada-375-wdt") ||
532 of_device_is_compatible(node
, "marvell,armada-380-wdt")) {
534 /* Dedicated RSTOUT register, can be requested. */
535 dev
->rstout
= devm_platform_ioremap_resource(pdev
, 1);
536 if (IS_ERR(dev
->rstout
))
537 return PTR_ERR(dev
->rstout
);
539 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 2);
542 dev
->rstout_mask
= devm_ioremap(&pdev
->dev
, res
->start
,
544 if (!dev
->rstout_mask
)
554 static int orion_wdt_probe(struct platform_device
*pdev
)
556 struct orion_watchdog
*dev
;
557 const struct of_device_id
*match
;
558 unsigned int wdt_max_duration
; /* (seconds) */
561 dev
= devm_kzalloc(&pdev
->dev
, sizeof(struct orion_watchdog
),
566 match
= of_match_device(orion_wdt_of_match_table
, &pdev
->dev
);
568 /* Default legacy match */
569 match
= &orion_wdt_of_match_table
[0];
571 dev
->wdt
.info
= &orion_wdt_info
;
572 dev
->wdt
.ops
= &orion_wdt_ops
;
573 dev
->wdt
.min_timeout
= 1;
574 dev
->data
= match
->data
;
576 ret
= orion_wdt_get_regs(pdev
, dev
);
580 ret
= dev
->data
->clock_init(pdev
, dev
);
582 dev_err(&pdev
->dev
, "cannot initialize clock\n");
586 wdt_max_duration
= WDT_MAX_CYCLE_COUNT
/ dev
->clk_rate
;
588 dev
->wdt
.timeout
= wdt_max_duration
;
589 dev
->wdt
.max_timeout
= wdt_max_duration
;
590 dev
->wdt
.parent
= &pdev
->dev
;
591 watchdog_init_timeout(&dev
->wdt
, heartbeat
, &pdev
->dev
);
593 platform_set_drvdata(pdev
, &dev
->wdt
);
594 watchdog_set_drvdata(&dev
->wdt
, dev
);
597 * Let's make sure the watchdog is fully stopped, unless it's
598 * explicitly enabled. This may be the case if the module was
599 * removed and re-inserted, or if the bootloader explicitly
600 * set a running watchdog before booting the kernel.
602 if (!orion_wdt_enabled(&dev
->wdt
))
603 orion_wdt_stop(&dev
->wdt
);
605 set_bit(WDOG_HW_RUNNING
, &dev
->wdt
.status
);
607 /* Request the IRQ only after the watchdog is disabled */
608 irq
= platform_get_irq_optional(pdev
, 0);
611 * Not all supported platforms specify an interrupt for the
612 * watchdog, so let's make it optional.
614 ret
= devm_request_irq(&pdev
->dev
, irq
, orion_wdt_irq
, 0,
617 dev_err(&pdev
->dev
, "failed to request IRQ\n");
622 /* Optional 2nd interrupt for pretimeout */
623 irq
= platform_get_irq_optional(pdev
, 1);
625 orion_wdt_info
.options
|= WDIOF_PRETIMEOUT
;
626 ret
= devm_request_irq(&pdev
->dev
, irq
, orion_wdt_pre_irq
,
629 dev_err(&pdev
->dev
, "failed to request IRQ\n");
635 watchdog_set_nowayout(&dev
->wdt
, nowayout
);
636 ret
= watchdog_register_device(&dev
->wdt
);
640 pr_info("Initial timeout %d sec%s\n",
641 dev
->wdt
.timeout
, nowayout
? ", nowayout" : "");
645 clk_disable_unprepare(dev
->clk
);
650 static void orion_wdt_remove(struct platform_device
*pdev
)
652 struct watchdog_device
*wdt_dev
= platform_get_drvdata(pdev
);
653 struct orion_watchdog
*dev
= watchdog_get_drvdata(wdt_dev
);
655 watchdog_unregister_device(wdt_dev
);
656 clk_disable_unprepare(dev
->clk
);
660 static void orion_wdt_shutdown(struct platform_device
*pdev
)
662 struct watchdog_device
*wdt_dev
= platform_get_drvdata(pdev
);
663 orion_wdt_stop(wdt_dev
);
666 static struct platform_driver orion_wdt_driver
= {
667 .probe
= orion_wdt_probe
,
668 .remove
= orion_wdt_remove
,
669 .shutdown
= orion_wdt_shutdown
,
672 .of_match_table
= orion_wdt_of_match_table
,
676 module_platform_driver(orion_wdt_driver
);
678 MODULE_AUTHOR("Sylver Bruneau <sylver.bruneau@googlemail.com>");
679 MODULE_DESCRIPTION("Orion Processor Watchdog");
681 module_param(heartbeat
, int, 0);
682 MODULE_PARM_DESC(heartbeat
, "Initial watchdog heartbeat in seconds");
684 module_param(nowayout
, bool, 0);
685 MODULE_PARM_DESC(nowayout
, "Watchdog cannot be stopped once started (default="
686 __MODULE_STRING(WATCHDOG_NOWAYOUT
) ")");
688 MODULE_LICENSE("GPL v2");
689 MODULE_ALIAS("platform:orion_wdt");