[U-Boot] [PATCH] mtd: nand: Allow caller to pass alternative ID table to nand_scan_ident()

This patch sync with newest mtd code in Linux on handling nand_scan_ident.
Signed-off-by: Lei Wen leiwen@marvell.com --- drivers/mtd/nand/atmel_nand.c | 2 +- drivers/mtd/nand/nand_base.c | 29 +++++++++++++++-------------- drivers/mtd/nand/nand_ids.c | 2 +- include/linux/mtd/nand.h | 6 ++++-- 4 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index d5eb54a..ab8bbb3 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -296,7 +296,7 @@ int board_nand_init(struct nand_chip *nand) mtd->priv = nand;
/* Detect NAND chips */ - if (nand_scan_ident(mtd, 1)) { + if (nand_scan_ident(mtd, 1, NULL)) { printk(KERN_WARNING "NAND Flash not found !\n"); return -ENXIO; } diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 5239c1f..39fcc94 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2414,10 +2414,10 @@ static void nand_set_defaults(struct nand_chip *chip, int busw) */ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, struct nand_chip *chip, - int busw, int *maf_id) + int busw, int *maf_id, + struct nand_flash_dev *type) { - const struct nand_flash_dev *type = NULL; - int i, dev_id, maf_idx; + int dev_id, maf_idx; int tmp_id, tmp_manf;
/* Select the device */ @@ -2456,15 +2456,14 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, return ERR_PTR(-ENODEV); }
- /* Lookup the flash id */ - for (i = 0; nand_flash_ids[i].name != NULL; i++) { - if (dev_id == nand_flash_ids[i].id) { - type = &nand_flash_ids[i]; - break; - } - } + if (!type) + type = nand_flash_ids; + + for (; type->name != NULL; type++) + if (dev_id == type->id) + break;
- if (!type) { + if (!type->name) { /* supress warning if there is no nand */ if (*maf_id != 0x00 && *maf_id != 0xff && dev_id != 0x00 && dev_id != 0xff) @@ -2580,13 +2579,15 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, * nand_scan_ident - [NAND Interface] Scan for the NAND device * @mtd: MTD device structure * @maxchips: Number of chips to scan for + * @table: Alternative NAND ID table * * This is the first phase of the normal nand_scan() function. It * reads the flash ID and sets up MTD fields accordingly. * * The mtd->owner field must be set to the module of the caller. */ -int nand_scan_ident(struct mtd_info *mtd, int maxchips) +int nand_scan_ident(struct mtd_info *mtd, int maxchips, + struct nand_flash_dev *table) { int i, busw, nand_maf_id; struct nand_chip *chip = mtd->priv; @@ -2598,7 +2599,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips) nand_set_defaults(chip, busw);
/* Read the flash type */ - type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id); + type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id, table);
if (IS_ERR(type)) { #ifndef CONFIG_SYS_NAND_QUIET_TEST @@ -2869,7 +2870,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips) { int ret;
- ret = nand_scan_ident(mtd, maxchips); + ret = nand_scan_ident(mtd, maxchips, NULL); if (!ret) ret = nand_scan_tail(mtd); return ret; diff --git a/drivers/mtd/nand/nand_ids.c b/drivers/mtd/nand/nand_ids.c index 8d7ea76..67da52a 100644 --- a/drivers/mtd/nand/nand_ids.c +++ b/drivers/mtd/nand/nand_ids.c @@ -22,7 +22,7 @@ + 256 256 Byte page size * 512 512 Byte page size */ -const struct nand_flash_dev nand_flash_ids[] = { +struct nand_flash_dev nand_flash_ids[] = {
#ifdef CONFIG_MTD_NAND_MUSEUM_IDS {"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0}, diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 1128f5a..bcbf4dd 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -33,11 +33,13 @@
struct mtd_info; +struct nand_flash_dev; /* Scan and identify a NAND device */ extern int nand_scan (struct mtd_info *mtd, int max_chips); /* Separate phases of nand_scan(), allowing board driver to intervene * and override command or ECC setup according to flash type */ -extern int nand_scan_ident(struct mtd_info *mtd, int max_chips); +extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, + struct nand_flash_dev *table); extern int nand_scan_tail(struct mtd_info *mtd);
/* Free resources held by the NAND device */ @@ -471,7 +473,7 @@ struct nand_manufacturers { char * name; };
-extern const struct nand_flash_dev nand_flash_ids[]; +extern struct nand_flash_dev nand_flash_ids[]; extern const struct nand_manufacturers nand_manuf_ids[];
extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd);

On Mon, Jan 3, 2011 at 10:06 AM, Lei Wen leiwen@marvell.com wrote:
This patch sync with newest mtd code in Linux on handling nand_scan_ident.
is there any point to the sync ? doesnt seem like anyone is using the new option.
--- a/drivers/mtd/nand/nand_ids.c +++ b/drivers/mtd/nand/nand_ids.c -const struct nand_flash_dev nand_flash_ids[] = { +struct nand_flash_dev nand_flash_ids[] = {
this is wrong -mike

Hi Mike,
On Mon, Jan 3, 2011 at 11:35 PM, Mike Frysinger vapier@gentoo.org wrote:
On Mon, Jan 3, 2011 at 10:06 AM, Lei Wen leiwen@marvell.com wrote:
This patch sync with newest mtd code in Linux on handling nand_scan_ident.
is there any point to the sync ? doesnt seem like anyone is using the new option.
This patch sync with David's patch on Linux. commit 5e81e88a4c140586d9212999cea683bcd66a15c6 Author: David Woodhouse David.Woodhouse@intel.com Date: Fri Feb 26 18:32:56 2010 +0000
mtd: nand: Allow caller to pass alternative ID table to nand_scan_ident()
Signed-off-by: David Woodhouse David.Woodhouse@intel.com
Yes, for this time uboot's code hasn't used this kind of code. But this prepare for my submition of pxa3xx_nand.c code in the next several weeks, which need this patch in advance.
--- a/drivers/mtd/nand/nand_ids.c +++ b/drivers/mtd/nand/nand_ids.c -const struct nand_flash_dev nand_flash_ids[] = { +struct nand_flash_dev nand_flash_ids[] = {
this is wrong
This would bring warning to the compilation, and it is also what Linux does now for the same code...
Best regards, Lei

On Mon, Jan 3, 2011 at 10:48 AM, Lei Wen wrote:
On Mon, Jan 3, 2011 at 11:35 PM, Mike Frysinger wrote:
On Mon, Jan 3, 2011 at 10:06 AM, Lei Wen wrote:
--- a/drivers/mtd/nand/nand_ids.c +++ b/drivers/mtd/nand/nand_ids.c -const struct nand_flash_dev nand_flash_ids[] = { +struct nand_flash_dev nand_flash_ids[] = {
this is wrong
This would bring warning to the compilation, and it is also what Linux does now for the same code...
then fix the callers to take a const flash table instead of removing the const markings on a const table -mike

Dear Lei Wen,
In message AANLkTi=t-Ho8pV=Nd_uN7K+XOwmWVo8L825Q9_weqD3g@mail.gmail.com you wrote:
This patch sync with David's patch on Linux. commit 5e81e88a4c140586d9212999cea683bcd66a15c6 Author: David Woodhouse David.Woodhouse@intel.com Date: Fri Feb 26 18:32:56 2010 +0000
mtd: nand: Allow caller to pass alternative ID table to nand_scan_ident() Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
If you ever post such patches, then please pay speacial attention to properly attribute such patches. See http://www.denx.de/wiki/view/U-Boot/Patches#Attributing_Code_Copyrights_Sign
All patches that do not adhere to this policy will be rejected.
Best regards,
Wolfgang Denk

On Mon, 3 Jan 2011 10:35:45 -0500 Mike Frysinger vapier@gentoo.org wrote:
On Mon, Jan 3, 2011 at 10:06 AM, Lei Wen leiwen@marvell.com wrote:
This patch sync with newest mtd code in Linux on handling nand_scan_ident.
is there any point to the sync ? doesnt seem like anyone is using the new option.
Even if Lei didn't need this for an upcoming driver, I see value in keeping in sync unless we have a good reason to deviate. It makes it easier to share drivers and bring over new features that we *do* want to use.
--- a/drivers/mtd/nand/nand_ids.c +++ b/drivers/mtd/nand/nand_ids.c -const struct nand_flash_dev nand_flash_ids[] = { +struct nand_flash_dev nand_flash_ids[] = {
this is wrong
I agree.
-Scott

This patch sync with David's patch on Linux for handling nand_scan_ident.
commit 5e81e88a4c140586d9212999cea683bcd66a15c6 Author: David Woodhouse David.Woodhouse@intel.com Date: Fri Feb 26 18:32:56 2010 +0000
mtd: nand: Allow caller to pass alternative ID table to nand_scan_ident()
Signed-off-by: David Woodhouse David.Woodhouse@intel.com
Signed-off-by: Lei Wen leiwen@marvell.com --- V2: Add original patch owner signature, and fix that patch accoring to comments on const type.
drivers/mtd/nand/atmel_nand.c | 2 +- drivers/mtd/nand/nand_base.c | 29 +++++++++++++++-------------- include/linux/mtd/nand.h | 4 +++- 3 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index d5eb54a..ab8bbb3 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -296,7 +296,7 @@ int board_nand_init(struct nand_chip *nand) mtd->priv = nand;
/* Detect NAND chips */ - if (nand_scan_ident(mtd, 1)) { + if (nand_scan_ident(mtd, 1, NULL)) { printk(KERN_WARNING "NAND Flash not found !\n"); return -ENXIO; } diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 5239c1f..9512ae0 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2414,10 +2414,10 @@ static void nand_set_defaults(struct nand_chip *chip, int busw) */ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, struct nand_chip *chip, - int busw, int *maf_id) + int busw, int *maf_id, + const struct nand_flash_dev *type) { - const struct nand_flash_dev *type = NULL; - int i, dev_id, maf_idx; + int dev_id, maf_idx; int tmp_id, tmp_manf;
/* Select the device */ @@ -2456,15 +2456,14 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, return ERR_PTR(-ENODEV); }
- /* Lookup the flash id */ - for (i = 0; nand_flash_ids[i].name != NULL; i++) { - if (dev_id == nand_flash_ids[i].id) { - type = &nand_flash_ids[i]; - break; - } - } + if (!type) + type = nand_flash_ids; + + for (; type->name != NULL; type++) + if (dev_id == type->id) + break;
- if (!type) { + if (!type->name) { /* supress warning if there is no nand */ if (*maf_id != 0x00 && *maf_id != 0xff && dev_id != 0x00 && dev_id != 0xff) @@ -2580,13 +2579,15 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, * nand_scan_ident - [NAND Interface] Scan for the NAND device * @mtd: MTD device structure * @maxchips: Number of chips to scan for + * @table: Alternative NAND ID table * * This is the first phase of the normal nand_scan() function. It * reads the flash ID and sets up MTD fields accordingly. * * The mtd->owner field must be set to the module of the caller. */ -int nand_scan_ident(struct mtd_info *mtd, int maxchips) +int nand_scan_ident(struct mtd_info *mtd, int maxchips, + struct nand_flash_dev *table) { int i, busw, nand_maf_id; struct nand_chip *chip = mtd->priv; @@ -2598,7 +2599,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips) nand_set_defaults(chip, busw);
/* Read the flash type */ - type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id); + type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id, table);
if (IS_ERR(type)) { #ifndef CONFIG_SYS_NAND_QUIET_TEST @@ -2869,7 +2870,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips) { int ret;
- ret = nand_scan_ident(mtd, maxchips); + ret = nand_scan_ident(mtd, maxchips, NULL); if (!ret) ret = nand_scan_tail(mtd); return ret; diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 1128f5a..ff6a1f9 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -33,11 +33,13 @@
struct mtd_info; +struct nand_flash_dev; /* Scan and identify a NAND device */ extern int nand_scan (struct mtd_info *mtd, int max_chips); /* Separate phases of nand_scan(), allowing board driver to intervene * and override command or ECC setup according to flash type */ -extern int nand_scan_ident(struct mtd_info *mtd, int max_chips); +extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, + struct nand_flash_dev *table); extern int nand_scan_tail(struct mtd_info *mtd);
/* Free resources held by the NAND device */

On Tue, Jan 04, 2011 at 11:39:04AM +0800, Lei Wen wrote:
@@ -2580,13 +2579,15 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
- nand_scan_ident - [NAND Interface] Scan for the NAND device
- @mtd: MTD device structure
- @maxchips: Number of chips to scan for
*/
- @table: Alternative NAND ID table
- This is the first phase of the normal nand_scan() function. It
- reads the flash ID and sets up MTD fields accordingly.
- The mtd->owner field must be set to the module of the caller.
-int nand_scan_ident(struct mtd_info *mtd, int maxchips) +int nand_scan_ident(struct mtd_info *mtd, int maxchips,
struct nand_flash_dev *table)
table should be const here as well.
-Scott

This patch sync with David's patch on Linux for handling nand_scan_ident.
commit 5e81e88a4c140586d9212999cea683bcd66a15c6 Author: David Woodhouse David.Woodhouse@intel.com Date: Fri Feb 26 18:32:56 2010 +0000
mtd: nand: Allow caller to pass alternative ID table to nand_scan_ident()
Signed-off-by: David Woodhouse David.Woodhouse@intel.com
Signed-off-by: Lei Wen leiwen@marvell.com --- V2: Add original patch owner signature, and fix that patch accoring to comments on const type. V3: Fix nand_scan_ident parameter as const
drivers/mtd/nand/atmel_nand.c | 2 +- drivers/mtd/nand/nand_base.c | 29 +++++++++++++++-------------- include/linux/mtd/nand.h | 4 +++- 3 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index d5eb54a..ab8bbb3 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -296,7 +296,7 @@ int board_nand_init(struct nand_chip *nand) mtd->priv = nand;
/* Detect NAND chips */ - if (nand_scan_ident(mtd, 1)) { + if (nand_scan_ident(mtd, 1, NULL)) { printk(KERN_WARNING "NAND Flash not found !\n"); return -ENXIO; } diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 5239c1f..3b96b0e 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2414,10 +2414,10 @@ static void nand_set_defaults(struct nand_chip *chip, int busw) */ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, struct nand_chip *chip, - int busw, int *maf_id) + int busw, int *maf_id, + const struct nand_flash_dev *type) { - const struct nand_flash_dev *type = NULL; - int i, dev_id, maf_idx; + int dev_id, maf_idx; int tmp_id, tmp_manf;
/* Select the device */ @@ -2456,15 +2456,14 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, return ERR_PTR(-ENODEV); }
- /* Lookup the flash id */ - for (i = 0; nand_flash_ids[i].name != NULL; i++) { - if (dev_id == nand_flash_ids[i].id) { - type = &nand_flash_ids[i]; - break; - } - } + if (!type) + type = nand_flash_ids; + + for (; type->name != NULL; type++) + if (dev_id == type->id) + break;
- if (!type) { + if (!type->name) { /* supress warning if there is no nand */ if (*maf_id != 0x00 && *maf_id != 0xff && dev_id != 0x00 && dev_id != 0xff) @@ -2580,13 +2579,15 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, * nand_scan_ident - [NAND Interface] Scan for the NAND device * @mtd: MTD device structure * @maxchips: Number of chips to scan for + * @table: Alternative NAND ID table * * This is the first phase of the normal nand_scan() function. It * reads the flash ID and sets up MTD fields accordingly. * * The mtd->owner field must be set to the module of the caller. */ -int nand_scan_ident(struct mtd_info *mtd, int maxchips) +int nand_scan_ident(struct mtd_info *mtd, int maxchips, + const struct nand_flash_dev *table) { int i, busw, nand_maf_id; struct nand_chip *chip = mtd->priv; @@ -2598,7 +2599,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips) nand_set_defaults(chip, busw);
/* Read the flash type */ - type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id); + type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id, table);
if (IS_ERR(type)) { #ifndef CONFIG_SYS_NAND_QUIET_TEST @@ -2869,7 +2870,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips) { int ret;
- ret = nand_scan_ident(mtd, maxchips); + ret = nand_scan_ident(mtd, maxchips, NULL); if (!ret) ret = nand_scan_tail(mtd); return ret; diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 1128f5a..d299929 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -33,11 +33,13 @@
struct mtd_info; +struct nand_flash_dev; /* Scan and identify a NAND device */ extern int nand_scan (struct mtd_info *mtd, int max_chips); /* Separate phases of nand_scan(), allowing board driver to intervene * and override command or ECC setup according to flash type */ -extern int nand_scan_ident(struct mtd_info *mtd, int max_chips); +extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, + const struct nand_flash_dev *table); extern int nand_scan_tail(struct mtd_info *mtd);
/* Free resources held by the NAND device */

On Thu, Jan 06, 2011 at 09:48:18AM +0800, Lei Wen wrote:
This patch sync with David's patch on Linux for handling nand_scan_ident.
commit 5e81e88a4c140586d9212999cea683bcd66a15c6 Author: David Woodhouse David.Woodhouse@intel.com Date: Fri Feb 26 18:32:56 2010 +0000
mtd: nand: Allow caller to pass alternative ID table to nand_scan_ident()
Signed-off-by: David Woodhouse David.Woodhouse@intel.com
Signed-off-by: Lei Wen leiwen@marvell.com
V2: Add original patch owner signature, and fix that patch accoring to comments on const type. V3: Fix nand_scan_ident parameter as const
Applied to u-boot-nand-flash.
-Scott
participants (5)
-
Lei Wen
-
Lei Wen
-
Mike Frysinger
-
Scott Wood
-
Wolfgang Denk