mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 21:52:04 +00:00
Renesas ARM Based SoC Updates for v3.17
* Use shmobile_init_late on r8a7791 and r8a7790 whien booting using DT-only * Support Core-Standby for Suspend to RAM on r8a7791 and r8a7790 SoCs * Shared CMA reservation for R-Car Gen2 SoCs * Add r8a7791 SYSC power management support -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJTqnn+AAoJENfPZGlqN0++SZIP/jn48ADVugeEANLibUl10IBb hWKh80Fr4/ELaXd0KJTa8SDzLW/JB3rr29bwBhkRWIcsMIeWObI2wJEnSVX2yZkO ZBijr9FbdmhQ5VmkXEqjUqYkGKx/0IGHMFQ8R6Io3tiwpLXFdz2+moT8cu3Rl4TP WNvP+xEPjvPUb/7PygXg2Ypdq5jmV4j24LUCJj+yo3ULP2zv92d620CuWT3P0zbv 5PRP3SvbzgwYHhINFF8e4StYsjrl++V+w5pjdm3XDcVNkDoc6p/e8Jqse6wjAYY+ 2ShUXhfg7/D56BlEChHb6xwlJmImO81x1NrB5zM69vpvGGQ9fW1XwDAtrFzocDag vDDp4KIY8TD/T6E6KhEpOdW1GSWYukJ2PBqsgxuYaY8eBO7HDPbG5klj8VEfACgu ZeY0F2Uq/wb1mJNh32s1FIaWQPGAGPY5Yi77ShHbo3xKQBlqtY2M3Snw8hYLUKgS tDowT94fWAdXXlFCtvOUMyPEa5+hqZ68PlYFU7Z0jvYcaUm9Ui/EEgo7YqdBWh9e CVN1fG5SvV8HY5h81GqvC87B45EzALqMG28rhv4e0rSP9PxHuIGWd/m22ea+aV8G eDKinQ0+EXeyG6BKjbx63s3zGiv60gNcj8anG7Kd6UNpyLnRGewWJkIpSonmqO9R TQNXLY08LHnONq/gw5Xc =6J6K -----END PGP SIGNATURE----- Merge tag 'renesas-soc-for-v3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/soc Merge "Renesas ARM Based SoC Updates for v3.17" from Simon Horman: - Use shmobile_init_late on r8a7791 and r8a7790 whien booting using DT-only - Support Core-Standby for Suspend to RAM on r8a7791 and r8a7790 SoCs - Shared CMA reservation for R-Car Gen2 SoCs - Add r8a7791 SYSC power management support * tag 'renesas-soc-for-v3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: ARM: shmobile: Remove ARCH_HAS_CPUFREQ config for shmobile ARM: shmobile: rcar-gen2: update call to dma_contiguous_reserve_area ARM: shmobile: rcar-gen2: correct return value of shmobile_smp_apmu_suspend_init ARM: shmobile: rcar-gen2: Remove useless copied section for LongTrail ARM: shmobile: rcar-gen2: Use "1ULL" instead of "(u64)1" ARM: shmobile: rcar-gen2: Update for of_get_flat_dt_prop() update ARM: shmobile: Add shared R-Car Gen2 CMA reservation code ARM: shmobile: Use shmobile_init_late() on r8a7791 DT-only ARM: shmobile: Use shmobile_init_late() on r8a7790 DT-only ARM: shmobile: Mark all SoCs in shmobile as CPUFreq, capable ARM: shmobile: r8a7791: Support Core-Standby for Suspend to RAM ARM: shmobile: r8a7790: Support Core-Standby for Suspend to RAM ARM: shmobile: APMU: Add Core-Standby-state for Suspend to RAM ARM: shmobile: r8a7791 SYSC setup code Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
98abaf1370
@ -12,6 +12,7 @@ menuconfig ARCH_SHMOBILE_MULTI
|
||||
select NO_IOPORT_MAP
|
||||
select PINCTRL
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select ARCH_HAS_OPP
|
||||
|
||||
if ARCH_SHMOBILE_MULTI
|
||||
|
||||
|
@ -54,6 +54,7 @@ obj-$(CONFIG_ARCH_SH73A0) += pm-sh73a0.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o pm-rmobile.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o pm-rcar.o
|
||||
obj-$(CONFIG_ARCH_R8A7790) += pm-r8a7790.o pm-rcar.o
|
||||
obj-$(CONFIG_ARCH_R8A7791) += pm-r8a7791.o pm-rcar.o
|
||||
|
||||
# Board objects
|
||||
ifdef CONFIG_ARCH_SHMOBILE_MULTI
|
||||
|
@ -35,8 +35,10 @@ extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv);
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
int shmobile_suspend_init(void);
|
||||
void shmobile_smp_apmu_suspend_init(void);
|
||||
#else
|
||||
static inline int shmobile_suspend_init(void) { return 0; }
|
||||
static inline void shmobile_smp_apmu_suspend_init(void) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_IDLE
|
||||
|
@ -5,6 +5,7 @@ void r8a7791_add_standard_devices(void);
|
||||
void r8a7791_add_dt_devices(void);
|
||||
void r8a7791_clock_init(void);
|
||||
void r8a7791_pinmux_init(void);
|
||||
void r8a7791_pm_init(void);
|
||||
extern struct smp_operations r8a7791_smp_ops;
|
||||
|
||||
#endif /* __ASM_R8A7791_H__ */
|
||||
|
@ -7,15 +7,19 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/cpu_pm.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cp15.h>
|
||||
#include <asm/proc-fns.h>
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/suspend.h>
|
||||
#include "common.h"
|
||||
|
||||
static struct {
|
||||
@ -141,7 +145,7 @@ int shmobile_smp_apmu_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
return apmu_wrap(cpu, apmu_power_on);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_SUSPEND)
|
||||
/* nicked from arch/arm/mach-exynos/hotplug.c */
|
||||
static inline void cpu_enter_lowpower_a15(void)
|
||||
{
|
||||
@ -172,16 +176,40 @@ static inline void cpu_enter_lowpower_a15(void)
|
||||
dsb();
|
||||
}
|
||||
|
||||
void shmobile_smp_apmu_cpu_die(unsigned int cpu)
|
||||
void shmobile_smp_apmu_cpu_shutdown(unsigned int cpu)
|
||||
{
|
||||
/* For this particular CPU deregister boot vector */
|
||||
shmobile_smp_hook(cpu, 0, 0);
|
||||
|
||||
/* Select next sleep mode using the APMU */
|
||||
apmu_wrap(cpu, apmu_power_off);
|
||||
|
||||
/* Do ARM specific CPU shutdown */
|
||||
cpu_enter_lowpower_a15();
|
||||
}
|
||||
|
||||
static inline void cpu_leave_lowpower(void)
|
||||
{
|
||||
unsigned int v;
|
||||
|
||||
asm volatile("mrc p15, 0, %0, c1, c0, 0\n"
|
||||
" orr %0, %0, %1\n"
|
||||
" mcr p15, 0, %0, c1, c0, 0\n"
|
||||
" mrc p15, 0, %0, c1, c0, 1\n"
|
||||
" orr %0, %0, %2\n"
|
||||
" mcr p15, 0, %0, c1, c0, 1\n"
|
||||
: "=&r" (v)
|
||||
: "Ir" (CR_C), "Ir" (0x40)
|
||||
: "cc");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_HOTPLUG_CPU)
|
||||
void shmobile_smp_apmu_cpu_die(unsigned int cpu)
|
||||
{
|
||||
/* For this particular CPU deregister boot vector */
|
||||
shmobile_smp_hook(cpu, 0, 0);
|
||||
|
||||
/* Shutdown CPU core */
|
||||
shmobile_smp_apmu_cpu_shutdown(cpu);
|
||||
|
||||
/* jump to shared mach-shmobile sleep / reset code */
|
||||
shmobile_smp_sleep();
|
||||
@ -192,3 +220,27 @@ int shmobile_smp_apmu_cpu_kill(unsigned int cpu)
|
||||
return apmu_wrap(cpu, apmu_power_off_poll);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SUSPEND)
|
||||
static int shmobile_smp_apmu_do_suspend(unsigned long cpu)
|
||||
{
|
||||
shmobile_smp_hook(cpu, virt_to_phys(cpu_resume), 0);
|
||||
shmobile_smp_apmu_cpu_shutdown(cpu);
|
||||
cpu_do_idle(); /* WFI selects Core Standby */
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int shmobile_smp_apmu_enter_suspend(suspend_state_t state)
|
||||
{
|
||||
cpu_suspend(smp_processor_id(), shmobile_smp_apmu_do_suspend);
|
||||
cpu_leave_lowpower();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void shmobile_smp_apmu_suspend_init(void)
|
||||
{
|
||||
shmobile_suspend_ops.enter = shmobile_smp_apmu_enter_suspend;
|
||||
}
|
||||
#else
|
||||
void shmobile_smp_apmu_suspend_init(void) {}
|
||||
#endif
|
||||
|
47
arch/arm/mach-shmobile/pm-r8a7791.c
Normal file
47
arch/arm/mach-shmobile/pm-r8a7791.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* r8a7791 Power management support
|
||||
*
|
||||
* Copyright (C) 2014 Renesas Electronics Corporation
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <mach/r8a7791.h>
|
||||
#include "pm-rcar.h"
|
||||
|
||||
/* SYSC */
|
||||
#define SYSCIER 0x0c
|
||||
#define SYSCIMR 0x10
|
||||
|
||||
#if defined(CONFIG_SMP)
|
||||
|
||||
static void __init r8a7791_sysc_init(void)
|
||||
{
|
||||
void __iomem *base = rcar_sysc_init(0xe6180000);
|
||||
|
||||
/* enable all interrupt sources, but do not use interrupt handler */
|
||||
iowrite32(0x0131000e, base + SYSCIER);
|
||||
iowrite32(0, base + SYSCIMR);
|
||||
}
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
static inline void r8a7791_sysc_init(void) {}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
void __init r8a7791_pm_init(void)
|
||||
{
|
||||
static int once;
|
||||
|
||||
if (once++)
|
||||
return;
|
||||
|
||||
r8a7791_sysc_init();
|
||||
}
|
@ -4,5 +4,6 @@
|
||||
void rcar_gen2_timer_init(void);
|
||||
#define MD(nr) BIT(nr)
|
||||
u32 rcar_gen2_read_mode_pins(void);
|
||||
void rcar_gen2_reserve(void);
|
||||
|
||||
#endif /* __ASM_RCAR_GEN2_H__ */
|
||||
|
@ -326,6 +326,8 @@ DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
|
||||
.smp = smp_ops(r8a7790_smp_ops),
|
||||
.init_early = r8a7790_init_early,
|
||||
.init_time = rcar_gen2_timer_init,
|
||||
.init_late = shmobile_init_late,
|
||||
.reserve = rcar_gen2_reserve,
|
||||
.dt_compat = r8a7790_boards_compat_dt,
|
||||
MACHINE_END
|
||||
#endif /* CONFIG_USE_OF */
|
||||
|
@ -217,6 +217,8 @@ DT_MACHINE_START(R8A7791_DT, "Generic R8A7791 (Flattened Device Tree)")
|
||||
.smp = smp_ops(r8a7791_smp_ops),
|
||||
.init_early = shmobile_init_delay,
|
||||
.init_time = rcar_gen2_timer_init,
|
||||
.init_late = shmobile_init_late,
|
||||
.reserve = rcar_gen2_reserve,
|
||||
.dt_compat = r8a7791_boards_compat_dt,
|
||||
MACHINE_END
|
||||
#endif /* CONFIG_USE_OF */
|
||||
|
@ -20,8 +20,11 @@
|
||||
|
||||
#include <linux/clk/shmobile.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-contiguous.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include "common.h"
|
||||
#include "rcar-gen2.h"
|
||||
@ -110,3 +113,72 @@ void __init rcar_gen2_timer_init(void)
|
||||
#endif
|
||||
clocksource_of_init();
|
||||
}
|
||||
|
||||
struct memory_reserve_config {
|
||||
u64 reserved;
|
||||
u64 base, size;
|
||||
};
|
||||
|
||||
static int __init rcar_gen2_scan_mem(unsigned long node, const char *uname,
|
||||
int depth, void *data)
|
||||
{
|
||||
const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
|
||||
const __be32 *reg, *endp;
|
||||
int l;
|
||||
struct memory_reserve_config *mrc = data;
|
||||
u64 lpae_start = 1ULL << 32;
|
||||
|
||||
/* We are scanning "memory" nodes only */
|
||||
if (type == NULL || strcmp(type, "memory"))
|
||||
return 0;
|
||||
|
||||
reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
|
||||
if (reg == NULL)
|
||||
reg = of_get_flat_dt_prop(node, "reg", &l);
|
||||
if (reg == NULL)
|
||||
return 0;
|
||||
|
||||
endp = reg + (l / sizeof(__be32));
|
||||
while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
|
||||
u64 base, size;
|
||||
|
||||
base = dt_mem_next_cell(dt_root_addr_cells, ®);
|
||||
size = dt_mem_next_cell(dt_root_size_cells, ®);
|
||||
|
||||
if (base >= lpae_start)
|
||||
continue;
|
||||
|
||||
if ((base + size) >= lpae_start)
|
||||
size = lpae_start - base;
|
||||
|
||||
if (size < mrc->reserved)
|
||||
continue;
|
||||
|
||||
if (base < mrc->base)
|
||||
continue;
|
||||
|
||||
/* keep the area at top near the 32-bit legacy limit */
|
||||
mrc->base = base + size - mrc->reserved;
|
||||
mrc->size = mrc->reserved;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct cma *rcar_gen2_dma_contiguous;
|
||||
|
||||
void __init rcar_gen2_reserve(void)
|
||||
{
|
||||
struct memory_reserve_config mrc;
|
||||
|
||||
/* reserve 256 MiB at the top of the physical legacy 32-bit space */
|
||||
memset(&mrc, 0, sizeof(mrc));
|
||||
mrc.reserved = SZ_256M;
|
||||
|
||||
of_scan_flat_dt(rcar_gen2_scan_mem, &mrc);
|
||||
#ifdef CONFIG_DMA_CMA
|
||||
if (mrc.size)
|
||||
dma_contiguous_reserve_area(mrc.size, mrc.base, 0,
|
||||
&rcar_gen2_dma_contiguous, true);
|
||||
#endif
|
||||
}
|
||||
|
@ -69,6 +69,7 @@ static void __init r8a7790_smp_prepare_cpus(unsigned int max_cpus)
|
||||
|
||||
/* turn on power to SCU */
|
||||
r8a7790_pm_init();
|
||||
shmobile_smp_apmu_suspend_init();
|
||||
rcar_sysc_power_up(&r8a7790_ca15_scu);
|
||||
rcar_sysc_power_up(&r8a7790_ca7_scu);
|
||||
}
|
||||
|
@ -50,6 +50,9 @@ static void __init r8a7791_smp_prepare_cpus(unsigned int max_cpus)
|
||||
writel_relaxed((readl_relaxed(p + CA15RESCNT) & ~0x0f) | 0xa5a50000,
|
||||
p + CA15RESCNT);
|
||||
iounmap(p);
|
||||
|
||||
r8a7791_pm_init();
|
||||
shmobile_smp_apmu_suspend_init();
|
||||
}
|
||||
|
||||
static int r8a7791_smp_boot_secondary(unsigned int cpu,
|
||||
|
Loading…
Reference in New Issue
Block a user