aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-06 23:32:08 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-06 23:32:08 -0500
commitb06f3a168cdcd80026276898fd1fee443ef25743 (patch)
treef883cd35369b8e0bdf196bb8194aaa205febc79a
parent51cb67c0b0fcb91581b15bd2e85f29af4d4b2df6 (diff)
parenta32d5b726ff8cf32bf491522b0ac8ae2545a063e (diff)
Merge tag 'for-linus-20160106' of git://git.infradead.org/linux-mtd
Pull MTD fixes from Brian Norris: "Three last MTD fixes for v4.4. These are all fixes for regressions and bugs reported mid cycle. Unfortunately, some of them took a bit long to get proper testing and feedback. - Assign the default MTD name earlier in the registration process, so partition parsers (like cmdlinepart) see the right name. Without this, some systems may come up with unpartitioned flash. This was a v4.4-rc1 regression. - Revert some new Winbond SPI NOR flash unlocking/locking support; new code in v4.4 caused regressions on some Spansion flash. - Fix mis-typed parameter ordering in SPI NOR unlock function; this bug was introduced in v4.4-rc1" * tag 'for-linus-20160106' of git://git.infradead.org/linux-mtd: mtd: spi-nor: fix stm_is_locked_sr() parameters mtd: spi-nor: fix Spansion regressions (aliased with Winbond) mtd: fix cmdlinepart parser, early naming for auto-filled MTD
-rw-r--r--drivers/mtd/mtdcore.c26
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c10
-rw-r--r--include/linux/mtd/spi-nor.h2
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 */
547static 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