mtd: add init_size hook for NAND driver
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> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
088bd455c9
commit
12a40a57f7
@ -2976,8 +2976,10 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
|
|||||||
|
|
||||||
chip->chipsize = (uint64_t)type->chipsize << 20;
|
chip->chipsize = (uint64_t)type->chipsize << 20;
|
||||||
|
|
||||||
/* Newer devices have all the information in additional id bytes */
|
if (!type->pagesize && chip->init_size) {
|
||||||
if (!type->pagesize) {
|
/* set the pagesize, oobsize, erasesize by the driver*/
|
||||||
|
busw = chip->init_size(mtd, chip, id_data);
|
||||||
|
} else if (!type->pagesize) {
|
||||||
int extid;
|
int extid;
|
||||||
/* The 3rd id byte holds MLC / multichip data */
|
/* The 3rd id byte holds MLC / multichip data */
|
||||||
chip->cellinfo = id_data[2];
|
chip->cellinfo = id_data[2];
|
||||||
|
@ -396,6 +396,10 @@ struct nand_buffers {
|
|||||||
* @block_markbad: [REPLACEABLE] mark the block bad
|
* @block_markbad: [REPLACEABLE] mark the block bad
|
||||||
* @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific funtion for controlling
|
* @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific funtion for controlling
|
||||||
* ALE/CLE/nCE. Also used to write command and address
|
* ALE/CLE/nCE. Also used to write command and address
|
||||||
|
* @init_size: [BOARDSPECIFIC] hardwarespecific funtion for setting
|
||||||
|
* mtd->oobsize, mtd->writesize and so on.
|
||||||
|
* @id_data contains the 8 bytes values of NAND_CMD_READID.
|
||||||
|
* Return with the bus width.
|
||||||
* @dev_ready: [BOARDSPECIFIC] hardwarespecific function for accesing device ready/busy line
|
* @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
|
* If set to NULL no access to ready/busy is available and the ready/busy information
|
||||||
* is read from the chip status register
|
* is read from the chip status register
|
||||||
@ -452,6 +456,8 @@ struct nand_chip {
|
|||||||
int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
|
int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
|
||||||
void (*cmd_ctrl)(struct mtd_info *mtd, int dat,
|
void (*cmd_ctrl)(struct mtd_info *mtd, int dat,
|
||||||
unsigned int ctrl);
|
unsigned int ctrl);
|
||||||
|
int (*init_size)(struct mtd_info *mtd,
|
||||||
|
struct nand_chip *this, u8 *id_data);
|
||||||
int (*dev_ready)(struct mtd_info *mtd);
|
int (*dev_ready)(struct mtd_info *mtd);
|
||||||
void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr);
|
void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr);
|
||||||
int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this);
|
int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this);
|
||||||
|
Loading…
Reference in New Issue
Block a user