Patchwork mtd: elbc nand: use drvdata to only remove the relevant chip

login
register
mail settings
Submitter Scott Wood
Date June 6, 2012, 11:36 p.m.
Message ID <20120606233639.GA13977@tyr.buserror.net>
Download mbox | patch
Permalink /patch/163445/
State Accepted
Commit 874d72c4fe07713c4889c944d3c7ebbce352c762
Headers show

Comments

Scott Wood - June 6, 2012, 11:36 p.m.
Previously the remove method was looping and removing all chips,
which is obviously not the right thing to do -- left over from when
the driver was organized differently and that was the remove method for
the entire controller.  This would result in bad things happening if
you have more than one NAND chip, and remove the module.

This also fixes priv->dev to properly point to the chip's device rather than
the controller's.  Until now priv->dev was only used for error/debug prints
(and it's an improvement there), so this shouldn't break anything.

Signed-off-by: Scott Wood <scottwood@freescale.com>
---
 drivers/mtd/nand/fsl_elbc_nand.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)
Artem Bityutskiy - June 7, 2012, 10:08 a.m.
On Wed, 2012-06-06 at 18:36 -0500, Scott Wood wrote:
> Previously the remove method was looping and removing all chips,
> which is obviously not the right thing to do -- left over from when
> the driver was organized differently and that was the remove method for
> the entire controller.  This would result in bad things happening if
> you have more than one NAND chip, and remove the module.
> 
> This also fixes priv->dev to properly point to the chip's device rather than
> the controller's.  Until now priv->dev was only used for error/debug prints
> (and it's an improvement there), so this shouldn't break anything.
> 
> Signed-off-by: Scott Wood <scottwood@freescale.com>

Pushed to l2-mtd.git, thanks!

Patch

diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
index 7842938..a3c5578 100644
--- a/drivers/mtd/nand/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/fsl_elbc_nand.c
@@ -916,7 +916,8 @@  static int __devinit fsl_elbc_nand_probe(struct platform_device *pdev)
 	elbc_fcm_ctrl->chips[bank] = priv;
 	priv->bank = bank;
 	priv->ctrl = fsl_lbc_ctrl_dev;
-	priv->dev = dev;
+	priv->dev = &pdev->dev;
+	dev_set_drvdata(priv->dev, priv);
 
 	priv->vbase = ioremap(res.start, resource_size(&res));
 	if (!priv->vbase) {
@@ -963,11 +964,10 @@  err:
 
 static int fsl_elbc_nand_remove(struct platform_device *pdev)
 {
-	int i;
 	struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand;
-	for (i = 0; i < MAX_BANKS; i++)
-		if (elbc_fcm_ctrl->chips[i])
-			fsl_elbc_chip_remove(elbc_fcm_ctrl->chips[i]);
+	struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev);
+
+	fsl_elbc_chip_remove(priv);
 
 	mutex_lock(&fsl_elbc_nand_mutex);
 	elbc_fcm_ctrl->counter--;