[U-Boot] [PATCH] [NAND] Add board_nand_init_tail to give board module a chance to init after NAND chip is scaned.

Sometimes, board module needs to know some information about the NAND chip e.g. page size to continue it's initialization. This short patch give board module a chance to continue its initialization after the NAND chip is scaned.
best regards,
diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c index e44470e..f795d2e 100644 --- a/drivers/mtd/nand/nand.c +++ b/drivers/mtd/nand/nand.c @@ -41,6 +41,10 @@ static const char default_nand_name[] = "nand";
extern int board_nand_init(struct nand_chip *nand);
+int __board_nand_init_tail(struct nand_chip *nand) { return 0; } +int inline board_nand_init_tail (struct nand_chip *) __attribute__ + ((weak, alias("__board_nand_init_tail"))); + static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand, ulong base_addr) { @@ -48,7 +52,7 @@ static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr; if (board_nand_init(nand) == 0) { - if (nand_scan(mtd, 1) == 0) { + if ((nand_scan(mtd, 1) == 0) && (board_nand_init_tail(nand) == 0)) { if (!mtd->name) mtd->name = (char *)default_nand_name; } else

Hong Xu wrote:
Sometimes, board module needs to know some information about the NAND chip e.g. page size to continue it's initialization. This short patch give board module a chance to continue its initialization after the NAND chip is scaned.
best regards,
diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c index e44470e..f795d2e 100644
* You need a "Signed-off-by" line * Typo s/scaned/scanned/ (both in the subject and the comment) * The "best regards," line should be deleted from the comment.
Thanks, gvb

In message 1516faed0808071906g118e3bf1ted560f41ad4dec12@mail.gmail.com you wrote:
diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c index e44470e..f795d2e 100644 --- a/drivers/mtd/nand/nand.c +++ b/drivers/mtd/nand/nand.c @@ -41,6 +41,10 @@ static const char default_nand_name[] = "nand";
extern int board_nand_init(struct nand_chip *nand);
+int __board_nand_init_tail(struct nand_chip *nand) { return 0; } +int inline board_nand_init_tail (struct nand_chip *) __attribute__
- ((weak, alias("__board_nand_init_tail")));
I don't like the "_tail" name. Maybe board_nand_init2() or so would be better?
static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand, ulong base_addr) { @@ -48,7 +52,7 @@ static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr; if (board_nand_init(nand) == 0) {
if (nand_scan(mtd, 1) == 0) {
} elseif ((nand_scan(mtd, 1) == 0) && (board_nand_init_tail(nand) == 0)) { if (!mtd->name) mtd->name = (char *)default_nand_name;
The logic is becoming pretty intricate. Maybe you can rewrite this to be more readable?
Best regards,
Wolfgang Denk

"Hong Xu" hongxu.cn@gmail.com wrote:
+int __board_nand_init_tail(struct nand_chip *nand) { return 0; } +int inline board_nand_init_tail (struct nand_chip *) __attribute__
- ((weak, alias("__board_nand_init_tail")));
A globally visible inline weak alias. How does that work?
Haavard

On Fri, Aug 08, 2008 at 10:06:03AM +0800, Hong Xu wrote:
Sometimes, board module needs to know some information about the NAND chip e.g. page size to continue it's initialization. This short patch give board module a chance to continue its initialization after the NAND chip is scaned.
[snip]
nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr; if (board_nand_init(nand) == 0) {
if (nand_scan(mtd, 1) == 0) {
} elseif ((nand_scan(mtd, 1) == 0) && (board_nand_init_tail(nand) == 0)) { if (!mtd->name) mtd->name = (char *)default_nand_name;
This doesn't give the board driver a chance to run before the bad block scan, though. The MTD code itself does (nand_scan_ident and nand_scan_tail, around which nand_scan is a wrapper), but the u-boot glue code doesn't currently let board drivers take advantage of that.
I'd like to transition away from having a centralized nand_init(), and instead have the board drivers call nand_scan*() themselves.
-Scott
participants (5)
-
Haavard Skinnemoen
-
Hong Xu
-
Jerry Van Baren
-
Scott Wood
-
Wolfgang Denk