diff options
| -rw-r--r-- | drivers/mtd/mtdcore.c | 26 | ||||
| -rw-r--r-- | drivers/mtd/spi-nor/spi-nor.c | 10 | ||||
| -rw-r--r-- | include/linux/mtd/spi-nor.h | 2 |
3 files changed, 22 insertions, 16 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 95c13b2ffa79..ffa288474820 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
| @@ -426,15 +426,6 @@ int add_mtd_device(struct mtd_info *mtd) | |||
| 426 | mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1; | 426 | mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1; |
| 427 | mtd->writesize_mask = (1 << mtd->writesize_shift) - 1; | 427 | mtd->writesize_mask = (1 << mtd->writesize_shift) - 1; |
| 428 | 428 | ||
| 429 | if (mtd->dev.parent) { | ||
| 430 | if (!mtd->owner && mtd->dev.parent->driver) | ||
| 431 | mtd->owner = mtd->dev.parent->driver->owner; | ||
| 432 | if (!mtd->name) | ||
| 433 | mtd->name = dev_name(mtd->dev.parent); | ||
| 434 | } else { | ||
| 435 | pr_debug("mtd device won't show a device symlink in sysfs\n"); | ||
| 436 | } | ||
| 437 | |||
| 438 | /* Some chips always power up locked. Unlock them now */ | 429 | /* Some chips always power up locked. Unlock them now */ |
| 439 | if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) { | 430 | if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) { |
| 440 | error = mtd_unlock(mtd, 0, mtd->size); | 431 | error = mtd_unlock(mtd, 0, mtd->size); |
| @@ -549,6 +540,21 @@ static int mtd_add_device_partitions(struct mtd_info *mtd, | |||
| 549 | return 0; | 540 | return 0; |
| 550 | } | 541 | } |
| 551 | 542 | ||
| 543 | /* | ||
| 544 | * Set a few defaults based on the parent devices, if not provided by the | ||
| 545 | * driver | ||
| 546 | */ | ||
| 547 | static void mtd_set_dev_defaults(struct mtd_info *mtd) | ||
| 548 | { | ||
| 549 | if (mtd->dev.parent) { | ||
| 550 | if (!mtd->owner && mtd->dev.parent->driver) | ||
| 551 | mtd->owner = mtd->dev.parent->driver->owner; | ||
| 552 | if (!mtd->name) | ||
| 553 | mtd->name = dev_name(mtd->dev.parent); | ||
| 554 | } else { | ||
| 555 | pr_debug("mtd device won't show a device symlink in sysfs\n"); | ||
| 556 | } | ||
| 557 | } | ||
| 552 | 558 | ||
| 553 | /** | 559 | /** |
| 554 | * mtd_device_parse_register - parse partitions and register an MTD device. | 560 | * mtd_device_parse_register - parse partitions and register an MTD device. |
| @@ -587,6 +593,8 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, | |||
| 587 | int ret; | 593 | int ret; |
| 588 | struct mtd_partition *real_parts = NULL; | 594 | struct mtd_partition *real_parts = NULL; |
| 589 | 595 | ||
| 596 | mtd_set_dev_defaults(mtd); | ||
| 597 | |||
| 590 | ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data); | 598 | ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data); |
| 591 | if (ret <= 0 && nr_parts && parts) { | 599 | if (ret <= 0 && nr_parts && parts) { |
| 592 | real_parts = kmemdup(parts, sizeof(*parts) * nr_parts, | 600 | real_parts = kmemdup(parts, sizeof(*parts) * nr_parts, |
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 49883905a434..32477c4eb421 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c | |||
| @@ -516,8 +516,8 @@ static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len) | |||
| 516 | status_old = read_sr(nor); | 516 | status_old = read_sr(nor); |
| 517 | 517 | ||
| 518 | /* Cannot unlock; would unlock larger region than requested */ | 518 | /* Cannot unlock; would unlock larger region than requested */ |
| 519 | if (stm_is_locked_sr(nor, status_old, ofs - mtd->erasesize, | 519 | if (stm_is_locked_sr(nor, ofs - mtd->erasesize, mtd->erasesize, |
| 520 | mtd->erasesize)) | 520 | status_old)) |
| 521 | return -EINVAL; | 521 | return -EINVAL; |
| 522 | 522 | ||
| 523 | /* | 523 | /* |
| @@ -1200,8 +1200,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) | |||
| 1200 | 1200 | ||
| 1201 | if (JEDEC_MFR(info) == SNOR_MFR_ATMEL || | 1201 | if (JEDEC_MFR(info) == SNOR_MFR_ATMEL || |
| 1202 | JEDEC_MFR(info) == SNOR_MFR_INTEL || | 1202 | JEDEC_MFR(info) == SNOR_MFR_INTEL || |
| 1203 | JEDEC_MFR(info) == SNOR_MFR_SST || | 1203 | JEDEC_MFR(info) == SNOR_MFR_SST) { |
| 1204 | JEDEC_MFR(info) == SNOR_MFR_WINBOND) { | ||
| 1205 | write_enable(nor); | 1204 | write_enable(nor); |
| 1206 | write_sr(nor, 0); | 1205 | write_sr(nor, 0); |
| 1207 | } | 1206 | } |
| @@ -1217,8 +1216,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) | |||
| 1217 | mtd->_read = spi_nor_read; | 1216 | mtd->_read = spi_nor_read; |
| 1218 | 1217 | ||
| 1219 | /* NOR protection support for STmicro/Micron chips and similar */ | 1218 | /* NOR protection support for STmicro/Micron chips and similar */ |
| 1220 | if (JEDEC_MFR(info) == SNOR_MFR_MICRON || | 1219 | if (JEDEC_MFR(info) == SNOR_MFR_MICRON) { |
| 1221 | JEDEC_MFR(info) == SNOR_MFR_WINBOND) { | ||
| 1222 | nor->flash_lock = stm_lock; | 1220 | nor->flash_lock = stm_lock; |
| 1223 | nor->flash_unlock = stm_unlock; | 1221 | nor->flash_unlock = stm_unlock; |
| 1224 | nor->flash_is_locked = stm_is_locked; | 1222 | nor->flash_is_locked = stm_is_locked; |
diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h index c8723b62c4cd..bc742dac7d3a 100644 --- a/include/linux/mtd/spi-nor.h +++ b/include/linux/mtd/spi-nor.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX | 25 | #define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX |
| 26 | #define SNOR_MFR_SPANSION CFI_MFR_AMD | 26 | #define SNOR_MFR_SPANSION CFI_MFR_AMD |
| 27 | #define SNOR_MFR_SST CFI_MFR_SST | 27 | #define SNOR_MFR_SST CFI_MFR_SST |
| 28 | #define SNOR_MFR_WINBOND 0xef | 28 | #define SNOR_MFR_WINBOND 0xef /* Also used by some Spansion */ |
| 29 | 29 | ||
| 30 | /* | 30 | /* |
| 31 | * Note on opcode nomenclature: some opcodes have a format like | 31 | * Note on opcode nomenclature: some opcodes have a format like |
