kernel: backport mtd fixes for nvmem
They are needed for NVMEM changes pending for v6.4. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
3b212db232
commit
b67ba02fc8
5 changed files with 197 additions and 5 deletions
|
@ -0,0 +1,43 @@
|
||||||
|
From 1cd9ceaa5282ff10ea20a7fbadde5a476a1cc99e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Walle <michael@walle.cc>
|
||||||
|
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 <michael@walle.cc>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
From 8bd1d24e6ca3c599dd455b0e1b22f77bab8290eb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Walle <michael@walle.cc>
|
||||||
|
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 <michael@walle.cc>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
From e0489f6e221f5ddee6cb3bd51b992b790c5fa4b9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Walle <michael@walle.cc>
|
||||||
|
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 <michael@walle.cc>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
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);
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
From 281f7a6c1a33fffcde32001bacbb4f672140fbf9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Walle <michael@walle.cc>
|
||||||
|
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 <michael@walle.cc>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
|
@ -77,15 +77,15 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
|
||||||
#include "mtdcore.h"
|
#include "mtdcore.h"
|
||||||
|
|
||||||
@@ -1081,6 +1082,8 @@ int mtd_device_parse_register(struct mtd
|
@@ -1082,6 +1083,8 @@ int mtd_device_parse_register(struct mtd
|
||||||
|
register_reboot_notifier(&mtd->reboot_notifier);
|
||||||
ret = mtd_otp_nvmem_add(mtd);
|
}
|
||||||
|
|
||||||
+ register_mtd_blktrans_devs();
|
+ register_mtd_blktrans_devs();
|
||||||
+
|
+
|
||||||
out:
|
out:
|
||||||
if (ret && device_is_registered(&mtd->dev))
|
if (ret) {
|
||||||
del_mtd_device(mtd);
|
nvmem_unregister(mtd->otp_user_nvmem);
|
||||||
--- a/include/linux/mtd/blktrans.h
|
--- a/include/linux/mtd/blktrans.h
|
||||||
+++ b/include/linux/mtd/blktrans.h
|
+++ b/include/linux/mtd/blktrans.h
|
||||||
@@ -76,6 +76,7 @@ extern int deregister_mtd_blktrans(struc
|
@@ -76,6 +76,7 @@ extern int deregister_mtd_blktrans(struc
|
||||||
|
|
Loading…
Reference in a new issue