aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-08-04 19:37:08 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-08-04 19:37:08 -0400
commit62d1716304d1bb35ad9cdafe40efbbb6b3981cfe (patch)
tree0a650e85338c02b10502e72ae251237e73e26639
parent4b6f23161b4e888e72671e377c32eabe9a8e62fc (diff)
parent2b372a9685a757a1d3ab30615ef42b2db7c45298 (diff)
Merge tag 'mtd/fixes-for-5.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
Pull MTD fixes from Miquel Raynal: "NAND: - Fix Micron driver as some chips enable internal ECC correction during their discovery while they advertize they do not have any. Hyperbus: - Restrict the build to only ARM64 SoCs (and compile testing) which is what should have been done since the beginning. - Fix Kconfig issue by selection something instead of implying it" * tag 'mtd/fixes-for-5.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux: mtd: hyperbus: Add hardware dependency to AM654 driver mtd: hyperbus: Kconfig: Fix HBMC_AM654 dependencies mtd: rawnand: micron: handle on-die "ECC-off" devices correctly
-rw-r--r--drivers/mtd/hyperbus/Kconfig3
-rw-r--r--drivers/mtd/nand/raw/nand_micron.c14
2 files changed, 13 insertions, 4 deletions
diff --git a/drivers/mtd/hyperbus/Kconfig b/drivers/mtd/hyperbus/Kconfig
index cff6bbd226f5..b4e3caf7d799 100644
--- a/drivers/mtd/hyperbus/Kconfig
+++ b/drivers/mtd/hyperbus/Kconfig
@@ -14,8 +14,9 @@ if MTD_HYPERBUS
14 14
15config HBMC_AM654 15config HBMC_AM654
16 tristate "HyperBus controller driver for AM65x SoC" 16 tristate "HyperBus controller driver for AM65x SoC"
17 depends on ARM64 || COMPILE_TEST
17 select MULTIPLEXER 18 select MULTIPLEXER
18 select MUX_MMIO 19 imply MUX_MMIO
19 help 20 help
20 This is the driver for HyperBus controller on TI's AM65x and 21 This is the driver for HyperBus controller on TI's AM65x and
21 other SoCs 22 other SoCs
diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c
index 1622d3145587..8ca9fad6e6ad 100644
--- a/drivers/mtd/nand/raw/nand_micron.c
+++ b/drivers/mtd/nand/raw/nand_micron.c
@@ -390,6 +390,14 @@ static int micron_supports_on_die_ecc(struct nand_chip *chip)
390 (chip->id.data[4] & MICRON_ID_INTERNAL_ECC_MASK) != 0x2) 390 (chip->id.data[4] & MICRON_ID_INTERNAL_ECC_MASK) != 0x2)
391 return MICRON_ON_DIE_UNSUPPORTED; 391 return MICRON_ON_DIE_UNSUPPORTED;
392 392
393 /*
394 * It seems that there are devices which do not support ECC officially.
395 * At least the MT29F2G08ABAGA / MT29F2G08ABBGA devices supports
396 * enabling the ECC feature but don't reflect that to the READ_ID table.
397 * So we have to guarantee that we disable the ECC feature directly
398 * after we did the READ_ID table command. Later we can evaluate the
399 * ECC_ENABLE support.
400 */
393 ret = micron_nand_on_die_ecc_setup(chip, true); 401 ret = micron_nand_on_die_ecc_setup(chip, true);
394 if (ret) 402 if (ret)
395 return MICRON_ON_DIE_UNSUPPORTED; 403 return MICRON_ON_DIE_UNSUPPORTED;
@@ -398,13 +406,13 @@ static int micron_supports_on_die_ecc(struct nand_chip *chip)
398 if (ret) 406 if (ret)
399 return MICRON_ON_DIE_UNSUPPORTED; 407 return MICRON_ON_DIE_UNSUPPORTED;
400 408
401 if (!(id[4] & MICRON_ID_ECC_ENABLED))
402 return MICRON_ON_DIE_UNSUPPORTED;
403
404 ret = micron_nand_on_die_ecc_setup(chip, false); 409 ret = micron_nand_on_die_ecc_setup(chip, false);
405 if (ret) 410 if (ret)
406 return MICRON_ON_DIE_UNSUPPORTED; 411 return MICRON_ON_DIE_UNSUPPORTED;
407 412
413 if (!(id[4] & MICRON_ID_ECC_ENABLED))
414 return MICRON_ON_DIE_UNSUPPORTED;
415
408 ret = nand_readid_op(chip, 0, id, sizeof(id)); 416 ret = nand_readid_op(chip, 0, id, sizeof(id));
409 if (ret) 417 if (ret)
410 return MICRON_ON_DIE_UNSUPPORTED; 418 return MICRON_ON_DIE_UNSUPPORTED;