Merge branch 'tegra/cleanups' into next/timer
Arnd Bergmann [Wed, 21 Mar 2012 14:27:34 +0000 (14:27 +0000)]
Conflicts:
arch/arm/mach-tegra/Makefile
arch/arm/mach-vexpress/core.h

The tegra Makefile was changed in four different branches
in the same line. This merge should reduce the amount
of churn.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

12 files changed:
1  2 
arch/arm/Kconfig
arch/arm/mach-nomadik/board-nhk8815.c
arch/arm/mach-omap2/pm24xx.c
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pb11mp.c
arch/arm/mach-realview/realview_pbx.c
arch/arm/mach-tegra/Makefile
arch/arm/mach-vexpress/core.h
arch/arm/mach-vexpress/ct-ca9x4.c
arch/arm/mach-vexpress/include/mach/ct-ca9x4.h
arch/arm/mach-vexpress/v2m.c
drivers/mmc/host/mmci.c

diff --combined arch/arm/Kconfig
@@@ -186,6 -186,9 +186,9 @@@ config GENERIC_ISA_DM
  config FIQ
        bool
  
+ config NEED_RET_TO_USER
+       bool
  config ARCH_MTD_XIP
        bool
  
@@@ -479,6 -482,7 +482,7 @@@ config ARCH_IOP13X
        select ARCH_SUPPORTS_MSI
        select VMSPLIT_1G
        select NEED_MACH_MEMORY_H
+       select NEED_RET_TO_USER
        help
          Support for Intel's IOP13XX (XScale) family of processors.
  
@@@ -486,6 -490,7 +490,7 @@@ config ARCH_IOP32
        bool "IOP32x-based"
        depends on MMU
        select CPU_XSCALE
+       select NEED_RET_TO_USER
        select PLAT_IOP
        select PCI
        select ARCH_REQUIRE_GPIOLIB
@@@ -497,6 -502,7 +502,7 @@@ config ARCH_IOP33
        bool "IOP33x-based"
        depends on MMU
        select CPU_XSCALE
+       select NEED_RET_TO_USER
        select PLAT_IOP
        select PCI
        select ARCH_REQUIRE_GPIOLIB
@@@ -1280,7 -1286,7 +1286,7 @@@ config ARM_ERRATA_74362
        depends on CPU_V7
        help
          This option enables the workaround for the 743622 Cortex-A9
 -        (r2p0..r2p2) erratum. Under very rare conditions, a faulty
 +        (r2p*) erratum. Under very rare conditions, a faulty
          optimisation in the Cortex-A9 Store Buffer may lead to data
          corruption. This workaround sets a specific bit in the diagnostic
          register of the Cortex-A9 which disables the Store Buffer
  #include <asm/mach/arch.h>
  #include <asm/mach/irq.h>
  #include <asm/mach/flash.h>
 +#include <asm/mach/time.h>
  
  #include <plat/gpio-nomadik.h>
  #include <plat/mtu.h>
  
 -#include <mach/setup.h>
  #include <mach/nand.h>
  #include <mach/fsmc.h>
  
@@@ -185,20 -185,11 +185,11 @@@ static void __init nhk8815_onenand_init
  #endif
  }
  
- #define __MEM_4K_RESOURCE(x) \
-       .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
+ static AMBA_APB_DEVICE(uart0, "uart0", 0, NOMADIK_UART0_BASE,
+       { IRQ_UART0 }, NULL);
  
- static struct amba_device uart0_device = {
-       .dev = { .init_name = "uart0" },
-       __MEM_4K_RESOURCE(NOMADIK_UART0_BASE),
-       .irq = {IRQ_UART0, NO_IRQ},
- };
- static struct amba_device uart1_device = {
-       .dev = { .init_name = "uart1" },
-       __MEM_4K_RESOURCE(NOMADIK_UART1_BASE),
-       .irq = {IRQ_UART1, NO_IRQ},
- };
+ static AMBA_APB_DEVICE(uart1, "uart1", 0, NOMADIK_UART1_BASE,
+       { IRQ_UART1 }, NULL);
  
  static struct amba_device *amba_devs[] __initdata = {
        &uart0_device,
@@@ -255,7 -246,10 +246,7 @@@ static void __init nomadik_timer_init(v
        src_cr |= SRC_CR_INIT_VAL;
        writel(src_cr, io_p2v(NOMADIK_SRC_BASE));
  
 -      /* Save global pointer to mtu, used by platform timer code */
 -      mtu_base = io_p2v(NOMADIK_MTU0_BASE);
 -
 -      nmdk_timer_init();
 +      nmdk_timer_init(io_p2v(NOMADIK_MTU0_BASE));
  }
  
  static struct sys_timer nomadik_timer = {
@@@ -82,7 -82,13 +82,7 @@@ static int omap2_fclks_active(void
        f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
        f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2);
  
 -      /* Ignore UART clocks.  These are handled by UART core (serial.c) */
 -      f1 &= ~(OMAP24XX_EN_UART1_MASK | OMAP24XX_EN_UART2_MASK);
 -      f2 &= ~OMAP24XX_EN_UART3_MASK;
 -
 -      if (f1 | f2)
 -              return 1;
 -      return 0;
 +      return (f1 | f2) ? 1 : 0;
  }
  
  static void omap2_enter_full_retention(void)
@@@ -226,7 -232,6 +226,6 @@@ static int omap2_can_sleep(void
  
  static void omap2_pm_idle(void)
  {
-       local_irq_disable();
        local_fiq_disable();
  
        if (!omap2_can_sleep()) {
  
  out:
        local_fiq_enable();
-       local_irq_enable();
  }
  
  #ifdef CONFIG_SUSPEND
@@@ -462,7 -466,7 +460,7 @@@ static int __init omap2_pm_init(void
        }
  
        suspend_set_ops(&omap_pm_ops);
-       pm_idle = omap2_pm_idle;
+       arm_pm_idle = omap2_pm_idle;
  
        return 0;
  }
@@@ -36,7 -36,7 +36,7 @@@
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
  #include <asm/hardware/cache-l2x0.h>
 -#include <asm/localtimer.h>
 +#include <asm/smp_twd.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
@@@ -135,63 -135,63 +135,63 @@@ static struct pl022_ssp_controller ssp0
  /*
   * These devices are connected via the core APB bridge
   */
- #define GPIO2_IRQ     { IRQ_EB_GPIO2, NO_IRQ }
- #define GPIO3_IRQ     { IRQ_EB_GPIO3, NO_IRQ }
+ #define GPIO2_IRQ     { IRQ_EB_GPIO2 }
+ #define GPIO3_IRQ     { IRQ_EB_GPIO3 }
  
- #define AACI_IRQ      { IRQ_EB_AACI, NO_IRQ }
+ #define AACI_IRQ      { IRQ_EB_AACI }
  #define MMCI0_IRQ     { IRQ_EB_MMCI0A, IRQ_EB_MMCI0B }
- #define KMI0_IRQ      { IRQ_EB_KMI0, NO_IRQ }
- #define KMI1_IRQ      { IRQ_EB_KMI1, NO_IRQ }
+ #define KMI0_IRQ      { IRQ_EB_KMI0 }
+ #define KMI1_IRQ      { IRQ_EB_KMI1 }
  
  /*
   * These devices are connected directly to the multi-layer AHB switch
   */
- #define EB_SMC_IRQ    { NO_IRQ, NO_IRQ }
- #define MPMC_IRQ      { NO_IRQ, NO_IRQ }
- #define EB_CLCD_IRQ   { IRQ_EB_CLCD, NO_IRQ }
- #define DMAC_IRQ      { IRQ_EB_DMA, NO_IRQ }
+ #define EB_SMC_IRQ    { }
+ #define MPMC_IRQ      { }
+ #define EB_CLCD_IRQ   { IRQ_EB_CLCD }
+ #define DMAC_IRQ      { IRQ_EB_DMA }
  
  /*
   * These devices are connected via the core APB bridge
   */
- #define SCTL_IRQ      { NO_IRQ, NO_IRQ }
- #define EB_WATCHDOG_IRQ       { IRQ_EB_WDOG, NO_IRQ }
- #define EB_GPIO0_IRQ  { IRQ_EB_GPIO0, NO_IRQ }
- #define GPIO1_IRQ     { IRQ_EB_GPIO1, NO_IRQ }
- #define EB_RTC_IRQ    { IRQ_EB_RTC, NO_IRQ }
+ #define SCTL_IRQ      { }
+ #define EB_WATCHDOG_IRQ       { IRQ_EB_WDOG }
+ #define EB_GPIO0_IRQ  { IRQ_EB_GPIO0 }
+ #define GPIO1_IRQ     { IRQ_EB_GPIO1 }
+ #define EB_RTC_IRQ    { IRQ_EB_RTC }
  
  /*
   * These devices are connected via the DMA APB bridge
   */
- #define SCI_IRQ               { IRQ_EB_SCI, NO_IRQ }
- #define EB_UART0_IRQ  { IRQ_EB_UART0, NO_IRQ }
- #define EB_UART1_IRQ  { IRQ_EB_UART1, NO_IRQ }
- #define EB_UART2_IRQ  { IRQ_EB_UART2, NO_IRQ }
- #define EB_UART3_IRQ  { IRQ_EB_UART3, NO_IRQ }
- #define EB_SSP_IRQ    { IRQ_EB_SSP, NO_IRQ }
+ #define SCI_IRQ               { IRQ_EB_SCI }
+ #define EB_UART0_IRQ  { IRQ_EB_UART0 }
+ #define EB_UART1_IRQ  { IRQ_EB_UART1 }
+ #define EB_UART2_IRQ  { IRQ_EB_UART2 }
+ #define EB_UART3_IRQ  { IRQ_EB_UART3 }
+ #define EB_SSP_IRQ    { IRQ_EB_SSP }
  
  /* FPGA Primecells */
- AMBA_DEVICE(aaci,  "fpga:aaci",  AACI,     NULL);
- AMBA_DEVICE(mmc0,  "fpga:mmc0",  MMCI0,    &realview_mmc0_plat_data);
- AMBA_DEVICE(kmi0,  "fpga:kmi0",  KMI0,     NULL);
- AMBA_DEVICE(kmi1,  "fpga:kmi1",  KMI1,     NULL);
- AMBA_DEVICE(uart3, "fpga:uart3", EB_UART3, NULL);
+ APB_DEVICE(aaci,  "fpga:aaci",  AACI,     NULL);
+ APB_DEVICE(mmc0,  "fpga:mmc0",  MMCI0,    &realview_mmc0_plat_data);
+ APB_DEVICE(kmi0,  "fpga:kmi0",  KMI0,     NULL);
+ APB_DEVICE(kmi1,  "fpga:kmi1",  KMI1,     NULL);
+ APB_DEVICE(uart3, "fpga:uart3", EB_UART3, NULL);
  
  /* DevChip Primecells */
- AMBA_DEVICE(smc,   "dev:smc",   EB_SMC,   NULL);
- AMBA_DEVICE(clcd,  "dev:clcd",  EB_CLCD,  &clcd_plat_data);
- AMBA_DEVICE(dmac,  "dev:dmac",  DMAC,     NULL);
- AMBA_DEVICE(sctl,  "dev:sctl",  SCTL,     NULL);
- AMBA_DEVICE(wdog,  "dev:wdog",  EB_WATCHDOG, NULL);
- AMBA_DEVICE(gpio0, "dev:gpio0", EB_GPIO0, &gpio0_plat_data);
- AMBA_DEVICE(gpio1, "dev:gpio1", GPIO1,    &gpio1_plat_data);
- AMBA_DEVICE(gpio2, "dev:gpio2", GPIO2,    &gpio2_plat_data);
- AMBA_DEVICE(rtc,   "dev:rtc",   EB_RTC,   NULL);
- AMBA_DEVICE(sci0,  "dev:sci0",  SCI,      NULL);
- AMBA_DEVICE(uart0, "dev:uart0", EB_UART0, NULL);
- AMBA_DEVICE(uart1, "dev:uart1", EB_UART1, NULL);
- AMBA_DEVICE(uart2, "dev:uart2", EB_UART2, NULL);
- AMBA_DEVICE(ssp0,  "dev:ssp0",  EB_SSP,   &ssp0_plat_data);
+ AHB_DEVICE(smc,   "dev:smc",   EB_SMC,   NULL);
+ AHB_DEVICE(clcd,  "dev:clcd",  EB_CLCD,  &clcd_plat_data);
+ AHB_DEVICE(dmac,  "dev:dmac",  DMAC,     NULL);
+ AHB_DEVICE(sctl,  "dev:sctl",  SCTL,     NULL);
+ APB_DEVICE(wdog,  "dev:wdog",  EB_WATCHDOG, NULL);
+ APB_DEVICE(gpio0, "dev:gpio0", EB_GPIO0, &gpio0_plat_data);
+ APB_DEVICE(gpio1, "dev:gpio1", GPIO1,    &gpio1_plat_data);
+ APB_DEVICE(gpio2, "dev:gpio2", GPIO2,    &gpio2_plat_data);
+ APB_DEVICE(rtc,   "dev:rtc",   EB_RTC,   NULL);
+ APB_DEVICE(sci0,  "dev:sci0",  SCI,      NULL);
+ APB_DEVICE(uart0, "dev:uart0", EB_UART0, NULL);
+ APB_DEVICE(uart1, "dev:uart1", EB_UART1, NULL);
+ APB_DEVICE(uart2, "dev:uart2", EB_UART2, NULL);
+ APB_DEVICE(ssp0,  "dev:ssp0",  EB_SSP,   &ssp0_plat_data);
  
  static struct amba_device *amba_devs[] __initdata = {
        &dmac_device,
@@@ -383,23 -383,6 +383,23 @@@ static void realview_eb11mp_fixup(void
        realview_eb_isp1761_resources[1].end    = IRQ_EB11MP_USB;
  }
  
 +#ifdef CONFIG_HAVE_ARM_TWD
 +static DEFINE_TWD_LOCAL_TIMER(twd_local_timer,
 +                            REALVIEW_EB11MP_TWD_BASE,
 +                            IRQ_LOCALTIMER);
 +
 +static void __init realview_eb_twd_init(void)
 +{
 +      if (core_tile_eb11mp() || core_tile_a9mp()) {
 +              int err = twd_local_timer_register(&twd_local_timer);
 +              if (err)
 +                      pr_err("twd_local_timer_register failed %d\n", err);
 +      }
 +}
 +#else
 +#define realview_eb_twd_init()        do { } while(0)
 +#endif
 +
  static void __init realview_eb_timer_init(void)
  {
        unsigned int timer_irq;
        timer2_va_base = __io_address(REALVIEW_EB_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_EB_TIMER2_3_BASE) + 0x20;
  
 -      if (core_tile_eb11mp() || core_tile_a9mp()) {
 -#ifdef CONFIG_LOCAL_TIMERS
 -              twd_base = __io_address(REALVIEW_EB11MP_TWD_BASE);
 -#endif
 +      if (core_tile_eb11mp() || core_tile_a9mp())
                timer_irq = IRQ_EB11MP_TIMER0_1;
 -      } else
 +      else
                timer_irq = IRQ_EB_TIMER0_1;
  
        realview_timer_init(timer_irq);
 +      realview_eb_twd_init();
  }
  
  static struct sys_timer realview_eb_timer = {
@@@ -36,7 -36,7 +36,7 @@@
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
  #include <asm/hardware/cache-l2x0.h>
 -#include <asm/localtimer.h>
 +#include <asm/smp_twd.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/flash.h>
@@@ -127,52 -127,52 +127,52 @@@ static struct pl022_ssp_controller ssp0
   * RealView PB11MPCore AMBA devices
   */
  
- #define GPIO2_IRQ             { IRQ_PB11MP_GPIO2, NO_IRQ }
- #define GPIO3_IRQ             { IRQ_PB11MP_GPIO3, NO_IRQ }
- #define AACI_IRQ              { IRQ_TC11MP_AACI, NO_IRQ }
+ #define GPIO2_IRQ             { IRQ_PB11MP_GPIO2 }
+ #define GPIO3_IRQ             { IRQ_PB11MP_GPIO3 }
+ #define AACI_IRQ              { IRQ_TC11MP_AACI }
  #define MMCI0_IRQ             { IRQ_TC11MP_MMCI0A, IRQ_TC11MP_MMCI0B }
- #define KMI0_IRQ              { IRQ_TC11MP_KMI0, NO_IRQ }
- #define KMI1_IRQ              { IRQ_TC11MP_KMI1, NO_IRQ }
- #define PB11MP_SMC_IRQ                { NO_IRQ, NO_IRQ }
- #define MPMC_IRQ              { NO_IRQ, NO_IRQ }
- #define PB11MP_CLCD_IRQ               { IRQ_PB11MP_CLCD, NO_IRQ }
- #define DMAC_IRQ              { IRQ_PB11MP_DMAC, NO_IRQ }
- #define SCTL_IRQ              { NO_IRQ, NO_IRQ }
- #define PB11MP_WATCHDOG_IRQ   { IRQ_PB11MP_WATCHDOG, NO_IRQ }
- #define PB11MP_GPIO0_IRQ      { IRQ_PB11MP_GPIO0, NO_IRQ }
- #define GPIO1_IRQ             { IRQ_PB11MP_GPIO1, NO_IRQ }
- #define PB11MP_RTC_IRQ                { IRQ_TC11MP_RTC, NO_IRQ }
- #define SCI_IRQ                       { IRQ_PB11MP_SCI, NO_IRQ }
- #define PB11MP_UART0_IRQ      { IRQ_TC11MP_UART0, NO_IRQ }
- #define PB11MP_UART1_IRQ      { IRQ_TC11MP_UART1, NO_IRQ }
- #define PB11MP_UART2_IRQ      { IRQ_PB11MP_UART2, NO_IRQ }
- #define PB11MP_UART3_IRQ      { IRQ_PB11MP_UART3, NO_IRQ }
- #define PB11MP_SSP_IRQ                { IRQ_PB11MP_SSP, NO_IRQ }
+ #define KMI0_IRQ              { IRQ_TC11MP_KMI0 }
+ #define KMI1_IRQ              { IRQ_TC11MP_KMI1 }
+ #define PB11MP_SMC_IRQ                { }
+ #define MPMC_IRQ              { }
+ #define PB11MP_CLCD_IRQ               { IRQ_PB11MP_CLCD }
+ #define DMAC_IRQ              { IRQ_PB11MP_DMAC }
+ #define SCTL_IRQ              { }
+ #define PB11MP_WATCHDOG_IRQ   { IRQ_PB11MP_WATCHDOG }
+ #define PB11MP_GPIO0_IRQ      { IRQ_PB11MP_GPIO0 }
+ #define GPIO1_IRQ             { IRQ_PB11MP_GPIO1 }
+ #define PB11MP_RTC_IRQ                { IRQ_TC11MP_RTC }
+ #define SCI_IRQ                       { IRQ_PB11MP_SCI }
+ #define PB11MP_UART0_IRQ      { IRQ_TC11MP_UART0 }
+ #define PB11MP_UART1_IRQ      { IRQ_TC11MP_UART1 }
+ #define PB11MP_UART2_IRQ      { IRQ_PB11MP_UART2 }
+ #define PB11MP_UART3_IRQ      { IRQ_PB11MP_UART3 }
+ #define PB11MP_SSP_IRQ                { IRQ_PB11MP_SSP }
  
  /* FPGA Primecells */
- AMBA_DEVICE(aaci,     "fpga:aaci",    AACI,           NULL);
- AMBA_DEVICE(mmc0,     "fpga:mmc0",    MMCI0,          &realview_mmc0_plat_data);
- AMBA_DEVICE(kmi0,     "fpga:kmi0",    KMI0,           NULL);
- AMBA_DEVICE(kmi1,     "fpga:kmi1",    KMI1,           NULL);
- AMBA_DEVICE(uart3,    "fpga:uart3",   PB11MP_UART3,   NULL);
+ APB_DEVICE(aaci,      "fpga:aaci",    AACI,           NULL);
+ APB_DEVICE(mmc0,      "fpga:mmc0",    MMCI0,          &realview_mmc0_plat_data);
+ APB_DEVICE(kmi0,      "fpga:kmi0",    KMI0,           NULL);
+ APB_DEVICE(kmi1,      "fpga:kmi1",    KMI1,           NULL);
+ APB_DEVICE(uart3,     "fpga:uart3",   PB11MP_UART3,   NULL);
  
  /* DevChip Primecells */
- AMBA_DEVICE(smc,      "dev:smc",      PB11MP_SMC,     NULL);
- AMBA_DEVICE(sctl,     "dev:sctl",     SCTL,           NULL);
- AMBA_DEVICE(wdog,     "dev:wdog",     PB11MP_WATCHDOG, NULL);
- AMBA_DEVICE(gpio0,    "dev:gpio0",    PB11MP_GPIO0,   &gpio0_plat_data);
- AMBA_DEVICE(gpio1,    "dev:gpio1",    GPIO1,          &gpio1_plat_data);
- AMBA_DEVICE(gpio2,    "dev:gpio2",    GPIO2,          &gpio2_plat_data);
- AMBA_DEVICE(rtc,      "dev:rtc",      PB11MP_RTC,     NULL);
- AMBA_DEVICE(sci0,     "dev:sci0",     SCI,            NULL);
- AMBA_DEVICE(uart0,    "dev:uart0",    PB11MP_UART0,   NULL);
- AMBA_DEVICE(uart1,    "dev:uart1",    PB11MP_UART1,   NULL);
- AMBA_DEVICE(uart2,    "dev:uart2",    PB11MP_UART2,   NULL);
- AMBA_DEVICE(ssp0,     "dev:ssp0",     PB11MP_SSP,     &ssp0_plat_data);
+ AHB_DEVICE(smc,               "dev:smc",      PB11MP_SMC,     NULL);
+ AHB_DEVICE(sctl,      "dev:sctl",     SCTL,           NULL);
+ APB_DEVICE(wdog,      "dev:wdog",     PB11MP_WATCHDOG, NULL);
+ APB_DEVICE(gpio0,     "dev:gpio0",    PB11MP_GPIO0,   &gpio0_plat_data);
+ APB_DEVICE(gpio1,     "dev:gpio1",    GPIO1,          &gpio1_plat_data);
+ APB_DEVICE(gpio2,     "dev:gpio2",    GPIO2,          &gpio2_plat_data);
+ APB_DEVICE(rtc,               "dev:rtc",      PB11MP_RTC,     NULL);
+ APB_DEVICE(sci0,      "dev:sci0",     SCI,            NULL);
+ APB_DEVICE(uart0,     "dev:uart0",    PB11MP_UART0,   NULL);
+ APB_DEVICE(uart1,     "dev:uart1",    PB11MP_UART1,   NULL);
+ APB_DEVICE(uart2,     "dev:uart2",    PB11MP_UART2,   NULL);
+ APB_DEVICE(ssp0,      "dev:ssp0",     PB11MP_SSP,     &ssp0_plat_data);
  
  /* Primecells on the NEC ISSP chip */
- AMBA_DEVICE(clcd,     "issp:clcd",    PB11MP_CLCD,    &clcd_plat_data);
- AMBA_DEVICE(dmac,     "issp:dmac",    DMAC,           NULL);
+ AHB_DEVICE(clcd,      "issp:clcd",    PB11MP_CLCD,    &clcd_plat_data);
+ AHB_DEVICE(dmac,      "issp:dmac",    DMAC,           NULL);
  
  static struct amba_device *amba_devs[] __initdata = {
        &dmac_device,
@@@ -290,21 -290,6 +290,21 @@@ static void __init gic_init_irq(void
        gic_cascade_irq(1, IRQ_TC11MP_PB_IRQ1);
  }
  
 +#ifdef CONFIG_HAVE_ARM_TWD
 +static DEFINE_TWD_LOCAL_TIMER(twd_local_timer,
 +                            REALVIEW_TC11MP_TWD_BASE,
 +                            IRQ_LOCALTIMER);
 +
 +static void __init realview_pb11mp_twd_init(void)
 +{
 +      int err = twd_local_timer_register(&twd_local_timer);
 +      if (err)
 +              pr_err("twd_local_timer_register failed %d\n", err);
 +}
 +#else
 +#define realview_pb11mp_twd_init()    do {} while(0)
 +#endif
 +
  static void __init realview_pb11mp_timer_init(void)
  {
        timer0_va_base = __io_address(REALVIEW_PB11MP_TIMER0_1_BASE);
        timer2_va_base = __io_address(REALVIEW_PB11MP_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_PB11MP_TIMER2_3_BASE) + 0x20;
  
 -#ifdef CONFIG_LOCAL_TIMERS
 -      twd_base = __io_address(REALVIEW_TC11MP_TWD_BASE);
 -#endif
        realview_timer_init(IRQ_TC11MP_TIMER0_1);
 +      realview_pb11mp_twd_init();
  }
  
  static struct sys_timer realview_pb11mp_timer = {
@@@ -144,52 -144,52 +144,52 @@@ static struct pl022_ssp_controller ssp0
   * RealView PBXCore AMBA devices
   */
  
- #define GPIO2_IRQ             { IRQ_PBX_GPIO2, NO_IRQ }
- #define GPIO3_IRQ             { IRQ_PBX_GPIO3, NO_IRQ }
- #define AACI_IRQ              { IRQ_PBX_AACI, NO_IRQ }
+ #define GPIO2_IRQ             { IRQ_PBX_GPIO2 }
+ #define GPIO3_IRQ             { IRQ_PBX_GPIO3 }
+ #define AACI_IRQ              { IRQ_PBX_AACI }
  #define MMCI0_IRQ             { IRQ_PBX_MMCI0A, IRQ_PBX_MMCI0B }
- #define KMI0_IRQ              { IRQ_PBX_KMI0, NO_IRQ }
- #define KMI1_IRQ              { IRQ_PBX_KMI1, NO_IRQ }
- #define PBX_SMC_IRQ           { NO_IRQ, NO_IRQ }
- #define MPMC_IRQ              { NO_IRQ, NO_IRQ }
- #define PBX_CLCD_IRQ          { IRQ_PBX_CLCD, NO_IRQ }
- #define DMAC_IRQ              { IRQ_PBX_DMAC, NO_IRQ }
- #define SCTL_IRQ              { NO_IRQ, NO_IRQ }
- #define PBX_WATCHDOG_IRQ      { IRQ_PBX_WATCHDOG, NO_IRQ }
- #define PBX_GPIO0_IRQ         { IRQ_PBX_GPIO0, NO_IRQ }
- #define GPIO1_IRQ             { IRQ_PBX_GPIO1, NO_IRQ }
- #define PBX_RTC_IRQ           { IRQ_PBX_RTC, NO_IRQ }
- #define SCI_IRQ                       { IRQ_PBX_SCI, NO_IRQ }
- #define PBX_UART0_IRQ         { IRQ_PBX_UART0, NO_IRQ }
- #define PBX_UART1_IRQ         { IRQ_PBX_UART1, NO_IRQ }
- #define PBX_UART2_IRQ         { IRQ_PBX_UART2, NO_IRQ }
- #define PBX_UART3_IRQ         { IRQ_PBX_UART3, NO_IRQ }
- #define PBX_SSP_IRQ           { IRQ_PBX_SSP, NO_IRQ }
+ #define KMI0_IRQ              { IRQ_PBX_KMI0 }
+ #define KMI1_IRQ              { IRQ_PBX_KMI1 }
+ #define PBX_SMC_IRQ           { }
+ #define MPMC_IRQ              { }
+ #define PBX_CLCD_IRQ          { IRQ_PBX_CLCD }
+ #define DMAC_IRQ              { IRQ_PBX_DMAC }
+ #define SCTL_IRQ              { }
+ #define PBX_WATCHDOG_IRQ      { IRQ_PBX_WATCHDOG }
+ #define PBX_GPIO0_IRQ         { IRQ_PBX_GPIO0 }
+ #define GPIO1_IRQ             { IRQ_PBX_GPIO1 }
+ #define PBX_RTC_IRQ           { IRQ_PBX_RTC }
+ #define SCI_IRQ                       { IRQ_PBX_SCI }
+ #define PBX_UART0_IRQ         { IRQ_PBX_UART0 }
+ #define PBX_UART1_IRQ         { IRQ_PBX_UART1 }
+ #define PBX_UART2_IRQ         { IRQ_PBX_UART2 }
+ #define PBX_UART3_IRQ         { IRQ_PBX_UART3 }
+ #define PBX_SSP_IRQ           { IRQ_PBX_SSP }
  
  /* FPGA Primecells */
- AMBA_DEVICE(aaci,     "fpga:aaci",    AACI,           NULL);
- AMBA_DEVICE(mmc0,     "fpga:mmc0",    MMCI0,          &realview_mmc0_plat_data);
- AMBA_DEVICE(kmi0,     "fpga:kmi0",    KMI0,           NULL);
- AMBA_DEVICE(kmi1,     "fpga:kmi1",    KMI1,           NULL);
- AMBA_DEVICE(uart3,    "fpga:uart3",   PBX_UART3,      NULL);
+ APB_DEVICE(aaci,      "fpga:aaci",    AACI,           NULL);
+ APB_DEVICE(mmc0,      "fpga:mmc0",    MMCI0,          &realview_mmc0_plat_data);
+ APB_DEVICE(kmi0,      "fpga:kmi0",    KMI0,           NULL);
+ APB_DEVICE(kmi1,      "fpga:kmi1",    KMI1,           NULL);
+ APB_DEVICE(uart3,     "fpga:uart3",   PBX_UART3,      NULL);
  
  /* DevChip Primecells */
- AMBA_DEVICE(smc,      "dev:smc",      PBX_SMC,        NULL);
- AMBA_DEVICE(sctl,     "dev:sctl",     SCTL,           NULL);
- AMBA_DEVICE(wdog,     "dev:wdog",     PBX_WATCHDOG,   NULL);
- AMBA_DEVICE(gpio0,    "dev:gpio0",    PBX_GPIO0,      &gpio0_plat_data);
- AMBA_DEVICE(gpio1,    "dev:gpio1",    GPIO1,          &gpio1_plat_data);
- AMBA_DEVICE(gpio2,    "dev:gpio2",    GPIO2,          &gpio2_plat_data);
- AMBA_DEVICE(rtc,      "dev:rtc",      PBX_RTC,        NULL);
- AMBA_DEVICE(sci0,     "dev:sci0",     SCI,            NULL);
- AMBA_DEVICE(uart0,    "dev:uart0",    PBX_UART0,      NULL);
- AMBA_DEVICE(uart1,    "dev:uart1",    PBX_UART1,      NULL);
- AMBA_DEVICE(uart2,    "dev:uart2",    PBX_UART2,      NULL);
- AMBA_DEVICE(ssp0,     "dev:ssp0",     PBX_SSP,        &ssp0_plat_data);
+ AHB_DEVICE(smc,       "dev:smc",      PBX_SMC,        NULL);
+ AHB_DEVICE(sctl,      "dev:sctl",     SCTL,           NULL);
+ APB_DEVICE(wdog,      "dev:wdog",     PBX_WATCHDOG,   NULL);
+ APB_DEVICE(gpio0,     "dev:gpio0",    PBX_GPIO0,      &gpio0_plat_data);
+ APB_DEVICE(gpio1,     "dev:gpio1",    GPIO1,          &gpio1_plat_data);
+ APB_DEVICE(gpio2,     "dev:gpio2",    GPIO2,          &gpio2_plat_data);
+ APB_DEVICE(rtc,               "dev:rtc",      PBX_RTC,        NULL);
+ APB_DEVICE(sci0,      "dev:sci0",     SCI,            NULL);
+ APB_DEVICE(uart0,     "dev:uart0",    PBX_UART0,      NULL);
+ APB_DEVICE(uart1,     "dev:uart1",    PBX_UART1,      NULL);
+ APB_DEVICE(uart2,     "dev:uart2",    PBX_UART2,      NULL);
+ APB_DEVICE(ssp0,      "dev:ssp0",     PBX_SSP,        &ssp0_plat_data);
  
  /* Primecells on the NEC ISSP chip */
- AMBA_DEVICE(clcd,     "issp:clcd",    PBX_CLCD,       &clcd_plat_data);
- AMBA_DEVICE(dmac,     "issp:dmac",    DMAC,           NULL);
+ AHB_DEVICE(clcd,      "issp:clcd",    PBX_CLCD,       &clcd_plat_data);
+ AHB_DEVICE(dmac,      "issp:dmac",    DMAC,           NULL);
  
  static struct amba_device *amba_devs[] __initdata = {
        &dmac_device,
@@@ -298,21 -298,6 +298,21 @@@ static void __init gic_init_irq(void
        }
  }
  
 +#ifdef CONFIG_HAVE_ARM_TWD
 +static DEFINE_TWD_LOCAL_TIMER(twd_local_timer,
 +                            REALVIEW_PBX_TILE_TWD_BASE,
 +                            IRQ_LOCALTIMER);
 +
 +static void __init realview_pbx_twd_init(void)
 +{
 +      int err = twd_local_timer_register(&twd_local_timer);
 +      if (err)
 +              pr_err("twd_local_timer_register failed %d\n", err);
 +}
 +#else
 +#define realview_pbx_twd_init()       do { } while(0)
 +#endif
 +
  static void __init realview_pbx_timer_init(void)
  {
        timer0_va_base = __io_address(REALVIEW_PBX_TIMER0_1_BASE);
        timer2_va_base = __io_address(REALVIEW_PBX_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_PBX_TIMER2_3_BASE) + 0x20;
  
 -#ifdef CONFIG_LOCAL_TIMERS
 -      if (core_tile_pbx11mp() || core_tile_pbxa9mp())
 -              twd_base = __io_address(REALVIEW_PBX_TILE_TWD_BASE);
 -#endif
        realview_timer_init(IRQ_PBX_TIMER0_1);
 +      realview_pbx_twd_init();
  }
  
  static struct sys_timer realview_pbx_timer = {
@@@ -13,7 -13,8 +13,7 @@@ obj-$(CONFIG_ARCH_TEGRA_2x_SOC)               += teg
  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)               += pinmux-tegra20-tables.o
  obj-$(CONFIG_ARCH_TEGRA_3x_SOC)               += pinmux-tegra30-tables.o
  obj-$(CONFIG_ARCH_TEGRA_3x_SOC)               += board-dt-tegra30.o
- obj-$(CONFIG_SMP)                       += platsmp.o headsmp.o
+ obj-$(CONFIG_SMP)                     += platsmp.o headsmp.o
 -obj-$(CONFIG_LOCAL_TIMERS)            += localtimer.o
  obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
  obj-$(CONFIG_TEGRA_SYSTEM_DMA)                += dma.o
  obj-$(CONFIG_CPU_FREQ)                  += cpu-tegra.o
@@@ -1,22 -1,2 +1,5 @@@
- #define AMBA_DEVICE(name,busid,base,plat)     \
- struct amba_device name##_device = {          \
-       .dev            = {                     \
-               .coherent_dma_mask = ~0UL,      \
-               .init_name = busid,             \
-               .platform_data = plat,          \
-       },                                      \
-       .res            = {                     \
-               .start  = base,                 \
-               .end    = base + SZ_4K - 1,     \
-               .flags  = IORESOURCE_MEM,       \
-       },                                      \
-       .dma_mask       = ~0UL,                 \
-       .irq            = IRQ_##base,           \
-       /* .dma         = DMA_##base,*/         \
- }
 -#define __MMIO_P2V(x) (((x) & 0xfffff) | (((x) & 0x0f000000) >> 4) | 0xf8000000)
 -#define MMIO_P2V(x)   ((void __iomem *)__MMIO_P2V(x))
 +/* 2MB large area for motherboard's peripherals static mapping */
 +#define V2M_PERIPH 0xf8000000
 +
 +/* Tile's peripherals static mappings should start here */
 +#define V2T_PERIPH 0xf8200000
  
  #include <plat/clcd.h>
  
 -#define V2M_PA_CS7    0x10000000
 -
  static struct map_desc ct_ca9x4_io_desc[] __initdata = {
        {
 -              .virtual        = __MMIO_P2V(CT_CA9X4_MPIC),
 -              .pfn            = __phys_to_pfn(CT_CA9X4_MPIC),
 -              .length         = SZ_16K,
 -              .type           = MT_DEVICE,
 -      }, {
 -              .virtual        = __MMIO_P2V(CT_CA9X4_SP804_TIMER),
 -              .pfn            = __phys_to_pfn(CT_CA9X4_SP804_TIMER),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 -      }, {
 -              .virtual        = __MMIO_P2V(CT_CA9X4_L2CC),
 -              .pfn            = __phys_to_pfn(CT_CA9X4_L2CC),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 +              .virtual        = V2T_PERIPH,
 +              .pfn            = __phys_to_pfn(CT_CA9X4_MPIC),
 +              .length         = SZ_8K,
 +              .type           = MT_DEVICE,
        },
  };
  
  static void __init ct_ca9x4_map_io(void)
  {
        iotable_init(ct_ca9x4_io_desc, ARRAY_SIZE(ct_ca9x4_io_desc));
  }
  
 -static void __init ct_ca9x4_init_irq(void)
 +#ifdef CONFIG_HAVE_ARM_TWD
 +static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, A9_MPCORE_TWD, IRQ_LOCALTIMER);
 +
 +static void __init ca9x4_twd_init(void)
  {
 -      gic_init(0, 29, MMIO_P2V(A9_MPCORE_GIC_DIST),
 -               MMIO_P2V(A9_MPCORE_GIC_CPU));
 +      int err = twd_local_timer_register(&twd_local_timer);
 +      if (err)
 +              pr_err("twd_local_timer_register failed %d\n", err);
  }
 +#else
 +#define ca9x4_twd_init()      do {} while(0)
 +#endif
  
 -#if 0
 -static void __init ct_ca9x4_timer_init(void)
 +static void __init ct_ca9x4_init_irq(void)
  {
 -      writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL);
 -      writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL);
 -
 -      sp804_clocksource_init(MMIO_P2V(CT_CA9X4_TIMER1), "ct-timer1");
 -      sp804_clockevents_init(MMIO_P2V(CT_CA9X4_TIMER0), IRQ_CT_CA9X4_TIMER0,
 -              "ct-timer0");
 +      gic_init(0, 29, ioremap(A9_MPCORE_GIC_DIST, SZ_4K),
 +               ioremap(A9_MPCORE_GIC_CPU, SZ_256));
 +      ca9x4_twd_init();
  }
  
 -static struct sys_timer ct_ca9x4_timer = {
 -      .init   = ct_ca9x4_timer_init,
 -};
 -#endif
 -
  static void ct_ca9x4_clcd_enable(struct clcd_fb *fb)
  {
        v2m_cfg_write(SYS_CFG_MUXFPGA | SYS_CFG_SITE_DB1, 0);
@@@ -92,10 -109,10 +92,10 @@@ static struct clcd_board ct_ca9x4_clcd_
        .remove         = versatile_clcd_remove_dma,
  };
  
- static AMBA_DEVICE(clcd, "ct:clcd", CT_CA9X4_CLCDC, &ct_ca9x4_clcd_data);
- static AMBA_DEVICE(dmc, "ct:dmc", CT_CA9X4_DMC, NULL);
- static AMBA_DEVICE(smc, "ct:smc", CT_CA9X4_SMC, NULL);
- static AMBA_DEVICE(gpio, "ct:gpio", CT_CA9X4_GPIO, NULL);
+ static AMBA_AHB_DEVICE(clcd, "ct:clcd", 0, CT_CA9X4_CLCDC, IRQ_CT_CA9X4_CLCDC, &ct_ca9x4_clcd_data);
+ static AMBA_APB_DEVICE(dmc, "ct:dmc", 0, CT_CA9X4_DMC, IRQ_CT_CA9X4_DMC, NULL);
+ static AMBA_APB_DEVICE(smc, "ct:smc", 0, CT_CA9X4_SMC, IRQ_CT_CA9X4_SMC, NULL);
+ static AMBA_APB_DEVICE(gpio, "ct:gpio", 0, CT_CA9X4_GPIO, IRQ_CT_CA9X4_GPIO, NULL);
  
  static struct amba_device *ct_ca9x4_amba_devs[] __initdata = {
        &clcd_device,
@@@ -184,7 -201,7 +184,7 @@@ static void __init ct_ca9x4_init(void
        int i;
  
  #ifdef CONFIG_CACHE_L2X0
 -      void __iomem *l2x0_base = MMIO_P2V(CT_CA9X4_L2CC);
 +      void __iomem *l2x0_base = ioremap(CT_CA9X4_L2CC, SZ_4K);
  
        /* set RAM latencies to 1 cycle for this core tile. */
        writel(0, l2x0_base + L2X0_TAG_LATENCY_CTRL);
  }
  
  #ifdef CONFIG_SMP
 +static void *ct_ca9x4_scu_base __initdata;
 +
  static void __init ct_ca9x4_init_cpu_map(void)
  {
 -      int i, ncores = scu_get_core_count(MMIO_P2V(A9_MPCORE_SCU));
 +      int i, ncores;
 +
 +      ct_ca9x4_scu_base = ioremap(A9_MPCORE_SCU, SZ_128);
 +      if (WARN_ON(!ct_ca9x4_scu_base))
 +              return;
 +
 +      ncores = scu_get_core_count(ct_ca9x4_scu_base);
  
        if (ncores > nr_cpu_ids) {
                pr_warn("SMP: %u cores greater than maximum (%u), clipping\n",
  
  static void __init ct_ca9x4_smp_enable(unsigned int max_cpus)
  {
 -      scu_enable(MMIO_P2V(A9_MPCORE_SCU));
 +      scu_enable(ct_ca9x4_scu_base);
  }
  #endif
  
@@@ -22,6 -22,9 +22,6 @@@
  #define CT_CA9X4_SYSWDT               (0x1e007000)
  #define CT_CA9X4_L2CC         (0x1e00a000)
  
 -#define CT_CA9X4_TIMER0               (CT_CA9X4_SP804_TIMER + 0x000)
 -#define CT_CA9X4_TIMER1               (CT_CA9X4_SP804_TIMER + 0x020)
 -
  #define A9_MPCORE_SCU         (CT_CA9X4_MPIC + 0x0000)
  #define A9_MPCORE_GIC_CPU     (CT_CA9X4_MPIC + 0x0100)
  #define A9_MPCORE_GIT         (CT_CA9X4_MPIC + 0x0200)
@@@ -32,7 -35,7 +32,7 @@@
   * Interrupts.  Those in {} are for AMBA devices
   */
  #define IRQ_CT_CA9X4_CLCDC    { 76 }
- #define IRQ_CT_CA9X4_DMC      { -1 }
+ #define IRQ_CT_CA9X4_DMC      { 0 }
  #define IRQ_CT_CA9X4_SMC      { 77, 78 }
  #define IRQ_CT_CA9X4_TIMER0   80
  #define IRQ_CT_CA9X4_TIMER1   81
  
  static struct map_desc v2m_io_desc[] __initdata = {
        {
 -              .virtual        = __MMIO_P2V(V2M_PA_CS7),
 +              .virtual        = V2M_PERIPH,
                .pfn            = __phys_to_pfn(V2M_PA_CS7),
                .length         = SZ_128K,
                .type           = MT_DEVICE,
        },
  };
  
 -static void __init v2m_timer_init(void)
 +static void __iomem *v2m_sysreg_base;
 +
 +static void __init v2m_sysctl_init(void __iomem *base)
  {
        u32 scctrl;
  
 +      if (WARN_ON(!base))
 +              return;
 +
        /* Select 1MHz TIMCLK as the reference clock for SP804 timers */
 -      scctrl = readl(MMIO_P2V(V2M_SYSCTL + SCCTRL));
 +      scctrl = readl(base + SCCTRL);
        scctrl |= SCCTRL_TIMEREN0SEL_TIMCLK;
        scctrl |= SCCTRL_TIMEREN1SEL_TIMCLK;
 -      writel(scctrl, MMIO_P2V(V2M_SYSCTL + SCCTRL));
 +      writel(scctrl, base + SCCTRL);
 +}
  
 -      writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL);
 -      writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL);
 +static void __init v2m_sp804_init(void __iomem *base, unsigned int irq)
 +{
 +      if (WARN_ON(!base || irq == NO_IRQ))
 +              return;
 +
 +      writel(0, base + TIMER_1_BASE + TIMER_CTRL);
 +      writel(0, base + TIMER_2_BASE + TIMER_CTRL);
  
 -      sp804_clocksource_init(MMIO_P2V(V2M_TIMER1), "v2m-timer1");
 -      sp804_clockevents_init(MMIO_P2V(V2M_TIMER0), IRQ_V2M_TIMER0,
 -              "v2m-timer0");
 +      sp804_clocksource_init(base + TIMER_2_BASE, "v2m-timer1");
 +      sp804_clockevents_init(base + TIMER_1_BASE, irq, "v2m-timer0");
 +}
 +
 +static void __init v2m_timer_init(void)
 +{
 +      v2m_sysctl_init(ioremap(V2M_SYSCTL, SZ_4K));
 +      v2m_sp804_init(ioremap(V2M_TIMER01, SZ_4K), IRQ_V2M_TIMER0);
  }
  
  static struct sys_timer v2m_timer = {
@@@ -98,14 -82,14 +98,14 @@@ int v2m_cfg_write(u32 devfn, u32 data
        devfn |= SYS_CFG_START | SYS_CFG_WRITE;
  
        spin_lock(&v2m_cfg_lock);
 -      val = readl(MMIO_P2V(V2M_SYS_CFGSTAT));
 -      writel(val & ~SYS_CFG_COMPLETE, MMIO_P2V(V2M_SYS_CFGSTAT));
 +      val = readl(v2m_sysreg_base + V2M_SYS_CFGSTAT);
 +      writel(val & ~SYS_CFG_COMPLETE, v2m_sysreg_base + V2M_SYS_CFGSTAT);
  
 -      writel(data, MMIO_P2V(V2M_SYS_CFGDATA));
 -      writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL));
 +      writel(data, v2m_sysreg_base +  V2M_SYS_CFGDATA);
 +      writel(devfn, v2m_sysreg_base + V2M_SYS_CFGCTRL);
  
        do {
 -              val = readl(MMIO_P2V(V2M_SYS_CFGSTAT));
 +              val = readl(v2m_sysreg_base + V2M_SYS_CFGSTAT);
        } while (val == 0);
        spin_unlock(&v2m_cfg_lock);
  
@@@ -119,28 -103,22 +119,28 @@@ int v2m_cfg_read(u32 devfn, u32 *data
        devfn |= SYS_CFG_START;
  
        spin_lock(&v2m_cfg_lock);
 -      writel(0, MMIO_P2V(V2M_SYS_CFGSTAT));
 -      writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL));
 +      writel(0, v2m_sysreg_base + V2M_SYS_CFGSTAT);
 +      writel(devfn, v2m_sysreg_base + V2M_SYS_CFGCTRL);
  
        mb();
  
        do {
                cpu_relax();
 -              val = readl(MMIO_P2V(V2M_SYS_CFGSTAT));
 +              val = readl(v2m_sysreg_base + V2M_SYS_CFGSTAT);
        } while (val == 0);
  
 -      *data = readl(MMIO_P2V(V2M_SYS_CFGDATA));
 +      *data = readl(v2m_sysreg_base + V2M_SYS_CFGDATA);
        spin_unlock(&v2m_cfg_lock);
  
        return !!(val & SYS_CFG_ERR);
  }
  
 +void __init v2m_flags_set(u32 data)
 +{
 +      writel(~0, v2m_sysreg_base + V2M_SYS_FLAGSCLR);
 +      writel(data, v2m_sysreg_base + V2M_SYS_FLAGSSET);
 +}
 +
  
  static struct resource v2m_pcie_i2c_resource = {
        .start  = V2M_SERIAL_BUS_PCI,
@@@ -226,7 -204,7 +226,7 @@@ static struct platform_device v2m_usb_d
  
  static void v2m_flash_set_vpp(struct platform_device *pdev, int on)
  {
 -      writel(on != 0, MMIO_P2V(V2M_SYS_FLASH));
 +      writel(on != 0, v2m_sysreg_base + V2M_SYS_FLASH);
  }
  
  static struct physmap_flash_data v2m_flash_data = {
@@@ -280,7 -258,7 +280,7 @@@ static struct platform_device v2m_cf_de
  
  static unsigned int v2m_mmci_status(struct device *dev)
  {
 -      return readl(MMIO_P2V(V2M_SYS_MCI)) & (1 << 0);
 +      return readl(v2m_sysreg_base + V2M_SYS_MCI) & (1 << 0);
  }
  
  static struct mmci_platform_data v2m_mmci_data = {
        .status         = v2m_mmci_status,
  };
  
- static AMBA_DEVICE(aaci,  "mb:aaci",  V2M_AACI, NULL);
- static AMBA_DEVICE(mmci,  "mb:mmci",  V2M_MMCI, &v2m_mmci_data);
- static AMBA_DEVICE(kmi0,  "mb:kmi0",  V2M_KMI0, NULL);
- static AMBA_DEVICE(kmi1,  "mb:kmi1",  V2M_KMI1, NULL);
- static AMBA_DEVICE(uart0, "mb:uart0", V2M_UART0, NULL);
- static AMBA_DEVICE(uart1, "mb:uart1", V2M_UART1, NULL);
- static AMBA_DEVICE(uart2, "mb:uart2", V2M_UART2, NULL);
- static AMBA_DEVICE(uart3, "mb:uart3", V2M_UART3, NULL);
- static AMBA_DEVICE(wdt,   "mb:wdt",   V2M_WDT, NULL);
- static AMBA_DEVICE(rtc,   "mb:rtc",   V2M_RTC, NULL);
+ static AMBA_APB_DEVICE(aaci,  "mb:aaci",  0, V2M_AACI, IRQ_V2M_AACI, NULL);
+ static AMBA_APB_DEVICE(mmci,  "mb:mmci",  0, V2M_MMCI, IRQ_V2M_MMCI, &v2m_mmci_data);
+ static AMBA_APB_DEVICE(kmi0,  "mb:kmi0",  0, V2M_KMI0, IRQ_V2M_KMI0, NULL);
+ static AMBA_APB_DEVICE(kmi1,  "mb:kmi1",  0, V2M_KMI1, IRQ_V2M_KMI1, NULL);
+ static AMBA_APB_DEVICE(uart0, "mb:uart0", 0, V2M_UART0, IRQ_V2M_UART0, NULL);
+ static AMBA_APB_DEVICE(uart1, "mb:uart1", 0, V2M_UART1, IRQ_V2M_UART1, NULL);
+ static AMBA_APB_DEVICE(uart2, "mb:uart2", 0, V2M_UART2, IRQ_V2M_UART2, NULL);
+ static AMBA_APB_DEVICE(uart3, "mb:uart3", 0, V2M_UART3, IRQ_V2M_UART3, NULL);
+ static AMBA_APB_DEVICE(wdt,   "mb:wdt",   0, V2M_WDT, IRQ_V2M_WDT, NULL);
+ static AMBA_APB_DEVICE(rtc,   "mb:rtc",   0, V2M_RTC, IRQ_V2M_RTC, NULL);
  
  static struct amba_device *v2m_amba_devs[] __initdata = {
        &aaci_device,
@@@ -393,7 -371,7 +393,7 @@@ static void __init v2m_init_early(void
  {
        ct_desc->init_early();
        clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups));
 -      versatile_sched_clock_init(MMIO_P2V(V2M_SYS_24MHZ), 24000000);
 +      versatile_sched_clock_init(v2m_sysreg_base + V2M_SYS_24MHZ, 24000000);
  }
  
  static void v2m_power_off(void)
@@@ -422,8 -400,7 +422,8 @@@ static void __init v2m_populate_ct_desc
        u32 current_tile_id;
  
        ct_desc = NULL;
 -      current_tile_id = readl(MMIO_P2V(V2M_SYS_PROCID0)) & V2M_CT_ID_MASK;
 +      current_tile_id = readl(v2m_sysreg_base + V2M_SYS_PROCID0)
 +                              & V2M_CT_ID_MASK;
  
        for (i = 0; i < ARRAY_SIZE(ct_descs) && !ct_desc; ++i)
                if (ct_descs[i]->id == current_tile_id)
  static void __init v2m_map_io(void)
  {
        iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
 +      v2m_sysreg_base = ioremap(V2M_SYSREGS, SZ_4K);
        v2m_populate_ct_desc();
        ct_desc->map_io();
  }
diff --combined drivers/mmc/host/mmci.c
@@@ -1271,13 -1271,12 +1271,13 @@@ static int __devinit mmci_probe(struct 
        /*
         * Block size can be up to 2048 bytes, but must be a power of two.
         */
 -      mmc->max_blk_size = 2048;
 +      mmc->max_blk_size = 1 << 11;
  
        /*
 -       * No limit on the number of blocks transferred.
 +       * Limit the number of blocks transferred so that we don't overflow
 +       * the maximum request size.
         */
 -      mmc->max_blk_count = mmc->max_req_size;
 +      mmc->max_blk_count = mmc->max_req_size >> 11;
  
        spin_lock_init(&host->lock);
  
        if (ret)
                goto unmap;
  
-       if (dev->irq[1] == NO_IRQ)
+       if (dev->irq[1] == NO_IRQ || !dev->irq[1])
                host->singleirq = true;
        else {
                ret = request_irq(dev->irq[1], mmci_pio_irq, IRQF_SHARED,