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:
parent
898ee75623
commit
9c80c8cd74
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Reference in New Issue