diff options
author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2017-03-22 16:07:21 -0400 |
---|---|---|
committer | Boris Brezillon <boris.brezillon@free-electrons.com> | 2017-03-28 08:18:03 -0400 |
commit | e93c1640e0387ab55b98b4e04600050f2beceac1 (patch) | |
tree | 0cb1e85b5d2553f12ccb041d83771181c2241b1e /drivers/mtd/nand | |
parent | 6da27b469317435b776114649439e32384165aa5 (diff) |
mtd: nand: denali: simplify multi device fixup code
The available configuration of the IP bus width is x8 or x16, so the
possible value for denali->devnum is 1 or 2.
If the value is 1, there is nothing to do. Fixup parameters only
when denali->devnum is 2.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r-- | drivers/mtd/nand/denali.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c index 2b5edd39248b..e1c45bf2656d 100644 --- a/drivers/mtd/nand/denali.c +++ b/drivers/mtd/nand/denali.c | |||
@@ -1403,7 +1403,7 @@ static void denali_drv_init(struct denali_nand_info *denali) | |||
1403 | denali->irq_status = 0; | 1403 | denali->irq_status = 0; |
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | static void denali_multidev_fixup(struct denali_nand_info *denali) | 1406 | static int denali_multidev_fixup(struct denali_nand_info *denali) |
1407 | { | 1407 | { |
1408 | struct nand_chip *chip = &denali->nand; | 1408 | struct nand_chip *chip = &denali->nand; |
1409 | struct mtd_info *mtd = nand_to_mtd(chip); | 1409 | struct mtd_info *mtd = nand_to_mtd(chip); |
@@ -1417,20 +1417,32 @@ static void denali_multidev_fixup(struct denali_nand_info *denali) | |||
1417 | */ | 1417 | */ |
1418 | denali->devnum = ioread32(denali->flash_reg + DEVICES_CONNECTED); | 1418 | denali->devnum = ioread32(denali->flash_reg + DEVICES_CONNECTED); |
1419 | 1419 | ||
1420 | mtd->size <<= denali->devnum - 1; | 1420 | if (denali->devnum == 1) |
1421 | mtd->erasesize <<= denali->devnum - 1; | 1421 | return 0; |
1422 | mtd->writesize <<= denali->devnum - 1; | 1422 | |
1423 | mtd->oobsize <<= denali->devnum - 1; | 1423 | if (denali->devnum != 2) { |
1424 | chip->chipsize <<= denali->devnum - 1; | 1424 | dev_err(denali->dev, "unsupported number of devices %d\n", |
1425 | chip->page_shift += denali->devnum - 1; | 1425 | denali->devnum); |
1426 | chip->phys_erase_shift += denali->devnum - 1; | 1426 | return -EINVAL; |
1427 | chip->bbt_erase_shift += denali->devnum - 1; | 1427 | } |
1428 | chip->chip_shift += denali->devnum - 1; | 1428 | |
1429 | chip->pagemask <<= denali->devnum - 1; | 1429 | /* 2 chips in parallel */ |
1430 | chip->ecc.size *= denali->devnum; | 1430 | mtd->size <<= 1; |
1431 | chip->ecc.bytes *= denali->devnum; | 1431 | mtd->erasesize <<= 1; |
1432 | chip->ecc.strength *= denali->devnum; | 1432 | mtd->writesize <<= 1; |
1433 | denali->bbtskipbytes *= denali->devnum; | 1433 | mtd->oobsize <<= 1; |
1434 | chip->chipsize <<= 1; | ||
1435 | chip->page_shift += 1; | ||
1436 | chip->phys_erase_shift += 1; | ||
1437 | chip->bbt_erase_shift += 1; | ||
1438 | chip->chip_shift += 1; | ||
1439 | chip->pagemask <<= 1; | ||
1440 | chip->ecc.size <<= 1; | ||
1441 | chip->ecc.bytes <<= 1; | ||
1442 | chip->ecc.strength <<= 1; | ||
1443 | denali->bbtskipbytes <<= 1; | ||
1444 | |||
1445 | return 0; | ||
1434 | } | 1446 | } |
1435 | 1447 | ||
1436 | int denali_init(struct denali_nand_info *denali) | 1448 | int denali_init(struct denali_nand_info *denali) |
@@ -1568,7 +1580,9 @@ int denali_init(struct denali_nand_info *denali) | |||
1568 | chip->ecc.write_oob = denali_write_oob; | 1580 | chip->ecc.write_oob = denali_write_oob; |
1569 | chip->erase = denali_erase; | 1581 | chip->erase = denali_erase; |
1570 | 1582 | ||
1571 | denali_multidev_fixup(denali); | 1583 | ret = denali_multidev_fixup(denali); |
1584 | if (ret) | ||
1585 | goto failed_req_irq; | ||
1572 | 1586 | ||
1573 | ret = nand_scan_tail(mtd); | 1587 | ret = nand_scan_tail(mtd); |
1574 | if (ret) | 1588 | if (ret) |