Merge branch 'cow_readahead' of git://oss.oracle.com/git/tma/linux-2.6 into merge-2
[deliverable/linux.git] / arch / arm / mach-omap2 / mailbox.c
index 318f3638653c1f97ce106d20ce4d2dd314d85c8d..42dbfa46e656de6ec04819b0bf19e6e321d0c2c7 100644 (file)
@@ -10,7 +10,6 @@
  * for more details.
  */
 
-#include <linux/kernel.h>
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/platform_device.h>
@@ -18,8 +17,6 @@
 #include <plat/mailbox.h>
 #include <mach/irqs.h>
 
-#define DRV_NAME "omap2-mailbox"
-
 #define MAILBOX_REVISION               0x000
 #define MAILBOX_SYSCONFIG              0x010
 #define MAILBOX_SYSSTATUS              0x014
@@ -131,7 +128,7 @@ static int omap2_mbox_startup(struct omap_mbox *mbox)
        }
 
        l = mbox_read_reg(MAILBOX_REVISION);
-       pr_info("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
+       pr_debug("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
 
        if (cpu_is_omap44xx())
                l = OMAP4_SMARTIDLE;
@@ -283,6 +280,8 @@ static struct omap_mbox_ops omap2_mbox_ops = {
  */
 
 /* FIXME: the following structs should be filled automatically by the user id */
+
+#if defined(CONFIG_ARCH_OMAP3430) || defined(CONFIG_ARCH_OMAP2420)
 /* DSP */
 static struct omap_mbox2_priv omap2_mbox_dsp_priv = {
        .tx_fifo = {
@@ -300,10 +299,46 @@ static struct omap_mbox2_priv omap2_mbox_dsp_priv = {
        .irqdisable     = MAILBOX_IRQENABLE(0),
 };
 
+struct omap_mbox mbox_dsp_info = {
+       .name   = "dsp",
+       .ops    = &omap2_mbox_ops,
+       .priv   = &omap2_mbox_dsp_priv,
+};
+#endif
+
+#if defined(CONFIG_ARCH_OMAP3430)
+struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL };
+#endif
+
+#if defined(CONFIG_ARCH_OMAP2420)
+/* IVA */
+static struct omap_mbox2_priv omap2_mbox_iva_priv = {
+       .tx_fifo = {
+               .msg            = MAILBOX_MESSAGE(2),
+               .fifo_stat      = MAILBOX_FIFOSTATUS(2),
+       },
+       .rx_fifo = {
+               .msg            = MAILBOX_MESSAGE(3),
+               .msg_stat       = MAILBOX_MSGSTATUS(3),
+       },
+       .irqenable      = MAILBOX_IRQENABLE(3),
+       .irqstatus      = MAILBOX_IRQSTATUS(3),
+       .notfull_bit    = MAILBOX_IRQ_NOTFULL(2),
+       .newmsg_bit     = MAILBOX_IRQ_NEWMSG(3),
+       .irqdisable     = MAILBOX_IRQENABLE(3),
+};
+
+static struct omap_mbox mbox_iva_info = {
+       .name   = "iva",
+       .ops    = &omap2_mbox_ops,
+       .priv   = &omap2_mbox_iva_priv,
+};
 
+struct omap_mbox *omap2_mboxes[] = { &mbox_iva_info, &mbox_dsp_info, NULL };
+#endif
 
-/* OMAP4 specific data structure. Use the cpu_is_omap4xxx()
-to use this*/
+#if defined(CONFIG_ARCH_OMAP4)
+/* OMAP4 */
 static struct omap_mbox2_priv omap2_mbox_1_priv = {
        .tx_fifo = {
                .msg            = MAILBOX_MESSAGE(0),
@@ -325,14 +360,6 @@ struct omap_mbox mbox_1_info = {
        .ops    = &omap2_mbox_ops,
        .priv   = &omap2_mbox_1_priv,
 };
-EXPORT_SYMBOL(mbox_1_info);
-
-struct omap_mbox mbox_dsp_info = {
-       .name   = "dsp",
-       .ops    = &omap2_mbox_ops,
-       .priv   = &omap2_mbox_dsp_priv,
-};
-EXPORT_SYMBOL(mbox_dsp_info);
 
 static struct omap_mbox2_priv omap2_mbox_2_priv = {
        .tx_fifo = {
@@ -355,110 +382,64 @@ struct omap_mbox mbox_2_info = {
        .ops    = &omap2_mbox_ops,
        .priv   = &omap2_mbox_2_priv,
 };
-EXPORT_SYMBOL(mbox_2_info);
-
-
-#if defined(CONFIG_ARCH_OMAP2420) /* IVA */
-static struct omap_mbox2_priv omap2_mbox_iva_priv = {
-       .tx_fifo = {
-               .msg            = MAILBOX_MESSAGE(2),
-               .fifo_stat      = MAILBOX_FIFOSTATUS(2),
-       },
-       .rx_fifo = {
-               .msg            = MAILBOX_MESSAGE(3),
-               .msg_stat       = MAILBOX_MSGSTATUS(3),
-       },
-       .irqenable      = MAILBOX_IRQENABLE(3),
-       .irqstatus      = MAILBOX_IRQSTATUS(3),
-       .notfull_bit    = MAILBOX_IRQ_NOTFULL(2),
-       .newmsg_bit     = MAILBOX_IRQ_NEWMSG(3),
-       .irqdisable     = MAILBOX_IRQENABLE(3),
-};
 
-static struct omap_mbox mbox_iva_info = {
-       .name   = "iva",
-       .ops    = &omap2_mbox_ops,
-       .priv   = &omap2_mbox_iva_priv,
-};
+struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL };
 #endif
 
 static int __devinit omap2_mbox_probe(struct platform_device *pdev)
 {
-       struct resource *res;
+       struct resource *mem;
        int ret;
+       struct omap_mbox **list;
 
-       /* MBOX base */
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (unlikely(!res)) {
-               dev_err(&pdev->dev, "invalid mem resource\n");
-               return -ENODEV;
+       if (false)
+               ;
+#if defined(CONFIG_ARCH_OMAP3430)
+       else if (cpu_is_omap3430()) {
+               list = omap3_mboxes;
+
+               list[0]->irq = platform_get_irq_byname(pdev, "dsp");
        }
-       mbox_base = ioremap(res->start, resource_size(res));
-       if (!mbox_base)
-               return -ENOMEM;
+#endif
+#if defined(CONFIG_ARCH_OMAP2420)
+       else if (cpu_is_omap2420()) {
+               list = omap2_mboxes;
 
-       /* DSP or IVA2 IRQ */
-       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+               list[0]->irq = platform_get_irq_byname(pdev, "dsp");
+               list[1]->irq = platform_get_irq_byname(pdev, "iva");
+       }
+#endif
+#if defined(CONFIG_ARCH_OMAP4)
+       else if (cpu_is_omap44xx()) {
+               list = omap4_mboxes;
 
-       if (unlikely(!res)) {
-               dev_err(&pdev->dev, "invalid irq resource\n");
-               ret = -ENODEV;
-               goto err_dsp;
+               list[0]->irq = list[1]->irq =
+                       platform_get_irq_byname(pdev, "mbox");
        }
-       if (cpu_is_omap44xx()) {
-               mbox_1_info.irq = res->start;
-               ret = omap_mbox_register(&pdev->dev, &mbox_1_info);
-       } else {
-               mbox_dsp_info.irq = res->start;
-               ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info);
+#endif
+       else {
+               pr_err("%s: platform not supported\n", __func__);
+               return -ENODEV;
        }
-       if (ret)
-               goto err_dsp;
 
-       if (cpu_is_omap44xx()) {
-               mbox_2_info.irq = res->start;
-               ret = omap_mbox_register(&pdev->dev, &mbox_2_info);
-               if (ret) {
-                       omap_mbox_unregister(&mbox_1_info);
-                       goto err_dsp;
-               }
-       }
-#if defined(CONFIG_ARCH_OMAP2420) /* IVA */
-       if (cpu_is_omap2420()) {
-               /* IVA IRQ */
-               res = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
-               if (unlikely(!res)) {
-                       dev_err(&pdev->dev, "invalid irq resource\n");
-                       ret = -ENODEV;
-                       omap_mbox_unregister(&mbox_dsp_info);
-                       goto err_dsp;
-               }
-               mbox_iva_info.irq = res->start;
-               ret = omap_mbox_register(&pdev->dev, &mbox_iva_info);
-               if (ret) {
-                       omap_mbox_unregister(&mbox_dsp_info);
-                       goto err_dsp;
-               }
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mbox_base = ioremap(mem->start, resource_size(mem));
+       if (!mbox_base)
+               return -ENOMEM;
+
+       ret = omap_mbox_register(&pdev->dev, list);
+       if (ret) {
+               iounmap(mbox_base);
+               return ret;
        }
-#endif
        return 0;
 
-err_dsp:
-       iounmap(mbox_base);
        return ret;
 }
 
 static int __devexit omap2_mbox_remove(struct platform_device *pdev)
 {
-#if defined(CONFIG_ARCH_OMAP2420)
-       omap_mbox_unregister(&mbox_iva_info);
-#endif
-
-       if (cpu_is_omap44xx()) {
-               omap_mbox_unregister(&mbox_2_info);
-               omap_mbox_unregister(&mbox_1_info);
-       } else
-               omap_mbox_unregister(&mbox_dsp_info);
+       omap_mbox_unregister();
        iounmap(mbox_base);
        return 0;
 }
@@ -467,7 +448,7 @@ static struct platform_driver omap2_mbox_driver = {
        .probe = omap2_mbox_probe,
        .remove = __devexit_p(omap2_mbox_remove),
        .driver = {
-               .name = DRV_NAME,
+               .name = "omap-mailbox",
        },
 };
 
@@ -486,5 +467,6 @@ module_exit(omap2_mbox_exit);
 
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("omap mailbox: omap2/3/4 architecture specific functions");
-MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>, Paul Mundt");
-MODULE_ALIAS("platform:"DRV_NAME);
+MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>");
+MODULE_AUTHOR("Paul Mundt");
+MODULE_ALIAS("platform:omap2-mailbox");
This page took 0.041872 seconds and 5 git commands to generate.