#include <mach/hardware.h>
 #include <mach/devices.h>
 #include <mach/setup.h>
+#include <mach/irqs.h>
 
 static struct map_desc u5500_io_desc[] __initdata = {
        __IO_DEV_DESC(U5500_GPIO0_BASE, SZ_4K),
        __IO_DEV_DESC(U5500_PRCMU_BASE, SZ_4K),
 };
 
+static struct resource mbox0_resources[] = {
+       {
+               .name = "mbox_peer",
+               .start = U5500_MBOX0_PEER_START,
+               .end = U5500_MBOX0_PEER_END,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .name = "mbox_local",
+               .start = U5500_MBOX0_LOCAL_START,
+               .end = U5500_MBOX0_LOCAL_END,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .name = "mbox_irq",
+               .start = MBOX_PAIR0_VIRT_IRQ,
+               .end = MBOX_PAIR0_VIRT_IRQ,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct resource mbox1_resources[] = {
+       {
+               .name = "mbox_peer",
+               .start = U5500_MBOX1_PEER_START,
+               .end = U5500_MBOX1_PEER_END,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .name = "mbox_local",
+               .start = U5500_MBOX1_LOCAL_START,
+               .end = U5500_MBOX1_LOCAL_END,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .name = "mbox_irq",
+               .start = MBOX_PAIR1_VIRT_IRQ,
+               .end = MBOX_PAIR1_VIRT_IRQ,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct resource mbox2_resources[] = {
+       {
+               .name = "mbox_peer",
+               .start = U5500_MBOX2_PEER_START,
+               .end = U5500_MBOX2_PEER_END,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .name = "mbox_local",
+               .start = U5500_MBOX2_LOCAL_START,
+               .end = U5500_MBOX2_LOCAL_END,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .name = "mbox_irq",
+               .start = MBOX_PAIR2_VIRT_IRQ,
+               .end = MBOX_PAIR2_VIRT_IRQ,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device mbox0_device = {
+       .id = 0,
+       .name = "mbox",
+       .resource = mbox0_resources,
+       .num_resources = ARRAY_SIZE(mbox0_resources),
+};
+
+static struct platform_device mbox1_device = {
+       .id = 1,
+       .name = "mbox",
+       .resource = mbox1_resources,
+       .num_resources = ARRAY_SIZE(mbox1_resources),
+};
+
+static struct platform_device mbox2_device = {
+       .id = 2,
+       .name = "mbox",
+       .resource = mbox2_resources,
+       .num_resources = ARRAY_SIZE(mbox2_resources),
+};
+
 static struct platform_device *u5500_platform_devs[] __initdata = {
        &u5500_gpio_devs[0],
        &u5500_gpio_devs[1],
        &u5500_gpio_devs[5],
        &u5500_gpio_devs[6],
        &u5500_gpio_devs[7],
+       &mbox0_device,
+       &mbox1_device,
+       &mbox2_device,
 };
 
 void __init u5500_map_io(void)
 
 #define U5500_GPIOBANK6_BASE   (U5500_GPIO4_BASE + 0x80)
 #define U5500_GPIOBANK7_BASE   (U5500_GPIO4_BASE + 0x100)
 
+#define U5500_MBOX_BASE                (U5500_MODEM_BASE + 0xFFD1000)
+#define U5500_MBOX0_PEER_START (U5500_MBOX_BASE + 0x40)
+#define U5500_MBOX0_PEER_END   (U5500_MBOX_BASE + 0x5F)
+#define U5500_MBOX0_LOCAL_START        (U5500_MBOX_BASE + 0x60)
+#define U5500_MBOX0_LOCAL_END  (U5500_MBOX_BASE + 0x7F)
+#define U5500_MBOX1_PEER_START (U5500_MBOX_BASE + 0x80)
+#define U5500_MBOX1_PEER_END   (U5500_MBOX_BASE + 0x9F)
+#define U5500_MBOX1_LOCAL_START        (U5500_MBOX_BASE + 0xA0)
+#define U5500_MBOX1_LOCAL_END  (U5500_MBOX_BASE + 0xBF)
+#define U5500_MBOX2_PEER_START (U5500_MBOX_BASE + 0x00)
+#define U5500_MBOX2_PEER_END   (U5500_MBOX_BASE + 0x1F)
+#define U5500_MBOX2_LOCAL_START        (U5500_MBOX_BASE + 0x20)
+#define U5500_MBOX2_LOCAL_END  (U5500_MBOX_BASE + 0x3F)
+
 #endif
 
 #include <mach/irqs-board-mop500.h>
 #endif
 
-#define NR_IRQS                                IRQ_BOARD_END
+/*
+ * After the board specific IRQ:s we reserve a range of IRQ:s in which virtual
+ * IRQ:s representing modem IRQ:s can be allocated
+ */
+#define IRQ_MODEM_EVENTS_BASE (IRQ_BOARD_END + 1)
+#define IRQ_MODEM_EVENTS_NBR 72
+#define IRQ_MODEM_EVENTS_END (IRQ_MODEM_EVENTS_BASE + IRQ_MODEM_EVENTS_NBR)
+
+/* List of virtual IRQ:s that are allocated from the range above */
+#define MBOX_PAIR0_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 43)
+#define MBOX_PAIR1_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 45)
+#define MBOX_PAIR2_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 41)
+
+#define NR_IRQS                                IRQ_MODEM_EVENTS_END
 
 #endif /* ASM_ARCH_IRQS_H */