Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c80c8cd authored by Felipe Contreras's avatar Felipe Contreras Committed by Hiroshi DOYU
Browse files

omap: mailbox: simplify omap_mbox_register()



No need to dynamically register mailboxes one by one.

Signed-off-by: default avatarFelipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: default avatarHiroshi DOYU <Hiroshi.DOYU@nokia.com>
parent 898ee756
Loading
Loading
Loading
Loading
+7 −18
Original line number Diff line number Diff line
@@ -29,8 +29,6 @@

static void __iomem *mbox_base;

static struct omap_mbox **list;

struct omap_mbox1_fifo {
	unsigned long cmd;
	unsigned long data;
@@ -151,9 +149,9 @@ 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);
@@ -161,27 +159,18 @@ static int __devinit omap1_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;
	}
	return 0;

err_out:
	while (i--)
		omap_mbox_unregister(list[i]);
	ret = omap_mbox_register(&pdev->dev, list);
	if (ret) {
		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;
}
+6 −16
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
}
+2 −3
Original line number Diff line number Diff line
@@ -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;
};

@@ -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)
{
+35 −60
Original line number Diff line number Diff line
@@ -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;
@@ -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)
@@ -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;

	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))
		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;
		if (IS_ERR(mbox->dev)) {
			ret = PTR_ERR(mbox->dev);
			goto err_out;
		}
	}
	*tmp = mbox;
	spin_unlock(&mboxes_lock);

	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;

	if (!mboxes)
		return -EINVAL;

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