forked from Minki/linux
b3205dea8f
Instead of hardcoding the SYSRAM details for each SoC, pass this information through device tree (DT) and make the code SoC agnostic. Generic DT SRAM bindings are used for achieving this. Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
75 lines
1.5 KiB
C
75 lines
1.5 KiB
C
/*
|
|
* Copyright (C) 2012 Samsung Electronics.
|
|
* Kyungmin Park <kyungmin.park@samsung.com>
|
|
* Tomasz Figa <t.figa@samsung.com>
|
|
*
|
|
* This program is free software,you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/io.h>
|
|
#include <linux/init.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_address.h>
|
|
|
|
#include <asm/firmware.h>
|
|
|
|
#include <mach/map.h>
|
|
|
|
#include "common.h"
|
|
#include "smc.h"
|
|
|
|
static int exynos_do_idle(void)
|
|
{
|
|
exynos_smc(SMC_CMD_SLEEP, 0, 0, 0);
|
|
return 0;
|
|
}
|
|
|
|
static int exynos_cpu_boot(int cpu)
|
|
{
|
|
exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
|
|
return 0;
|
|
}
|
|
|
|
static int exynos_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
|
|
{
|
|
void __iomem *boot_reg;
|
|
|
|
if (!sysram_ns_base_addr)
|
|
return -ENODEV;
|
|
|
|
boot_reg = sysram_ns_base_addr + 0x1c + 4*cpu;
|
|
|
|
__raw_writel(boot_addr, boot_reg);
|
|
return 0;
|
|
}
|
|
|
|
static const struct firmware_ops exynos_firmware_ops = {
|
|
.do_idle = exynos_do_idle,
|
|
.set_cpu_boot_addr = exynos_set_cpu_boot_addr,
|
|
.cpu_boot = exynos_cpu_boot,
|
|
};
|
|
|
|
void __init exynos_firmware_init(void)
|
|
{
|
|
struct device_node *nd;
|
|
const __be32 *addr;
|
|
|
|
nd = of_find_compatible_node(NULL, NULL,
|
|
"samsung,secure-firmware");
|
|
if (!nd)
|
|
return;
|
|
|
|
addr = of_get_address(nd, 0, NULL, NULL);
|
|
if (!addr) {
|
|
pr_err("%s: No address specified.\n", __func__);
|
|
return;
|
|
}
|
|
|
|
pr_info("Running under secure firmware.\n");
|
|
|
|
register_firmware_ops(&exynos_firmware_ops);
|
|
}
|