From b67ba02fc848cee5175cfdefe81e10adf195c435 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Thu, 6 Apr 2023 07:26:11 +0200 Subject: [PATCH] kernel: backport mtd fixes for nvmem MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit They are needed for NVMEM changes pending for v6.4. Signed-off-by: Rafał Miłecki --- ...-unique-name-for-nvmem-device-take-t.patch | 43 +++++++++++++++ ...2-mtd-core-fix-nvmem-error-reporting.patch | 47 ++++++++++++++++ ...re-fix-error-path-for-nvmem-provider.patch | 55 +++++++++++++++++++ ...-mtd_otp_nvmem_add-to-handle-EPROBE_.patch | 47 ++++++++++++++++ ...rans-call-add-disks-after-mtd-device.patch | 10 ++-- 5 files changed, 197 insertions(+), 5 deletions(-) create mode 100644 target/linux/generic/backport-5.15/424-v6.4-0001-mtd-core-provide-unique-name-for-nvmem-device-take-t.patch create mode 100644 target/linux/generic/backport-5.15/424-v6.4-0002-mtd-core-fix-nvmem-error-reporting.patch create mode 100644 target/linux/generic/backport-5.15/424-v6.4-0003-mtd-core-fix-error-path-for-nvmem-provider.patch create mode 100644 target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch diff --git a/target/linux/generic/backport-5.15/424-v6.4-0001-mtd-core-provide-unique-name-for-nvmem-device-take-t.patch b/target/linux/generic/backport-5.15/424-v6.4-0001-mtd-core-provide-unique-name-for-nvmem-device-take-t.patch new file mode 100644 index 000000000000..a453f241e0e4 --- /dev/null +++ b/target/linux/generic/backport-5.15/424-v6.4-0001-mtd-core-provide-unique-name-for-nvmem-device-take-t.patch @@ -0,0 +1,43 @@ +From 1cd9ceaa5282ff10ea20a7fbadde5a476a1cc99e Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Wed, 8 Mar 2023 09:20:18 +0100 +Subject: [PATCH] mtd: core: provide unique name for nvmem device, take two + +Commit c048b60d39e1 ("mtd: core: provide unique name for nvmem device") +tries to give the nvmem device a unique name, but fails badly if the mtd +device doesn't have a "struct device" associated with it, i.e. if +CONFIG_MTD_PARTITIONED_MASTER is not set. This will result in the name +"(null)-user-otp", which is not unique. It seems the best we can do is +to use the compatible name together with a unique identifier added by +the nvmem subsystem by using NVMEM_DEVID_AUTO. + +Fixes: c048b60d39e1 ("mtd: core: provide unique name for nvmem device") +Cc: stable@vger.kernel.org +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-1-michael@walle.cc +--- + drivers/mtd/mtdcore.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -895,8 +895,8 @@ static struct nvmem_device *mtd_otp_nvme + + /* OTP nvmem will be registered on the physical device */ + config.dev = mtd->dev.parent; +- config.name = kasprintf(GFP_KERNEL, "%s-%s", dev_name(&mtd->dev), compatible); +- config.id = NVMEM_DEVID_NONE; ++ config.name = compatible; ++ config.id = NVMEM_DEVID_AUTO; + config.owner = THIS_MODULE; + config.type = NVMEM_TYPE_OTP; + config.root_only = true; +@@ -912,7 +912,6 @@ static struct nvmem_device *mtd_otp_nvme + nvmem = NULL; + + of_node_put(np); +- kfree(config.name); + + return nvmem; + } diff --git a/target/linux/generic/backport-5.15/424-v6.4-0002-mtd-core-fix-nvmem-error-reporting.patch b/target/linux/generic/backport-5.15/424-v6.4-0002-mtd-core-fix-nvmem-error-reporting.patch new file mode 100644 index 000000000000..501e9409e225 --- /dev/null +++ b/target/linux/generic/backport-5.15/424-v6.4-0002-mtd-core-fix-nvmem-error-reporting.patch @@ -0,0 +1,47 @@ +From 8bd1d24e6ca3c599dd455b0e1b22f77bab8290eb Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Wed, 8 Mar 2023 09:20:19 +0100 +Subject: [PATCH] mtd: core: fix nvmem error reporting + +The master MTD will only have an associated device if +CONFIG_MTD_PARTITIONED_MASTER is set, thus we cannot use dev_err() on +mtd->dev. Instead use the parent device which is the physical flash +memory. + +Fixes: 4b361cfa8624 ("mtd: core: add OTP nvmem provider support") +Cc: stable@vger.kernel.org +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-2-michael@walle.cc +--- + drivers/mtd/mtdcore.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -946,6 +946,7 @@ static int mtd_nvmem_fact_otp_reg_read(v + + static int mtd_otp_nvmem_add(struct mtd_info *mtd) + { ++ struct device *dev = mtd->dev.parent; + struct nvmem_device *nvmem; + ssize_t size; + int err; +@@ -959,7 +960,7 @@ static int mtd_otp_nvmem_add(struct mtd_ + nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, + mtd_nvmem_user_otp_reg_read); + if (IS_ERR(nvmem)) { +- dev_err(&mtd->dev, "Failed to register OTP NVMEM device\n"); ++ dev_err(dev, "Failed to register OTP NVMEM device\n"); + return PTR_ERR(nvmem); + } + mtd->otp_user_nvmem = nvmem; +@@ -977,7 +978,7 @@ static int mtd_otp_nvmem_add(struct mtd_ + nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size, + mtd_nvmem_fact_otp_reg_read); + if (IS_ERR(nvmem)) { +- dev_err(&mtd->dev, "Failed to register OTP NVMEM device\n"); ++ dev_err(dev, "Failed to register OTP NVMEM device\n"); + err = PTR_ERR(nvmem); + goto err; + } diff --git a/target/linux/generic/backport-5.15/424-v6.4-0003-mtd-core-fix-error-path-for-nvmem-provider.patch b/target/linux/generic/backport-5.15/424-v6.4-0003-mtd-core-fix-error-path-for-nvmem-provider.patch new file mode 100644 index 000000000000..099f0d287968 --- /dev/null +++ b/target/linux/generic/backport-5.15/424-v6.4-0003-mtd-core-fix-error-path-for-nvmem-provider.patch @@ -0,0 +1,55 @@ +From e0489f6e221f5ddee6cb3bd51b992b790c5fa4b9 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Wed, 8 Mar 2023 09:20:20 +0100 +Subject: [PATCH] mtd: core: fix error path for nvmem provider + +If mtd_otp_nvmem_add() fails, the partitions won't be removed +because there is simply no call to del_mtd_partitions(). +Unfortunately, add_mtd_partitions() will print all partitions to +the kernel console. If mtd_otp_nvmem_add() returns -EPROBE_DEFER +this would print the partitions multiple times to the kernel +console. Instead move mtd_otp_nvmem_add() to the beginning of the +function. + +Fixes: 4b361cfa8624 ("mtd: core: add OTP nvmem provider support") +Cc: stable@vger.kernel.org +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-3-michael@walle.cc +--- + drivers/mtd/mtdcore.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -1031,10 +1031,14 @@ int mtd_device_parse_register(struct mtd + + mtd_set_dev_defaults(mtd); + ++ ret = mtd_otp_nvmem_add(mtd); ++ if (ret) ++ goto out; ++ + if (IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) { + ret = add_mtd_device(mtd); + if (ret) +- return ret; ++ goto out; + } + + /* Prefer parsed partitions over driver-provided fallback */ +@@ -1069,9 +1073,12 @@ int mtd_device_parse_register(struct mtd + register_reboot_notifier(&mtd->reboot_notifier); + } + +- ret = mtd_otp_nvmem_add(mtd); +- + out: ++ if (ret) { ++ nvmem_unregister(mtd->otp_user_nvmem); ++ nvmem_unregister(mtd->otp_factory_nvmem); ++ } ++ + if (ret && device_is_registered(&mtd->dev)) + del_mtd_device(mtd); + diff --git a/target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch b/target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch new file mode 100644 index 000000000000..2d89a5db1266 --- /dev/null +++ b/target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch @@ -0,0 +1,47 @@ +From 281f7a6c1a33fffcde32001bacbb4f672140fbf9 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Wed, 8 Mar 2023 09:20:21 +0100 +Subject: [PATCH] mtd: core: prepare mtd_otp_nvmem_add() to handle + -EPROBE_DEFER + +NVMEM soon will get the ability for nvmem layouts and these might +not be ready when nvmem_register() is called and thus it might +return -EPROBE_DEFER. Don't print the error message in this case. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc +--- + drivers/mtd/mtdcore.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -960,8 +960,8 @@ static int mtd_otp_nvmem_add(struct mtd_ + nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, + mtd_nvmem_user_otp_reg_read); + if (IS_ERR(nvmem)) { +- dev_err(dev, "Failed to register OTP NVMEM device\n"); +- return PTR_ERR(nvmem); ++ err = PTR_ERR(nvmem); ++ goto err; + } + mtd->otp_user_nvmem = nvmem; + } +@@ -978,7 +978,6 @@ static int mtd_otp_nvmem_add(struct mtd_ + nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size, + mtd_nvmem_fact_otp_reg_read); + if (IS_ERR(nvmem)) { +- dev_err(dev, "Failed to register OTP NVMEM device\n"); + err = PTR_ERR(nvmem); + goto err; + } +@@ -991,7 +990,7 @@ static int mtd_otp_nvmem_add(struct mtd_ + err: + if (mtd->otp_user_nvmem) + nvmem_unregister(mtd->otp_user_nvmem); +- return err; ++ return dev_err_probe(dev, err, "Failed to register OTP NVMEM device\n"); + } + + /** diff --git a/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch b/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch index b10b8d997963..32a7fb626642 100644 --- a/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch +++ b/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch @@ -77,15 +77,15 @@ Signed-off-by: Daniel Golle #include "mtdcore.h" -@@ -1081,6 +1082,8 @@ int mtd_device_parse_register(struct mtd - - ret = mtd_otp_nvmem_add(mtd); +@@ -1082,6 +1083,8 @@ int mtd_device_parse_register(struct mtd + register_reboot_notifier(&mtd->reboot_notifier); + } + register_mtd_blktrans_devs(); + out: - if (ret && device_is_registered(&mtd->dev)) - del_mtd_device(mtd); + if (ret) { + nvmem_unregister(mtd->otp_user_nvmem); --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h @@ -76,6 +76,7 @@ extern int deregister_mtd_blktrans(struc -- 2.30.2