1/* 2 * SMP support for r8a7790 3 * 4 * Copyright (C) 2012-2013 Renesas Solutions Corp. 5 * Copyright (C) 2012 Takashi Yoshii <takashi.yoshii.ze@renesas.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; version 2 of the License. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 */ 16#include <linux/kernel.h> 17#include <linux/init.h> 18#include <linux/smp.h> 19#include <linux/io.h> 20 21#include <asm/smp_plat.h> 22 23#include "common.h" 24#include "platsmp-apmu.h" 25#include "pm-rcar.h" 26#include "rcar-gen2.h" 27#include "r8a7790.h" 28 29static struct rcar_sysc_ch r8a7790_ca15_scu = { 30 .chan_offs = 0x180, /* PWRSR5 .. PWRER5 */ 31 .isr_bit = 12, /* CA15-SCU */ 32}; 33 34static struct rcar_sysc_ch r8a7790_ca7_scu = { 35 .chan_offs = 0x100, /* PWRSR3 .. PWRER3 */ 36 .isr_bit = 21, /* CA7-SCU */ 37}; 38 39static struct rcar_apmu_config r8a7790_apmu_config[] = { 40 { 41 .iomem = DEFINE_RES_MEM(0xe6152000, 0x188), 42 .cpus = { 0, 1, 2, 3 }, 43 }, 44 { 45 .iomem = DEFINE_RES_MEM(0xe6151000, 0x188), 46 .cpus = { 0x100, 0x0101, 0x102, 0x103 }, 47 } 48}; 49 50static void __init r8a7790_smp_prepare_cpus(unsigned int max_cpus) 51{ 52 /* let APMU code install data related to shmobile_boot_vector */ 53 shmobile_smp_apmu_prepare_cpus(max_cpus, 54 r8a7790_apmu_config, 55 ARRAY_SIZE(r8a7790_apmu_config)); 56 57 /* turn on power to SCU */ 58 rcar_gen2_pm_init(); 59 rcar_sysc_power_up(&r8a7790_ca15_scu); 60 rcar_sysc_power_up(&r8a7790_ca7_scu); 61} 62 63struct smp_operations r8a7790_smp_ops __initdata = { 64 .smp_prepare_cpus = r8a7790_smp_prepare_cpus, 65 .smp_boot_secondary = shmobile_smp_apmu_boot_secondary, 66#ifdef CONFIG_HOTPLUG_CPU 67 .cpu_disable = shmobile_smp_cpu_disable, 68 .cpu_die = shmobile_smp_apmu_cpu_die, 69 .cpu_kill = shmobile_smp_apmu_cpu_kill, 70#endif 71}; 72