aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/onenand
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-11-07 12:11:16 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-11-07 12:11:16 -0500
commite0d65113a70f1dc514e625cc4e7a7485a4bf72df (patch)
tree7320a130dc304623f5cf4b5dd8f67fb1776225ca /drivers/mtd/onenand
parentcf5e15fbd72c13977720aa15b7b7e00e1d8fd8f2 (diff)
parent48e546b7f281f251893baa40769581fd15f085fb (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.c14
-rw-r--r--drivers/mtd/onenand/omap2.c16
-rw-r--r--drivers/mtd/onenand/onenand_base.c114
-rw-r--r--drivers/mtd/onenand/onenand_bbt.c8
-rw-r--r--drivers/mtd/onenand/samsung.c13
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
33static const char *part_probes[] = { "cmdlinepart", NULL, };
34
35struct onenand_info { 33struct 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
70static const char *part_probes[] = { "cmdlinepart", NULL, };
71
72static void omap2_onenand_dma_cb(int lch, u16 ch_status, void *data) 69static 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:
786err_free_cs: 780err_free_cs:
787 gpmc_cs_free(c->gpmc_cs); 781 gpmc_cs_free(c->gpmc_cs);
788err_kfree: 782err_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 */
2559static void onenand_sync(struct mtd_info *mtd) 2560static 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
158static struct s3c_onenand *onenand; 157static struct s3c_onenand *onenand;
159 158
160static const char *part_probes[] = { "cmdlinepart", NULL, };
161
162static inline int s3c_read_reg(int offset) 159static 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