diff mbox series

[03/12] dfu: mtd: remove direct call of mtdparts_init function

Message ID 20230608171614.3.I620daeba9c6dbeed0f0164229d65403d36291bb1@changeid
State Accepted
Commit 28d3439f1b343f1299c8e92a673ceca2d9296baa
Delegated to: Patrice Chotard
Headers show
Series stm32mp1: use U-Boot device tree to configure MTD partitions | expand

Commit Message

Patrick DELAUNAY June 8, 2023, 3:16 p.m. UTC
With MTD support in driver model, the direct call of mtdparts_init
should be avoided and replaced by mtd_probe_devices.

With the modificaton when MTDIDS/MTDPARTS are empty the OF fallback
with partition describe in device tree is correctly performed,
introduced by commit dc339bf784f0 ("mtd: add support for parsing
partitions defined in OF").
With this patch the dependency with CONFIG_CMD_MTDPARTS is removed.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 drivers/dfu/Kconfig   |  1 -
 drivers/dfu/dfu_mtd.c | 34 +++++++++++++++++++---------------
 2 files changed, 19 insertions(+), 16 deletions(-)

Comments

Patrice CHOTARD June 13, 2023, 6:26 a.m. UTC | #1
On 6/8/23 17:16, Patrick Delaunay wrote:
> With MTD support in driver model, the direct call of mtdparts_init
> should be avoided and replaced by mtd_probe_devices.
> 
> With the modificaton when MTDIDS/MTDPARTS are empty the OF fallback
> with partition describe in device tree is correctly performed,
> introduced by commit dc339bf784f0 ("mtd: add support for parsing
> partitions defined in OF").
> With this patch the dependency with CONFIG_CMD_MTDPARTS is removed.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  drivers/dfu/Kconfig   |  1 -
>  drivers/dfu/dfu_mtd.c | 34 +++++++++++++++++++---------------
>  2 files changed, 19 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/dfu/Kconfig b/drivers/dfu/Kconfig
> index 8d7f13dcb0b5..c3a0b93b25e0 100644
> --- a/drivers/dfu/Kconfig
> +++ b/drivers/dfu/Kconfig
> @@ -41,7 +41,6 @@ config DFU_MMC
>  config DFU_MTD
>  	bool "MTD back end for DFU"
>  	depends on DM_MTD
> -	depends on CMD_MTDPARTS
>  	help
>  	  This option enables using DFU to read and write to on any MTD device.
>  
> diff --git a/drivers/dfu/dfu_mtd.c b/drivers/dfu/dfu_mtd.c
> index c7075f12eca9..75e2f6a42151 100644
> --- a/drivers/dfu/dfu_mtd.c
> +++ b/drivers/dfu/dfu_mtd.c
> @@ -10,7 +10,6 @@
>  #include <common.h>
>  #include <dfu.h>
>  #include <mtd.h>
> -#include <jffs2/load_kernel.h>
>  #include <linux/err.h>
>  #include <linux/ctype.h>
>  
> @@ -275,7 +274,7 @@ int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char **argv, int a
>  {
>  	char *s;
>  	struct mtd_info *mtd;
> -	int ret, part;
> +	int part;
>  
>  	mtd = get_mtd_device_nm(devstr);
>  	if (IS_ERR_OR_NULL(mtd))
> @@ -299,10 +298,9 @@ int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char **argv, int a
>  		if (*s)
>  			return -EINVAL;
>  	} else if ((!strcmp(argv[0], "part")) || (!strcmp(argv[0], "partubi"))) {
> -		char mtd_id[32];
> -		struct mtd_device *mtd_dev;
> -		u8 part_num;
> -		struct part_info *pi;
> +		struct mtd_info *partition;
> +		int partnum = 0;
> +		bool part_found = false;
>  
>  		if (argc != 2)
>  			return -EINVAL;
> @@ -313,19 +311,25 @@ int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char **argv, int a
>  		if (*s)
>  			return -EINVAL;
>  
> -		sprintf(mtd_id, "%s,%d", devstr, part - 1);
> -		printf("using id '%s'\n", mtd_id);
> +		/* register partitions with MTDIDS/MTDPARTS or OF fallback */
> +		mtd_probe_devices();
>  
> -		mtdparts_init();
> -
> -		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
> -		if (ret != 0) {
> -			printf("Could not locate '%s'\n", mtd_id);
> +		partnum = 0;
> +		list_for_each_entry(partition, &mtd->partitions, node) {
> +			partnum++;
> +			if (partnum == part) {
> +				part_found = true;
> +				break;
> +			}
> +		}
> +		if (!part_found) {
> +			printf("No partition %d in %s\n", part, mtd->name);
>  			return -1;
>  		}
> +		log_debug("partition %d:%s in %s\n", partnum, partition->name, mtd->name);
>  
> -		dfu->data.mtd.start = pi->offset;
> -		dfu->data.mtd.size = pi->size;
> +		dfu->data.mtd.start = partition->offset;
> +		dfu->data.mtd.size = partition->size;
>  		if (!strcmp(argv[0], "partubi"))
>  			dfu->data.mtd.ubi = 1;
>  	} else {
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Thanks
Patrice
diff mbox series

Patch

diff --git a/drivers/dfu/Kconfig b/drivers/dfu/Kconfig
index 8d7f13dcb0b5..c3a0b93b25e0 100644
--- a/drivers/dfu/Kconfig
+++ b/drivers/dfu/Kconfig
@@ -41,7 +41,6 @@  config DFU_MMC
 config DFU_MTD
 	bool "MTD back end for DFU"
 	depends on DM_MTD
-	depends on CMD_MTDPARTS
 	help
 	  This option enables using DFU to read and write to on any MTD device.
 
diff --git a/drivers/dfu/dfu_mtd.c b/drivers/dfu/dfu_mtd.c
index c7075f12eca9..75e2f6a42151 100644
--- a/drivers/dfu/dfu_mtd.c
+++ b/drivers/dfu/dfu_mtd.c
@@ -10,7 +10,6 @@ 
 #include <common.h>
 #include <dfu.h>
 #include <mtd.h>
-#include <jffs2/load_kernel.h>
 #include <linux/err.h>
 #include <linux/ctype.h>
 
@@ -275,7 +274,7 @@  int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char **argv, int a
 {
 	char *s;
 	struct mtd_info *mtd;
-	int ret, part;
+	int part;
 
 	mtd = get_mtd_device_nm(devstr);
 	if (IS_ERR_OR_NULL(mtd))
@@ -299,10 +298,9 @@  int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char **argv, int a
 		if (*s)
 			return -EINVAL;
 	} else if ((!strcmp(argv[0], "part")) || (!strcmp(argv[0], "partubi"))) {
-		char mtd_id[32];
-		struct mtd_device *mtd_dev;
-		u8 part_num;
-		struct part_info *pi;
+		struct mtd_info *partition;
+		int partnum = 0;
+		bool part_found = false;
 
 		if (argc != 2)
 			return -EINVAL;
@@ -313,19 +311,25 @@  int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char **argv, int a
 		if (*s)
 			return -EINVAL;
 
-		sprintf(mtd_id, "%s,%d", devstr, part - 1);
-		printf("using id '%s'\n", mtd_id);
+		/* register partitions with MTDIDS/MTDPARTS or OF fallback */
+		mtd_probe_devices();
 
-		mtdparts_init();
-
-		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
-		if (ret != 0) {
-			printf("Could not locate '%s'\n", mtd_id);
+		partnum = 0;
+		list_for_each_entry(partition, &mtd->partitions, node) {
+			partnum++;
+			if (partnum == part) {
+				part_found = true;
+				break;
+			}
+		}
+		if (!part_found) {
+			printf("No partition %d in %s\n", part, mtd->name);
 			return -1;
 		}
+		log_debug("partition %d:%s in %s\n", partnum, partition->name, mtd->name);
 
-		dfu->data.mtd.start = pi->offset;
-		dfu->data.mtd.size = pi->size;
+		dfu->data.mtd.start = partition->offset;
+		dfu->data.mtd.size = partition->size;
 		if (!strcmp(argv[0], "partubi"))
 			dfu->data.mtd.ubi = 1;
 	} else {