mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 00:40:03 +00:00
mtd: nand: add a helper to check the SLC/MLC nand chip
Add a helper to check if a nand chip is SLC or MLC. This helper makes the code more readable. Signed-off-by: Huang Shijie <b32955@freescale.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
parent
4ae7d228d6
commit
1d0ed69ddd
3 changed files with 16 additions and 9 deletions
|
@ -1520,7 +1520,7 @@ int denali_init(struct denali_nand_info *denali)
|
|||
* so just let controller do 15bit ECC for MLC and 8bit ECC for
|
||||
* SLC if possible.
|
||||
* */
|
||||
if (denali->nand.cellinfo & NAND_CI_CELLTYPE_MSK &&
|
||||
if (!nand_is_slc(&denali->nand) &&
|
||||
(denali->mtd.oobsize > (denali->bbtskipbytes +
|
||||
ECC_15BITS * (denali->mtd.writesize /
|
||||
ECC_SECTOR_SIZE)))) {
|
||||
|
|
|
@ -3108,8 +3108,7 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
|
|||
* ID to decide what to do.
|
||||
*/
|
||||
if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG &&
|
||||
(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
|
||||
id_data[5] != 0x00) {
|
||||
!nand_is_slc(chip) && id_data[5] != 0x00) {
|
||||
/* Calc pagesize */
|
||||
mtd->writesize = 2048 << (extid & 0x03);
|
||||
extid >>= 2;
|
||||
|
@ -3141,7 +3140,7 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
|
|||
(((extid >> 1) & 0x04) | (extid & 0x03));
|
||||
*busw = 0;
|
||||
} else if (id_len == 6 && id_data[0] == NAND_MFR_HYNIX &&
|
||||
(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
|
||||
!nand_is_slc(chip)) {
|
||||
unsigned int tmp;
|
||||
|
||||
/* Calc pagesize */
|
||||
|
@ -3204,7 +3203,7 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
|
|||
* - ID byte 5, bit[7]: 1 -> BENAND, 0 -> raw SLC
|
||||
*/
|
||||
if (id_len >= 6 && id_data[0] == NAND_MFR_TOSHIBA &&
|
||||
!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
|
||||
nand_is_slc(chip) &&
|
||||
(id_data[5] & 0x7) == 0x6 /* 24nm */ &&
|
||||
!(id_data[4] & 0x80) /* !BENAND */) {
|
||||
mtd->oobsize = 32 * mtd->writesize >> 9;
|
||||
|
@ -3265,11 +3264,11 @@ static void nand_decode_bbm_options(struct mtd_info *mtd,
|
|||
* Micron devices with 2KiB pages and on SLC Samsung, Hynix, Toshiba,
|
||||
* AMD/Spansion, and Macronix. All others scan only the first page.
|
||||
*/
|
||||
if ((chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
|
||||
if (!nand_is_slc(chip) &&
|
||||
(maf_id == NAND_MFR_SAMSUNG ||
|
||||
maf_id == NAND_MFR_HYNIX))
|
||||
chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
|
||||
else if ((!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
|
||||
else if ((nand_is_slc(chip) &&
|
||||
(maf_id == NAND_MFR_SAMSUNG ||
|
||||
maf_id == NAND_MFR_HYNIX ||
|
||||
maf_id == NAND_MFR_TOSHIBA ||
|
||||
|
@ -3745,8 +3744,7 @@ int nand_scan_tail(struct mtd_info *mtd)
|
|||
chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;
|
||||
|
||||
/* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
|
||||
if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&
|
||||
!(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
|
||||
if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && nand_is_slc(chip)) {
|
||||
switch (chip->ecc.steps) {
|
||||
case 2:
|
||||
mtd->subpage_sft = 1;
|
||||
|
|
|
@ -795,4 +795,13 @@ static inline int onfi_get_sync_timing_mode(struct nand_chip *chip)
|
|||
return le16_to_cpu(chip->onfi_params.src_sync_timing_mode);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if it is a SLC nand.
|
||||
* The !nand_is_slc() can be used to check the MLC/TLC nand chips.
|
||||
* We do not distinguish the MLC and TLC now.
|
||||
*/
|
||||
static inline bool nand_is_slc(struct nand_chip *chip)
|
||||
{
|
||||
return !(chip->cellinfo & NAND_CI_CELLTYPE_MSK);
|
||||
}
|
||||
#endif /* __LINUX_MTD_NAND_H */
|
||||
|
|
Loading…
Reference in a new issue