Patchwork mtd : add init_size hook for NAND driver

login
register
mail settings
Submitter Huang Shijie
Date Sept. 24, 2010, 11:34 a.m.
Message ID <1285328063-7982-1-git-send-email-shijie8@gmail.com>
Download mbox | patch
Permalink /patch/65635/
State New
Headers show

Comments

Huang Shijie - Sept. 24, 2010, 11:34 a.m.
Not all the NAND devices have all the information in additional
id bytes.

So add a hook in the nand_chip{} is a good method to calculate the
right value of oobsize, erasesize and so on.

Without the hook,you will get the wrong value, and you have to hack
in the ->scan_bbt() to change the wrong value which make the code
mess.

Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
 drivers/mtd/nand/nand_base.c |    6 ++++--
 include/linux/mtd/nand.h     |    5 +++++
 2 files changed, 9 insertions(+), 2 deletions(-)
Artem Bityutskiy - Sept. 26, 2010, 12:05 p.m.
On Fri, 2010-09-24 at 19:34 +0800, Huang Shijie wrote:
> Not all the NAND devices have all the information in additional
> id bytes.
> 
> So add a hook in the nand_chip{} is a good method to calculate the
> right value of oobsize, erasesize and so on.
> 
> Without the hook,you will get the wrong value, and you have to hack
> in the ->scan_bbt() to change the wrong value which make the code
> mess.
> 
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
>  drivers/mtd/nand/nand_base.c |    6 ++++--
>  include/linux/mtd/nand.h     |    5 +++++
>  2 files changed, 9 insertions(+), 2 deletions(-)

Taken to l2-mtd-2.6.git, thanks.
Huang Shijie - Sept. 27, 2010, 3:06 a.m.
Hi Artem:
    I think the new patch is better.

The new patch will reuse the id_data.
Even if the additional id byte does not have all the information in
some case, but other infomation such as manufacture id and device id
are also useful to the NAND driver.

Best regards
Huang Shijie


2010/9/26 Artem Bityutskiy <dedekind1@gmail.com>:
> On Fri, 2010-09-24 at 19:34 +0800, Huang Shijie wrote:
>> Not all the NAND devices have all the information in additional
>> id bytes.
>>
>> So add a hook in the nand_chip{} is a good method to calculate the
>> right value of oobsize, erasesize and so on.
>>
>> Without the hook,you will get the wrong value, and you have to hack
>> in the ->scan_bbt() to change the wrong value which make the code
>> mess.
>>
>> Signed-off-by: Huang Shijie <shijie8@gmail.com>
>> ---
>>  drivers/mtd/nand/nand_base.c |    6 ++++--
>>  include/linux/mtd/nand.h     |    5 +++++
>>  2 files changed, 9 insertions(+), 2 deletions(-)
>
> Taken to l2-mtd-2.6.git, thanks.
>
> --
> Best Regards,
> Artem Bityutskiy (Битюцкий Артём)
>
>
Artem Bityutskiy - Sept. 28, 2010, 6:29 a.m.
On Mon, 2010-09-27 at 11:06 +0800, Huang Shijie wrote:
> Hi Artem:
>     I think the new patch is better.
> 
> The new patch will reuse the id_data.
> Even if the additional id byte does not have all the information in
> some case, but other infomation such as manufacture id and device id
> are also useful to the NAND driver.

OK, pushed this one to l2-mtd-2.6.git, thanks.

Patch

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index d551ddd..0288f1f 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2848,8 +2848,10 @@  static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
 
 	chip->chipsize = (uint64_t)type->chipsize << 20;
 
-	/* Newer devices have all the information in additional id bytes */
-	if (!type->pagesize) {
+	if (!type->pagesize && chip->init_size) {
+		/* set the pagesize, oobsize, erasesize by the driver*/
+		busw = chip->init_size(mtd, chip);
+	} else if (!type->pagesize) {
 		int extid;
 		/* The 3rd id byte holds MLC / multichip data */
 		chip->cellinfo = id_data[2];
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 102e12c..2296a7a 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -332,6 +332,9 @@  struct nand_buffers {
  * @block_markbad:	[REPLACEABLE] mark the block bad
  * @cmd_ctrl:		[BOARDSPECIFIC] hardwarespecific funtion for controlling
  *			ALE/CLE/nCE. Also used to write command and address
+ * @init_size:		[BOARDSPECIFIC] hardwarespecific funtion for setting
+ *			mtd->oobsize, mtd->writesize and so on.
+ *			Return with the bus width.
  * @dev_ready:		[BOARDSPECIFIC] hardwarespecific function for accesing device ready/busy line
  *			If set to NULL no access to ready/busy is available and the ready/busy information
  *			is read from the chip status register
@@ -386,6 +389,8 @@  struct nand_chip {
 	int		(*block_markbad)(struct mtd_info *mtd, loff_t ofs);
 	void		(*cmd_ctrl)(struct mtd_info *mtd, int dat,
 				    unsigned int ctrl);
+	int		(*init_size)(struct mtd_info *mtd,
+					struct nand_chip *this);
 	int		(*dev_ready)(struct mtd_info *mtd);
 	void		(*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr);
 	int		(*waitfunc)(struct mtd_info *mtd, struct nand_chip *this);