aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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