omap: mailbox: Add support for AM33XX SoC
authorVaibhav Bedia <vaibhav.bedia@ti.com>
Tue, 20 Dec 2011 11:35:09 +0000 (17:05 +0530)
committerVaibhav Hiremath <hvaibhav@ti.com>
Mon, 23 Jan 2012 19:14:42 +0000 (00:44 +0530)
While at it, remove some unnecessary #if statements

Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com>
arch/arm/mach-omap2/mailbox.c

index 45a324e1245d0a6cfc3a33ca5090599242080714..e804f7805a154dc81702d3b803a8fe47c30b681d 100644 (file)
 #define MAILBOX_IRQ_NEWMSG(m)          (1 << (2 * (m)))
 #define MAILBOX_IRQ_NOTFULL(m)         (1 << (2 * (m) + 1))
 
+/* TODO: This can and should be based on #users and #sub-modules */
 #define MBOX_REG_SIZE                  0x120
 
 #define OMAP4_MBOX_REG_SIZE            0x130
 
+#define AM33XX_MBOX_REG_SIZE           0x140
+
 #define MBOX_NR_REGS                   (MBOX_REG_SIZE / sizeof(u32))
 #define OMAP4_MBOX_NR_REGS             (OMAP4_MBOX_REG_SIZE / sizeof(u32))
+#define AM33XX_MBOX_NR_REGS            (AM33XX_MBOX_REG_SIZE / sizeof(u32))
 
 static void __iomem *mbox_base;
 
@@ -141,7 +145,7 @@ static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
        struct omap_mbox2_priv *p = mbox->priv;
        u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
 
-       if (!cpu_is_omap44xx())
+       if (!cpu_is_omap44xx() && !cpu_is_am33xx())
                bit = mbox_read_reg(p->irqdisable) & ~bit;
 
        mbox_write_reg(bit, p->irqdisable);
@@ -229,7 +233,6 @@ static struct omap_mbox_ops omap2_mbox_ops = {
 
 /* FIXME: the following structs should be filled automatically by the user id */
 
-#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP2)
 /* DSP */
 static struct omap_mbox2_priv omap2_mbox_dsp_priv = {
        .tx_fifo = {
@@ -252,13 +255,9 @@ struct omap_mbox mbox_dsp_info = {
        .ops    = &omap2_mbox_ops,
        .priv   = &omap2_mbox_dsp_priv,
 };
-#endif
 
-#if defined(CONFIG_ARCH_OMAP3)
 struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL };
-#endif
 
-#if defined(CONFIG_SOC_OMAP2420)
 /* IVA */
 static struct omap_mbox2_priv omap2_mbox_iva_priv = {
        .tx_fifo = {
@@ -283,9 +282,34 @@ static struct omap_mbox mbox_iva_info = {
 };
 
 struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL };
-#endif
 
-#if defined(CONFIG_ARCH_OMAP4)
+/* A8 -> Wakeup-M3 */
+static struct omap_mbox2_priv omap2_mbox_m3_priv = {
+       .tx_fifo = {
+               .msg            = MAILBOX_MESSAGE(0),
+               .fifo_stat      = MAILBOX_FIFOSTATUS(0),
+               .msg_stat       = MAILBOX_MSGSTATUS(0),
+       },
+       /* TODO: No M3->A8 so this needs to be removed */
+       .rx_fifo = {
+               .msg            = MAILBOX_MESSAGE(1),
+               .msg_stat       = MAILBOX_MSGSTATUS(1),
+       },
+       .irqenable      = OMAP4_MAILBOX_IRQENABLE(3),
+       .irqstatus      = OMAP4_MAILBOX_IRQSTATUS(3),
+       .notfull_bit    = MAILBOX_IRQ_NOTFULL(0),
+       .newmsg_bit     = MAILBOX_IRQ_NEWMSG(0),
+       .irqdisable     = OMAP4_MAILBOX_IRQENABLE_CLR(3),
+};
+
+struct omap_mbox wkup_m3_info = {
+       .name   = "wkup_m3",
+       .ops    = &omap2_mbox_ops,
+       .priv   = &omap2_mbox_m3_priv,
+};
+
+struct omap_mbox *am33xx_mboxes[] = { &wkup_m3_info, NULL };
+
 /* OMAP4 */
 static struct omap_mbox2_priv omap2_mbox_1_priv = {
        .tx_fifo = {
@@ -332,7 +356,6 @@ struct omap_mbox mbox_2_info = {
 };
 
 struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL };
-#endif
 
 static int __devinit omap2_mbox_probe(struct platform_device *pdev)
 {
@@ -342,14 +365,15 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
 
        if (false)
                ;
-#if defined(CONFIG_ARCH_OMAP3)
-       else if (cpu_is_omap34xx()) {
+       else if (cpu_is_omap34xx() && !cpu_is_am33xx()) {
                list = omap3_mboxes;
 
+               list[0]->irq = platform_get_irq(pdev, 0);
+       } else if (cpu_is_am33xx()) {
+               list = am33xx_mboxes;
+
                list[0]->irq = platform_get_irq(pdev, 0);
        }
-#endif
-#if defined(CONFIG_ARCH_OMAP2)
        else if (cpu_is_omap2430()) {
                list = omap2_mboxes;
 
@@ -360,14 +384,11 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
                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;
 
                list[0]->irq = list[1]->irq = platform_get_irq(pdev, 0);
        }
-#endif
        else {
                pr_err("%s: platform not supported\n", __func__);
                return -ENODEV;