#include <mach/cm.h>
 #include <asm/system.h>
 #include <asm/leds.h>
+#include <asm/mach-types.h>
 #include <asm/mach/time.h>
 #include <asm/pgtable.h>
 
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_RTCINT, NO_IRQ },
-       .periphid       = 0x00041030,
 };
 
 static struct amba_device uart0_device = {
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_UARTINT0, NO_IRQ },
-       .periphid       = 0x0041010,
 };
 
 static struct amba_device uart1_device = {
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_UARTINT1, NO_IRQ },
-       .periphid       = 0x0041010,
 };
 
 static struct amba_device kmi0_device = {
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_KMIINT0, NO_IRQ },
-       .periphid       = 0x00041050,
 };
 
 static struct amba_device kmi1_device = {
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_KMIINT1, NO_IRQ },
-       .periphid       = 0x00041050,
 };
 
 static struct amba_device *amba_devs[] __initdata = {
 {
        int i;
 
+       /*
+        * The Integrator/AP lacks necessary AMBA PrimeCell IDs, so we need to
+        * hard-code them. The Integator/CP and forward have proper cell IDs.
+        * Else we leave them undefined to the bus driver can autoprobe them.
+        */
+       if (machine_is_integrator()) {
+               rtc_device.periphid     = 0x00041030;
+               uart0_device.periphid   = 0x00041010;
+               uart1_device.periphid   = 0x00041010;
+               kmi0_device.periphid    = 0x00041050;
+               kmi1_device.periphid    = 0x00041050;
+       }
+
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
                amba_device_register(d, &iomem_resource);