dect
/
linux-2.6
Archived
13
0
Fork 0

omap: mailbox: simplify omap_mbox_register()

No need to dynamically register mailboxes one by one.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
This commit is contained in:
Felipe Contreras 2010-06-11 15:51:46 +00:00 committed by Hiroshi DOYU
parent 898ee75623
commit 9c80c8cd74
4 changed files with 48 additions and 95 deletions

View File

@ -29,8 +29,6 @@
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;
@ -151,9 +149,9 @@ static int __devinit omap1_mbox_probe(struct platform_device *pdev)
struct resource *mem; struct resource *mem;
int ret; int ret;
int i; int i;
struct omap_mbox **list;
list = omap1_mboxes; list = omap1_mboxes;
list[0]->irq = platform_get_irq_byname(pdev, "dsp"); list[0]->irq = platform_get_irq_byname(pdev, "dsp");
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@ -161,27 +159,18 @@ static int __devinit omap1_mbox_probe(struct platform_device *pdev)
if (!mbox_base) if (!mbox_base)
return -ENOMEM; return -ENOMEM;
for (i = 0; list[i]; i++) { ret = omap_mbox_register(&pdev->dev, list);
ret = omap_mbox_register(&pdev->dev, list[i]); if (ret) {
if (ret) iounmap(mbox_base);
goto err_out; return ret;
} }
return 0;
err_out: return 0;
while (i--)
omap_mbox_unregister(list[i]);
iounmap(mbox_base);
return ret;
} }
static int __devexit omap1_mbox_remove(struct platform_device *pdev) static int __devexit omap1_mbox_remove(struct platform_device *pdev)
{ {
int i; omap_mbox_unregister();
for (i = 0; list[i]; i++)
omap_mbox_unregister(list[i]);
iounmap(mbox_base); iounmap(mbox_base);
return 0; return 0;
} }

View File

@ -56,8 +56,6 @@
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;
@ -390,7 +388,7 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
{ {
struct resource *mem; struct resource *mem;
int ret; int ret;
int i; struct omap_mbox **list;
if (cpu_is_omap3430()) { if (cpu_is_omap3430()) {
list = omap3_mboxes; list = omap3_mboxes;
@ -421,27 +419,19 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
if (!mbox_base) if (!mbox_base)
return -ENOMEM; return -ENOMEM;
for (i = 0; list[i]; i++) { ret = omap_mbox_register(&pdev->dev, list);
ret = omap_mbox_register(&pdev->dev, list[i]); if (ret) {
if (ret) iounmap(mbox_base);
goto err_out; return ret;
} }
return 0; return 0;
err_out:
while (i--)
omap_mbox_unregister(list[i]);
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)
{ {
int i; omap_mbox_unregister();
for (i = 0; list[i]; i++)
omap_mbox_unregister(list[i]);
iounmap(mbox_base); iounmap(mbox_base);
return 0; return 0;
} }

View File

@ -55,7 +55,6 @@ struct omap_mbox {
struct omap_mbox_queue *txq, *rxq; struct omap_mbox_queue *txq, *rxq;
struct omap_mbox_ops *ops; struct omap_mbox_ops *ops;
struct device *dev; struct device *dev;
struct omap_mbox *next;
void *priv; void *priv;
}; };
@ -65,8 +64,8 @@ void omap_mbox_init_seq(struct omap_mbox *);
struct omap_mbox *omap_mbox_get(const char *); struct omap_mbox *omap_mbox_get(const char *);
void omap_mbox_put(struct omap_mbox *); void omap_mbox_put(struct omap_mbox *);
int omap_mbox_register(struct device *parent, struct omap_mbox *); int omap_mbox_register(struct device *parent, struct omap_mbox **);
int omap_mbox_unregister(struct omap_mbox *); int omap_mbox_unregister(void);
static inline void omap_mbox_save_ctx(struct omap_mbox *mbox) static inline void omap_mbox_save_ctx(struct omap_mbox *mbox)
{ {

View File

@ -33,8 +33,7 @@
#include <plat/mailbox.h> #include <plat/mailbox.h>
static struct workqueue_struct *mboxd; static struct workqueue_struct *mboxd;
static struct omap_mbox *mboxes; static struct omap_mbox **mboxes;
static DEFINE_SPINLOCK(mboxes_lock);
static bool rq_full; static bool rq_full;
static int mbox_configured; static int mbox_configured;
@ -307,31 +306,20 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
} }
} }
static struct omap_mbox **find_mboxes(const char *name)
{
struct omap_mbox **p;
for (p = &mboxes; *p; p = &(*p)->next) {
if (strcmp((*p)->name, name) == 0)
break;
}
return p;
}
struct omap_mbox *omap_mbox_get(const char *name) struct omap_mbox *omap_mbox_get(const char *name)
{ {
struct omap_mbox *mbox; struct omap_mbox *mbox;
int ret; int ret;
spin_lock(&mboxes_lock); if (!mboxes)
mbox = *(find_mboxes(name)); return ERR_PTR(-EINVAL);
if (mbox == NULL) {
spin_unlock(&mboxes_lock);
return ERR_PTR(-ENOENT);
}
spin_unlock(&mboxes_lock); for (mbox = *mboxes; mbox; mbox++)
if (!strcmp(mbox->name, name))
break;
if (!mbox)
return ERR_PTR(-ENOENT);
ret = omap_mbox_startup(mbox); ret = omap_mbox_startup(mbox);
if (ret) if (ret)
@ -349,57 +337,44 @@ EXPORT_SYMBOL(omap_mbox_put);
static struct class omap_mbox_class = { .name = "mbox", }; static struct class omap_mbox_class = { .name = "mbox", };
int omap_mbox_register(struct device *parent, struct omap_mbox *mbox) int omap_mbox_register(struct device *parent, struct omap_mbox **list)
{ {
int ret = 0; int ret;
struct omap_mbox **tmp; int i;
if (!mbox) mboxes = list;
if (!mboxes)
return -EINVAL; return -EINVAL;
if (mbox->next)
return -EBUSY;
mbox->dev = device_create(&omap_mbox_class, for (i = 0; mboxes[i]; i++) {
parent, 0, mbox, "%s", mbox->name); struct omap_mbox *mbox = mboxes[i];
if (IS_ERR(mbox->dev)) mbox->dev = device_create(&omap_mbox_class,
return PTR_ERR(mbox->dev); parent, 0, mbox, "%s", mbox->name);
if (IS_ERR(mbox->dev)) {
spin_lock(&mboxes_lock); ret = PTR_ERR(mbox->dev);
tmp = find_mboxes(mbox->name); goto err_out;
if (*tmp) { }
ret = -EBUSY;
spin_unlock(&mboxes_lock);
goto err_find;
} }
*tmp = mbox;
spin_unlock(&mboxes_lock);
return 0; return 0;
err_find: err_out:
while (i--)
device_unregister(mboxes[i]->dev);
return ret; return ret;
} }
EXPORT_SYMBOL(omap_mbox_register); EXPORT_SYMBOL(omap_mbox_register);
int omap_mbox_unregister(struct omap_mbox *mbox) int omap_mbox_unregister(void)
{ {
struct omap_mbox **tmp; int i;
spin_lock(&mboxes_lock); if (!mboxes)
tmp = &mboxes; return -EINVAL;
while (*tmp) {
if (mbox == *tmp) {
*tmp = mbox->next;
mbox->next = NULL;
spin_unlock(&mboxes_lock);
device_unregister(mbox->dev);
return 0;
}
tmp = &(*tmp)->next;
}
spin_unlock(&mboxes_lock);
return -EINVAL; for (i = 0; mboxes[i]; i++)
device_unregister(mboxes[i]->dev);
mboxes = NULL;
return 0;
} }
EXPORT_SYMBOL(omap_mbox_unregister); EXPORT_SYMBOL(omap_mbox_unregister);