Patchwork [U-Boot,1/4] mtd/nand : Add function board_nand_init_tail() for some special NAND controllers

login
register
mail settings
Submitter Shengzhou Liu
Date Dec. 2, 2011, 9:17 a.m.
Message ID <1322817437-4955-1-git-send-email-Shengzhou.Liu@freescale.com>
Download mbox | patch
Permalink /patch/128816/
State Superseded
Delegated to: Scott Wood
Headers show

Comments

Shengzhou Liu - Dec. 2, 2011, 9:17 a.m.
In some NAND controllers there is a size limitation of RAM buffer(2K bytes).
To support large-page NAND chips with greater than 2K pagesize, we need a large
buffer, but we don't know pagesize before calling nand_scan_ident(), for more
flexible and to identify different cases of large-page greater than 2K bytes,
we have a board_nand_init_tail() between nand_scan_ident() and nand_scan_tail().

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
---
 drivers/mtd/nand/nand.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)
Igor Grinberg - Dec. 4, 2011, 9:04 a.m.
Hi,

On 12/02/11 11:17, Shengzhou Liu wrote:
> In some NAND controllers there is a size limitation of RAM buffer(2K bytes).
> To support large-page NAND chips with greater than 2K pagesize, we need a large
> buffer, but we don't know pagesize before calling nand_scan_ident(), for more
> flexible and to identify different cases of large-page greater than 2K bytes,
> we have a board_nand_init_tail() between nand_scan_ident() and nand_scan_tail().
> 
> Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
> ---
>  drivers/mtd/nand/nand.c |   14 +++++++++++++-
>  1 files changed, 13 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c
> index d987f4c..2bafe47 100644
> --- a/drivers/mtd/nand/nand.c
> +++ b/drivers/mtd/nand/nand.c
> @@ -39,6 +39,13 @@ static ulong base_address[CONFIG_SYS_MAX_NAND_DEVICE] = CONFIG_SYS_NAND_BASE_LIS
>  static const char default_nand_name[] = "nand";
>  static __attribute__((unused)) char dev_name[CONFIG_SYS_MAX_NAND_DEVICE][8];
>  
> +int __board_nand_init_tail(struct mtd_info *mtd, struct nand_chip *nand)
> +{
> +	/* Allow for init at tail in controller-specific file for some reason */
> +}
> +void board_nand_init_tail(struct mtd_info *mtd, struct nand_chip *nand)
> +__attribute__((weak, alias("__board_nand_init_tail")));
> +

Something is wrong here...
You need to decide what should be the return type...
Either make it void and change the return type of the default function,
or make it an int and add a return statement.

>  static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
>  			   ulong base_addr)
>  {
> @@ -51,7 +58,12 @@ 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, maxchips) == 0) {
> +		if (!nand_scan_ident(mtd, maxchips, NULL)) {
> +			board_nand_init_tail(mtd, nand);
> +			if (nand_scan_tail(mtd)) {
> +				mtd->name = NULL;
> +				return;
> +			}
>  			if (!mtd->name)
>  				mtd->name = (char *)default_nand_name;
>  #ifdef CONFIG_NEEDS_MANUAL_RELOC

Patch

diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c
index d987f4c..2bafe47 100644
--- a/drivers/mtd/nand/nand.c
+++ b/drivers/mtd/nand/nand.c
@@ -39,6 +39,13 @@  static ulong base_address[CONFIG_SYS_MAX_NAND_DEVICE] = CONFIG_SYS_NAND_BASE_LIS
 static const char default_nand_name[] = "nand";
 static __attribute__((unused)) char dev_name[CONFIG_SYS_MAX_NAND_DEVICE][8];
 
+int __board_nand_init_tail(struct mtd_info *mtd, struct nand_chip *nand)
+{
+	/* Allow for init at tail in controller-specific file for some reason */
+}
+void board_nand_init_tail(struct mtd_info *mtd, struct nand_chip *nand)
+__attribute__((weak, alias("__board_nand_init_tail")));
+
 static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
 			   ulong base_addr)
 {
@@ -51,7 +58,12 @@  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, maxchips) == 0) {
+		if (!nand_scan_ident(mtd, maxchips, NULL)) {
+			board_nand_init_tail(mtd, nand);
+			if (nand_scan_tail(mtd)) {
+				mtd->name = NULL;
+				return;
+			}
 			if (!mtd->name)
 				mtd->name = (char *)default_nand_name;
 #ifdef CONFIG_NEEDS_MANUAL_RELOC