aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2012-06-06 19:36:39 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-07-06 13:17:05 -0400
commit874d72c4fe07713c4889c944d3c7ebbce352c762 (patch)
tree16db5ddbe2f4cab545e64dae0d5b9fad43d503db
parent9d6367f4f7835131b2b3987d134fd4c44636fa8d (diff)
mtd: elbc nand: use drvdata to only remove the relevant chip
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> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--drivers/mtd/nand/fsl_elbc_nand.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
index 1d8d111fa3ae..22bb5e6ddaca 100644
--- a/drivers/mtd/nand/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/fsl_elbc_nand.c
@@ -915,7 +915,8 @@ static int __devinit fsl_elbc_nand_probe(struct platform_device *pdev)
915 elbc_fcm_ctrl->chips[bank] = priv; 915 elbc_fcm_ctrl->chips[bank] = priv;
916 priv->bank = bank; 916 priv->bank = bank;
917 priv->ctrl = fsl_lbc_ctrl_dev; 917 priv->ctrl = fsl_lbc_ctrl_dev;
918 priv->dev = dev; 918 priv->dev = &pdev->dev;
919 dev_set_drvdata(priv->dev, priv);
919 920
920 priv->vbase = ioremap(res.start, resource_size(&res)); 921 priv->vbase = ioremap(res.start, resource_size(&res));
921 if (!priv->vbase) { 922 if (!priv->vbase) {
@@ -962,11 +963,10 @@ err:
962 963
963static int fsl_elbc_nand_remove(struct platform_device *pdev) 964static int fsl_elbc_nand_remove(struct platform_device *pdev)
964{ 965{
965 int i;
966 struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand; 966 struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand;
967 for (i = 0; i < MAX_BANKS; i++) 967 struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev);
968 if (elbc_fcm_ctrl->chips[i]) 968
969 fsl_elbc_chip_remove(elbc_fcm_ctrl->chips[i]); 969 fsl_elbc_chip_remove(priv);
970 970
971 mutex_lock(&fsl_elbc_nand_mutex); 971 mutex_lock(&fsl_elbc_nand_mutex);
972 elbc_fcm_ctrl->counter--; 972 elbc_fcm_ctrl->counter--;