diff options
author | Huang Shijie <b32955@freescale.com> | 2012-11-09 03:23:45 -0500 |
---|---|---|
committer | Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | 2012-11-18 09:02:31 -0500 |
commit | 07300164657526d8d26c626c43723c310fbf3616 (patch) | |
tree | 750a5a6e4bec684577c8969a0960f5e533ea7932 /drivers/mtd/nand/nand_base.c | |
parent | ded4c55d108e0e4e4ba221b39a782e85d77a5ca0 (diff) |
mtd: de-select the chip when it is not used
When we scan several nand chips with nand_scan(), such as
.......................
nand_scan(*, 2);
.......................
In nand_scan_ident(), the maxchips will become 2, so the current code
will select chip 1 to read the device ID. But the chip 0 is still
selected in this case.
To make the logic clear, we'd better de-select the chip when it is not used.
This patch de-select the nand chip if it is not used any more.
Signed-off-by: Huang Shijie <b32955@freescale.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Diffstat (limited to 'drivers/mtd/nand/nand_base.c')
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 01505406ca7b..95d56ed8500a 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -3329,6 +3329,8 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips, | |||
3329 | return PTR_ERR(type); | 3329 | return PTR_ERR(type); |
3330 | } | 3330 | } |
3331 | 3331 | ||
3332 | chip->select_chip(mtd, -1); | ||
3333 | |||
3332 | /* Check for a chip array */ | 3334 | /* Check for a chip array */ |
3333 | for (i = 1; i < maxchips; i++) { | 3335 | for (i = 1; i < maxchips; i++) { |
3334 | chip->select_chip(mtd, i); | 3336 | chip->select_chip(mtd, i); |
@@ -3338,8 +3340,11 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips, | |||
3338 | chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); | 3340 | chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); |
3339 | /* Read manufacturer and device IDs */ | 3341 | /* Read manufacturer and device IDs */ |
3340 | if (nand_maf_id != chip->read_byte(mtd) || | 3342 | if (nand_maf_id != chip->read_byte(mtd) || |
3341 | nand_dev_id != chip->read_byte(mtd)) | 3343 | nand_dev_id != chip->read_byte(mtd)) { |
3344 | chip->select_chip(mtd, -1); | ||
3342 | break; | 3345 | break; |
3346 | } | ||
3347 | chip->select_chip(mtd, -1); | ||
3343 | } | 3348 | } |
3344 | if (i > 1) | 3349 | if (i > 1) |
3345 | pr_info("%d NAND chips detected\n", i); | 3350 | pr_info("%d NAND chips detected\n", i); |
@@ -3598,9 +3603,6 @@ int nand_scan_tail(struct mtd_info *mtd) | |||
3598 | /* Initialize state */ | 3603 | /* Initialize state */ |
3599 | chip->state = FL_READY; | 3604 | chip->state = FL_READY; |
3600 | 3605 | ||
3601 | /* De-select the device */ | ||
3602 | chip->select_chip(mtd, -1); | ||
3603 | |||
3604 | /* Invalidate the pagebuffer reference */ | 3606 | /* Invalidate the pagebuffer reference */ |
3605 | chip->pagebuf = -1; | 3607 | chip->pagebuf = -1; |
3606 | 3608 | ||