diff options
| -rw-r--r-- | drivers/mtd/mtdpart.c | 5 | ||||
| -rw-r--r-- | drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 13 | ||||
| -rw-r--r-- | drivers/mtd/nand/raw/nand_base.c | 1 | ||||
| -rw-r--r-- | drivers/mtd/nand/raw/nand_bbt.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/spi/core.c | 46 |
5 files changed, 34 insertions, 33 deletions
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 60104e1079c5..37f174ccbcec 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
| @@ -480,6 +480,10 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, | |||
| 480 | /* let's register it anyway to preserve ordering */ | 480 | /* let's register it anyway to preserve ordering */ |
| 481 | slave->offset = 0; | 481 | slave->offset = 0; |
| 482 | slave->mtd.size = 0; | 482 | slave->mtd.size = 0; |
| 483 | |||
| 484 | /* Initialize ->erasesize to make add_mtd_device() happy. */ | ||
| 485 | slave->mtd.erasesize = parent->erasesize; | ||
| 486 | |||
| 483 | printk(KERN_ERR"mtd: partition \"%s\" is out of reach -- disabled\n", | 487 | printk(KERN_ERR"mtd: partition \"%s\" is out of reach -- disabled\n", |
| 484 | part->name); | 488 | part->name); |
| 485 | goto out_register; | 489 | goto out_register; |
| @@ -632,7 +636,6 @@ err_remove_part: | |||
| 632 | mutex_unlock(&mtd_partitions_mutex); | 636 | mutex_unlock(&mtd_partitions_mutex); |
| 633 | 637 | ||
| 634 | free_partition(new); | 638 | free_partition(new); |
| 635 | pr_info("%s:%i\n", __func__, __LINE__); | ||
| 636 | 639 | ||
| 637 | return ret; | 640 | return ret; |
| 638 | } | 641 | } |
diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index bd4cfac6b5aa..a4768df5083f 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | |||
| @@ -155,9 +155,10 @@ int gpmi_init(struct gpmi_nand_data *this) | |||
| 155 | 155 | ||
| 156 | /* | 156 | /* |
| 157 | * Reset BCH here, too. We got failures otherwise :( | 157 | * Reset BCH here, too. We got failures otherwise :( |
| 158 | * See later BCH reset for explanation of MX23 handling | 158 | * See later BCH reset for explanation of MX23 and MX28 handling |
| 159 | */ | 159 | */ |
| 160 | ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this)); | 160 | ret = gpmi_reset_block(r->bch_regs, |
| 161 | GPMI_IS_MX23(this) || GPMI_IS_MX28(this)); | ||
| 161 | if (ret) | 162 | if (ret) |
| 162 | goto err_out; | 163 | goto err_out; |
| 163 | 164 | ||
| @@ -263,12 +264,10 @@ int bch_set_geometry(struct gpmi_nand_data *this) | |||
| 263 | /* | 264 | /* |
| 264 | * Due to erratum #2847 of the MX23, the BCH cannot be soft reset on this | 265 | * Due to erratum #2847 of the MX23, the BCH cannot be soft reset on this |
| 265 | * chip, otherwise it will lock up. So we skip resetting BCH on the MX23. | 266 | * chip, otherwise it will lock up. So we skip resetting BCH on the MX23. |
| 266 | * On the other hand, the MX28 needs the reset, because one case has been | 267 | * and MX28. |
| 267 | * seen where the BCH produced ECC errors constantly after 10000 | ||
| 268 | * consecutive reboots. The latter case has not been seen on the MX23 | ||
| 269 | * yet, still we don't know if it could happen there as well. | ||
| 270 | */ | 268 | */ |
| 271 | ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this)); | 269 | ret = gpmi_reset_block(r->bch_regs, |
| 270 | GPMI_IS_MX23(this) || GPMI_IS_MX28(this)); | ||
| 272 | if (ret) | 271 | if (ret) |
| 273 | goto err_out; | 272 | goto err_out; |
| 274 | 273 | ||
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c index cca4b24d2ffa..839494ac457c 100644 --- a/drivers/mtd/nand/raw/nand_base.c +++ b/drivers/mtd/nand/raw/nand_base.c | |||
| @@ -410,6 +410,7 @@ static int nand_check_wp(struct nand_chip *chip) | |||
| 410 | 410 | ||
| 411 | /** | 411 | /** |
| 412 | * nand_fill_oob - [INTERN] Transfer client buffer to oob | 412 | * nand_fill_oob - [INTERN] Transfer client buffer to oob |
| 413 | * @chip: NAND chip object | ||
| 413 | * @oob: oob data buffer | 414 | * @oob: oob data buffer |
| 414 | * @len: oob data write length | 415 | * @len: oob data write length |
| 415 | * @ops: oob ops structure | 416 | * @ops: oob ops structure |
diff --git a/drivers/mtd/nand/raw/nand_bbt.c b/drivers/mtd/nand/raw/nand_bbt.c index 1b722fe9213c..19a2b563acdf 100644 --- a/drivers/mtd/nand/raw/nand_bbt.c +++ b/drivers/mtd/nand/raw/nand_bbt.c | |||
| @@ -158,7 +158,7 @@ static u32 add_marker_len(struct nand_bbt_descr *td) | |||
| 158 | 158 | ||
| 159 | /** | 159 | /** |
| 160 | * read_bbt - [GENERIC] Read the bad block table starting from page | 160 | * read_bbt - [GENERIC] Read the bad block table starting from page |
| 161 | * @chip: NAND chip object | 161 | * @this: NAND chip object |
| 162 | * @buf: temporary buffer | 162 | * @buf: temporary buffer |
| 163 | * @page: the starting page | 163 | * @page: the starting page |
| 164 | * @num: the number of bbt descriptors to read | 164 | * @num: the number of bbt descriptors to read |
diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 479c2f2cf17f..fa87ae28cdfe 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c | |||
| @@ -304,24 +304,30 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, | |||
| 304 | struct nand_device *nand = spinand_to_nand(spinand); | 304 | struct nand_device *nand = spinand_to_nand(spinand); |
| 305 | struct mtd_info *mtd = nanddev_to_mtd(nand); | 305 | struct mtd_info *mtd = nanddev_to_mtd(nand); |
| 306 | struct nand_page_io_req adjreq = *req; | 306 | struct nand_page_io_req adjreq = *req; |
| 307 | unsigned int nbytes = 0; | 307 | void *buf = spinand->databuf; |
| 308 | void *buf = NULL; | 308 | unsigned int nbytes; |
| 309 | u16 column = 0; | 309 | u16 column = 0; |
| 310 | int ret; | 310 | int ret; |
| 311 | 311 | ||
| 312 | memset(spinand->databuf, 0xff, | 312 | /* |
| 313 | nanddev_page_size(nand) + | 313 | * Looks like PROGRAM LOAD (AKA write cache) does not necessarily reset |
| 314 | nanddev_per_page_oobsize(nand)); | 314 | * the cache content to 0xFF (depends on vendor implementation), so we |
| 315 | * must fill the page cache entirely even if we only want to program | ||
| 316 | * the data portion of the page, otherwise we might corrupt the BBM or | ||
| 317 | * user data previously programmed in OOB area. | ||
| 318 | */ | ||
| 319 | nbytes = nanddev_page_size(nand) + nanddev_per_page_oobsize(nand); | ||
| 320 | memset(spinand->databuf, 0xff, nbytes); | ||
| 321 | adjreq.dataoffs = 0; | ||
| 322 | adjreq.datalen = nanddev_page_size(nand); | ||
| 323 | adjreq.databuf.out = spinand->databuf; | ||
| 324 | adjreq.ooblen = nanddev_per_page_oobsize(nand); | ||
| 325 | adjreq.ooboffs = 0; | ||
| 326 | adjreq.oobbuf.out = spinand->oobbuf; | ||
| 315 | 327 | ||
| 316 | if (req->datalen) { | 328 | if (req->datalen) |
| 317 | memcpy(spinand->databuf + req->dataoffs, req->databuf.out, | 329 | memcpy(spinand->databuf + req->dataoffs, req->databuf.out, |
| 318 | req->datalen); | 330 | req->datalen); |
| 319 | adjreq.dataoffs = 0; | ||
| 320 | adjreq.datalen = nanddev_page_size(nand); | ||
| 321 | adjreq.databuf.out = spinand->databuf; | ||
| 322 | nbytes = adjreq.datalen; | ||
| 323 | buf = spinand->databuf; | ||
| 324 | } | ||
| 325 | 331 | ||
| 326 | if (req->ooblen) { | 332 | if (req->ooblen) { |
| 327 | if (req->mode == MTD_OPS_AUTO_OOB) | 333 | if (req->mode == MTD_OPS_AUTO_OOB) |
| @@ -332,14 +338,6 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, | |||
| 332 | else | 338 | else |
| 333 | memcpy(spinand->oobbuf + req->ooboffs, req->oobbuf.out, | 339 | memcpy(spinand->oobbuf + req->ooboffs, req->oobbuf.out, |
| 334 | req->ooblen); | 340 | req->ooblen); |
| 335 | |||
| 336 | adjreq.ooblen = nanddev_per_page_oobsize(nand); | ||
| 337 | adjreq.ooboffs = 0; | ||
| 338 | nbytes += nanddev_per_page_oobsize(nand); | ||
| 339 | if (!buf) { | ||
| 340 | buf = spinand->oobbuf; | ||
| 341 | column = nanddev_page_size(nand); | ||
| 342 | } | ||
| 343 | } | 341 | } |
| 344 | 342 | ||
| 345 | spinand_cache_op_adjust_colum(spinand, &adjreq, &column); | 343 | spinand_cache_op_adjust_colum(spinand, &adjreq, &column); |
| @@ -370,8 +368,8 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, | |||
| 370 | 368 | ||
| 371 | /* | 369 | /* |
| 372 | * We need to use the RANDOM LOAD CACHE operation if there's | 370 | * We need to use the RANDOM LOAD CACHE operation if there's |
| 373 | * more than one iteration, because the LOAD operation resets | 371 | * more than one iteration, because the LOAD operation might |
| 374 | * the cache to 0xff. | 372 | * reset the cache to 0xff. |
| 375 | */ | 373 | */ |
| 376 | if (nbytes) { | 374 | if (nbytes) { |
| 377 | column = op.addr.val; | 375 | column = op.addr.val; |
| @@ -1018,11 +1016,11 @@ static int spinand_init(struct spinand_device *spinand) | |||
| 1018 | for (i = 0; i < nand->memorg.ntargets; i++) { | 1016 | for (i = 0; i < nand->memorg.ntargets; i++) { |
| 1019 | ret = spinand_select_target(spinand, i); | 1017 | ret = spinand_select_target(spinand, i); |
| 1020 | if (ret) | 1018 | if (ret) |
| 1021 | goto err_free_bufs; | 1019 | goto err_manuf_cleanup; |
| 1022 | 1020 | ||
| 1023 | ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED); | 1021 | ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED); |
| 1024 | if (ret) | 1022 | if (ret) |
| 1025 | goto err_free_bufs; | 1023 | goto err_manuf_cleanup; |
| 1026 | } | 1024 | } |
| 1027 | 1025 | ||
| 1028 | ret = nanddev_init(nand, &spinand_ops, THIS_MODULE); | 1026 | ret = nanddev_init(nand, &spinand_ops, THIS_MODULE); |
