Only OMAP3 would work.

Signed-off-by: Felipe Contreras <[email protected]>
---
 arch/arm/mach-omap2/devices.c              |  103 +++++----------------------
 arch/arm/mach-omap2/mailbox.c              |   14 +---
 arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |   45 ++++++++++++
 arch/arm/plat-omap/include/plat/mailbox.h  |    4 +
 4 files changed, 72 insertions(+), 94 deletions(-)

diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index d9ac853..89f6cbc 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -20,12 +20,14 @@
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 
+#include <plat/omap_device.h>
 #include <plat/control.h>
 #include <plat/tc.h>
 #include <plat/board.h>
 #include <plat/mux.h>
 #include <mach/gpio.h>
 #include <plat/mmc.h>
+#include <plat/mailbox.h>
 
 #include "mux.h"
 
@@ -137,95 +139,28 @@ static inline void omap_init_camera(void)
 #endif
 
 #if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
+static inline void omap_init_mbox(void)
+{
+       struct omap_hwmod *hwmod;
+       struct omap_device *odev;
+       struct omap_mbox_platform_data pdata;
 
-#define MBOX_REG_SIZE   0x120
-
-#ifdef CONFIG_ARCH_OMAP2
-static struct resource omap2_mbox_resources[] = {
-       {
-               .start          = OMAP24XX_MAILBOX_BASE,
-               .end            = OMAP24XX_MAILBOX_BASE + MBOX_REG_SIZE - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       {
-               .start          = INT_24XX_MAIL_U0_MPU,
-               .flags          = IORESOURCE_IRQ,
-               .name           = "dsp",
-       },
-       {
-               .start          = INT_24XX_MAIL_U3_MPU,
-               .flags          = IORESOURCE_IRQ,
-               .name           = "iva",
-       },
-};
-static int omap2_mbox_resources_sz = ARRAY_SIZE(omap2_mbox_resources);
-#else
-#define omap2_mbox_resources           NULL
-#define omap2_mbox_resources_sz                0
-#endif
-
-#ifdef CONFIG_ARCH_OMAP3
-static struct resource omap3_mbox_resources[] = {
-       {
-               .start          = OMAP34XX_MAILBOX_BASE,
-               .end            = OMAP34XX_MAILBOX_BASE + MBOX_REG_SIZE - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       {
-               .start          = INT_24XX_MAIL_U0_MPU,
-               .flags          = IORESOURCE_IRQ,
-               .name           = "dsp",
-       },
-};
-static int omap3_mbox_resources_sz = ARRAY_SIZE(omap3_mbox_resources);
-#else
-#define omap3_mbox_resources           NULL
-#define omap3_mbox_resources_sz                0
-#endif
-
-#ifdef CONFIG_ARCH_OMAP4
-
-#define OMAP4_MBOX_REG_SIZE    0x130
-static struct resource omap4_mbox_resources[] = {
-       {
-               .start          = OMAP44XX_MAILBOX_BASE,
-               .end            = OMAP44XX_MAILBOX_BASE +
-                                       OMAP4_MBOX_REG_SIZE - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       {
-               .start          = OMAP44XX_IRQ_MAIL_U0,
-               .flags          = IORESOURCE_IRQ,
-               .name           = "mbox",
-       },
-};
-static int omap4_mbox_resources_sz = ARRAY_SIZE(omap4_mbox_resources);
-#else
-#define omap4_mbox_resources           NULL
-#define omap4_mbox_resources_sz                0
-#endif
+       hwmod = omap_hwmod_lookup("mailbox");
+       if (!hwmod) {
+               pr_err("%s: unable to find hwmod\n", __func__);
+               return;
+       }
 
-static struct platform_device mbox_device = {
-       .name           = "omap-mailbox",
-       .id             = -1,
-};
+       pdata.base_addr = hwmod->_rt_va;
 
-static inline void omap_init_mbox(void)
-{
-       if (cpu_is_omap24xx()) {
-               mbox_device.resource = omap2_mbox_resources;
-               mbox_device.num_resources = omap2_mbox_resources_sz;
-       } else if (cpu_is_omap34xx()) {
-               mbox_device.resource = omap3_mbox_resources;
-               mbox_device.num_resources = omap3_mbox_resources_sz;
-       } else if (cpu_is_omap44xx()) {
-               mbox_device.resource = omap4_mbox_resources;
-               mbox_device.num_resources = omap4_mbox_resources_sz;
-       } else {
-               pr_err("%s: platform not supported\n", __func__);
+       odev = omap_device_build("omap-mailbox", -1, hwmod,
+                       &pdata, sizeof(pdata),
+                       NULL, 0,
+                       0);
+       if (!odev) {
+               pr_err("%s: could not build device\n", __func__);
                return;
        }
-       platform_device_register(&mbox_device);
 }
 #else
 static inline void omap_init_mbox(void) { }
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c
index d46e439..baaaa5a 100644
--- a/arch/arm/mach-omap2/mailbox.c
+++ b/arch/arm/mach-omap2/mailbox.c
@@ -15,6 +15,7 @@
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <plat/mailbox.h>
+#include <plat/omap_hwmod.h>
 #include <mach/irqs.h>
 
 #define MAILBOX_REVISION               0x000
@@ -388,11 +389,9 @@ struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, 
&mbox_2_info, NULL };
 
 static int __devinit omap2_mbox_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        int ret;
        struct omap_mbox **list;
-
-       res = pdev->resource;
+       struct omap_mbox_platform_data *pdata = pdev->dev.platform_data;
 
        if (false);
 #if defined(CONFIG_ARCH_OMAP3430)
@@ -423,15 +422,11 @@ static int __devinit omap2_mbox_probe(struct 
platform_device *pdev)
                return -ENODEV;
        }
 
-       mbox_base = ioremap(res[0].start, resource_size(&res[0]));
-       if (!mbox_base)
-               return -ENOMEM;
+       mbox_base = pdata->base_addr;
 
        ret = omap_mbox_register(&pdev->dev, list);
-       if (ret) {
-               iounmap(mbox_base);
+       if (ret)
                return ret;
-       }
        return 0;
 
        return ret;
@@ -440,7 +435,6 @@ static int __devinit omap2_mbox_probe(struct 
platform_device *pdev)
 static int __devexit omap2_mbox_remove(struct platform_device *pdev)
 {
        omap_mbox_unregister();
-       iounmap(mbox_base);
        return 0;
 }
 
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c 
b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index ed60840..62b8fa8 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -164,12 +164,57 @@ static struct omap_hwmod omap3xxx_mpu_hwmod = {
        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
 };
 
+/* mailbox */
+
+static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
+       .name = "mailbox",
+};
+
+static struct omap_hwmod omap3xxx_mailbox_hwmod;
+static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = {
+       { .name = "dsp", .irq = 26 },
+};
+
+static struct omap_hwmod_addr_space omap3xxx_mailbox_addrs[] = {
+       {
+               .pa_start       = 0x48094000,
+               .pa_end         = 0x48094120,
+               .flags          = ADDR_TYPE_RT
+       },
+};
+
+/* L4_CORE -> mailbox */
+static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = {
+       .master         = &omap3xxx_l4_core_hwmod,
+       .slave          = &omap3xxx_mailbox_hwmod,
+       .addr           = omap3xxx_mailbox_addrs,
+       .addr_cnt       = ARRAY_SIZE(omap3xxx_mailbox_addrs),
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mailbox slave ports */
+static struct omap_hwmod_ocp_if *omap3xxx_mailbox_slaves[] = {
+       &omap3xxx_l4_core__mailbox,
+};
+
+static struct omap_hwmod omap3xxx_mailbox_hwmod = {
+       .name           = "mailbox",
+       .class          = &omap3xxx_mailbox_hwmod_class,
+       .main_clk       = "mailboxes_ick",
+       .mpu_irqs       = omap3xxx_mailbox_irqs,
+       .mpu_irqs_cnt   = ARRAY_SIZE(omap3xxx_mailbox_irqs),
+       .slaves         = omap3xxx_mailbox_slaves,
+       .slaves_cnt     = ARRAY_SIZE(omap3xxx_mailbox_slaves),
+       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
 static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
        &omap3xxx_l3_hwmod,
        &omap3xxx_l4_core_hwmod,
        &omap3xxx_l4_per_hwmod,
        &omap3xxx_l4_wkup_hwmod,
        &omap3xxx_mpu_hwmod,
+       &omap3xxx_mailbox_hwmod,
        NULL,
 };
 
diff --git a/arch/arm/plat-omap/include/plat/mailbox.h 
b/arch/arm/plat-omap/include/plat/mailbox.h
index 9976565..78060bd 100644
--- a/arch/arm/plat-omap/include/plat/mailbox.h
+++ b/arch/arm/plat-omap/include/plat/mailbox.h
@@ -59,6 +59,10 @@ struct omap_mbox {
        void                    *priv;
 };
 
+struct omap_mbox_platform_data {
+       void __iomem *base_addr;
+};
+
 int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg);
 void omap_mbox_init_seq(struct omap_mbox *);
 
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to