omap: mailbox: reorganize registering
It's more extensible this way. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
This commit is contained in:
parent
1f2c4dfd30
commit
898ee75623
|
@ -29,6 +29,8 @@
|
||||||
|
|
||||||
static void __iomem *mbox_base;
|
static void __iomem *mbox_base;
|
||||||
|
|
||||||
|
static struct omap_mbox **list;
|
||||||
|
|
||||||
struct omap_mbox1_fifo {
|
struct omap_mbox1_fifo {
|
||||||
unsigned long cmd;
|
unsigned long cmd;
|
||||||
unsigned long data;
|
unsigned long data;
|
||||||
|
@ -142,44 +144,44 @@ struct omap_mbox mbox_dsp_info = {
|
||||||
.priv = &omap1_mbox_dsp_priv,
|
.priv = &omap1_mbox_dsp_priv,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct omap_mbox *omap1_mboxes[] = { &mbox_dsp_info, NULL };
|
||||||
|
|
||||||
static int __devinit omap1_mbox_probe(struct platform_device *pdev)
|
static int __devinit omap1_mbox_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct resource *res;
|
struct resource *mem;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* MBOX base */
|
list = omap1_mboxes;
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
||||||
if (unlikely(!res)) {
|
|
||||||
dev_err(&pdev->dev, "invalid mem resource\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
mbox_base = ioremap(res->start, resource_size(res));
|
list[0]->irq = platform_get_irq_byname(pdev, "dsp");
|
||||||
|
|
||||||
|
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
mbox_base = ioremap(mem->start, resource_size(mem));
|
||||||
if (!mbox_base)
|
if (!mbox_base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* DSP IRQ */
|
for (i = 0; list[i]; i++) {
|
||||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
ret = omap_mbox_register(&pdev->dev, list[i]);
|
||||||
if (unlikely(!res)) {
|
if (ret)
|
||||||
dev_err(&pdev->dev, "invalid irq resource\n");
|
goto err_out;
|
||||||
ret = -ENODEV;
|
|
||||||
goto err_out;
|
|
||||||
}
|
}
|
||||||
mbox_dsp_info.irq = res->start;
|
|
||||||
|
|
||||||
ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info);
|
|
||||||
if (ret)
|
|
||||||
goto err_out;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
|
while (i--)
|
||||||
|
omap_mbox_unregister(list[i]);
|
||||||
iounmap(mbox_base);
|
iounmap(mbox_base);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devexit omap1_mbox_remove(struct platform_device *pdev)
|
static int __devexit omap1_mbox_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
omap_mbox_unregister(&mbox_dsp_info);
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; list[i]; i++)
|
||||||
|
omap_mbox_unregister(list[i]);
|
||||||
|
|
||||||
iounmap(mbox_base);
|
iounmap(mbox_base);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,8 @@
|
||||||
|
|
||||||
static void __iomem *mbox_base;
|
static void __iomem *mbox_base;
|
||||||
|
|
||||||
|
static struct omap_mbox **list;
|
||||||
|
|
||||||
struct omap_mbox2_fifo {
|
struct omap_mbox2_fifo {
|
||||||
unsigned long msg;
|
unsigned long msg;
|
||||||
unsigned long fifo_stat;
|
unsigned long fifo_stat;
|
||||||
|
@ -307,6 +309,8 @@ struct omap_mbox mbox_dsp_info = {
|
||||||
.priv = &omap2_mbox_dsp_priv,
|
.priv = &omap2_mbox_dsp_priv,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL };
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP2420)
|
#if defined(CONFIG_ARCH_OMAP2420)
|
||||||
|
|
||||||
/* IVA */
|
/* IVA */
|
||||||
|
@ -331,6 +335,8 @@ static struct omap_mbox mbox_iva_info = {
|
||||||
.ops = &omap2_mbox_ops,
|
.ops = &omap2_mbox_ops,
|
||||||
.priv = &omap2_mbox_iva_priv,
|
.priv = &omap2_mbox_iva_priv,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct omap_mbox *omap2_mboxes[] = { &mbox_iva_info, &mbox_dsp_info, NULL };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* OMAP4 */
|
/* OMAP4 */
|
||||||
|
@ -378,89 +384,64 @@ struct omap_mbox mbox_2_info = {
|
||||||
.priv = &omap2_mbox_2_priv,
|
.priv = &omap2_mbox_2_priv,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL };
|
||||||
|
|
||||||
static int __devinit omap2_mbox_probe(struct platform_device *pdev)
|
static int __devinit omap2_mbox_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct resource *res;
|
struct resource *mem;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* MBOX base */
|
if (cpu_is_omap3430()) {
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
list = omap3_mboxes;
|
||||||
if (unlikely(!res)) {
|
|
||||||
dev_err(&pdev->dev, "invalid mem resource\n");
|
list[0]->irq = platform_get_irq_byname(pdev, "dsp");
|
||||||
|
}
|
||||||
|
#if defined(CONFIG_ARCH_OMAP2420)
|
||||||
|
else if (cpu_is_omap2420()) {
|
||||||
|
list = omap2_mboxes;
|
||||||
|
|
||||||
|
list[0]->irq = platform_get_irq_byname(pdev, "dsp");
|
||||||
|
list[1]->irq = platform_get_irq_byname(pdev, "iva");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (cpu_is_omap44xx()) {
|
||||||
|
list = omap4_mboxes;
|
||||||
|
|
||||||
|
list[0]->irq = list[1]->irq =
|
||||||
|
platform_get_irq_byname(pdev, "mbox");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pr_err("%s: platform not supported\n", __func__);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
mbox_base = ioremap(res->start, resource_size(res));
|
|
||||||
|
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
mbox_base = ioremap(mem->start, resource_size(mem));
|
||||||
if (!mbox_base)
|
if (!mbox_base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* DSP or IVA2 IRQ */
|
for (i = 0; list[i]; i++) {
|
||||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
ret = omap_mbox_register(&pdev->dev, list[i]);
|
||||||
|
if (ret)
|
||||||
if (unlikely(!res)) {
|
goto err_out;
|
||||||
dev_err(&pdev->dev, "invalid irq resource\n");
|
|
||||||
ret = -ENODEV;
|
|
||||||
goto err_dsp;
|
|
||||||
}
|
}
|
||||||
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);
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP2420) /* IVA */
|
err_out:
|
||||||
err_iva1:
|
while (i--)
|
||||||
omap_mbox_unregister(&mbox_dsp_info);
|
omap_mbox_unregister(list[i]);
|
||||||
#endif
|
|
||||||
|
|
||||||
err_dsp:
|
|
||||||
iounmap(mbox_base);
|
iounmap(mbox_base);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devexit omap2_mbox_remove(struct platform_device *pdev)
|
static int __devexit omap2_mbox_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_ARCH_OMAP2420)
|
int i;
|
||||||
if (cpu_is_omap2420())
|
|
||||||
omap_mbox_unregister(&mbox_iva_info);
|
for (i = 0; list[i]; i++)
|
||||||
#endif
|
omap_mbox_unregister(list[i]);
|
||||||
|
|
||||||
if (cpu_is_omap44xx()) {
|
|
||||||
omap_mbox_unregister(&mbox_2_info);
|
|
||||||
omap_mbox_unregister(&mbox_1_info);
|
|
||||||
} else
|
|
||||||
omap_mbox_unregister(&mbox_dsp_info);
|
|
||||||
iounmap(mbox_base);
|
iounmap(mbox_base);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue