diff options
| -rw-r--r-- | drivers/mtd/nand/brcmnand/brcmnand.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c index 7c1c306650a4..3bd31a6055b6 100644 --- a/drivers/mtd/nand/brcmnand/brcmnand.c +++ b/drivers/mtd/nand/brcmnand/brcmnand.c | |||
| @@ -344,6 +344,28 @@ static const u8 brcmnand_cs_offsets_cs0[] = { | |||
| 344 | [BRCMNAND_CS_TIMING2] = 0x14, | 344 | [BRCMNAND_CS_TIMING2] = 0x14, |
| 345 | }; | 345 | }; |
| 346 | 346 | ||
| 347 | /* | ||
| 348 | * Bitfields for the CFG and CFG_EXT registers. Pre-v7.1 controllers only had | ||
| 349 | * one config register, but once the bitfields overflowed, newer controllers | ||
| 350 | * (v7.1 and newer) added a CFG_EXT register and shuffled a few fields around. | ||
| 351 | */ | ||
| 352 | enum { | ||
| 353 | CFG_BLK_ADR_BYTES_SHIFT = 8, | ||
| 354 | CFG_COL_ADR_BYTES_SHIFT = 12, | ||
| 355 | CFG_FUL_ADR_BYTES_SHIFT = 16, | ||
| 356 | CFG_BUS_WIDTH_SHIFT = 23, | ||
| 357 | CFG_BUS_WIDTH = BIT(CFG_BUS_WIDTH_SHIFT), | ||
| 358 | CFG_DEVICE_SIZE_SHIFT = 24, | ||
| 359 | |||
| 360 | /* Only for pre-v7.1 (with no CFG_EXT register) */ | ||
| 361 | CFG_PAGE_SIZE_SHIFT = 20, | ||
| 362 | CFG_BLK_SIZE_SHIFT = 28, | ||
| 363 | |||
| 364 | /* Only for v7.1+ (with CFG_EXT register) */ | ||
| 365 | CFG_EXT_PAGE_SIZE_SHIFT = 0, | ||
| 366 | CFG_EXT_BLK_SIZE_SHIFT = 4, | ||
| 367 | }; | ||
| 368 | |||
| 347 | /* BRCMNAND_INTFC_STATUS */ | 369 | /* BRCMNAND_INTFC_STATUS */ |
| 348 | enum { | 370 | enum { |
| 349 | INTFC_FLASH_STATUS = GENMASK(7, 0), | 371 | INTFC_FLASH_STATUS = GENMASK(7, 0), |
| @@ -1720,17 +1742,19 @@ static int brcmnand_set_cfg(struct brcmnand_host *host, | |||
| 1720 | } | 1742 | } |
| 1721 | device_size = fls64(cfg->device_size) - fls64(BRCMNAND_MIN_DEVSIZE); | 1743 | device_size = fls64(cfg->device_size) - fls64(BRCMNAND_MIN_DEVSIZE); |
| 1722 | 1744 | ||
| 1723 | tmp = (cfg->blk_adr_bytes << 8) | | 1745 | tmp = (cfg->blk_adr_bytes << CFG_BLK_ADR_BYTES_SHIFT) | |
| 1724 | (cfg->col_adr_bytes << 12) | | 1746 | (cfg->col_adr_bytes << CFG_COL_ADR_BYTES_SHIFT) | |
| 1725 | (cfg->ful_adr_bytes << 16) | | 1747 | (cfg->ful_adr_bytes << CFG_FUL_ADR_BYTES_SHIFT) | |
| 1726 | (!!(cfg->device_width == 16) << 23) | | 1748 | (!!(cfg->device_width == 16) << CFG_BUS_WIDTH_SHIFT) | |
| 1727 | (device_size << 24); | 1749 | (device_size << CFG_DEVICE_SIZE_SHIFT); |
| 1728 | if (cfg_offs == cfg_ext_offs) { | 1750 | if (cfg_offs == cfg_ext_offs) { |
| 1729 | tmp |= (page_size << 20) | (block_size << 28); | 1751 | tmp |= (page_size << CFG_PAGE_SIZE_SHIFT) | |
| 1752 | (block_size << CFG_BLK_SIZE_SHIFT); | ||
| 1730 | nand_writereg(ctrl, cfg_offs, tmp); | 1753 | nand_writereg(ctrl, cfg_offs, tmp); |
| 1731 | } else { | 1754 | } else { |
| 1732 | nand_writereg(ctrl, cfg_offs, tmp); | 1755 | nand_writereg(ctrl, cfg_offs, tmp); |
| 1733 | tmp = page_size | (block_size << 4); | 1756 | tmp = (page_size << CFG_EXT_PAGE_SIZE_SHIFT) | |
| 1757 | (block_size << CFG_EXT_BLK_SIZE_SHIFT); | ||
| 1734 | nand_writereg(ctrl, cfg_ext_offs, tmp); | 1758 | nand_writereg(ctrl, cfg_ext_offs, tmp); |
| 1735 | } | 1759 | } |
| 1736 | 1760 | ||
