1/* 2 * SMP support for r8a7791 3 * 4 * Copyright (C) 2013 Renesas Solutions Corp. 5 * Copyright (C) 2013 Magnus Damm 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 "r8a7791.h" 26#include "rcar-gen2.h" 27 28static struct rcar_apmu_config r8a7791_apmu_config[] = { 29 { 30 .iomem = DEFINE_RES_MEM(0xe6152000, 0x188), 31 .cpus = { 0, 1 }, 32 } 33}; 34 35static void __init r8a7791_smp_prepare_cpus(unsigned int max_cpus) 36{ 37 /* let APMU code install data related to shmobile_boot_vector */ 38 shmobile_smp_apmu_prepare_cpus(max_cpus, 39 r8a7791_apmu_config, 40 ARRAY_SIZE(r8a7791_apmu_config)); 41 42 rcar_gen2_pm_init(); 43} 44 45static int r8a7791_smp_boot_secondary(unsigned int cpu, 46 struct task_struct *idle) 47{ 48 /* Error out when hardware debug mode is enabled */ 49 if (rcar_gen2_read_mode_pins() & BIT(21)) { 50 pr_warn("Unable to boot CPU%u when MD21 is set\n", cpu); 51 return -ENOTSUPP; 52 } 53 54 return shmobile_smp_apmu_boot_secondary(cpu, idle); 55} 56 57struct smp_operations r8a7791_smp_ops __initdata = { 58 .smp_prepare_cpus = r8a7791_smp_prepare_cpus, 59 .smp_boot_secondary = r8a7791_smp_boot_secondary, 60#ifdef CONFIG_HOTPLUG_CPU 61 .cpu_disable = shmobile_smp_cpu_disable, 62 .cpu_die = shmobile_smp_apmu_cpu_die, 63 .cpu_kill = shmobile_smp_apmu_cpu_kill, 64#endif 65}; 66