Loading arch/arm/mach-bcm/board_bcm281xx.c +42 −41 Original line number Diff line number Diff line /* * Copyright (C) 2012-2013 Broadcom Corporation * Copyright (C) 2012-2014 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as Loading @@ -11,64 +11,65 @@ * GNU General Public License for more details. */ #include <linux/of_platform.h> #include <linux/init.h> #include <linux/device.h> #include <linux/platform_device.h> #include <linux/clocksource.h> #include <linux/of_address.h> #include <linux/of_platform.h> #include <asm/mach/arch.h> #include <asm/mach/time.h> #include <asm/hardware/cache-l2x0.h> #include "bcm_kona_smc.h" #include "kona.h" static int __init kona_l2_cache_init(void) #define SECWDOG_OFFSET 0x00000000 #define SECWDOG_RESERVED_MASK 0xe2000000 #define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000 #define SECWDOG_EN_MASK 0x08000000 #define SECWDOG_SRSTEN_MASK 0x04000000 #define SECWDOG_CLKS_SHIFT 20 #define SECWDOG_COUNT_SHIFT 0 static void bcm281xx_restart(enum reboot_mode mode, const char *cmd) { if (!IS_ENABLED(CONFIG_CACHE_L2X0)) return 0; uint32_t val; void __iomem *base; struct device_node *np_wdog; if (bcm_kona_smc_init() < 0) { pr_info("Kona secure API not available. Skipping L2 init\n"); return 0; np_wdog = of_find_compatible_node(NULL, NULL, "brcm,kona-wdt"); if (!np_wdog) { pr_emerg("Couldn't find brcm,kona-wdt\n"); return; } bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0); /* * The aux_val and aux_mask have no effect since L2 cache is already * enabled. Pass 0s for aux_val and 1s for aux_mask for default value. */ return l2x0_of_init(0, ~0); base = of_iomap(np_wdog, 0); if (!base) { pr_emerg("Couldn't map brcm,kona-wdt\n"); return; } static void bcm_board_setup_restart(void) { struct device_node *np; /* Enable watchdog with short timeout (244us). */ val = readl(base + SECWDOG_OFFSET); val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK; val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK | (0x15 << SECWDOG_CLKS_SHIFT) | (0x8 << SECWDOG_COUNT_SHIFT); writel(val, base + SECWDOG_OFFSET); np = of_find_compatible_node(NULL, NULL, "brcm,bcm11351"); if (np) { if (of_device_is_available(np)) bcm_kona_setup_restart(); of_node_put(np); } /* Restart setup for other boards goes here */ /* Wait for reset */ while (1); } static void __init board_init(void) static void __init bcm281xx_init(void) { of_platform_populate(NULL, of_default_bus_match_table, NULL, &platform_bus); bcm_board_setup_restart(); kona_l2_cache_init(); } static const char * const bcm11351_dt_compat[] = { "brcm,bcm11351", NULL, }; static const char * const bcm281xx_dt_compat[] = { "brcm,bcm11351", /* Have to use the first number upstreamed */ NULL, }; DT_MACHINE_START(BCM11351_DT, "BCM281xx Broadcom Application Processor") .init_machine = board_init, .restart = bcm_kona_restart, .dt_compat = bcm11351_dt_compat, DT_MACHINE_START(BCM281XX_DT, "BCM281xx Broadcom Application Processor") .init_machine = bcm281xx_init, .restart = bcm281xx_restart, .dt_compat = bcm281xx_dt_compat, MACHINE_END arch/arm/mach-bcm/kona.c +21 −43 Original line number Diff line number Diff line /* * Copyright (C) 2013 Broadcom Corporation * Copyright (C) 2012-2014 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as Loading @@ -11,55 +11,33 @@ * GNU General Public License for more details. */ #include <linux/of_address.h> #include <asm/io.h> #include <linux/of_platform.h> #include <asm/hardware/cache-l2x0.h> #include "bcm_kona_smc.h" #include "kona.h" static void __iomem *watchdog_base; void bcm_kona_setup_restart(void) void __init kona_l2_cache_init(void) { struct device_node *np_wdog; int ret; /* * The assumption is that whoever calls bcm_kona_setup_restart() * also needs a Kona Watchdog Timer entry in Device Tree, i.e. we * report an error if the DT entry is missing. */ np_wdog = of_find_compatible_node(NULL, NULL, "brcm,kona-wdt"); if (!np_wdog) { pr_err("brcm,kona-wdt not found in DT, reboot disabled\n"); if (!IS_ENABLED(CONFIG_CACHE_L2X0)) return; } watchdog_base = of_iomap(np_wdog, 0); WARN(!watchdog_base, "failed to map watchdog base"); of_node_put(np_wdog); } #define SECWDOG_OFFSET 0x00000000 #define SECWDOG_RESERVED_MASK 0xE2000000 #define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000 #define SECWDOG_EN_MASK 0x08000000 #define SECWDOG_SRSTEN_MASK 0x04000000 #define SECWDOG_CLKS_SHIFT 20 #define SECWDOG_LOCK_SHIFT 0 void bcm_kona_restart(enum reboot_mode mode, const char *cmd) { uint32_t val; if (!watchdog_base) panic("Watchdog not mapped. Reboot failed.\n"); ret = bcm_kona_smc_init(); if (ret) { pr_info("Secure API not available (%d). Skipping L2 init.\n", ret); return; } /* Enable watchdog2 with very short timeout. */ val = readl(watchdog_base + SECWDOG_OFFSET); val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK; val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK | (0x8 << SECWDOG_CLKS_SHIFT) | (0x8 << SECWDOG_LOCK_SHIFT); writel(val, watchdog_base + SECWDOG_OFFSET); bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0); while (1) ; /* * The aux_val and aux_mask have no effect since L2 cache is already * enabled. Pass 0s for aux_val and 1s for aux_mask for default value. */ ret = l2x0_of_init(0, ~0); if (ret) pr_err("Couldn't enable L2 cache: %d\n", ret); } arch/arm/mach-bcm/kona.h +2 −5 Original line number Diff line number Diff line /* * Copyright (C) 2013 Broadcom Corporation * Copyright (C) 2012-2014 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as Loading @@ -11,7 +11,4 @@ * GNU General Public License for more details. */ #include <linux/reboot.h> void bcm_kona_setup_restart(void); void bcm_kona_restart(enum reboot_mode mode, const char *cmd); void __init kona_l2_cache_init(void); Loading
arch/arm/mach-bcm/board_bcm281xx.c +42 −41 Original line number Diff line number Diff line /* * Copyright (C) 2012-2013 Broadcom Corporation * Copyright (C) 2012-2014 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as Loading @@ -11,64 +11,65 @@ * GNU General Public License for more details. */ #include <linux/of_platform.h> #include <linux/init.h> #include <linux/device.h> #include <linux/platform_device.h> #include <linux/clocksource.h> #include <linux/of_address.h> #include <linux/of_platform.h> #include <asm/mach/arch.h> #include <asm/mach/time.h> #include <asm/hardware/cache-l2x0.h> #include "bcm_kona_smc.h" #include "kona.h" static int __init kona_l2_cache_init(void) #define SECWDOG_OFFSET 0x00000000 #define SECWDOG_RESERVED_MASK 0xe2000000 #define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000 #define SECWDOG_EN_MASK 0x08000000 #define SECWDOG_SRSTEN_MASK 0x04000000 #define SECWDOG_CLKS_SHIFT 20 #define SECWDOG_COUNT_SHIFT 0 static void bcm281xx_restart(enum reboot_mode mode, const char *cmd) { if (!IS_ENABLED(CONFIG_CACHE_L2X0)) return 0; uint32_t val; void __iomem *base; struct device_node *np_wdog; if (bcm_kona_smc_init() < 0) { pr_info("Kona secure API not available. Skipping L2 init\n"); return 0; np_wdog = of_find_compatible_node(NULL, NULL, "brcm,kona-wdt"); if (!np_wdog) { pr_emerg("Couldn't find brcm,kona-wdt\n"); return; } bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0); /* * The aux_val and aux_mask have no effect since L2 cache is already * enabled. Pass 0s for aux_val and 1s for aux_mask for default value. */ return l2x0_of_init(0, ~0); base = of_iomap(np_wdog, 0); if (!base) { pr_emerg("Couldn't map brcm,kona-wdt\n"); return; } static void bcm_board_setup_restart(void) { struct device_node *np; /* Enable watchdog with short timeout (244us). */ val = readl(base + SECWDOG_OFFSET); val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK; val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK | (0x15 << SECWDOG_CLKS_SHIFT) | (0x8 << SECWDOG_COUNT_SHIFT); writel(val, base + SECWDOG_OFFSET); np = of_find_compatible_node(NULL, NULL, "brcm,bcm11351"); if (np) { if (of_device_is_available(np)) bcm_kona_setup_restart(); of_node_put(np); } /* Restart setup for other boards goes here */ /* Wait for reset */ while (1); } static void __init board_init(void) static void __init bcm281xx_init(void) { of_platform_populate(NULL, of_default_bus_match_table, NULL, &platform_bus); bcm_board_setup_restart(); kona_l2_cache_init(); } static const char * const bcm11351_dt_compat[] = { "brcm,bcm11351", NULL, }; static const char * const bcm281xx_dt_compat[] = { "brcm,bcm11351", /* Have to use the first number upstreamed */ NULL, }; DT_MACHINE_START(BCM11351_DT, "BCM281xx Broadcom Application Processor") .init_machine = board_init, .restart = bcm_kona_restart, .dt_compat = bcm11351_dt_compat, DT_MACHINE_START(BCM281XX_DT, "BCM281xx Broadcom Application Processor") .init_machine = bcm281xx_init, .restart = bcm281xx_restart, .dt_compat = bcm281xx_dt_compat, MACHINE_END
arch/arm/mach-bcm/kona.c +21 −43 Original line number Diff line number Diff line /* * Copyright (C) 2013 Broadcom Corporation * Copyright (C) 2012-2014 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as Loading @@ -11,55 +11,33 @@ * GNU General Public License for more details. */ #include <linux/of_address.h> #include <asm/io.h> #include <linux/of_platform.h> #include <asm/hardware/cache-l2x0.h> #include "bcm_kona_smc.h" #include "kona.h" static void __iomem *watchdog_base; void bcm_kona_setup_restart(void) void __init kona_l2_cache_init(void) { struct device_node *np_wdog; int ret; /* * The assumption is that whoever calls bcm_kona_setup_restart() * also needs a Kona Watchdog Timer entry in Device Tree, i.e. we * report an error if the DT entry is missing. */ np_wdog = of_find_compatible_node(NULL, NULL, "brcm,kona-wdt"); if (!np_wdog) { pr_err("brcm,kona-wdt not found in DT, reboot disabled\n"); if (!IS_ENABLED(CONFIG_CACHE_L2X0)) return; } watchdog_base = of_iomap(np_wdog, 0); WARN(!watchdog_base, "failed to map watchdog base"); of_node_put(np_wdog); } #define SECWDOG_OFFSET 0x00000000 #define SECWDOG_RESERVED_MASK 0xE2000000 #define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000 #define SECWDOG_EN_MASK 0x08000000 #define SECWDOG_SRSTEN_MASK 0x04000000 #define SECWDOG_CLKS_SHIFT 20 #define SECWDOG_LOCK_SHIFT 0 void bcm_kona_restart(enum reboot_mode mode, const char *cmd) { uint32_t val; if (!watchdog_base) panic("Watchdog not mapped. Reboot failed.\n"); ret = bcm_kona_smc_init(); if (ret) { pr_info("Secure API not available (%d). Skipping L2 init.\n", ret); return; } /* Enable watchdog2 with very short timeout. */ val = readl(watchdog_base + SECWDOG_OFFSET); val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK; val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK | (0x8 << SECWDOG_CLKS_SHIFT) | (0x8 << SECWDOG_LOCK_SHIFT); writel(val, watchdog_base + SECWDOG_OFFSET); bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0); while (1) ; /* * The aux_val and aux_mask have no effect since L2 cache is already * enabled. Pass 0s for aux_val and 1s for aux_mask for default value. */ ret = l2x0_of_init(0, ~0); if (ret) pr_err("Couldn't enable L2 cache: %d\n", ret); }
arch/arm/mach-bcm/kona.h +2 −5 Original line number Diff line number Diff line /* * Copyright (C) 2013 Broadcom Corporation * Copyright (C) 2012-2014 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as Loading @@ -11,7 +11,4 @@ * GNU General Public License for more details. */ #include <linux/reboot.h> void bcm_kona_setup_restart(void); void bcm_kona_restart(enum reboot_mode mode, const char *cmd); void __init kona_l2_cache_init(void);