Skip to content

Commit

Permalink
omap: mailbox: simplify omap_mbox_register()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Felipe Contreras authored and Hiroshi DOYU committed Aug 4, 2010
1 parent 898ee75 commit 9c80c8c
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 97 deletions.
25 changes: 7 additions & 18 deletions arch/arm/mach-omap1/mailbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@

static void __iomem *mbox_base;

static struct omap_mbox **list;

struct omap_mbox1_fifo {
unsigned long cmd;
unsigned long data;
Expand Down Expand Up @@ -151,37 +149,28 @@ static int __devinit omap1_mbox_probe(struct platform_device *pdev)
struct resource *mem;
int ret;
int i;
struct omap_mbox **list;

list = omap1_mboxes;

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)
return -ENOMEM;

for (i = 0; list[i]; i++) {
ret = omap_mbox_register(&pdev->dev, list[i]);
if (ret)
goto err_out;
ret = omap_mbox_register(&pdev->dev, list);
if (ret) {
iounmap(mbox_base);
return ret;
}
return 0;

err_out:
while (i--)
omap_mbox_unregister(list[i]);
iounmap(mbox_base);
return ret;
return 0;
}

static int __devexit omap1_mbox_remove(struct platform_device *pdev)
{
int i;

for (i = 0; list[i]; i++)
omap_mbox_unregister(list[i]);

omap_mbox_unregister();
iounmap(mbox_base);
return 0;
}
Expand Down
22 changes: 6 additions & 16 deletions arch/arm/mach-omap2/mailbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@

static void __iomem *mbox_base;

static struct omap_mbox **list;

struct omap_mbox2_fifo {
unsigned long msg;
unsigned long fifo_stat;
Expand Down Expand Up @@ -390,7 +388,7 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
{
struct resource *mem;
int ret;
int i;
struct omap_mbox **list;

if (cpu_is_omap3430()) {
list = omap3_mboxes;
Expand Down Expand Up @@ -421,27 +419,19 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
if (!mbox_base)
return -ENOMEM;

for (i = 0; list[i]; i++) {
ret = omap_mbox_register(&pdev->dev, list[i]);
if (ret)
goto err_out;
ret = omap_mbox_register(&pdev->dev, list);
if (ret) {
iounmap(mbox_base);
return ret;
}
return 0;

err_out:
while (i--)
omap_mbox_unregister(list[i]);
iounmap(mbox_base);
return ret;
}

static int __devexit omap2_mbox_remove(struct platform_device *pdev)
{
int i;

for (i = 0; list[i]; i++)
omap_mbox_unregister(list[i]);

omap_mbox_unregister();
iounmap(mbox_base);
return 0;
}
Expand Down
5 changes: 2 additions & 3 deletions arch/arm/plat-omap/include/plat/mailbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ struct omap_mbox {
struct omap_mbox_queue *txq, *rxq;
struct omap_mbox_ops *ops;
struct device *dev;
struct omap_mbox *next;
void *priv;
};

Expand All @@ -65,8 +64,8 @@ void omap_mbox_init_seq(struct omap_mbox *);
struct omap_mbox *omap_mbox_get(const char *);
void omap_mbox_put(struct omap_mbox *);

int omap_mbox_register(struct device *parent, struct omap_mbox *);
int omap_mbox_unregister(struct omap_mbox *);
int omap_mbox_register(struct device *parent, struct omap_mbox **);
int omap_mbox_unregister(void);

static inline void omap_mbox_save_ctx(struct omap_mbox *mbox)
{
Expand Down
95 changes: 35 additions & 60 deletions arch/arm/plat-omap/mailbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@
#include <plat/mailbox.h>

static struct workqueue_struct *mboxd;
static struct omap_mbox *mboxes;
static DEFINE_SPINLOCK(mboxes_lock);
static struct omap_mbox **mboxes;
static bool rq_full;

static int mbox_configured;
Expand Down Expand Up @@ -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 *mbox;
int ret;

spin_lock(&mboxes_lock);
mbox = *(find_mboxes(name));
if (mbox == NULL) {
spin_unlock(&mboxes_lock);
return ERR_PTR(-ENOENT);
}
if (!mboxes)
return ERR_PTR(-EINVAL);

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);
if (ret)
Expand All @@ -349,57 +337,44 @@ EXPORT_SYMBOL(omap_mbox_put);

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;
struct omap_mbox **tmp;
int ret;
int i;

if (!mbox)
mboxes = list;
if (!mboxes)
return -EINVAL;
if (mbox->next)
return -EBUSY;

mbox->dev = device_create(&omap_mbox_class,
parent, 0, mbox, "%s", mbox->name);
if (IS_ERR(mbox->dev))
return PTR_ERR(mbox->dev);

spin_lock(&mboxes_lock);
tmp = find_mboxes(mbox->name);
if (*tmp) {
ret = -EBUSY;
spin_unlock(&mboxes_lock);
goto err_find;
}
*tmp = mbox;
spin_unlock(&mboxes_lock);

for (i = 0; mboxes[i]; i++) {
struct omap_mbox *mbox = mboxes[i];
mbox->dev = device_create(&omap_mbox_class,
parent, 0, mbox, "%s", mbox->name);
if (IS_ERR(mbox->dev)) {
ret = PTR_ERR(mbox->dev);
goto err_out;
}
}
return 0;

err_find:
err_out:
while (i--)
device_unregister(mboxes[i]->dev);
return ret;
}
EXPORT_SYMBOL(omap_mbox_register);

int omap_mbox_unregister(struct omap_mbox *mbox)
int omap_mbox_unregister(void)
{
struct omap_mbox **tmp;

spin_lock(&mboxes_lock);
tmp = &mboxes;
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);
int i;

return -EINVAL;
if (!mboxes)
return -EINVAL;

for (i = 0; mboxes[i]; i++)
device_unregister(mboxes[i]->dev);
mboxes = NULL;
return 0;
}
EXPORT_SYMBOL(omap_mbox_unregister);

Expand Down

0 comments on commit 9c80c8c

Please sign in to comment.