ARM: shmobile: Disconnect EMEV2 SMP code from clocks
authorMagnus Damm <damm@opensource.se>
Tue, 2 Jul 2013 09:28:30 +0000 (18:28 +0900)
committerSimon Horman <horms+renesas@verge.net.au>
Wed, 17 Jul 2013 05:26:55 +0000 (14:26 +0900)
Update the EMEV2 SMP code to access the SMU directly
instead of relying on help from the legacy clock code.

This change moves us one step closer to common clocks.

Signed-off-by: Magnus Damm <damm@opensource.se>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
arch/arm/mach-shmobile/clock-emev2.c
arch/arm/mach-shmobile/include/mach/emev2.h
arch/arm/mach-shmobile/smp-emev2.c

index 56dd0cfcddc774f70660ca53f7145eb6786d8367..5ac13ba71d54c2e4c8a600c97f177f4250901f9a 100644 (file)
@@ -40,7 +40,6 @@
 #define USIB2SCLKDIV 0x65c
 #define USIB3SCLKDIV 0x660
 #define STI_CLKSEL 0x688
-#define SMU_GENERAL_REG0 0x7c0
 
 /* not pretty, but hey */
 static void __iomem *smu_base;
@@ -51,11 +50,6 @@ static void emev2_smu_write(unsigned long value, int offs)
        iowrite32(value, smu_base + offs);
 }
 
-void emev2_set_boot_vector(unsigned long value)
-{
-       emev2_smu_write(value, SMU_GENERAL_REG0);
-}
-
 static struct clk_mapping smu_mapping = {
        .phys   = EMEV2_SMU_BASE,
        .len    = PAGE_SIZE,
@@ -205,18 +199,6 @@ static struct clk_lookup lookups[] = {
 void __init emev2_clock_init(void)
 {
        int k, ret = 0;
-       static int is_setup;
-
-       /* yuck, this is ugly as hell, but the non-smp case of clocks
-        * code is now designed to rely on ioremap() instead of static
-        * entity maps. in the case of smp we need access to the SMU
-        * register earlier than ioremap() is actually working without
-        * any static maps. to enable SMP in ugly but with dynamic
-        * mappings we have to call emev2_clock_init() from different
-        * places depending on UP and SMP...
-        */
-       if (is_setup++)
-               return;
 
        smu_base = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
        BUG_ON(!smu_base);
index b0ab4b72770adae9e66e39324e87924651d4190b..c2eb7568d9bed4080b468efa9aba4a26e7d6d043 100644 (file)
@@ -5,7 +5,6 @@ extern void emev2_map_io(void);
 extern void emev2_init_delay(void);
 extern void emev2_add_standard_devices(void);
 extern void emev2_clock_init(void);
-extern void emev2_set_boot_vector(unsigned long value);
 
 #define EMEV2_GPIO_BASE 200
 #define EMEV2_GPIO_IRQ(n) (EMEV2_GPIO_BASE + (n))
index 97871655b716db6993ae84b1acba0e2d80187a66..1bf8bc7e8ed8aa17d651b292e25150fad0cd551d 100644 (file)
@@ -29,6 +29,8 @@
 #include <asm/smp_scu.h>
 
 #define EMEV2_SCU_BASE 0x1e000000
+#define EMEV2_SMU_BASE 0xe0110000
+#define SMU_GENERAL_REG0 0x7c0
 
 static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
@@ -38,13 +40,18 @@ static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *
 
 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) */
-       emev2_clock_init(); /* need ioremapped SMU */
-       emev2_set_boot_vector(__pa(shmobile_boot_vector));
+       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;