| From 03785c3f4c4002001dd9737399122bfc4f79f71a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 2 Mar 2021 18:57:56 +0530 |
| Subject: mtd: Handle possible -EPROBE_DEFER from parse_mtd_partitions() |
| |
| From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> |
| |
| [ Upstream commit 08608adb520e51403be7592c2214846fa440a23a ] |
| |
| There are chances that the parse_mtd_partitions() function will return |
| -EPROBE_DEFER in mtd_device_parse_register(). This might happen when |
| the dependency is not available for the parser. For instance, on SDX55 |
| the MTD_QCOMSMEM_PARTS parser depends on the QCOM_SMEM driver to parse |
| the partitions defined in the shared memory region. With the current |
| flow, the error returned from parse_mtd_partitions() will be discarded |
| in favor of trying to add the fallback partition. |
| |
| This will prevent the driver to end up in probe deferred pool and the |
| partitions won't be parsed even after the QCOM_SMEM driver is available. |
| |
| Fix this issue by bailing out of mtd_device_parse_register() when |
| -EPROBE_DEFER error is returned from parse_mtd_partitions() function and |
| propagate the error code to the driver core for probing later. |
| |
| Fixes: 5ac67ce36cfe ("mtd: move code adding (registering) partitions to the parse_mtd_partitions()") |
| Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> |
| Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mtd/mtdcore.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c |
| index 2d6423d89a17..d97ddc65b5d4 100644 |
| --- a/drivers/mtd/mtdcore.c |
| +++ b/drivers/mtd/mtdcore.c |
| @@ -820,6 +820,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, |
| |
| /* Prefer parsed partitions over driver-provided fallback */ |
| ret = parse_mtd_partitions(mtd, types, parser_data); |
| + if (ret == -EPROBE_DEFER) |
| + goto out; |
| + |
| if (ret > 0) |
| ret = 0; |
| else if (nr_parts) |
| -- |
| 2.30.2 |
| |