diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-07 12:11:16 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-07 12:11:16 -0500 |
commit | e0d65113a70f1dc514e625cc4e7a7485a4bf72df (patch) | |
tree | 7320a130dc304623f5cf4b5dd8f67fb1776225ca /drivers/mtd/onenand | |
parent | cf5e15fbd72c13977720aa15b7b7e00e1d8fd8f2 (diff) | |
parent | 48e546b7f281f251893baa40769581fd15f085fb (diff) |
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (226 commits)
mtd: tests: annotate as DANGEROUS in Kconfig
mtd: tests: don't use mtd0 as a default
mtd: clean up usage of MTD_DOCPROBE_ADDRESS
jffs2: add compr=lzo and compr=zlib options
jffs2: implement mount option parsing and compression overriding
mtd: nand: initialize ops.mode
mtd: provide an alias for the redboot module name
mtd: m25p80: don't probe device which has status of 'disabled'
mtd: nand_h1900 never worked
mtd: Add DiskOnChip G3 support
mtd: m25p80: add EON flash EN25Q32B into spi flash id table
mtd: mark block device queue as non-rotational
mtd: r852: make r852_pm_ops static
mtd: m25p80: add support for at25df321a spi data flash
mtd: mxc_nand: preset_v1_v2: unlock all NAND flash blocks
mtd: nand: switch `check_pattern()' to standard `memcmp()'
mtd: nand: invalidate cache on unaligned reads
mtd: nand: do not scan bad blocks with NAND_BBT_NO_OOB set
mtd: nand: wait to set BBT version
mtd: nand: scrub BBT on ECC errors
...
Fix up trivial conflicts:
- arch/arm/mach-at91/board-usb-a9260.c
Merged into board-usb-a926x.c
- drivers/mtd/maps/lantiq-flash.c
add_mtd_partitions -> mtd_device_register vs changed to use
mtd_device_parse_register.
Diffstat (limited to 'drivers/mtd/onenand')
-rw-r--r-- | drivers/mtd/onenand/generic.c | 14 | ||||
-rw-r--r-- | drivers/mtd/onenand/omap2.c | 16 | ||||
-rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 114 | ||||
-rw-r--r-- | drivers/mtd/onenand/onenand_bbt.c | 8 | ||||
-rw-r--r-- | drivers/mtd/onenand/samsung.c | 13 |
5 files changed, 78 insertions, 87 deletions
diff --git a/drivers/mtd/onenand/generic.c b/drivers/mtd/onenand/generic.c index 2d70d354d846..7813095264a5 100644 --- a/drivers/mtd/onenand/generic.c +++ b/drivers/mtd/onenand/generic.c | |||
@@ -30,11 +30,8 @@ | |||
30 | */ | 30 | */ |
31 | #define DRIVER_NAME "onenand-flash" | 31 | #define DRIVER_NAME "onenand-flash" |
32 | 32 | ||
33 | static const char *part_probes[] = { "cmdlinepart", NULL, }; | ||
34 | |||
35 | struct onenand_info { | 33 | struct onenand_info { |
36 | struct mtd_info mtd; | 34 | struct mtd_info mtd; |
37 | struct mtd_partition *parts; | ||
38 | struct onenand_chip onenand; | 35 | struct onenand_chip onenand; |
39 | }; | 36 | }; |
40 | 37 | ||
@@ -73,13 +70,9 @@ static int __devinit generic_onenand_probe(struct platform_device *pdev) | |||
73 | goto out_iounmap; | 70 | goto out_iounmap; |
74 | } | 71 | } |
75 | 72 | ||
76 | err = parse_mtd_partitions(&info->mtd, part_probes, &info->parts, 0); | 73 | err = mtd_device_parse_register(&info->mtd, NULL, 0, |
77 | if (err > 0) | 74 | pdata ? pdata->parts : NULL, |
78 | mtd_device_register(&info->mtd, info->parts, err); | 75 | pdata ? pdata->nr_parts : 0); |
79 | else if (err <= 0 && pdata && pdata->parts) | ||
80 | mtd_device_register(&info->mtd, pdata->parts, pdata->nr_parts); | ||
81 | else | ||
82 | err = mtd_device_register(&info->mtd, NULL, 0); | ||
83 | 76 | ||
84 | platform_set_drvdata(pdev, info); | 77 | platform_set_drvdata(pdev, info); |
85 | 78 | ||
@@ -104,7 +97,6 @@ static int __devexit generic_onenand_remove(struct platform_device *pdev) | |||
104 | platform_set_drvdata(pdev, NULL); | 97 | platform_set_drvdata(pdev, NULL); |
105 | 98 | ||
106 | if (info) { | 99 | if (info) { |
107 | mtd_device_unregister(&info->mtd); | ||
108 | onenand_release(&info->mtd); | 100 | onenand_release(&info->mtd); |
109 | release_mem_region(res->start, size); | 101 | release_mem_region(res->start, size); |
110 | iounmap(info->onenand.base); | 102 | iounmap(info->onenand.base); |
diff --git a/drivers/mtd/onenand/omap2.c b/drivers/mtd/onenand/omap2.c index 6a1d6d9a2df9..7e9ea6852b67 100644 --- a/drivers/mtd/onenand/omap2.c +++ b/drivers/mtd/onenand/omap2.c | |||
@@ -57,7 +57,6 @@ struct omap2_onenand { | |||
57 | unsigned long phys_base; | 57 | unsigned long phys_base; |
58 | int gpio_irq; | 58 | int gpio_irq; |
59 | struct mtd_info mtd; | 59 | struct mtd_info mtd; |
60 | struct mtd_partition *parts; | ||
61 | struct onenand_chip onenand; | 60 | struct onenand_chip onenand; |
62 | struct completion irq_done; | 61 | struct completion irq_done; |
63 | struct completion dma_done; | 62 | struct completion dma_done; |
@@ -67,8 +66,6 @@ struct omap2_onenand { | |||
67 | struct regulator *regulator; | 66 | struct regulator *regulator; |
68 | }; | 67 | }; |
69 | 68 | ||
70 | static const char *part_probes[] = { "cmdlinepart", NULL, }; | ||
71 | |||
72 | static void omap2_onenand_dma_cb(int lch, u16 ch_status, void *data) | 69 | static void omap2_onenand_dma_cb(int lch, u16 ch_status, void *data) |
73 | { | 70 | { |
74 | struct omap2_onenand *c = data; | 71 | struct omap2_onenand *c = data; |
@@ -741,6 +738,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) | |||
741 | c->regulator = regulator_get(&pdev->dev, "vonenand"); | 738 | c->regulator = regulator_get(&pdev->dev, "vonenand"); |
742 | if (IS_ERR(c->regulator)) { | 739 | if (IS_ERR(c->regulator)) { |
743 | dev_err(&pdev->dev, "Failed to get regulator\n"); | 740 | dev_err(&pdev->dev, "Failed to get regulator\n"); |
741 | r = PTR_ERR(c->regulator); | ||
744 | goto err_release_dma; | 742 | goto err_release_dma; |
745 | } | 743 | } |
746 | c->onenand.enable = omap2_onenand_enable; | 744 | c->onenand.enable = omap2_onenand_enable; |
@@ -753,13 +751,9 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) | |||
753 | if ((r = onenand_scan(&c->mtd, 1)) < 0) | 751 | if ((r = onenand_scan(&c->mtd, 1)) < 0) |
754 | goto err_release_regulator; | 752 | goto err_release_regulator; |
755 | 753 | ||
756 | r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0); | 754 | r = mtd_device_parse_register(&c->mtd, NULL, 0, |
757 | if (r > 0) | 755 | pdata ? pdata->parts : NULL, |
758 | r = mtd_device_register(&c->mtd, c->parts, r); | 756 | pdata ? pdata->nr_parts : 0); |
759 | else if (pdata->parts != NULL) | ||
760 | r = mtd_device_register(&c->mtd, pdata->parts, pdata->nr_parts); | ||
761 | else | ||
762 | r = mtd_device_register(&c->mtd, NULL, 0); | ||
763 | if (r) | 757 | if (r) |
764 | goto err_release_onenand; | 758 | goto err_release_onenand; |
765 | 759 | ||
@@ -786,7 +780,6 @@ err_release_mem_region: | |||
786 | err_free_cs: | 780 | err_free_cs: |
787 | gpmc_cs_free(c->gpmc_cs); | 781 | gpmc_cs_free(c->gpmc_cs); |
788 | err_kfree: | 782 | err_kfree: |
789 | kfree(c->parts); | ||
790 | kfree(c); | 783 | kfree(c); |
791 | 784 | ||
792 | return r; | 785 | return r; |
@@ -809,7 +802,6 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev) | |||
809 | iounmap(c->onenand.base); | 802 | iounmap(c->onenand.base); |
810 | release_mem_region(c->phys_base, ONENAND_IO_SIZE); | 803 | release_mem_region(c->phys_base, ONENAND_IO_SIZE); |
811 | gpmc_cs_free(c->gpmc_cs); | 804 | gpmc_cs_free(c->gpmc_cs); |
812 | kfree(c->parts); | ||
813 | kfree(c); | 805 | kfree(c); |
814 | 806 | ||
815 | return 0; | 807 | return 0; |
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index ac9e959802a7..a8394730b4b6 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c | |||
@@ -1015,7 +1015,7 @@ static void onenand_release_device(struct mtd_info *mtd) | |||
1015 | } | 1015 | } |
1016 | 1016 | ||
1017 | /** | 1017 | /** |
1018 | * onenand_transfer_auto_oob - [Internal] oob auto-placement transfer | 1018 | * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer |
1019 | * @param mtd MTD device structure | 1019 | * @param mtd MTD device structure |
1020 | * @param buf destination address | 1020 | * @param buf destination address |
1021 | * @param column oob offset to read from | 1021 | * @param column oob offset to read from |
@@ -1079,7 +1079,7 @@ static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status) | |||
1079 | return status; | 1079 | return status; |
1080 | 1080 | ||
1081 | /* check if we failed due to uncorrectable error */ | 1081 | /* check if we failed due to uncorrectable error */ |
1082 | if (status != -EBADMSG && status != ONENAND_BBT_READ_ECC_ERROR) | 1082 | if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR) |
1083 | return status; | 1083 | return status; |
1084 | 1084 | ||
1085 | /* check if address lies in MLC region */ | 1085 | /* check if address lies in MLC region */ |
@@ -1122,10 +1122,10 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1122 | int ret = 0; | 1122 | int ret = 0; |
1123 | int writesize = this->writesize; | 1123 | int writesize = this->writesize; |
1124 | 1124 | ||
1125 | DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08x, len = %i\n", | 1125 | pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from, |
1126 | __func__, (unsigned int) from, (int) len); | 1126 | (int)len); |
1127 | 1127 | ||
1128 | if (ops->mode == MTD_OOB_AUTO) | 1128 | if (ops->mode == MTD_OPS_AUTO_OOB) |
1129 | oobsize = this->ecclayout->oobavail; | 1129 | oobsize = this->ecclayout->oobavail; |
1130 | else | 1130 | else |
1131 | oobsize = mtd->oobsize; | 1131 | oobsize = mtd->oobsize; |
@@ -1159,7 +1159,7 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1159 | if (unlikely(ret)) | 1159 | if (unlikely(ret)) |
1160 | ret = onenand_recover_lsb(mtd, from, ret); | 1160 | ret = onenand_recover_lsb(mtd, from, ret); |
1161 | onenand_update_bufferram(mtd, from, !ret); | 1161 | onenand_update_bufferram(mtd, from, !ret); |
1162 | if (ret == -EBADMSG) | 1162 | if (mtd_is_eccerr(ret)) |
1163 | ret = 0; | 1163 | ret = 0; |
1164 | if (ret) | 1164 | if (ret) |
1165 | break; | 1165 | break; |
@@ -1170,7 +1170,7 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1170 | thisooblen = oobsize - oobcolumn; | 1170 | thisooblen = oobsize - oobcolumn; |
1171 | thisooblen = min_t(int, thisooblen, ooblen - oobread); | 1171 | thisooblen = min_t(int, thisooblen, ooblen - oobread); |
1172 | 1172 | ||
1173 | if (ops->mode == MTD_OOB_AUTO) | 1173 | if (ops->mode == MTD_OPS_AUTO_OOB) |
1174 | onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen); | 1174 | onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen); |
1175 | else | 1175 | else |
1176 | this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); | 1176 | this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); |
@@ -1226,10 +1226,10 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1226 | int ret = 0, boundary = 0; | 1226 | int ret = 0, boundary = 0; |
1227 | int writesize = this->writesize; | 1227 | int writesize = this->writesize; |
1228 | 1228 | ||
1229 | DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08x, len = %i\n", | 1229 | pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from, |
1230 | __func__, (unsigned int) from, (int) len); | 1230 | (int)len); |
1231 | 1231 | ||
1232 | if (ops->mode == MTD_OOB_AUTO) | 1232 | if (ops->mode == MTD_OPS_AUTO_OOB) |
1233 | oobsize = this->ecclayout->oobavail; | 1233 | oobsize = this->ecclayout->oobavail; |
1234 | else | 1234 | else |
1235 | oobsize = mtd->oobsize; | 1235 | oobsize = mtd->oobsize; |
@@ -1255,7 +1255,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1255 | this->command(mtd, ONENAND_CMD_READ, from, writesize); | 1255 | this->command(mtd, ONENAND_CMD_READ, from, writesize); |
1256 | ret = this->wait(mtd, FL_READING); | 1256 | ret = this->wait(mtd, FL_READING); |
1257 | onenand_update_bufferram(mtd, from, !ret); | 1257 | onenand_update_bufferram(mtd, from, !ret); |
1258 | if (ret == -EBADMSG) | 1258 | if (mtd_is_eccerr(ret)) |
1259 | ret = 0; | 1259 | ret = 0; |
1260 | } | 1260 | } |
1261 | } | 1261 | } |
@@ -1291,7 +1291,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1291 | thisooblen = oobsize - oobcolumn; | 1291 | thisooblen = oobsize - oobcolumn; |
1292 | thisooblen = min_t(int, thisooblen, ooblen - oobread); | 1292 | thisooblen = min_t(int, thisooblen, ooblen - oobread); |
1293 | 1293 | ||
1294 | if (ops->mode == MTD_OOB_AUTO) | 1294 | if (ops->mode == MTD_OPS_AUTO_OOB) |
1295 | onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen); | 1295 | onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen); |
1296 | else | 1296 | else |
1297 | this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); | 1297 | this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); |
@@ -1315,7 +1315,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, | |||
1315 | /* Now wait for load */ | 1315 | /* Now wait for load */ |
1316 | ret = this->wait(mtd, FL_READING); | 1316 | ret = this->wait(mtd, FL_READING); |
1317 | onenand_update_bufferram(mtd, from, !ret); | 1317 | onenand_update_bufferram(mtd, from, !ret); |
1318 | if (ret == -EBADMSG) | 1318 | if (mtd_is_eccerr(ret)) |
1319 | ret = 0; | 1319 | ret = 0; |
1320 | } | 1320 | } |
1321 | 1321 | ||
@@ -1351,19 +1351,19 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, | |||
1351 | struct mtd_ecc_stats stats; | 1351 | struct mtd_ecc_stats stats; |
1352 | int read = 0, thislen, column, oobsize; | 1352 | int read = 0, thislen, column, oobsize; |
1353 | size_t len = ops->ooblen; | 1353 | size_t len = ops->ooblen; |
1354 | mtd_oob_mode_t mode = ops->mode; | 1354 | unsigned int mode = ops->mode; |
1355 | u_char *buf = ops->oobbuf; | 1355 | u_char *buf = ops->oobbuf; |
1356 | int ret = 0, readcmd; | 1356 | int ret = 0, readcmd; |
1357 | 1357 | ||
1358 | from += ops->ooboffs; | 1358 | from += ops->ooboffs; |
1359 | 1359 | ||
1360 | DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08x, len = %i\n", | 1360 | pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from, |
1361 | __func__, (unsigned int) from, (int) len); | 1361 | (int)len); |
1362 | 1362 | ||
1363 | /* Initialize return length value */ | 1363 | /* Initialize return length value */ |
1364 | ops->oobretlen = 0; | 1364 | ops->oobretlen = 0; |
1365 | 1365 | ||
1366 | if (mode == MTD_OOB_AUTO) | 1366 | if (mode == MTD_OPS_AUTO_OOB) |
1367 | oobsize = this->ecclayout->oobavail; | 1367 | oobsize = this->ecclayout->oobavail; |
1368 | else | 1368 | else |
1369 | oobsize = mtd->oobsize; | 1369 | oobsize = mtd->oobsize; |
@@ -1403,13 +1403,13 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, | |||
1403 | if (unlikely(ret)) | 1403 | if (unlikely(ret)) |
1404 | ret = onenand_recover_lsb(mtd, from, ret); | 1404 | ret = onenand_recover_lsb(mtd, from, ret); |
1405 | 1405 | ||
1406 | if (ret && ret != -EBADMSG) { | 1406 | if (ret && !mtd_is_eccerr(ret)) { |
1407 | printk(KERN_ERR "%s: read failed = 0x%x\n", | 1407 | printk(KERN_ERR "%s: read failed = 0x%x\n", |
1408 | __func__, ret); | 1408 | __func__, ret); |
1409 | break; | 1409 | break; |
1410 | } | 1410 | } |
1411 | 1411 | ||
1412 | if (mode == MTD_OOB_AUTO) | 1412 | if (mode == MTD_OPS_AUTO_OOB) |
1413 | onenand_transfer_auto_oob(mtd, buf, column, thislen); | 1413 | onenand_transfer_auto_oob(mtd, buf, column, thislen); |
1414 | else | 1414 | else |
1415 | this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); | 1415 | this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); |
@@ -1487,10 +1487,10 @@ static int onenand_read_oob(struct mtd_info *mtd, loff_t from, | |||
1487 | int ret; | 1487 | int ret; |
1488 | 1488 | ||
1489 | switch (ops->mode) { | 1489 | switch (ops->mode) { |
1490 | case MTD_OOB_PLACE: | 1490 | case MTD_OPS_PLACE_OOB: |
1491 | case MTD_OOB_AUTO: | 1491 | case MTD_OPS_AUTO_OOB: |
1492 | break; | 1492 | break; |
1493 | case MTD_OOB_RAW: | 1493 | case MTD_OPS_RAW: |
1494 | /* Not implemented yet */ | 1494 | /* Not implemented yet */ |
1495 | default: | 1495 | default: |
1496 | return -EINVAL; | 1496 | return -EINVAL; |
@@ -1576,8 +1576,8 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, | |||
1576 | size_t len = ops->ooblen; | 1576 | size_t len = ops->ooblen; |
1577 | u_char *buf = ops->oobbuf; | 1577 | u_char *buf = ops->oobbuf; |
1578 | 1578 | ||
1579 | DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08x, len = %zi\n", | 1579 | pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from, |
1580 | __func__, (unsigned int) from, len); | 1580 | len); |
1581 | 1581 | ||
1582 | /* Initialize return value */ | 1582 | /* Initialize return value */ |
1583 | ops->oobretlen = 0; | 1583 | ops->oobretlen = 0; |
@@ -1750,8 +1750,8 @@ static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
1750 | /* Wait for any existing operation to clear */ | 1750 | /* Wait for any existing operation to clear */ |
1751 | onenand_panic_wait(mtd); | 1751 | onenand_panic_wait(mtd); |
1752 | 1752 | ||
1753 | DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", | 1753 | pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to, |
1754 | __func__, (unsigned int) to, (int) len); | 1754 | (int)len); |
1755 | 1755 | ||
1756 | /* Initialize retlen, in case of early exit */ | 1756 | /* Initialize retlen, in case of early exit */ |
1757 | *retlen = 0; | 1757 | *retlen = 0; |
@@ -1821,7 +1821,7 @@ static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
1821 | } | 1821 | } |
1822 | 1822 | ||
1823 | /** | 1823 | /** |
1824 | * onenand_fill_auto_oob - [Internal] oob auto-placement transfer | 1824 | * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer |
1825 | * @param mtd MTD device structure | 1825 | * @param mtd MTD device structure |
1826 | * @param oob_buf oob buffer | 1826 | * @param oob_buf oob buffer |
1827 | * @param buf source address | 1827 | * @param buf source address |
@@ -1883,8 +1883,8 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, | |||
1883 | u_char *oobbuf; | 1883 | u_char *oobbuf; |
1884 | int ret = 0, cmd; | 1884 | int ret = 0, cmd; |
1885 | 1885 | ||
1886 | DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", | 1886 | pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to, |
1887 | __func__, (unsigned int) to, (int) len); | 1887 | (int)len); |
1888 | 1888 | ||
1889 | /* Initialize retlen, in case of early exit */ | 1889 | /* Initialize retlen, in case of early exit */ |
1890 | ops->retlen = 0; | 1890 | ops->retlen = 0; |
@@ -1908,7 +1908,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, | |||
1908 | if (!len) | 1908 | if (!len) |
1909 | return 0; | 1909 | return 0; |
1910 | 1910 | ||
1911 | if (ops->mode == MTD_OOB_AUTO) | 1911 | if (ops->mode == MTD_OPS_AUTO_OOB) |
1912 | oobsize = this->ecclayout->oobavail; | 1912 | oobsize = this->ecclayout->oobavail; |
1913 | else | 1913 | else |
1914 | oobsize = mtd->oobsize; | 1914 | oobsize = mtd->oobsize; |
@@ -1945,7 +1945,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, | |||
1945 | /* We send data to spare ram with oobsize | 1945 | /* We send data to spare ram with oobsize |
1946 | * to prevent byte access */ | 1946 | * to prevent byte access */ |
1947 | memset(oobbuf, 0xff, mtd->oobsize); | 1947 | memset(oobbuf, 0xff, mtd->oobsize); |
1948 | if (ops->mode == MTD_OOB_AUTO) | 1948 | if (ops->mode == MTD_OPS_AUTO_OOB) |
1949 | onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen); | 1949 | onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen); |
1950 | else | 1950 | else |
1951 | memcpy(oobbuf + oobcolumn, oob, thisooblen); | 1951 | memcpy(oobbuf + oobcolumn, oob, thisooblen); |
@@ -2055,7 +2055,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, | |||
2055 | 2055 | ||
2056 | 2056 | ||
2057 | /** | 2057 | /** |
2058 | * onenand_write_oob_nolock - [Internal] OneNAND write out-of-band | 2058 | * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band |
2059 | * @param mtd MTD device structure | 2059 | * @param mtd MTD device structure |
2060 | * @param to offset to write to | 2060 | * @param to offset to write to |
2061 | * @param len number of bytes to write | 2061 | * @param len number of bytes to write |
@@ -2074,17 +2074,17 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, | |||
2074 | u_char *oobbuf; | 2074 | u_char *oobbuf; |
2075 | size_t len = ops->ooblen; | 2075 | size_t len = ops->ooblen; |
2076 | const u_char *buf = ops->oobbuf; | 2076 | const u_char *buf = ops->oobbuf; |
2077 | mtd_oob_mode_t mode = ops->mode; | 2077 | unsigned int mode = ops->mode; |
2078 | 2078 | ||
2079 | to += ops->ooboffs; | 2079 | to += ops->ooboffs; |
2080 | 2080 | ||
2081 | DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", | 2081 | pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to, |
2082 | __func__, (unsigned int) to, (int) len); | 2082 | (int)len); |
2083 | 2083 | ||
2084 | /* Initialize retlen, in case of early exit */ | 2084 | /* Initialize retlen, in case of early exit */ |
2085 | ops->oobretlen = 0; | 2085 | ops->oobretlen = 0; |
2086 | 2086 | ||
2087 | if (mode == MTD_OOB_AUTO) | 2087 | if (mode == MTD_OPS_AUTO_OOB) |
2088 | oobsize = this->ecclayout->oobavail; | 2088 | oobsize = this->ecclayout->oobavail; |
2089 | else | 2089 | else |
2090 | oobsize = mtd->oobsize; | 2090 | oobsize = mtd->oobsize; |
@@ -2128,7 +2128,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, | |||
2128 | /* We send data to spare ram with oobsize | 2128 | /* We send data to spare ram with oobsize |
2129 | * to prevent byte access */ | 2129 | * to prevent byte access */ |
2130 | memset(oobbuf, 0xff, mtd->oobsize); | 2130 | memset(oobbuf, 0xff, mtd->oobsize); |
2131 | if (mode == MTD_OOB_AUTO) | 2131 | if (mode == MTD_OPS_AUTO_OOB) |
2132 | onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen); | 2132 | onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen); |
2133 | else | 2133 | else |
2134 | memcpy(oobbuf + column, buf, thislen); | 2134 | memcpy(oobbuf + column, buf, thislen); |
@@ -2217,10 +2217,10 @@ static int onenand_write_oob(struct mtd_info *mtd, loff_t to, | |||
2217 | int ret; | 2217 | int ret; |
2218 | 2218 | ||
2219 | switch (ops->mode) { | 2219 | switch (ops->mode) { |
2220 | case MTD_OOB_PLACE: | 2220 | case MTD_OPS_PLACE_OOB: |
2221 | case MTD_OOB_AUTO: | 2221 | case MTD_OPS_AUTO_OOB: |
2222 | break; | 2222 | break; |
2223 | case MTD_OOB_RAW: | 2223 | case MTD_OPS_RAW: |
2224 | /* Not implemented yet */ | 2224 | /* Not implemented yet */ |
2225 | default: | 2225 | default: |
2226 | return -EINVAL; | 2226 | return -EINVAL; |
@@ -2281,7 +2281,7 @@ static int onenand_multiblock_erase_verify(struct mtd_info *mtd, | |||
2281 | } | 2281 | } |
2282 | 2282 | ||
2283 | /** | 2283 | /** |
2284 | * onenand_multiblock_erase - [Internal] erase block(s) using multiblock erase | 2284 | * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase |
2285 | * @param mtd MTD device structure | 2285 | * @param mtd MTD device structure |
2286 | * @param instr erase instruction | 2286 | * @param instr erase instruction |
2287 | * @param region erase region | 2287 | * @param region erase region |
@@ -2397,7 +2397,7 @@ static int onenand_multiblock_erase(struct mtd_info *mtd, | |||
2397 | 2397 | ||
2398 | 2398 | ||
2399 | /** | 2399 | /** |
2400 | * onenand_block_by_block_erase - [Internal] erase block(s) using regular erase | 2400 | * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase |
2401 | * @param mtd MTD device structure | 2401 | * @param mtd MTD device structure |
2402 | * @param instr erase instruction | 2402 | * @param instr erase instruction |
2403 | * @param region erase region | 2403 | * @param region erase region |
@@ -2489,8 +2489,9 @@ static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr) | |||
2489 | struct mtd_erase_region_info *region = NULL; | 2489 | struct mtd_erase_region_info *region = NULL; |
2490 | loff_t region_offset = 0; | 2490 | loff_t region_offset = 0; |
2491 | 2491 | ||
2492 | DEBUG(MTD_DEBUG_LEVEL3, "%s: start=0x%012llx, len=%llu\n", __func__, | 2492 | pr_debug("%s: start=0x%012llx, len=%llu\n", __func__, |
2493 | (unsigned long long) instr->addr, (unsigned long long) instr->len); | 2493 | (unsigned long long)instr->addr, |
2494 | (unsigned long long)instr->len); | ||
2494 | 2495 | ||
2495 | /* Do not allow erase past end of device */ | 2496 | /* Do not allow erase past end of device */ |
2496 | if (unlikely((len + addr) > mtd->size)) { | 2497 | if (unlikely((len + addr) > mtd->size)) { |
@@ -2558,7 +2559,7 @@ static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr) | |||
2558 | */ | 2559 | */ |
2559 | static void onenand_sync(struct mtd_info *mtd) | 2560 | static void onenand_sync(struct mtd_info *mtd) |
2560 | { | 2561 | { |
2561 | DEBUG(MTD_DEBUG_LEVEL3, "%s: called\n", __func__); | 2562 | pr_debug("%s: called\n", __func__); |
2562 | 2563 | ||
2563 | /* Grab the lock and see if the device is available */ | 2564 | /* Grab the lock and see if the device is available */ |
2564 | onenand_get_device(mtd, FL_SYNCING); | 2565 | onenand_get_device(mtd, FL_SYNCING); |
@@ -2602,7 +2603,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) | |||
2602 | struct bbm_info *bbm = this->bbm; | 2603 | struct bbm_info *bbm = this->bbm; |
2603 | u_char buf[2] = {0, 0}; | 2604 | u_char buf[2] = {0, 0}; |
2604 | struct mtd_oob_ops ops = { | 2605 | struct mtd_oob_ops ops = { |
2605 | .mode = MTD_OOB_PLACE, | 2606 | .mode = MTD_OPS_PLACE_OOB, |
2606 | .ooblen = 2, | 2607 | .ooblen = 2, |
2607 | .oobbuf = buf, | 2608 | .oobbuf = buf, |
2608 | .ooboffs = 0, | 2609 | .ooboffs = 0, |
@@ -2922,7 +2923,7 @@ static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr, | |||
2922 | } | 2923 | } |
2923 | 2924 | ||
2924 | /** | 2925 | /** |
2925 | * onenand_otp_write_oob_nolock - [Internal] OneNAND write out-of-band, specific to OTP | 2926 | * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP |
2926 | * @param mtd MTD device structure | 2927 | * @param mtd MTD device structure |
2927 | * @param to offset to write to | 2928 | * @param to offset to write to |
2928 | * @param len number of bytes to write | 2929 | * @param len number of bytes to write |
@@ -3170,7 +3171,7 @@ static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len, | |||
3170 | this->command(mtd, ONENAND_CMD_RESET, 0, 0); | 3171 | this->command(mtd, ONENAND_CMD_RESET, 0, 0); |
3171 | this->wait(mtd, FL_RESETING); | 3172 | this->wait(mtd, FL_RESETING); |
3172 | } else { | 3173 | } else { |
3173 | ops.mode = MTD_OOB_PLACE; | 3174 | ops.mode = MTD_OPS_PLACE_OOB; |
3174 | ops.ooblen = len; | 3175 | ops.ooblen = len; |
3175 | ops.oobbuf = buf; | 3176 | ops.oobbuf = buf; |
3176 | ops.ooboffs = 0; | 3177 | ops.ooboffs = 0; |
@@ -3429,6 +3430,19 @@ static void onenand_check_features(struct mtd_info *mtd) | |||
3429 | else if (numbufs == 1) { | 3430 | else if (numbufs == 1) { |
3430 | this->options |= ONENAND_HAS_4KB_PAGE; | 3431 | this->options |= ONENAND_HAS_4KB_PAGE; |
3431 | this->options |= ONENAND_HAS_CACHE_PROGRAM; | 3432 | this->options |= ONENAND_HAS_CACHE_PROGRAM; |
3433 | /* | ||
3434 | * There are two different 4KiB pagesize chips | ||
3435 | * and no way to detect it by H/W config values. | ||
3436 | * | ||
3437 | * To detect the correct NOP for each chips, | ||
3438 | * It should check the version ID as workaround. | ||
3439 | * | ||
3440 | * Now it has as following | ||
3441 | * KFM4G16Q4M has NOP 4 with version ID 0x0131 | ||
3442 | * KFM4G16Q5M has NOP 1 with versoin ID 0x013e | ||
3443 | */ | ||
3444 | if ((this->version_id & 0xf) == 0xe) | ||
3445 | this->options |= ONENAND_HAS_NOP_1; | ||
3432 | } | 3446 | } |
3433 | 3447 | ||
3434 | case ONENAND_DEVICE_DENSITY_2Gb: | 3448 | case ONENAND_DEVICE_DENSITY_2Gb: |
@@ -3663,7 +3677,7 @@ static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int | |||
3663 | int i, ret; | 3677 | int i, ret; |
3664 | int block; | 3678 | int block; |
3665 | struct mtd_oob_ops ops = { | 3679 | struct mtd_oob_ops ops = { |
3666 | .mode = MTD_OOB_PLACE, | 3680 | .mode = MTD_OPS_PLACE_OOB, |
3667 | .ooboffs = 0, | 3681 | .ooboffs = 0, |
3668 | .ooblen = mtd->oobsize, | 3682 | .ooblen = mtd->oobsize, |
3669 | .datbuf = NULL, | 3683 | .datbuf = NULL, |
@@ -4054,6 +4068,8 @@ int onenand_scan(struct mtd_info *mtd, int maxchips) | |||
4054 | this->ecclayout = &onenand_oob_128; | 4068 | this->ecclayout = &onenand_oob_128; |
4055 | mtd->subpage_sft = 2; | 4069 | mtd->subpage_sft = 2; |
4056 | } | 4070 | } |
4071 | if (ONENAND_IS_NOP_1(this)) | ||
4072 | mtd->subpage_sft = 0; | ||
4057 | break; | 4073 | break; |
4058 | case 64: | 4074 | case 64: |
4059 | this->ecclayout = &onenand_oob_64; | 4075 | this->ecclayout = &onenand_oob_64; |
diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c index b2d7fc5ea25d..66fe3b7e7851 100644 --- a/drivers/mtd/onenand/onenand_bbt.c +++ b/drivers/mtd/onenand/onenand_bbt.c | |||
@@ -81,7 +81,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr | |||
81 | startblock = 0; | 81 | startblock = 0; |
82 | from = 0; | 82 | from = 0; |
83 | 83 | ||
84 | ops.mode = MTD_OOB_PLACE; | 84 | ops.mode = MTD_OPS_PLACE_OOB; |
85 | ops.ooblen = readlen; | 85 | ops.ooblen = readlen; |
86 | ops.oobbuf = buf; | 86 | ops.oobbuf = buf; |
87 | ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0; | 87 | ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0; |
@@ -154,7 +154,7 @@ static int onenand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) | |||
154 | block = (int) (onenand_block(this, offs) << 1); | 154 | block = (int) (onenand_block(this, offs) << 1); |
155 | res = (bbm->bbt[block >> 3] >> (block & 0x06)) & 0x03; | 155 | res = (bbm->bbt[block >> 3] >> (block & 0x06)) & 0x03; |
156 | 156 | ||
157 | DEBUG(MTD_DEBUG_LEVEL2, "onenand_isbad_bbt: bbt info for offs 0x%08x: (block %d) 0x%02x\n", | 157 | pr_debug("onenand_isbad_bbt: bbt info for offs 0x%08x: (block %d) 0x%02x\n", |
158 | (unsigned int) offs, block >> 1, res); | 158 | (unsigned int) offs, block >> 1, res); |
159 | 159 | ||
160 | switch ((int) res) { | 160 | switch ((int) res) { |
@@ -189,10 +189,8 @@ int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) | |||
189 | len = this->chipsize >> (this->erase_shift + 2); | 189 | len = this->chipsize >> (this->erase_shift + 2); |
190 | /* Allocate memory (2bit per block) and clear the memory bad block table */ | 190 | /* Allocate memory (2bit per block) and clear the memory bad block table */ |
191 | bbm->bbt = kzalloc(len, GFP_KERNEL); | 191 | bbm->bbt = kzalloc(len, GFP_KERNEL); |
192 | if (!bbm->bbt) { | 192 | if (!bbm->bbt) |
193 | printk(KERN_ERR "onenand_scan_bbt: Out of memory\n"); | ||
194 | return -ENOMEM; | 193 | return -ENOMEM; |
195 | } | ||
196 | 194 | ||
197 | /* Set the bad block position */ | 195 | /* Set the bad block position */ |
198 | bbm->badblockpos = ONENAND_BADBLOCK_POS; | 196 | bbm->badblockpos = ONENAND_BADBLOCK_POS; |
diff --git a/drivers/mtd/onenand/samsung.c b/drivers/mtd/onenand/samsung.c index 3306b5b3c736..5474547eafc2 100644 --- a/drivers/mtd/onenand/samsung.c +++ b/drivers/mtd/onenand/samsung.c | |||
@@ -147,7 +147,6 @@ struct s3c_onenand { | |||
147 | struct resource *dma_res; | 147 | struct resource *dma_res; |
148 | unsigned long phys_base; | 148 | unsigned long phys_base; |
149 | struct completion complete; | 149 | struct completion complete; |
150 | struct mtd_partition *parts; | ||
151 | }; | 150 | }; |
152 | 151 | ||
153 | #define CMD_MAP_00(dev, addr) (dev->cmd_map(MAP_00, ((addr) << 1))) | 152 | #define CMD_MAP_00(dev, addr) (dev->cmd_map(MAP_00, ((addr) << 1))) |
@@ -157,8 +156,6 @@ struct s3c_onenand { | |||
157 | 156 | ||
158 | static struct s3c_onenand *onenand; | 157 | static struct s3c_onenand *onenand; |
159 | 158 | ||
160 | static const char *part_probes[] = { "cmdlinepart", NULL, }; | ||
161 | |||
162 | static inline int s3c_read_reg(int offset) | 159 | static inline int s3c_read_reg(int offset) |
163 | { | 160 | { |
164 | return readl(onenand->base + offset); | 161 | return readl(onenand->base + offset); |
@@ -1017,13 +1014,9 @@ static int s3c_onenand_probe(struct platform_device *pdev) | |||
1017 | if (s3c_read_reg(MEM_CFG_OFFSET) & ONENAND_SYS_CFG1_SYNC_READ) | 1014 | if (s3c_read_reg(MEM_CFG_OFFSET) & ONENAND_SYS_CFG1_SYNC_READ) |
1018 | dev_info(&onenand->pdev->dev, "OneNAND Sync. Burst Read enabled\n"); | 1015 | dev_info(&onenand->pdev->dev, "OneNAND Sync. Burst Read enabled\n"); |
1019 | 1016 | ||
1020 | err = parse_mtd_partitions(mtd, part_probes, &onenand->parts, 0); | 1017 | err = mtd_device_parse_register(mtd, NULL, 0, |
1021 | if (err > 0) | 1018 | pdata ? pdata->parts : NULL, |
1022 | mtd_device_register(mtd, onenand->parts, err); | 1019 | pdata ? pdata->nr_parts : 0); |
1023 | else if (err <= 0 && pdata && pdata->parts) | ||
1024 | mtd_device_register(mtd, pdata->parts, pdata->nr_parts); | ||
1025 | else | ||
1026 | err = mtd_device_register(mtd, NULL, 0); | ||
1027 | 1020 | ||
1028 | platform_set_drvdata(pdev, mtd); | 1021 | platform_set_drvdata(pdev, mtd); |
1029 | 1022 | ||