linux-pinenote/arch/arm/mach-shmobile/smp-emev2.c
Olof Johansson fc5d46222f Merge tag 'renesas-soc-for-v3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/soc
From Simon Horman:
Renesas ARM based SoC updates for v3.12

* Setup arch timer based on MD pins on r8a7790 SoC
* Thermal driver support for r8a7790 SoC
* Make arch timer optional for r8a7790 and r8a73a4 SoCs
* CMT10 clock event for r8a7790 and r8a73a4 SoCs
* Increased clock coverage for r8a73a4 SoC
* MMCIF DMA definitions for r8a7740 SoC
* Disconnect SMP code from clocks on emev2 SoC

* tag 'renesas-soc-for-v3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: (49 commits)
  ARM: shmobile: Setup r8a7790 arch timer based on MD pins
  ARM: shmobile: Introduce r8a7790_read_mode_pins()
  ARM: shmobile: r8a7740: add MMCIF DMA definitions
  ARM: shmobile: Disconnect EMEV2 SMP code from clocks
  ARM: shmobile: Make r8a73a4 Arch timer optional
  ARM: shmobile: Add r8a73a4 CMT10 clock event
  ARM: shmobile: Make r8a7790 Arch timer optional
  ARM: shmobile: Add r8a7790 CMT00 clock event
  ARM: shmobile: Sort r8a7790 MSTP entries
  ARM: shmobile: r8a73a4: add clocks for I2C controllers
  ARM: shmobile: r8a73a4: add Z2 clock support
  ARM: shmobile: r8a73a4: safeguard against wrong clk_set_rate() uses
  ARM: shmobile: r8a73a4: implement CPU clock scaling for CPUFreq
  ARM: shmobile: r8a73a4: wait for completion when kicking the clock
  ARM: shmobile: r8a7790: add thermal driver support
  ARM: shmobile: r8a7790: add clocks for thermal
  ARM: shmobile: Add SMSC ethernet chip to KZM9D DT reference
  ARM: shmobile: KZM9D DT reference implementation
  ARM: shmobile: r8a7790: add MMCIF and SDHI DT templates
  ARM: shmobile: r8a73a4: add MMCIF and SDHI DT templates
  ...

Signed-off-by: Olof Johansson <olof@lixom.net>
2013-08-14 11:09:46 -07:00

65 lines
2 KiB
C

/*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/smp.h>
#include <linux/spinlock.h>
#include <linux/io.h>
#include <linux/delay.h>
#include <mach/common.h>
#include <mach/emev2.h>
#include <asm/smp_plat.h>
#include <asm/smp_scu.h>
#define EMEV2_SCU_BASE 0x1e000000
#define EMEV2_SMU_BASE 0xe0110000
#define SMU_GENERAL_REG0 0x7c0
static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
{
arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
return 0;
}
static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
{
void __iomem *smu;
/* setup EMEV2 specific SCU base, enable */
shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
scu_enable(shmobile_scu_base);
/* Tell ROM loader about our vector (in headsmp-scu.S, headsmp.S) */
smu = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
if (smu) {
iowrite32(__pa(shmobile_boot_vector), smu + SMU_GENERAL_REG0);
iounmap(smu);
}
shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
shmobile_boot_arg = (unsigned long)shmobile_scu_base;
/* enable cache coherency on booting CPU */
scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
}
struct smp_operations emev2_smp_ops __initdata = {
.smp_prepare_cpus = emev2_smp_prepare_cpus,
.smp_boot_secondary = emev2_boot_secondary,
};