1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | // Copyright (C) 2012-2014 Broadcom Corporation |
3 | |
4 | #include <linux/clocksource.h> |
5 | #include <linux/of_address.h> |
6 | |
7 | #include <asm/mach/arch.h> |
8 | |
9 | #include "kona_l2_cache.h" |
10 | |
11 | #define SECWDOG_OFFSET 0x00000000 |
12 | #define SECWDOG_RESERVED_MASK 0xe2000000 |
13 | #define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000 |
14 | #define SECWDOG_EN_MASK 0x08000000 |
15 | #define SECWDOG_SRSTEN_MASK 0x04000000 |
16 | #define SECWDOG_CLKS_SHIFT 20 |
17 | #define SECWDOG_COUNT_SHIFT 0 |
18 | |
19 | static void bcm281xx_restart(enum reboot_mode mode, const char *cmd) |
20 | { |
21 | uint32_t val; |
22 | void __iomem *base; |
23 | struct device_node *np_wdog; |
24 | |
25 | np_wdog = of_find_compatible_node(NULL, NULL, compat: "brcm,kona-wdt" ); |
26 | if (!np_wdog) { |
27 | pr_emerg("Couldn't find brcm,kona-wdt\n" ); |
28 | return; |
29 | } |
30 | base = of_iomap(node: np_wdog, index: 0); |
31 | of_node_put(node: np_wdog); |
32 | if (!base) { |
33 | pr_emerg("Couldn't map brcm,kona-wdt\n" ); |
34 | return; |
35 | } |
36 | |
37 | /* Enable watchdog with short timeout (244us). */ |
38 | val = readl(addr: base + SECWDOG_OFFSET); |
39 | val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK; |
40 | val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK | |
41 | (0x15 << SECWDOG_CLKS_SHIFT) | |
42 | (0x8 << SECWDOG_COUNT_SHIFT); |
43 | writel(val, addr: base + SECWDOG_OFFSET); |
44 | |
45 | /* Wait for reset */ |
46 | while (1); |
47 | } |
48 | |
49 | static void __init bcm281xx_init(void) |
50 | { |
51 | kona_l2_cache_init(); |
52 | } |
53 | |
54 | static const char * const bcm281xx_dt_compat[] = { |
55 | "brcm,bcm11351" , /* Have to use the first number upstreamed */ |
56 | NULL, |
57 | }; |
58 | |
59 | DT_MACHINE_START(BCM281XX_DT, "BCM281xx Broadcom Application Processor" ) |
60 | .init_machine = bcm281xx_init, |
61 | .restart = bcm281xx_restart, |
62 | .dt_compat = bcm281xx_dt_compat, |
63 | MACHINE_END |
64 | |