2013-08-29 03:22:07 +04:00
/*
* 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>
2014-06-20 20:53:06 +04:00
2013-08-29 03:22:07 +04:00
# include <asm/smp_plat.h>
2014-06-20 20:53:06 +04:00
2014-06-17 11:47:37 +04:00
# include "common.h"
2014-10-24 12:33:08 +04:00
# include "platsmp-apmu.h"
2014-06-17 11:47:53 +04:00
# include "pm-rcar.h"
2015-03-16 08:48:43 +03:00
# include "rcar-gen2.h"
2014-06-20 20:53:06 +04:00
# include "r8a7790.h"
2013-08-29 03:22:07 +04:00
2015-06-04 21:22:35 +03:00
static const struct rcar_sysc_ch r8a7790_ca15_scu = {
2014-01-15 16:26:13 +04:00
. chan_offs = 0x180 , /* PWRSR5 .. PWRER5 */
. isr_bit = 12 , /* CA15-SCU */
} ;
2015-06-04 21:22:35 +03:00
static const struct rcar_sysc_ch r8a7790_ca7_scu = {
2014-01-15 16:26:04 +04:00
. chan_offs = 0x100 , /* PWRSR3 .. PWRER3 */
. isr_bit = 21 , /* CA7-SCU */
} ;
2014-10-24 12:33:08 +04:00
static struct rcar_apmu_config r8a7790_apmu_config [ ] = {
{
2015-02-03 17:57:41 +03:00
. iomem = DEFINE_RES_MEM ( 0xe6152000 , 0x188 ) ,
2014-10-24 12:33:08 +04:00
. cpus = { 0 , 1 , 2 , 3 } ,
} ,
{
2015-02-03 17:57:41 +03:00
. iomem = DEFINE_RES_MEM ( 0xe6151000 , 0x188 ) ,
2014-10-24 12:33:08 +04:00
. cpus = { 0x100 , 0x0101 , 0x102 , 0x103 } ,
}
} ;
2013-08-29 03:22:07 +04:00
static void __init r8a7790_smp_prepare_cpus ( unsigned int max_cpus )
{
/* let APMU code install data related to shmobile_boot_vector */
2014-10-24 12:33:08 +04:00
shmobile_smp_apmu_prepare_cpus ( max_cpus ,
r8a7790_apmu_config ,
ARRAY_SIZE ( r8a7790_apmu_config ) ) ;
2013-08-29 03:22:07 +04:00
2014-01-15 16:26:04 +04:00
/* turn on power to SCU */
2015-03-16 08:48:43 +03:00
rcar_gen2_pm_init ( ) ;
2014-01-15 16:26:13 +04:00
rcar_sysc_power_up ( & r8a7790_ca15_scu ) ;
2014-01-15 16:26:04 +04:00
rcar_sysc_power_up ( & r8a7790_ca7_scu ) ;
2013-08-29 03:22:07 +04:00
}
struct smp_operations r8a7790_smp_ops __initdata = {
. smp_prepare_cpus = r8a7790_smp_prepare_cpus ,
. smp_boot_secondary = shmobile_smp_apmu_boot_secondary ,
# ifdef CONFIG_HOTPLUG_CPU
2015-07-29 02:34:48 +03:00
. cpu_can_disable = shmobile_smp_cpu_can_disable ,
2013-08-29 03:22:07 +04:00
. cpu_die = shmobile_smp_apmu_cpu_die ,
. cpu_kill = shmobile_smp_apmu_cpu_kill ,
# endif
} ;