mtd: add helpers to set/get features for ONFI nand
Add the set-features(0xef)/get-features(0xee) helpers for ONFI nand. Also add the necessary macros. Signed-off-by: Huang Shijie <b32955@freescale.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
2caf87a49e
commit
7db03eccfc
2 changed files with 64 additions and 0 deletions
|
@ -2699,6 +2699,50 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
||||||
return chip->block_markbad(mtd, ofs);
|
return chip->block_markbad(mtd, ofs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nand_onfi_set_features- [REPLACEABLE] set features for ONFI nand
|
||||||
|
* @mtd: MTD device structure
|
||||||
|
* @chip: nand chip info structure
|
||||||
|
* @addr: feature address.
|
||||||
|
* @subfeature_param: the subfeature parameters, a four bytes array.
|
||||||
|
*/
|
||||||
|
static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
int addr, uint8_t *subfeature_param)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
if (!chip->onfi_version)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1);
|
||||||
|
chip->write_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
|
||||||
|
status = chip->waitfunc(mtd, chip);
|
||||||
|
if (status & NAND_STATUS_FAIL)
|
||||||
|
return -EIO;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nand_onfi_get_features- [REPLACEABLE] get features for ONFI nand
|
||||||
|
* @mtd: MTD device structure
|
||||||
|
* @chip: nand chip info structure
|
||||||
|
* @addr: feature address.
|
||||||
|
* @subfeature_param: the subfeature parameters, a four bytes array.
|
||||||
|
*/
|
||||||
|
static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
int addr, uint8_t *subfeature_param)
|
||||||
|
{
|
||||||
|
if (!chip->onfi_version)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* clear the sub feature parameters */
|
||||||
|
memset(subfeature_param, 0, ONFI_SUBFEATURE_PARAM_LEN);
|
||||||
|
|
||||||
|
chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1);
|
||||||
|
chip->read_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nand_suspend - [MTD Interface] Suspend the NAND flash
|
* nand_suspend - [MTD Interface] Suspend the NAND flash
|
||||||
* @mtd: MTD device structure
|
* @mtd: MTD device structure
|
||||||
|
@ -3223,6 +3267,12 @@ int nand_scan_tail(struct mtd_info *mtd)
|
||||||
if (!chip->write_page)
|
if (!chip->write_page)
|
||||||
chip->write_page = nand_write_page;
|
chip->write_page = nand_write_page;
|
||||||
|
|
||||||
|
/* set for ONFI nand */
|
||||||
|
if (!chip->onfi_set_features)
|
||||||
|
chip->onfi_set_features = nand_onfi_set_features;
|
||||||
|
if (!chip->onfi_get_features)
|
||||||
|
chip->onfi_get_features = nand_onfi_get_features;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check ECC mode, default to software if 3byte/512byte hardware ECC is
|
* Check ECC mode, default to software if 3byte/512byte hardware ECC is
|
||||||
* selected and we have 256 byte pagesize fallback to software ECC
|
* selected and we have 256 byte pagesize fallback to software ECC
|
||||||
|
|
|
@ -92,6 +92,8 @@ extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
|
||||||
#define NAND_CMD_READID 0x90
|
#define NAND_CMD_READID 0x90
|
||||||
#define NAND_CMD_ERASE2 0xd0
|
#define NAND_CMD_ERASE2 0xd0
|
||||||
#define NAND_CMD_PARAM 0xec
|
#define NAND_CMD_PARAM 0xec
|
||||||
|
#define NAND_CMD_GET_FEATURES 0xee
|
||||||
|
#define NAND_CMD_SET_FEATURES 0xef
|
||||||
#define NAND_CMD_RESET 0xff
|
#define NAND_CMD_RESET 0xff
|
||||||
|
|
||||||
#define NAND_CMD_LOCK 0x2a
|
#define NAND_CMD_LOCK 0x2a
|
||||||
|
@ -229,6 +231,12 @@ typedef enum {
|
||||||
/* Keep gcc happy */
|
/* Keep gcc happy */
|
||||||
struct nand_chip;
|
struct nand_chip;
|
||||||
|
|
||||||
|
/* ONFI feature address */
|
||||||
|
#define ONFI_FEATURE_ADDR_TIMING_MODE 0x1
|
||||||
|
|
||||||
|
/* ONFI subfeature parameters length */
|
||||||
|
#define ONFI_SUBFEATURE_PARAM_LEN 4
|
||||||
|
|
||||||
struct nand_onfi_params {
|
struct nand_onfi_params {
|
||||||
/* rev info and features block */
|
/* rev info and features block */
|
||||||
/* 'O' 'N' 'F' 'I' */
|
/* 'O' 'N' 'F' 'I' */
|
||||||
|
@ -454,6 +462,8 @@ struct nand_buffers {
|
||||||
* non 0 if ONFI supported.
|
* non 0 if ONFI supported.
|
||||||
* @onfi_params: [INTERN] holds the ONFI page parameter when ONFI is
|
* @onfi_params: [INTERN] holds the ONFI page parameter when ONFI is
|
||||||
* supported, 0 otherwise.
|
* supported, 0 otherwise.
|
||||||
|
* @onfi_set_features [REPLACEABLE] set the features for ONFI nand
|
||||||
|
* @onfi_get_features [REPLACEABLE] get the features for ONFI nand
|
||||||
* @ecclayout: [REPLACEABLE] the default ECC placement scheme
|
* @ecclayout: [REPLACEABLE] the default ECC placement scheme
|
||||||
* @bbt: [INTERN] bad block table pointer
|
* @bbt: [INTERN] bad block table pointer
|
||||||
* @bbt_td: [REPLACEABLE] bad block table descriptor for flash
|
* @bbt_td: [REPLACEABLE] bad block table descriptor for flash
|
||||||
|
@ -496,6 +506,10 @@ struct nand_chip {
|
||||||
int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
|
int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
const uint8_t *buf, int oob_required, int page,
|
const uint8_t *buf, int oob_required, int page,
|
||||||
int cached, int raw);
|
int cached, int raw);
|
||||||
|
int (*onfi_set_features)(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
int feature_addr, uint8_t *subfeature_para);
|
||||||
|
int (*onfi_get_features)(struct mtd_info *mtd, struct nand_chip *chip,
|
||||||
|
int feature_addr, uint8_t *subfeature_para);
|
||||||
|
|
||||||
int chip_delay;
|
int chip_delay;
|
||||||
unsigned int options;
|
unsigned int options;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue