162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// Copyright (C) 2012-2014 Broadcom Corporation 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/clocksource.h> 562306a36Sopenharmony_ci#include <linux/of_address.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <asm/mach/arch.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "kona_l2_cache.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define SECWDOG_OFFSET 0x00000000 1262306a36Sopenharmony_ci#define SECWDOG_RESERVED_MASK 0xe2000000 1362306a36Sopenharmony_ci#define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000 1462306a36Sopenharmony_ci#define SECWDOG_EN_MASK 0x08000000 1562306a36Sopenharmony_ci#define SECWDOG_SRSTEN_MASK 0x04000000 1662306a36Sopenharmony_ci#define SECWDOG_CLKS_SHIFT 20 1762306a36Sopenharmony_ci#define SECWDOG_COUNT_SHIFT 0 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic void bcm281xx_restart(enum reboot_mode mode, const char *cmd) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci uint32_t val; 2262306a36Sopenharmony_ci void __iomem *base; 2362306a36Sopenharmony_ci struct device_node *np_wdog; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci np_wdog = of_find_compatible_node(NULL, NULL, "brcm,kona-wdt"); 2662306a36Sopenharmony_ci if (!np_wdog) { 2762306a36Sopenharmony_ci pr_emerg("Couldn't find brcm,kona-wdt\n"); 2862306a36Sopenharmony_ci return; 2962306a36Sopenharmony_ci } 3062306a36Sopenharmony_ci base = of_iomap(np_wdog, 0); 3162306a36Sopenharmony_ci of_node_put(np_wdog); 3262306a36Sopenharmony_ci if (!base) { 3362306a36Sopenharmony_ci pr_emerg("Couldn't map brcm,kona-wdt\n"); 3462306a36Sopenharmony_ci return; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci /* Enable watchdog with short timeout (244us). */ 3862306a36Sopenharmony_ci val = readl(base + SECWDOG_OFFSET); 3962306a36Sopenharmony_ci val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK; 4062306a36Sopenharmony_ci val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK | 4162306a36Sopenharmony_ci (0x15 << SECWDOG_CLKS_SHIFT) | 4262306a36Sopenharmony_ci (0x8 << SECWDOG_COUNT_SHIFT); 4362306a36Sopenharmony_ci writel(val, base + SECWDOG_OFFSET); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci /* Wait for reset */ 4662306a36Sopenharmony_ci while (1); 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic void __init bcm281xx_init(void) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci kona_l2_cache_init(); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic const char * const bcm281xx_dt_compat[] = { 5562306a36Sopenharmony_ci "brcm,bcm11351", /* Have to use the first number upstreamed */ 5662306a36Sopenharmony_ci NULL, 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciDT_MACHINE_START(BCM281XX_DT, "BCM281xx Broadcom Application Processor") 6062306a36Sopenharmony_ci .init_machine = bcm281xx_init, 6162306a36Sopenharmony_ci .restart = bcm281xx_restart, 6262306a36Sopenharmony_ci .dt_compat = bcm281xx_dt_compat, 6362306a36Sopenharmony_ciMACHINE_END 64