2013-10-01 17:13:16 +09:00
/*
* 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>
2014-06-20 18:53:07 +02:00
2013-10-01 17:13:16 +09:00
# include <asm/smp_plat.h>
2014-06-20 18:53:07 +02:00
2014-06-17 16:47:37 +09:00
# include "common.h"
2014-10-24 17:33:08 +09:00
# include "platsmp-apmu.h"
2014-06-20 18:53:07 +02:00
# include "r8a7791.h"
2014-06-17 16:48:01 +09:00
# include "rcar-gen2.h"
2013-10-01 17:13:16 +09:00
2014-10-24 17:33:08 +09:00
static struct rcar_apmu_config r8a7791_apmu_config [ ] = {
{
2015-02-03 15:57:42 +01:00
. iomem = DEFINE_RES_MEM ( 0xe6152000 , 0x188 ) ,
2014-10-24 17:33:09 +09:00
. cpus = { 0 , 1 } ,
2014-10-24 17:33:08 +09:00
}
} ;
2013-10-01 17:13:16 +09:00
static void __init r8a7791_smp_prepare_cpus ( unsigned int max_cpus )
{
/* let APMU code install data related to shmobile_boot_vector */
2014-10-24 17:33:08 +09:00
shmobile_smp_apmu_prepare_cpus ( max_cpus ,
r8a7791_apmu_config ,
ARRAY_SIZE ( r8a7791_apmu_config ) ) ;
2013-10-01 17:13:16 +09:00
2015-03-16 14:48:43 +09:00
rcar_gen2_pm_init ( ) ;
2013-10-01 17:13:16 +09:00
}
2014-02-26 18:59:16 +09:00
static int r8a7791_smp_boot_secondary ( unsigned int cpu ,
struct task_struct * idle )
{
/* Error out when hardware debug mode is enabled */
if ( rcar_gen2_read_mode_pins ( ) & BIT ( 21 ) ) {
pr_warn ( " Unable to boot CPU%u when MD21 is set \n " , cpu ) ;
return - ENOTSUPP ;
}
return shmobile_smp_apmu_boot_secondary ( cpu , idle ) ;
}
2015-11-15 10:39:53 +09:00
const struct smp_operations r8a7791_smp_ops __initconst = {
2013-10-01 17:13:16 +09:00
. smp_prepare_cpus = r8a7791_smp_prepare_cpus ,
2014-02-26 18:59:16 +09:00
. smp_boot_secondary = r8a7791_smp_boot_secondary ,
2013-10-01 17:13:16 +09:00
# ifdef CONFIG_HOTPLUG_CPU
2015-07-29 00:34:48 +01:00
. cpu_can_disable = shmobile_smp_cpu_can_disable ,
2013-10-01 17:13:16 +09:00
. cpu_die = shmobile_smp_apmu_cpu_die ,
. cpu_kill = shmobile_smp_apmu_cpu_kill ,
# endif
} ;