ARM: ux500: call ux500_setup_id later
authorArnd Bergmann <arnd@arndb.de>
Mon, 20 Jun 2016 21:21:20 +0000 (23:21 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 12 Jul 2016 09:24:08 +0000 (11:24 +0200)
ux500_setup_id is currently called from u8500_map_io(), which is
really early, but nothing relies on the ID any more, other than
a printk message that is not really all that important to
have early during boot.

If we move the call to ux500_setup_id() into ux500_soc_device_init(),
that file becomes usuable almost entirely standalone, and we can kill
off the u8500_map_io() callback as it just does the default
debug_ll_io_init() now.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/mach-ux500/cpu-db8500.c
arch/arm/mach-ux500/id.c

index e7eba47..881cafb 100644 (file)
 
 #include "board-mop500.h"
 #include "db8500-regs.h"
-#include "id.h"
-
-static void __init u8500_map_io(void)
-{
-       debug_ll_io_init();
-       ux500_setup_id();
-}
 
 /*
  * The PMU IRQ lines of two cores are wired together into a single interrupt.
@@ -117,7 +110,6 @@ static const char * stericsson_dt_platform_compat[] = {
 DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)")
        .l2c_aux_val    = 0,
        .l2c_aux_mask   = ~0,
-       .map_io         = u8500_map_io,
        .init_irq       = ux500_init_irq,
        .init_machine   = u8500_init_machine,
        .dt_compat      = stericsson_dt_platform_compat,
index 17f80ef..983004d 100644 (file)
@@ -37,21 +37,16 @@ static struct dbx500_asic_id dbx500_id;
 
 static unsigned int __init ux500_read_asicid(phys_addr_t addr)
 {
-       phys_addr_t base = addr & ~0xfff;
-       struct map_desc desc = {
-               .virtual        = (unsigned long)UX500_VIRT_ROM,
-               .pfn            = __phys_to_pfn(base),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       };
+       void __iomem *virt = ioremap(addr, 4);
+       unsigned int asicid;
 
-       iotable_init(&desc, 1);
+       if (!virt)
+               return 0;
 
-       /* As in devicemaps_init() */
-       local_flush_tlb_all();
-       flush_cache_all();
+       asicid = readl(virt);
+       iounmap(virt);
 
-       return readl(UX500_VIRT_ROM + (addr & 0xfff));
+       return asicid;
 }
 
 static void ux500_print_soc_info(unsigned int asicid)
@@ -86,7 +81,7 @@ static unsigned int partnumber(unsigned int asicid)
  * DB9540      0x413fc090      0xFFFFDBF4              0x009540xx
  */
 
-void __init ux500_setup_id(void)
+static void __init ux500_setup_id(void)
 {
        unsigned int cpuid = read_cpuid_id();
        unsigned int asicid = 0;
@@ -197,6 +192,8 @@ struct device * __init ux500_soc_device_init(void)
        struct soc_device *soc_dev;
        struct soc_device_attribute *soc_dev_attr;
 
+       ux500_setup_id();
+
        soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
        if (!soc_dev_attr)
                return ERR_PTR(-ENOMEM);