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

Commit 28299a47 authored by Suman Anna's avatar Suman Anna Committed by Tony Lindgren
Browse files

mailbox/omap: use devm_* interfaces



Use the various devm_ interfaces to simplify the cleanup in
probe and remove functions in OMAP2+ mailbox driver.

Signed-off-by: default avatarSuman Anna <s-anna@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent cbf14f3a
Loading
Loading
Loading
Loading
+19 −45
Original line number Diff line number Diff line
@@ -236,23 +236,24 @@ static int omap2_mbox_probe(struct platform_device *pdev)
	}

	/* allocate one extra for marking end of list */
	list = kzalloc((pdata->info_cnt + 1) * sizeof(*list), GFP_KERNEL);
	list = devm_kzalloc(&pdev->dev, (pdata->info_cnt + 1) * sizeof(*list),
			    GFP_KERNEL);
	if (!list)
		return -ENOMEM;

	mboxblk = mbox = kzalloc(pdata->info_cnt * sizeof(*mbox), GFP_KERNEL);
	if (!mboxblk) {
		ret = -ENOMEM;
		goto free_list;
	}
	mboxblk = devm_kzalloc(&pdev->dev, pdata->info_cnt * sizeof(*mbox),
			       GFP_KERNEL);
	if (!mboxblk)
		return -ENOMEM;

	privblk = priv = kzalloc(pdata->info_cnt * sizeof(*priv), GFP_KERNEL);
	if (!privblk) {
		ret = -ENOMEM;
		goto free_mboxblk;
	}
	privblk = devm_kzalloc(&pdev->dev, pdata->info_cnt * sizeof(*priv),
			       GFP_KERNEL);
	if (!privblk)
		return -ENOMEM;

	info = pdata->info;
	mbox = mboxblk;
	priv = privblk;
	for (i = 0; i < pdata->info_cnt; i++, info++, priv++) {
		priv->tx_fifo.msg = MAILBOX_MESSAGE(info->tx_id);
		priv->tx_fifo.fifo_stat = MAILBOX_FIFOSTATUS(info->tx_id);
@@ -276,55 +277,28 @@ static int omap2_mbox_probe(struct platform_device *pdev)
		mbox->name = info->name;
		mbox->ops = &omap2_mbox_ops;
		mbox->irq = platform_get_irq(pdev, info->irq_id);
		if (mbox->irq < 0) {
			ret = mbox->irq;
			goto free_privblk;
		}
		if (mbox->irq < 0)
			return mbox->irq;
		list[i] = mbox++;
	}

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		ret = -ENOENT;
		goto free_privblk;
	}

	mbox_base = ioremap(mem->start, resource_size(mem));
	if (!mbox_base) {
		ret = -ENOMEM;
		goto free_privblk;
	}
	mbox_base = devm_ioremap_resource(&pdev->dev, mem);
	if (IS_ERR(mbox_base))
		return PTR_ERR(mbox_base);

	ret = omap_mbox_register(&pdev->dev, list);
	if (ret)
		goto unmap_mbox;
		return ret;

	platform_set_drvdata(pdev, list);

	return 0;

unmap_mbox:
	iounmap(mbox_base);
free_privblk:
	kfree(privblk);
free_mboxblk:
	kfree(mboxblk);
free_list:
	kfree(list);
	return ret;
}

static int omap2_mbox_remove(struct platform_device *pdev)
{
	struct omap_mbox2_priv *privblk;
	struct omap_mbox **list = platform_get_drvdata(pdev);
	struct omap_mbox *mboxblk = list[0];

	privblk = mboxblk->priv;
	omap_mbox_unregister();
	iounmap(mbox_base);
	kfree(privblk);
	kfree(mboxblk);
	kfree(list);

	return 0;
}