Renesas ARM Based SoC Arm SoC Updates for v4.19
* Convert to SPDX identifier * Remove legacy SMP fallback code Geert Uytterhoeven says "R-Car H2 and M2-W have been supporting SMP enablement from DT using the "renesas,apmu" enable-method since v4.8. A legacy fallback was left in place for backwards compatibility with old DTBs. This patch series removes the legacy SMP fallbacks for R-Car H2 and M2-W, and consolidates their support in the common R-Car Gen2 machine definition.2 * APMU cleanups after legacy SMP fallback removal - Move cpu_leave_lowpower() from HOTPLUG_CPU || SUSPEND section to the SUSPEND section as it is only used for suspend - Remove shmobile_smp_apmu_prepare_cpus() as it is no longer used - Remove platsmp-apmu.h * Drop legacy SYSC fallbacks Geert Uytterhoeven says "When DT SYSC support was introduced in v4.7, legacy fallbacks were kept to keep secondary CPUs working on R-Car H1, H2, and M2-W using old DTBs. However, the time has come to drop these fallbacks, and clean up the resulting code" -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE4nzZofWswv9L/nKF189kaWo3T74FAlsw9BUACgkQ189kaWo3 T77wNA//a5XfWFjbzvIBT+CJ23dGcJRh3dnren+CENIeOi6/HE2zzTYrOVzqngS2 pj/rKeV9kZ/5APCjLzDVvC6UemteUqBtnU85c5FsrqivfUvzPA3/dKxqx/u4NMPv Cz90B6gYl0IIncWerecsS7k2BY0AVHKhDCdlGFZgEtBtF36oT4PA5npNO9K9cbDf nQcJkFaIwPgD3p7mckmZylE0duAkNQmXAyXplPrJYPv1dz87p/b1GVV34VsNoYl0 Zulm0sJEgaywMaFSeNdxjaHNiTirpYPMvK8S/PIU/IyKd1eufoEp19GgvZ6ndYIQ T1OSqvmdkx80XTKzUqFL5m81HgqfQsGnMLOajsMWCqD+gRT4/HSwar10jHx3rSOu 8q51gmtf4BS05gMf1ZBfjaBqwqhh2DHL5bO6oMUQT4lF5t952y+ucXDot+WXRnb+ MBk8vAfyyBRSOOBCARx0uoSIStOeJO2F/pvyg7pAku55OZJ7Vsl62StwsmNZ2gE2 UVHlCcpwtjjcOKRYWkl0i/Qv9nG3jIlolgVQMt1TSm+myY462bKW8BzKGtx0MXgX TGYamTBbRvqv1Gu7099oVzJ9a4D4fx7NIoaN+xwrxHgjdMf2m7KMkI7FIerJUJKr QhyDv6N3gB7WRuecQHkTf19Yam8c0MoHwlAboTqqUwIXSP28fU4= =r3sD -----END PGP SIGNATURE----- Merge tag 'renesas-arm-soc-for-v4.19' of https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/soc Renesas ARM Based SoC Arm SoC Updates for v4.19 * Convert to SPDX identifier * Remove legacy SMP fallback code for R-CAR H2 and M2-W - DT enablement has been in since 4.8, no longer needed * APMU cleanups after legacy SMP fallback removal * Drop legacy SYSC fallback code for R-Car H1, H2 and M2-W - DT enablement has been in since 4.7, no longer needed. * tag 'renesas-arm-soc-for-v4.19' of https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: ARM: shmobile: convert to SPDX identifier soc: renesas: rcar-sysc: Drop legacy handling ARM: shmobile: r8a7779: Remove explicit SYSC config and init ARM: shmobile: r8a7779: Use rcar_sysc_power_{down,up}_cpu() soc: renesas: rcar-sysc: Provide helpers to power up/down CPUs ARM: shmobile: r8a7779: Stop powering down secondary CPUs during early boot ARM: shmobile: rcar-gen2: Remove explicit SYSC config and init ARM: shmobile: apmu: Remove platsmp-apmu.h ARM: shmobile: apmu: Remove obsolete shmobile_smp_apmu_prepare_cpus() ARM: shmobile: apmu: Move cpu_leave_lowpower() to SUSPEND section ARM: shmobile: Remove unused shmobile_smp_init_fallback_ops() ARM: shmobile: r8a7791: Use common R-Car Gen2 machine definition ARM: shmobile: r8a7791: Remove legacy SMP fallback code ARM: shmobile: r8a7790: Use common R-Car Gen2 machine definition ARM: shmobile: r8a7790: Remove legacy SMP fallback code Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
a67de88209
@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Renesas SCIF(A) debugging macro include header
|
||||
*
|
||||
@ -5,10 +6,6 @@
|
||||
*
|
||||
* Copyright (C) 2012-2013 Renesas Electronics Corporation
|
||||
* Copyright (C) 1994-1999 Russell King
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define SCIF_PHYS CONFIG_DEBUG_UART_PHYS
|
||||
|
@ -11,9 +11,7 @@ obj-$(CONFIG_ARCH_SH73A0) += setup-sh73a0.o
|
||||
obj-$(CONFIG_ARCH_R8A73A4) += setup-r8a73a4.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += setup-r8a7740.o
|
||||
obj-$(CONFIG_ARCH_R8A7778) += setup-r8a7778.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += setup-r8a7779.o pm-r8a7779.o
|
||||
obj-$(CONFIG_ARCH_R8A7790) += setup-r8a7790.o
|
||||
obj-$(CONFIG_ARCH_R8A7791) += setup-r8a7791.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += setup-r8a7779.o
|
||||
obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o
|
||||
obj-$(CONFIG_ARCH_R7S72100) += setup-r7s72100.o
|
||||
|
||||
@ -32,8 +30,6 @@ obj-$(CONFIG_ARCH_R8A7793) += regulator-quirk-rcar-gen2.o
|
||||
smp-y := $(cpu-y)
|
||||
smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
|
||||
smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
|
||||
smp-$(CONFIG_ARCH_R8A7790) += smp-r8a7790.o
|
||||
smp-$(CONFIG_ARCH_R8A7791) += smp-r8a7791.o
|
||||
smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o platsmp-scu.o
|
||||
|
||||
# PM objects
|
||||
|
@ -15,7 +15,6 @@ extern void shmobile_smp_sleep(void);
|
||||
extern void shmobile_smp_hook(unsigned int cpu, unsigned long fn,
|
||||
unsigned long arg);
|
||||
extern bool shmobile_smp_cpu_can_disable(unsigned int cpu);
|
||||
extern bool shmobile_smp_init_fallback_ops(void);
|
||||
extern void shmobile_boot_apmu(void);
|
||||
extern void shmobile_boot_scu(void);
|
||||
extern void shmobile_smp_scu_prepare_cpus(phys_addr_t scu_base_phys,
|
||||
|
@ -1,11 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* SMP support for APMU based systems with Cortex A7/A15
|
||||
*
|
||||
* Copyright (C) 2014 Renesas Electronics Corporation
|
||||
*
|
||||
* 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/linkage.h>
|
||||
|
@ -1,12 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SMP support for SoCs with APMU
|
||||
*
|
||||
* Copyright (C) 2014 Renesas Electronics Corporation
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
*
|
||||
* 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/cpu_pm.h>
|
||||
#include <linux/delay.h>
|
||||
@ -23,7 +20,6 @@
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/suspend.h>
|
||||
#include "common.h"
|
||||
#include "platsmp-apmu.h"
|
||||
#include "rcar-gen2.h"
|
||||
|
||||
static struct {
|
||||
@ -87,6 +83,104 @@ static int __maybe_unused apmu_wrap(int cpu, int (*fn)(void __iomem *p, int cpu)
|
||||
return p ? fn(p, apmu_cpus[cpu].bit) : -EINVAL;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_SUSPEND)
|
||||
/* nicked from arch/arm/mach-exynos/hotplug.c */
|
||||
static inline void cpu_enter_lowpower_a15(void)
|
||||
{
|
||||
unsigned int v;
|
||||
|
||||
asm volatile(
|
||||
" mrc p15, 0, %0, c1, c0, 0\n"
|
||||
" bic %0, %0, %1\n"
|
||||
" mcr p15, 0, %0, c1, c0, 0\n"
|
||||
: "=&r" (v)
|
||||
: "Ir" (CR_C)
|
||||
: "cc");
|
||||
|
||||
flush_cache_louis();
|
||||
|
||||
asm volatile(
|
||||
/*
|
||||
* Turn off coherency
|
||||
*/
|
||||
" mrc p15, 0, %0, c1, c0, 1\n"
|
||||
" bic %0, %0, %1\n"
|
||||
" mcr p15, 0, %0, c1, c0, 1\n"
|
||||
: "=&r" (v)
|
||||
: "Ir" (0x40)
|
||||
: "cc");
|
||||
|
||||
isb();
|
||||
dsb();
|
||||
}
|
||||
|
||||
static void shmobile_smp_apmu_cpu_shutdown(unsigned int cpu)
|
||||
{
|
||||
|
||||
/* Select next sleep mode using the APMU */
|
||||
apmu_wrap(cpu, apmu_power_off);
|
||||
|
||||
/* Do ARM specific CPU shutdown */
|
||||
cpu_enter_lowpower_a15();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_HOTPLUG_CPU)
|
||||
static 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();
|
||||
}
|
||||
|
||||
static 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, __pa_symbol(cpu_resume), 0);
|
||||
shmobile_smp_apmu_cpu_shutdown(cpu);
|
||||
cpu_do_idle(); /* WFI selects Core Standby */
|
||||
return 1;
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
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 __init shmobile_smp_apmu_suspend_init(void)
|
||||
{
|
||||
shmobile_suspend_ops.enter = shmobile_smp_apmu_enter_suspend;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void apmu_init_cpu(struct resource *res, int cpu, int bit)
|
||||
{
|
||||
@ -106,38 +200,6 @@ static void apmu_init_cpu(struct resource *res, int cpu, int bit)
|
||||
writel(x, apmu_cpus[cpu].iomem + DBGRCR_OFFS);
|
||||
}
|
||||
|
||||
static void apmu_parse_cfg(void (*fn)(struct resource *res, int cpu, int bit),
|
||||
struct rcar_apmu_config *apmu_config, int num)
|
||||
{
|
||||
int id;
|
||||
int k;
|
||||
int bit, index;
|
||||
bool is_allowed;
|
||||
|
||||
for (k = 0; k < num; k++) {
|
||||
/* only enable the cluster that includes the boot CPU */
|
||||
is_allowed = false;
|
||||
for (bit = 0; bit < ARRAY_SIZE(apmu_config[k].cpus); bit++) {
|
||||
id = apmu_config[k].cpus[bit];
|
||||
if (id >= 0) {
|
||||
if (id == cpu_logical_map(0))
|
||||
is_allowed = true;
|
||||
}
|
||||
}
|
||||
if (!is_allowed)
|
||||
continue;
|
||||
|
||||
for (bit = 0; bit < ARRAY_SIZE(apmu_config[k].cpus); bit++) {
|
||||
id = apmu_config[k].cpus[bit];
|
||||
if (id >= 0) {
|
||||
index = get_logical_index(id);
|
||||
if (index >= 0)
|
||||
fn(&apmu_config[k].iomem, index, bit);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const struct of_device_id apmu_ids[] = {
|
||||
{ .compatible = "renesas,apmu" },
|
||||
{ /*sentinel*/ }
|
||||
@ -194,15 +256,8 @@ static void __init shmobile_smp_apmu_setup_boot(void)
|
||||
shmobile_boot_fn_gen2 = shmobile_boot_fn;
|
||||
}
|
||||
|
||||
void __init shmobile_smp_apmu_prepare_cpus(unsigned int max_cpus,
|
||||
struct rcar_apmu_config *apmu_config,
|
||||
int num)
|
||||
{
|
||||
shmobile_smp_apmu_setup_boot();
|
||||
apmu_parse_cfg(apmu_init_cpu, apmu_config, num);
|
||||
}
|
||||
|
||||
int shmobile_smp_apmu_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
static int shmobile_smp_apmu_boot_secondary(unsigned int cpu,
|
||||
struct task_struct *idle)
|
||||
{
|
||||
/* For this particular CPU register boot vector */
|
||||
shmobile_smp_hook(cpu, __pa_symbol(shmobile_boot_apmu), 0);
|
||||
@ -229,101 +284,3 @@ static struct smp_operations apmu_smp_ops __initdata = {
|
||||
|
||||
CPU_METHOD_OF_DECLARE(shmobile_smp_apmu, "renesas,apmu", &apmu_smp_ops);
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_SUSPEND)
|
||||
/* nicked from arch/arm/mach-exynos/hotplug.c */
|
||||
static inline void cpu_enter_lowpower_a15(void)
|
||||
{
|
||||
unsigned int v;
|
||||
|
||||
asm volatile(
|
||||
" mrc p15, 0, %0, c1, c0, 0\n"
|
||||
" bic %0, %0, %1\n"
|
||||
" mcr p15, 0, %0, c1, c0, 0\n"
|
||||
: "=&r" (v)
|
||||
: "Ir" (CR_C)
|
||||
: "cc");
|
||||
|
||||
flush_cache_louis();
|
||||
|
||||
asm volatile(
|
||||
/*
|
||||
* Turn off coherency
|
||||
*/
|
||||
" mrc p15, 0, %0, c1, c0, 1\n"
|
||||
" bic %0, %0, %1\n"
|
||||
" mcr p15, 0, %0, c1, c0, 1\n"
|
||||
: "=&r" (v)
|
||||
: "Ir" (0x40)
|
||||
: "cc");
|
||||
|
||||
isb();
|
||||
dsb();
|
||||
}
|
||||
|
||||
static void shmobile_smp_apmu_cpu_shutdown(unsigned int cpu)
|
||||
{
|
||||
|
||||
/* 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();
|
||||
}
|
||||
|
||||
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, __pa_symbol(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 __init shmobile_smp_apmu_suspend_init(void)
|
||||
{
|
||||
shmobile_suspend_ops.enter = shmobile_smp_apmu_enter_suspend;
|
||||
}
|
||||
#endif
|
||||
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* rmobile apmu definition
|
||||
*
|
||||
* Copyright (C) 2014 Renesas Electronics Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef PLATSMP_APMU_H
|
||||
#define PLATSMP_APMU_H
|
||||
|
||||
struct rcar_apmu_config {
|
||||
struct resource iomem;
|
||||
int cpus[4];
|
||||
};
|
||||
|
||||
extern void shmobile_smp_apmu_prepare_cpus(unsigned int max_cpus,
|
||||
struct rcar_apmu_config *apmu_config,
|
||||
int num);
|
||||
extern int shmobile_smp_apmu_boot_secondary(unsigned int cpu,
|
||||
struct task_struct *idle);
|
||||
extern void shmobile_smp_apmu_cpu_die(unsigned int cpu);
|
||||
extern int shmobile_smp_apmu_cpu_kill(unsigned int cpu);
|
||||
|
||||
#endif /* PLATSMP_APMU_H */
|
@ -36,12 +36,3 @@ bool shmobile_smp_cpu_can_disable(unsigned int cpu)
|
||||
return true; /* Hotplug of any CPU is supported */
|
||||
}
|
||||
#endif
|
||||
|
||||
bool __init shmobile_smp_init_fallback_ops(void)
|
||||
{
|
||||
/* fallback on PSCI/smp_ops if no other DT based method is detected */
|
||||
if (!IS_ENABLED(CONFIG_SMP))
|
||||
return false;
|
||||
|
||||
return platform_can_secondary_boot() ? true : false;
|
||||
}
|
||||
|
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* r8a7779 Power management support
|
||||
*
|
||||
* 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 <linux/soc/renesas/rcar-sysc.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "r8a7779.h"
|
||||
|
||||
/* SYSC */
|
||||
#define SYSCIER 0x0c
|
||||
#define SYSCIMR 0x10
|
||||
|
||||
#if defined(CONFIG_PM) || defined(CONFIG_SMP)
|
||||
|
||||
static void __init r8a7779_sysc_init(void)
|
||||
{
|
||||
rcar_sysc_init(0xffd85000, 0x0131000e);
|
||||
}
|
||||
|
||||
#else /* CONFIG_PM || CONFIG_SMP */
|
||||
|
||||
static inline void r8a7779_sysc_init(void) {}
|
||||
|
||||
#endif /* CONFIG_PM || CONFIG_SMP */
|
||||
|
||||
void __init r8a7779_pm_init(void)
|
||||
{
|
||||
static int once;
|
||||
|
||||
if (!once++)
|
||||
r8a7779_sysc_init();
|
||||
}
|
@ -15,7 +15,6 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/soc/renesas/rcar-sysc.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/cputype.h>
|
||||
#include "common.h"
|
||||
@ -46,23 +45,6 @@ static inline u32 phys_to_sbar(phys_addr_t addr)
|
||||
return (addr >> 8) & 0xfffffc00;
|
||||
}
|
||||
|
||||
/* SYSC */
|
||||
#define SYSCIER 0x0c
|
||||
#define SYSCIMR 0x10
|
||||
|
||||
#if defined(CONFIG_SMP)
|
||||
|
||||
static void __init rcar_gen2_sysc_init(u32 syscier)
|
||||
{
|
||||
rcar_sysc_init(0xe6180000, syscier);
|
||||
}
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
static inline void rcar_gen2_sysc_init(u32 syscier) {}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
void __init rcar_gen2_pm_init(void)
|
||||
{
|
||||
void __iomem *p;
|
||||
@ -72,7 +54,6 @@ void __init rcar_gen2_pm_init(void)
|
||||
bool has_a7 = false;
|
||||
bool has_a15 = false;
|
||||
struct resource res;
|
||||
u32 syscier = 0;
|
||||
int error;
|
||||
|
||||
if (once++)
|
||||
@ -89,11 +70,6 @@ void __init rcar_gen2_pm_init(void)
|
||||
has_a7 = true;
|
||||
}
|
||||
|
||||
if (of_machine_is_compatible("renesas,r8a7790"))
|
||||
syscier = 0x013111ef;
|
||||
else if (of_machine_is_compatible("renesas,r8a7791"))
|
||||
syscier = 0x00111003;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "renesas,smp-sram");
|
||||
if (!np) {
|
||||
/* No smp-sram in DT, fall back to hardcoded address */
|
||||
@ -155,6 +131,5 @@ map:
|
||||
}
|
||||
iounmap(p);
|
||||
|
||||
rcar_gen2_sysc_init(syscier);
|
||||
shmobile_smp_apmu_suspend_init();
|
||||
}
|
||||
|
@ -2,8 +2,6 @@
|
||||
#ifndef __ASM_R8A7779_H__
|
||||
#define __ASM_R8A7779_H__
|
||||
|
||||
extern void r8a7779_pm_init(void);
|
||||
|
||||
extern const struct smp_operations r8a7779_smp_ops;
|
||||
|
||||
#endif /* __ASM_R8A7779_H__ */
|
||||
|
@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_R8A7790_H__
|
||||
#define __ASM_R8A7790_H__
|
||||
|
||||
extern const struct smp_operations r8a7790_smp_ops;
|
||||
|
||||
#endif /* __ASM_R8A7790_H__ */
|
@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_R8A7791_H__
|
||||
#define __ASM_R8A7791_H__
|
||||
|
||||
extern const struct smp_operations r8a7791_smp_ops;
|
||||
|
||||
#endif /* __ASM_R8A7791_H__ */
|
@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* R-Car Generation 2 da9063/da9210 regulator quirk
|
||||
*
|
||||
@ -16,15 +17,6 @@
|
||||
* been initialized, but before the i2c slave drivers are initialized.
|
||||
*
|
||||
* Copyright (C) 2015 Glider bvba
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
|
@ -1,16 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Emma Mobile EV2 processor support
|
||||
*
|
||||
* Copyright (C) 2012 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -1,17 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* r7s72100 processor support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -1,17 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* r8a73a4 processor support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
|
@ -1,17 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* R8A7740 processor support
|
||||
*
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -1,18 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* r8a7778 processor support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
* Copyright (C) 2013 Cogent Embedded, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
|
@ -1,18 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* r8a7779 processor support
|
||||
*
|
||||
* Copyright (C) 2011, 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
* Copyright (C) 2013 Cogent Embedded, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* r8a7790 processor support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "r8a7790.h"
|
||||
#include "rcar-gen2.h"
|
||||
|
||||
static const char * const r8a7790_boards_compat_dt[] __initconst = {
|
||||
"renesas,r8a7790",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
|
||||
.smp_init = smp_init_ops(shmobile_smp_init_fallback_ops),
|
||||
.smp = smp_ops(r8a7790_smp_ops),
|
||||
.init_early = shmobile_init_delay,
|
||||
.init_time = rcar_gen2_timer_init,
|
||||
.init_late = shmobile_init_late,
|
||||
.reserve = rcar_gen2_reserve,
|
||||
.dt_compat = r8a7790_boards_compat_dt,
|
||||
MACHINE_END
|
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* r8a7791 processor support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Electronics Corporation
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "r8a7791.h"
|
||||
#include "rcar-gen2.h"
|
||||
|
||||
static const char *const r8a7791_boards_compat_dt[] __initconst = {
|
||||
"renesas,r8a7791",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(R8A7791_DT, "Generic R8A7791 (Flattened Device Tree)")
|
||||
.smp_init = smp_init_ops(shmobile_smp_init_fallback_ops),
|
||||
.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
|
@ -1,18 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* R-Car Generation 2 support
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
* Copyright (C) 2014 Ulrich Hecht
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
@ -186,10 +178,8 @@ void __init rcar_gen2_reserve(void)
|
||||
}
|
||||
|
||||
static const char * const rcar_gen2_boards_compat_dt[] __initconst = {
|
||||
/*
|
||||
* R8A7790 and R8A7791 can't be handled here as long as they need SMP
|
||||
* initialization fallback.
|
||||
*/
|
||||
"renesas,r8a7790",
|
||||
"renesas,r8a7791",
|
||||
"renesas,r8a7792",
|
||||
"renesas,r8a7793",
|
||||
"renesas,r8a7794",
|
||||
|
@ -1,18 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* sh73a0 processor support
|
||||
*
|
||||
* Copyright (C) 2010 Takashi Yoshii
|
||||
* Copyright (C) 2010 Magnus Damm
|
||||
* Copyright (C) 2008 Yoshihiro Shimoda
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -1,17 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SMP support for Emma Mobile EV2
|
||||
*
|
||||
* Copyright (C) 2012 Renesas Solutions Corp.
|
||||
* Copyright (C) 2012 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -1,17 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SMP support for R-Mobile / SH-Mobile - r8a7779 portion
|
||||
*
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
@ -31,59 +23,24 @@
|
||||
#define AVECR IOMEM(0xfe700040)
|
||||
#define R8A7779_SCU_BASE 0xf0000000
|
||||
|
||||
static const struct rcar_sysc_ch r8a7779_ch_cpu1 = {
|
||||
.chan_offs = 0x40, /* PWRSR0 .. PWRER0 */
|
||||
.chan_bit = 1, /* ARM1 */
|
||||
.isr_bit = 1, /* ARM1 */
|
||||
};
|
||||
|
||||
static const struct rcar_sysc_ch r8a7779_ch_cpu2 = {
|
||||
.chan_offs = 0x40, /* PWRSR0 .. PWRER0 */
|
||||
.chan_bit = 2, /* ARM2 */
|
||||
.isr_bit = 2, /* ARM2 */
|
||||
};
|
||||
|
||||
static const struct rcar_sysc_ch r8a7779_ch_cpu3 = {
|
||||
.chan_offs = 0x40, /* PWRSR0 .. PWRER0 */
|
||||
.chan_bit = 3, /* ARM3 */
|
||||
.isr_bit = 3, /* ARM3 */
|
||||
};
|
||||
|
||||
static const struct rcar_sysc_ch * const r8a7779_ch_cpu[4] = {
|
||||
[1] = &r8a7779_ch_cpu1,
|
||||
[2] = &r8a7779_ch_cpu2,
|
||||
[3] = &r8a7779_ch_cpu3,
|
||||
};
|
||||
|
||||
static int r8a7779_platform_cpu_kill(unsigned int cpu)
|
||||
{
|
||||
const struct rcar_sysc_ch *ch = NULL;
|
||||
int ret = -EIO;
|
||||
|
||||
cpu = cpu_logical_map(cpu);
|
||||
|
||||
if (cpu < ARRAY_SIZE(r8a7779_ch_cpu))
|
||||
ch = r8a7779_ch_cpu[cpu];
|
||||
|
||||
if (ch)
|
||||
ret = rcar_sysc_power_down(ch);
|
||||
if (cpu)
|
||||
ret = rcar_sysc_power_down_cpu(cpu);
|
||||
|
||||
return ret ? ret : 1;
|
||||
}
|
||||
|
||||
static int r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
{
|
||||
const struct rcar_sysc_ch *ch = NULL;
|
||||
unsigned int lcpu = cpu_logical_map(cpu);
|
||||
int ret;
|
||||
int ret = -EIO;
|
||||
|
||||
if (lcpu < ARRAY_SIZE(r8a7779_ch_cpu))
|
||||
ch = r8a7779_ch_cpu[lcpu];
|
||||
|
||||
if (ch)
|
||||
ret = rcar_sysc_power_up(ch);
|
||||
else
|
||||
ret = -EIO;
|
||||
cpu = cpu_logical_map(cpu);
|
||||
if (cpu)
|
||||
ret = rcar_sysc_power_up_cpu(cpu);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -95,13 +52,6 @@ static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)
|
||||
|
||||
/* setup r8a7779 specific SCU bits */
|
||||
shmobile_smp_scu_prepare_cpus(R8A7779_SCU_BASE, max_cpus);
|
||||
|
||||
r8a7779_pm_init();
|
||||
|
||||
/* power off secondary CPUs */
|
||||
r8a7779_platform_cpu_kill(1);
|
||||
r8a7779_platform_cpu_kill(2);
|
||||
r8a7779_platform_cpu_kill(3);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* SMP support for r8a7790
|
||||
*
|
||||
* Copyright (C) 2012-2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2012 Takashi Yoshii <takashi.yoshii.ze@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/soc/renesas/rcar-sysc.h>
|
||||
|
||||
#include <asm/smp_plat.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "platsmp-apmu.h"
|
||||
#include "rcar-gen2.h"
|
||||
#include "r8a7790.h"
|
||||
|
||||
static const struct rcar_sysc_ch r8a7790_ca15_scu = {
|
||||
.chan_offs = 0x180, /* PWRSR5 .. PWRER5 */
|
||||
.isr_bit = 12, /* CA15-SCU */
|
||||
};
|
||||
|
||||
static const struct rcar_sysc_ch r8a7790_ca7_scu = {
|
||||
.chan_offs = 0x100, /* PWRSR3 .. PWRER3 */
|
||||
.isr_bit = 21, /* CA7-SCU */
|
||||
};
|
||||
|
||||
static struct rcar_apmu_config r8a7790_apmu_config[] = {
|
||||
{
|
||||
.iomem = DEFINE_RES_MEM(0xe6152000, 0x188),
|
||||
.cpus = { 0, 1, 2, 3 },
|
||||
},
|
||||
{
|
||||
.iomem = DEFINE_RES_MEM(0xe6151000, 0x188),
|
||||
.cpus = { 0x100, 0x0101, 0x102, 0x103 },
|
||||
}
|
||||
};
|
||||
|
||||
static void __init r8a7790_smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
/* let APMU code install data related to shmobile_boot_vector */
|
||||
shmobile_smp_apmu_prepare_cpus(max_cpus,
|
||||
r8a7790_apmu_config,
|
||||
ARRAY_SIZE(r8a7790_apmu_config));
|
||||
|
||||
/* turn on power to SCU */
|
||||
rcar_gen2_pm_init();
|
||||
rcar_sysc_power_up(&r8a7790_ca15_scu);
|
||||
rcar_sysc_power_up(&r8a7790_ca7_scu);
|
||||
}
|
||||
|
||||
const struct smp_operations r8a7790_smp_ops __initconst = {
|
||||
.smp_prepare_cpus = r8a7790_smp_prepare_cpus,
|
||||
.smp_boot_secondary = shmobile_smp_apmu_boot_secondary,
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
.cpu_can_disable = shmobile_smp_cpu_can_disable,
|
||||
.cpu_die = shmobile_smp_apmu_cpu_die,
|
||||
.cpu_kill = shmobile_smp_apmu_cpu_kill,
|
||||
#endif
|
||||
};
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* SMP support for r8a7791
|
||||
*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Magnus Damm
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/smp_plat.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "platsmp-apmu.h"
|
||||
#include "r8a7791.h"
|
||||
#include "rcar-gen2.h"
|
||||
|
||||
static struct rcar_apmu_config r8a7791_apmu_config[] = {
|
||||
{
|
||||
.iomem = DEFINE_RES_MEM(0xe6152000, 0x188),
|
||||
.cpus = { 0, 1 },
|
||||
}
|
||||
};
|
||||
|
||||
static void __init r8a7791_smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
/* let APMU code install data related to shmobile_boot_vector */
|
||||
shmobile_smp_apmu_prepare_cpus(max_cpus,
|
||||
r8a7791_apmu_config,
|
||||
ARRAY_SIZE(r8a7791_apmu_config));
|
||||
|
||||
rcar_gen2_pm_init();
|
||||
}
|
||||
|
||||
const struct smp_operations r8a7791_smp_ops __initconst = {
|
||||
.smp_prepare_cpus = r8a7791_smp_prepare_cpus,
|
||||
.smp_boot_secondary = shmobile_smp_apmu_boot_secondary,
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
.cpu_can_disable = shmobile_smp_cpu_can_disable,
|
||||
.cpu_die = shmobile_smp_apmu_cpu_die,
|
||||
.cpu_kill = shmobile_smp_apmu_cpu_kill,
|
||||
#endif
|
||||
};
|
@ -58,6 +58,12 @@
|
||||
|
||||
#define RCAR_PD_ALWAYS_ON 32 /* Always-on power area */
|
||||
|
||||
struct rcar_sysc_ch {
|
||||
u16 chan_offs;
|
||||
u8 chan_bit;
|
||||
u8 isr_bit;
|
||||
};
|
||||
|
||||
static void __iomem *rcar_sysc_base;
|
||||
static DEFINE_SPINLOCK(rcar_sysc_lock); /* SMP CPUs + I/O devices */
|
||||
|
||||
@ -143,12 +149,12 @@ static int rcar_sysc_power(const struct rcar_sysc_ch *sysc_ch, bool on)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rcar_sysc_power_down(const struct rcar_sysc_ch *sysc_ch)
|
||||
static int rcar_sysc_power_down(const struct rcar_sysc_ch *sysc_ch)
|
||||
{
|
||||
return rcar_sysc_power(sysc_ch, false);
|
||||
}
|
||||
|
||||
int rcar_sysc_power_up(const struct rcar_sysc_ch *sysc_ch)
|
||||
static int rcar_sysc_power_up(const struct rcar_sysc_ch *sysc_ch)
|
||||
{
|
||||
return rcar_sysc_power(sysc_ch, true);
|
||||
}
|
||||
@ -315,6 +321,8 @@ struct rcar_pm_domains {
|
||||
struct generic_pm_domain *domains[RCAR_PD_ALWAYS_ON + 1];
|
||||
};
|
||||
|
||||
static struct genpd_onecell_data *rcar_sysc_onecell_data;
|
||||
|
||||
static int __init rcar_sysc_pd_init(void)
|
||||
{
|
||||
const struct rcar_sysc_info *info;
|
||||
@ -326,9 +334,6 @@ static int __init rcar_sysc_pd_init(void)
|
||||
unsigned int i;
|
||||
int error;
|
||||
|
||||
if (rcar_sysc_base)
|
||||
return 0;
|
||||
|
||||
np = of_find_matching_node_and_match(NULL, rcar_sysc_matches, &match);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
@ -361,6 +366,7 @@ static int __init rcar_sysc_pd_init(void)
|
||||
|
||||
domains->onecell_data.domains = domains->domains;
|
||||
domains->onecell_data.num_domains = ARRAY_SIZE(domains->domains);
|
||||
rcar_sysc_onecell_data = &domains->onecell_data;
|
||||
|
||||
for (i = 0, syscier = 0; i < info->num_areas; i++)
|
||||
syscier |= BIT(info->areas[i].isr_bit);
|
||||
@ -448,27 +454,39 @@ void __init rcar_sysc_nullify(struct rcar_sysc_area *areas,
|
||||
}
|
||||
}
|
||||
|
||||
void __init rcar_sysc_init(phys_addr_t base, u32 syscier)
|
||||
#ifdef CONFIG_ARCH_R8A7779
|
||||
static int rcar_sysc_power_cpu(unsigned int idx, bool on)
|
||||
{
|
||||
u32 syscimr;
|
||||
struct generic_pm_domain *genpd;
|
||||
struct rcar_sysc_pd *pd;
|
||||
unsigned int i;
|
||||
|
||||
if (!rcar_sysc_pd_init())
|
||||
return;
|
||||
if (!rcar_sysc_onecell_data)
|
||||
return -ENODEV;
|
||||
|
||||
rcar_sysc_base = ioremap_nocache(base, PAGE_SIZE);
|
||||
for (i = 0; i < rcar_sysc_onecell_data->num_domains; i++) {
|
||||
genpd = rcar_sysc_onecell_data->domains[i];
|
||||
if (!genpd)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Mask all interrupt sources to prevent the CPU from receiving them.
|
||||
* Make sure not to clear reserved bits that were set before.
|
||||
*/
|
||||
syscimr = ioread32(rcar_sysc_base + SYSCIMR);
|
||||
syscimr |= syscier;
|
||||
pr_debug("%s: syscimr = 0x%08x\n", __func__, syscimr);
|
||||
iowrite32(syscimr, rcar_sysc_base + SYSCIMR);
|
||||
pd = to_rcar_pd(genpd);
|
||||
if (!(pd->flags & PD_CPU) || pd->ch.chan_bit != idx)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* SYSC needs all interrupt sources enabled to control power.
|
||||
*/
|
||||
pr_debug("%s: syscier = 0x%08x\n", __func__, syscier);
|
||||
iowrite32(syscier, rcar_sysc_base + SYSCIER);
|
||||
return on ? rcar_sysc_power_up(&pd->ch)
|
||||
: rcar_sysc_power_down(&pd->ch);
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int rcar_sysc_power_down_cpu(unsigned int cpu)
|
||||
{
|
||||
return rcar_sysc_power_cpu(cpu, false);
|
||||
}
|
||||
|
||||
int rcar_sysc_power_up_cpu(unsigned int cpu)
|
||||
{
|
||||
return rcar_sysc_power_cpu(cpu, true);
|
||||
}
|
||||
#endif /* CONFIG_ARCH_R8A7779 */
|
||||
|
@ -2,16 +2,7 @@
|
||||
#ifndef __LINUX_SOC_RENESAS_RCAR_SYSC_H__
|
||||
#define __LINUX_SOC_RENESAS_RCAR_SYSC_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct rcar_sysc_ch {
|
||||
u16 chan_offs;
|
||||
u8 chan_bit;
|
||||
u8 isr_bit;
|
||||
};
|
||||
|
||||
int rcar_sysc_power_down(const struct rcar_sysc_ch *sysc_ch);
|
||||
int rcar_sysc_power_up(const struct rcar_sysc_ch *sysc_ch);
|
||||
void rcar_sysc_init(phys_addr_t base, u32 syscier);
|
||||
int rcar_sysc_power_down_cpu(unsigned int cpu);
|
||||
int rcar_sysc_power_up_cpu(unsigned int cpu);
|
||||
|
||||
#endif /* __LINUX_SOC_RENESAS_RCAR_SYSC_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user