diff options
Diffstat (limited to 'arch/arm/mach-omap2/mailbox.c')
| -rw-r--r-- | arch/arm/mach-omap2/mailbox.c | 182 | 
1 files changed, 82 insertions, 100 deletions
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 318f3638653..42dbfa46e65 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -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");  | 
