All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
@ 2021-07-29 14:55 ` Aswath Govindraju
  2021-07-29 22:30   ` Jaehoon Chung
  2021-07-30  4:47   ` Ashok Reddy Soma
  0 siblings, 2 replies; 10+ messages in thread
From: Aswath Govindraju @ 2021-07-29 14:55 UTC (permalink / raw)
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Aswath Govindraju, Peng Fan, Jaehoon Chung, Simon Glass,
	Heinrich Schuchardt, Bin Meng, Patrick Delaunay, Pragnesh Patel,
	Frédéric Danis, Reuben Dowle, Yangbo Lu, Stefan Bosch,
	Ashok Reddy Soma, Nicolas Saenz Julienne, Pali Rohár,
	u-boot

Add support for enumerating MMC card in a given mode using mmc rescan and
mmc dev commands. The speed mode is provided as the last argument in these
commands and is indicated using the index from enum bus_mode in
include/mmc.h. A speed mode can be set only if it has already been enabled
in the device tree.

Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
---
 cmd/Kconfig              | 10 ++++++
 cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
 drivers/mmc/mmc-uclass.c |  3 ++
 drivers/mmc/mmc.c        | 18 ++++++++++
 include/mmc.h            |  4 +++
 5 files changed, 85 insertions(+), 21 deletions(-)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index ffef3cc76ca4..3a857b3f6e2e 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2389,4 +2389,14 @@ config CMD_UBIFS
 	help
 	  UBIFS is a file system for flash devices which works on top of UBI.
 
+config MMC_SPEED_MODE_SET
+	bool "set speed mode using mmc command"
+	depends on CMD_MMC
+	default n
+	help
+	  Enable setting speed mode using mmc rescan and mmc dev commands.
+	  The speed mode is provided as the last argument in these commands
+	  and is indicated using the index from enum bus_mode in
+	  include/mmc.h. A speed mode can be set only if it has already
+	  been enabled in the device tree.
 endmenu
diff --git a/cmd/mmc.c b/cmd/mmc.c
index b942576b58ac..073e87d69634 100644
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
 		}
 	}
 }
-static struct mmc *init_mmc_device(int dev, bool force_init)
+
+static struct mmc *init_mmc_device(int dev, bool force_init,
+				   enum bus_mode speed_mode)
 {
 	struct mmc *mmc;
 	mmc = find_mmc_device(dev);
@@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
 
 	if (force_init)
 		mmc->has_init = 0;
+
+#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
+	mmc->user_speed_mode = speed_mode;
+#endif
+
 	if (mmc_init(mmc))
 		return NULL;
 
@@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
 		}
 	}
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
 	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
 		return CMD_RET_SUCCESS;
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
 	blk = simple_strtoul(argv[2], NULL, 16);
 	cnt = simple_strtoul(argv[3], NULL, 16);
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
 		return CMD_RET_FAILURE;
 	}
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
 	blk = simple_strtoul(argv[2], NULL, 16);
 	cnt = simple_strtoul(argv[3], NULL, 16);
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
 	blk = simple_strtoul(argv[1], NULL, 16);
 	cnt = simple_strtoul(argv[2], NULL, 16);
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
 			 int argc, char *const argv[])
 {
 	struct mmc *mmc;
+	enum bus_mode speed_mode = MMC_MODES_END;
+
+	if (argc == 1) {
+		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
+	} else if (argc == 2) {
+		/* parse the mode */
+		speed_mode = simple_strtoul(argv[1], NULL, 10);
+		/* Need to pass the the speed mode required too */
+		mmc = init_mmc_device(curr_device, true, speed_mode);
+	} else {
+		return CMD_RET_USAGE;
+	}
 
-	mmc = init_mmc_device(curr_device, true);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
 	struct blk_desc *mmc_dev;
 	struct mmc *mmc;
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
 {
 	int dev, part = 0, ret;
 	struct mmc *mmc;
+	enum bus_mode speed_mode = MMC_MODES_END;
 
 	if (argc == 1) {
 		dev = curr_device;
+		mmc = init_mmc_device(dev, true, MMC_MODES_END);
 	} else if (argc == 2) {
 		dev = simple_strtoul(argv[1], NULL, 10);
+		mmc = init_mmc_device(dev, true, MMC_MODES_END);
 	} else if (argc == 3) {
 		dev = (int)simple_strtoul(argv[1], NULL, 10);
 		part = (int)simple_strtoul(argv[2], NULL, 10);
@@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
 			       PART_ACCESS_MASK);
 			return CMD_RET_FAILURE;
 		}
+		mmc = init_mmc_device(dev, true, MMC_MODES_END);
+	} else if (argc == 4) {
+		dev = (int)simple_strtoul(argv[1], NULL, 10);
+		part = (int)simple_strtoul(argv[2], NULL, 10);
+		speed_mode = simple_strtoul(argv[3], NULL, 10);
+		mmc = init_mmc_device(curr_device, true, speed_mode);
 	} else {
 		return CMD_RET_USAGE;
 	}
 
-	mmc = init_mmc_device(dev, true);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
 	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
 	int i, r, pidx;
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
 	reset = simple_strtoul(argv[3], NULL, 10);
 	mode = simple_strtoul(argv[4], NULL, 10);
 
-	mmc = init_mmc_device(dev, false);
+	mmc = init_mmc_device(dev, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
 	bootsize = simple_strtoul(argv[2], NULL, 10);
 	rpmbsize = simple_strtoul(argv[3], NULL, 10);
 
-	mmc = init_mmc_device(dev, false);
+	mmc = init_mmc_device(dev, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
 
 	dev = simple_strtoul(argv[1], NULL, 10);
 
-	mmc = init_mmc_device(dev, false);
+	mmc = init_mmc_device(dev, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
 		return CMD_RET_USAGE;
 	}
 
-	mmc = init_mmc_device(dev, false);
+	mmc = init_mmc_device(dev, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
 
 	dev = simple_strtoul(argv[1], NULL, 10);
 
-	mmc = init_mmc_device(dev, false);
+	mmc = init_mmc_device(dev, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
@@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
 	int err;
 	struct mmc *mmc;
 
-	mmc = init_mmc_device(curr_device, false);
+	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
 	if (!mmc)
 		return CMD_RET_FAILURE;
 	if (IS_SD(mmc)) {
@@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
 #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
 	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
 #endif
-	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
+	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
 	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
-	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
+	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
 	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
 #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
 	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
@@ -1042,9 +1068,12 @@ U_BOOT_CMD(
 	"mmc swrite addr blk#\n"
 #endif
 	"mmc erase blk# cnt\n"
-	"mmc rescan\n"
+	"mmc rescan [mode]\n"
 	"mmc part - lists available partition on current mmc device\n"
-	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
+	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
+	"  - the required speed mode is passed as the index from the following list\n"
+	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
+	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
 	"mmc list - lists available devices\n"
 	"mmc wp - power on write protect boot partitions\n"
 #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
index 0e13238c7e7a..66fe8bed984b 100644
--- a/drivers/mmc/mmc-uclass.c
+++ b/drivers/mmc/mmc-uclass.c
@@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
 	bdesc->part_type = cfg->part_type;
 	mmc->dev = dev;
 
+#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
+	mmc->user_speed_mode = MMC_MODES_END;
+#endif
 	return 0;
 }
 
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 8078a89f18cb..b24a45d458d4 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
 	 */
 	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
 			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
+
+#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
+	if (mmc->user_speed_mode != MMC_MODES_END) {
+		int i;
+		/* set host caps */
+		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
+			/* Remove all existing speed capabilities */
+			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
+				mmc->host_caps &= ~MMC_CAP(i);
+			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
+					   | MMC_CAP(MMC_LEGACY) |
+					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
+		} else {
+			pr_err("bus_mode requested is not supported\n");
+			return -EINVAL;
+		}
+	}
+#endif
 #if CONFIG_IS_ENABLED(DM_MMC)
 	mmc_deferred_probe(mmc);
 #endif
diff --git a/include/mmc.h b/include/mmc.h
index 0bf19de20e52..e64ef7611dd7 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -726,6 +726,10 @@ struct mmc {
 				  */
 	u32 quirks;
 	u8 hs400_tuning;
+
+#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
+	enum bus_mode user_speed_mode;
+#endif
 };
 
 #if CONFIG_IS_ENABLED(DM_MMC)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-29 14:55 ` [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command Aswath Govindraju
@ 2021-07-29 22:30   ` Jaehoon Chung
  2021-07-30  5:12     ` Aswath Govindraju
  2021-07-30  4:47   ` Ashok Reddy Soma
  1 sibling, 1 reply; 10+ messages in thread
From: Jaehoon Chung @ 2021-07-29 22:30 UTC (permalink / raw)
  To: Aswath Govindraju
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Simon Glass, Heinrich Schuchardt, Bin Meng,
	Patrick Delaunay, Pragnesh Patel, Frédéric Danis,
	Reuben Dowle, Yangbo Lu, Stefan Bosch, Ashok Reddy Soma,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Aswath,

On 7/29/21 11:55 PM, Aswath Govindraju wrote:
> Add support for enumerating MMC card in a given mode using mmc rescan and
> mmc dev commands. The speed mode is provided as the last argument in these
> commands and is indicated using the index from enum bus_mode in
> include/mmc.h. A speed mode can be set only if it has already been enabled
> in the device tree.

Thanks for this patch. It seems that it's useful to develope and debug.
I will test with this patch.

Could you also update doc/usage/mmc.rst file?

Best Regards,
Jaehoo Chung

> 
> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
> ---
>  cmd/Kconfig              | 10 ++++++
>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>  drivers/mmc/mmc-uclass.c |  3 ++
>  drivers/mmc/mmc.c        | 18 ++++++++++
>  include/mmc.h            |  4 +++
>  5 files changed, 85 insertions(+), 21 deletions(-)
> 
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index ffef3cc76ca4..3a857b3f6e2e 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>  	help
>  	  UBIFS is a file system for flash devices which works on top of UBI.
>  
> +config MMC_SPEED_MODE_SET
> +	bool "set speed mode using mmc command"
> +	depends on CMD_MMC
> +	default n
> +	help
> +	  Enable setting speed mode using mmc rescan and mmc dev commands.
> +	  The speed mode is provided as the last argument in these commands
> +	  and is indicated using the index from enum bus_mode in
> +	  include/mmc.h. A speed mode can be set only if it has already
> +	  been enabled in the device tree.
>  endmenu
> diff --git a/cmd/mmc.c b/cmd/mmc.c
> index b942576b58ac..073e87d69634 100644
> --- a/cmd/mmc.c
> +++ b/cmd/mmc.c
> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>  		}
>  	}
>  }
> -static struct mmc *init_mmc_device(int dev, bool force_init)
> +
> +static struct mmc *init_mmc_device(int dev, bool force_init,
> +				   enum bus_mode speed_mode)
>  {
>  	struct mmc *mmc;
>  	mmc = find_mmc_device(dev);
> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
>  
>  	if (force_init)
>  		mmc->has_init = 0;
> +
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	mmc->user_speed_mode = speed_mode;
> +#endif
> +
>  	if (mmc_init(mmc))
>  		return NULL;
>  
> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
>  		}
>  	}
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>  		return CMD_RET_SUCCESS;
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
>  	blk = simple_strtoul(argv[2], NULL, 16);
>  	cnt = simple_strtoul(argv[3], NULL, 16);
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
>  		return CMD_RET_FAILURE;
>  	}
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
>  	blk = simple_strtoul(argv[2], NULL, 16);
>  	cnt = simple_strtoul(argv[3], NULL, 16);
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
>  	blk = simple_strtoul(argv[1], NULL, 16);
>  	cnt = simple_strtoul(argv[2], NULL, 16);
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
>  			 int argc, char *const argv[])
>  {
>  	struct mmc *mmc;
> +	enum bus_mode speed_mode = MMC_MODES_END;
> +
> +	if (argc == 1) {
> +		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
> +	} else if (argc == 2) {
> +		/* parse the mode */
> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
> +		/* Need to pass the the speed mode required too */
> +		mmc = init_mmc_device(curr_device, true, speed_mode);
> +	} else {
> +		return CMD_RET_USAGE;
> +	}
>  
> -	mmc = init_mmc_device(curr_device, true);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>  	struct blk_desc *mmc_dev;
>  	struct mmc *mmc;
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>  {
>  	int dev, part = 0, ret;
>  	struct mmc *mmc;
> +	enum bus_mode speed_mode = MMC_MODES_END;
>  
>  	if (argc == 1) {
>  		dev = curr_device;
> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>  	} else if (argc == 2) {
>  		dev = simple_strtoul(argv[1], NULL, 10);
> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>  	} else if (argc == 3) {
>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>  		part = (int)simple_strtoul(argv[2], NULL, 10);
> @@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>  			       PART_ACCESS_MASK);
>  			return CMD_RET_FAILURE;
>  		}
> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
> +	} else if (argc == 4) {
> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
> +		part = (int)simple_strtoul(argv[2], NULL, 10);
> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>  	} else {
>  		return CMD_RET_USAGE;
>  	}
>  
> -	mmc = init_mmc_device(dev, true);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>  	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
>  	int i, r, pidx;
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
>  	reset = simple_strtoul(argv[3], NULL, 10);
>  	mode = simple_strtoul(argv[4], NULL, 10);
>  
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>  
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
>  
>  	dev = simple_strtoul(argv[1], NULL, 10);
>  
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
>  		return CMD_RET_USAGE;
>  	}
>  
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
>  
>  	dev = simple_strtoul(argv[1], NULL, 10);
>  
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  
> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
>  	int err;
>  	struct mmc *mmc;
>  
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  	if (IS_SD(mmc)) {
> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
>  #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>  #endif
> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>  	"mmc swrite addr blk#\n"
>  #endif
>  	"mmc erase blk# cnt\n"
> -	"mmc rescan\n"
> +	"mmc rescan [mode]\n"
>  	"mmc part - lists available partition on current mmc device\n"
> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
> +	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
> +	"  - the required speed mode is passed as the index from the following list\n"
> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
>  	"mmc list - lists available devices\n"
>  	"mmc wp - power on write protect boot partitions\n"
>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
> index 0e13238c7e7a..66fe8bed984b 100644
> --- a/drivers/mmc/mmc-uclass.c
> +++ b/drivers/mmc/mmc-uclass.c
> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
>  	bdesc->part_type = cfg->part_type;
>  	mmc->dev = dev;
>  
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	mmc->user_speed_mode = MMC_MODES_END;
> +#endif
>  	return 0;
>  }
>  
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 8078a89f18cb..b24a45d458d4 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>  	 */
>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
> +
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	if (mmc->user_speed_mode != MMC_MODES_END) {
> +		int i;
> +		/* set host caps */
> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
> +			/* Remove all existing speed capabilities */
> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
> +				mmc->host_caps &= ~MMC_CAP(i);
> +			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
> +					   | MMC_CAP(MMC_LEGACY) |
> +					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
> +		} else {
> +			pr_err("bus_mode requested is not supported\n");
> +			return -EINVAL;
> +		}
> +	}
> +#endif
>  #if CONFIG_IS_ENABLED(DM_MMC)
>  	mmc_deferred_probe(mmc);
>  #endif
> diff --git a/include/mmc.h b/include/mmc.h
> index 0bf19de20e52..e64ef7611dd7 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -726,6 +726,10 @@ struct mmc {
>  				  */
>  	u32 quirks;
>  	u8 hs400_tuning;
> +
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	enum bus_mode user_speed_mode;
> +#endif
>  };
>  
>  #if CONFIG_IS_ENABLED(DM_MMC)
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-29 14:55 ` [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command Aswath Govindraju
  2021-07-29 22:30   ` Jaehoon Chung
@ 2021-07-30  4:47   ` Ashok Reddy Soma
  2021-07-30  5:10     ` Aswath Govindraju
  1 sibling, 1 reply; 10+ messages in thread
From: Ashok Reddy Soma @ 2021-07-30  4:47 UTC (permalink / raw)
  To: Aswath Govindraju
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Jaehoon Chung, Simon Glass, Heinrich Schuchardt,
	Bin Meng, Patrick Delaunay, Pragnesh Patel,
	Frédéric Danis, Reuben Dowle, Yangbo Lu, Stefan Bosch,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Aswath,

> -----Original Message-----
> From: Aswath Govindraju <a-govindraju@ti.com>
> Sent: Thursday, July 29, 2021 8:25 PM
> Cc: Lokesh Vutla <lokeshvutla@ti.com>; Vignesh Raghavendra
> <vigneshr@ti.com>; Kishon Vijay Abraham I <kishon@ti.com>; Aswath
> Govindraju <a-govindraju@ti.com>; Peng Fan <peng.fan@nxp.com>; Jaehoon
> Chung <jh80.chung@samsung.com>; Simon Glass <sjg@chromium.org>;
> Heinrich Schuchardt <xypron.glpk@gmx.de>; Bin Meng
> <bmeng.cn@gmail.com>; Patrick Delaunay <patrick.delaunay@foss.st.com>;
> Pragnesh Patel <pragnesh.patel@sifive.com>; Frédéric Danis
> <frederic.danis@collabora.com>; Reuben Dowle <reubendowle0@gmail.com>;
> Yangbo Lu <yangbo.lu@nxp.com>; Stefan Bosch <stefan_b@posteo.net>; Ashok
> Reddy Soma <ashokred@xilinx.com>; Nicolas Saenz Julienne
> <nsaenzjulienne@suse.de>; Pali Rohár <pali@kernel.org>; u-boot@lists.denx.de
> Subject: [PATCH] mmc: Add support for enumerating MMC card in a given
> mode using mmc command
> 
> Add support for enumerating MMC card in a given mode using mmc rescan
> and mmc dev commands. The speed mode is provided as the last argument in
> these commands and is indicated using the index from enum bus_mode in
> include/mmc.h. A speed mode can be set only if it has already been enabled in
> the device tree.
> 
> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
> ---
>  cmd/Kconfig              | 10 ++++++
>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>  drivers/mmc/mmc-uclass.c |  3 ++
>  drivers/mmc/mmc.c        | 18 ++++++++++
>  include/mmc.h            |  4 +++
>  5 files changed, 85 insertions(+), 21 deletions(-)
> 
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index ffef3cc76ca4..3a857b3f6e2e 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>  	help
>  	  UBIFS is a file system for flash devices which works on top of UBI.
> 
> +config MMC_SPEED_MODE_SET
> +	bool "set speed mode using mmc command"
> +	depends on CMD_MMC
> +	default n
> +	help
> +	  Enable setting speed mode using mmc rescan and mmc dev
> commands.
> +	  The speed mode is provided as the last argument in these commands
> +	  and is indicated using the index from enum bus_mode in
> +	  include/mmc.h. A speed mode can be set only if it has already
> +	  been enabled in the device tree.
>  endmenu
> diff --git a/cmd/mmc.c b/cmd/mmc.c
> index b942576b58ac..073e87d69634 100644
> --- a/cmd/mmc.c
> +++ b/cmd/mmc.c
> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>  		}
>  	}
>  }
> -static struct mmc *init_mmc_device(int dev, bool force_init)
> +
> +static struct mmc *init_mmc_device(int dev, bool force_init,
> +				   enum bus_mode speed_mode)
>  {
>  	struct mmc *mmc;
>  	mmc = find_mmc_device(dev);
> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool
> force_init)
> 
>  	if (force_init)
>  		mmc->has_init = 0;
> +
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	mmc->user_speed_mode = speed_mode;
> +#endif
> +
Can you please use  if (IS_ENABLED(CONFIG_MMC_SPEED_MODE_SET) 

>  	if (mmc_init(mmc))
>  		return NULL;
> 
> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag,
> int argc,
>  		}
>  	}
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>  		return CMD_RET_SUCCESS;
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int
> flag,
>  	blk = simple_strtoul(argv[2], NULL, 16);
>  	cnt = simple_strtoul(argv[3], NULL, 16);
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl
> *cmdtp, int flag,
>  		return CMD_RET_FAILURE;
>  	}
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int
> flag,
>  	blk = simple_strtoul(argv[2], NULL, 16);
>  	cnt = simple_strtoul(argv[3], NULL, 16);
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int
> flag,
>  	blk = simple_strtoul(argv[1], NULL, 16);
>  	cnt = simple_strtoul(argv[2], NULL, 16);
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int
> flag,
>  			 int argc, char *const argv[])
>  {
>  	struct mmc *mmc;
> +	enum bus_mode speed_mode = MMC_MODES_END;
> +
> +	if (argc == 1) {
> +		mmc = init_mmc_device(curr_device, true,
> MMC_MODES_END);
> +	} else if (argc == 2) {
> +		/* parse the mode */
> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
> +		/* Need to pass the the speed mode required too */
> +		mmc = init_mmc_device(curr_device, true, speed_mode);
> +	} else {
> +		return CMD_RET_USAGE;
> +	}
> 
> -	mmc = init_mmc_device(curr_device, true);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>  	struct blk_desc *mmc_dev;
>  	struct mmc *mmc;
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int
> flag,  {
>  	int dev, part = 0, ret;
>  	struct mmc *mmc;
> +	enum bus_mode speed_mode = MMC_MODES_END;
> 
>  	if (argc == 1) {
>  		dev = curr_device;
> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>  	} else if (argc == 2) {
>  		dev = simple_strtoul(argv[1], NULL, 10);
> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>  	} else if (argc == 3) {
>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>  		part = (int)simple_strtoul(argv[2], NULL, 10); @@ -528,11
> +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>  			       PART_ACCESS_MASK);
>  			return CMD_RET_FAILURE;
>  		}
> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
> +	} else if (argc == 4) {
> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
> +		part = (int)simple_strtoul(argv[2], NULL, 10);
> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>  	} else {
>  		return CMD_RET_USAGE;
>  	}
> 
> -	mmc = init_mmc_device(dev, true);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp,
> int flag,
>  	enum mmc_hwpart_conf_mode mode =
> MMC_HWPART_CONF_CHECK;
>  	int i, r, pidx;
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int
> flag,
>  	reset = simple_strtoul(argv[3], NULL, 10);
>  	mode = simple_strtoul(argv[4], NULL, 10);
> 
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp,
> int flag,
>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
> 
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int
> flag,
> 
>  	dev = simple_strtoul(argv[1], NULL, 10);
> 
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int
> flag,
>  		return CMD_RET_USAGE;
>  	}
> 
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl
> *cmdtp, int flag,
> 
>  	dev = simple_strtoul(argv[1], NULL, 10);
> 
> -	mmc = init_mmc_device(dev, false);
> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
> 
> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int
> flag,
>  	int err;
>  	struct mmc *mmc;
> 
> -	mmc = init_mmc_device(curr_device, false);
> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>  	if (!mmc)
>  		return CMD_RET_FAILURE;
>  	if (IS_SD(mmc)) {
> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {  #if
> CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
> #endif
> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),  #if
> CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "",
> ""), @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>  	"mmc swrite addr blk#\n"
>  #endif
>  	"mmc erase blk# cnt\n"
> -	"mmc rescan\n"
> +	"mmc rescan [mode]\n"
>  	"mmc part - lists available partition on current mmc device\n"
> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
> +	"mmc dev [dev] [part] [mode] - show or set current mmc device
> [partition] and set mode\n"
> +	"  - the required speed mode is passed as the index from the following
> list\n"
> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52,
> UHS_SDR12, UHS_SDR25,\n"
> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200,
> MMC_HS_400, MMC_HS_400_ES]\n"
>  	"mmc list - lists available devices\n"
>  	"mmc wp - power on write protect boot partitions\n"
>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c index
> 0e13238c7e7a..66fe8bed984b 100644
> --- a/drivers/mmc/mmc-uclass.c
> +++ b/drivers/mmc/mmc-uclass.c
> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc,
> const struct mmc_config *cfg)
>  	bdesc->part_type = cfg->part_type;
>  	mmc->dev = dev;
> 
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	mmc->user_speed_mode = MMC_MODES_END;
> +#endif

same here

>  	return 0;
>  }
> 
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index
> 8078a89f18cb..b24a45d458d4 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>  	 */
>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY)
> |
>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
> +
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)

here  as well

Thanks,
Ashok

> +	if (mmc->user_speed_mode != MMC_MODES_END) {
> +		int i;
> +		/* set host caps */
> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
> +			/* Remove all existing speed capabilities */
> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
> +				mmc->host_caps &= ~MMC_CAP(i);
> +			mmc->host_caps |= (MMC_CAP(mmc-
> >user_speed_mode)
> +					   | MMC_CAP(MMC_LEGACY) |
> +					   MMC_CAP(MMC_LEGACY) |
> MMC_MODE_1BIT);
> +		} else {
> +			pr_err("bus_mode requested is not supported\n");
> +			return -EINVAL;
> +		}
> +	}
> +#endif
>  #if CONFIG_IS_ENABLED(DM_MMC)
>  	mmc_deferred_probe(mmc);
>  #endif
> diff --git a/include/mmc.h b/include/mmc.h index
> 0bf19de20e52..e64ef7611dd7 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -726,6 +726,10 @@ struct mmc {
>  				  */
>  	u32 quirks;
>  	u8 hs400_tuning;
> +
> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> +	enum bus_mode user_speed_mode;
> +#endif
>  };
> 
>  #if CONFIG_IS_ENABLED(DM_MMC)
> --
> 2.17.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-30  4:47   ` Ashok Reddy Soma
@ 2021-07-30  5:10     ` Aswath Govindraju
  2021-07-30  5:21       ` Ashok Reddy Soma
  0 siblings, 1 reply; 10+ messages in thread
From: Aswath Govindraju @ 2021-07-30  5:10 UTC (permalink / raw)
  To: Ashok Reddy Soma
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Jaehoon Chung, Simon Glass, Heinrich Schuchardt,
	Bin Meng, Patrick Delaunay, Pragnesh Patel,
	Frédéric Danis, Reuben Dowle, Yangbo Lu, Stefan Bosch,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Ashok,

On 30/07/21 10:17 am, Ashok Reddy Soma wrote:
> Hi Aswath,
> 
>> -----Original Message-----
>> From: Aswath Govindraju <a-govindraju@ti.com>
>> Sent: Thursday, July 29, 2021 8:25 PM
>> Cc: Lokesh Vutla <lokeshvutla@ti.com>; Vignesh Raghavendra
>> <vigneshr@ti.com>; Kishon Vijay Abraham I <kishon@ti.com>; Aswath
>> Govindraju <a-govindraju@ti.com>; Peng Fan <peng.fan@nxp.com>; Jaehoon
>> Chung <jh80.chung@samsung.com>; Simon Glass <sjg@chromium.org>;
>> Heinrich Schuchardt <xypron.glpk@gmx.de>; Bin Meng
>> <bmeng.cn@gmail.com>; Patrick Delaunay <patrick.delaunay@foss.st.com>;
>> Pragnesh Patel <pragnesh.patel@sifive.com>; Frédéric Danis
>> <frederic.danis@collabora.com>; Reuben Dowle <reubendowle0@gmail.com>;
>> Yangbo Lu <yangbo.lu@nxp.com>; Stefan Bosch <stefan_b@posteo.net>; Ashok
>> Reddy Soma <ashokred@xilinx.com>; Nicolas Saenz Julienne
>> <nsaenzjulienne@suse.de>; Pali Rohár <pali@kernel.org>; u-boot@lists.denx.de
>> Subject: [PATCH] mmc: Add support for enumerating MMC card in a given
>> mode using mmc command
>>
>> Add support for enumerating MMC card in a given mode using mmc rescan
>> and mmc dev commands. The speed mode is provided as the last argument in
>> these commands and is indicated using the index from enum bus_mode in
>> include/mmc.h. A speed mode can be set only if it has already been enabled in
>> the device tree.
>>
>> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
>> ---
>>  cmd/Kconfig              | 10 ++++++
>>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>>  drivers/mmc/mmc-uclass.c |  3 ++
>>  drivers/mmc/mmc.c        | 18 ++++++++++
>>  include/mmc.h            |  4 +++
>>  5 files changed, 85 insertions(+), 21 deletions(-)
>>
>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>> index ffef3cc76ca4..3a857b3f6e2e 100644
>> --- a/cmd/Kconfig
>> +++ b/cmd/Kconfig
>> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>>  	help
>>  	  UBIFS is a file system for flash devices which works on top of UBI.
>>
>> +config MMC_SPEED_MODE_SET
>> +	bool "set speed mode using mmc command"
>> +	depends on CMD_MMC
>> +	default n
>> +	help
>> +	  Enable setting speed mode using mmc rescan and mmc dev
>> commands.
>> +	  The speed mode is provided as the last argument in these commands
>> +	  and is indicated using the index from enum bus_mode in
>> +	  include/mmc.h. A speed mode can be set only if it has already
>> +	  been enabled in the device tree.
>>  endmenu
>> diff --git a/cmd/mmc.c b/cmd/mmc.c
>> index b942576b58ac..073e87d69634 100644
>> --- a/cmd/mmc.c
>> +++ b/cmd/mmc.c
>> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>>  		}
>>  	}
>>  }
>> -static struct mmc *init_mmc_device(int dev, bool force_init)
>> +
>> +static struct mmc *init_mmc_device(int dev, bool force_init,
>> +				   enum bus_mode speed_mode)
>>  {
>>  	struct mmc *mmc;
>>  	mmc = find_mmc_device(dev);
>> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool
>> force_init)
>>
>>  	if (force_init)
>>  		mmc->has_init = 0;
>> +
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	mmc->user_speed_mode = speed_mode;
>> +#endif
>> +
> Can you please use  if (IS_ENABLED(CONFIG_MMC_SPEED_MODE_SET) 
> 
>>  	if (mmc_init(mmc))
>>  		return NULL;
>>
>> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag,
>> int argc,
>>  		}
>>  	}
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>>  		return CMD_RET_SUCCESS;
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int
>> flag,
>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl
>> *cmdtp, int flag,
>>  		return CMD_RET_FAILURE;
>>  	}
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int
>> flag,
>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int
>> flag,
>>  	blk = simple_strtoul(argv[1], NULL, 16);
>>  	cnt = simple_strtoul(argv[2], NULL, 16);
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int
>> flag,
>>  			 int argc, char *const argv[])
>>  {
>>  	struct mmc *mmc;
>> +	enum bus_mode speed_mode = MMC_MODES_END;
>> +
>> +	if (argc == 1) {
>> +		mmc = init_mmc_device(curr_device, true,
>> MMC_MODES_END);
>> +	} else if (argc == 2) {
>> +		/* parse the mode */
>> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
>> +		/* Need to pass the the speed mode required too */
>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>> +	} else {
>> +		return CMD_RET_USAGE;
>> +	}
>>
>> -	mmc = init_mmc_device(curr_device, true);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>>  	struct blk_desc *mmc_dev;
>>  	struct mmc *mmc;
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int
>> flag,  {
>>  	int dev, part = 0, ret;
>>  	struct mmc *mmc;
>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>
>>  	if (argc == 1) {
>>  		dev = curr_device;
>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>  	} else if (argc == 2) {
>>  		dev = simple_strtoul(argv[1], NULL, 10);
>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>  	} else if (argc == 3) {
>>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>  		part = (int)simple_strtoul(argv[2], NULL, 10); @@ -528,11
>> +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>  			       PART_ACCESS_MASK);
>>  			return CMD_RET_FAILURE;
>>  		}
>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>> +	} else if (argc == 4) {
>> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
>> +		part = (int)simple_strtoul(argv[2], NULL, 10);
>> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>  	} else {
>>  		return CMD_RET_USAGE;
>>  	}
>>
>> -	mmc = init_mmc_device(dev, true);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp,
>> int flag,
>>  	enum mmc_hwpart_conf_mode mode =
>> MMC_HWPART_CONF_CHECK;
>>  	int i, r, pidx;
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int
>> flag,
>>  	reset = simple_strtoul(argv[3], NULL, 10);
>>  	mode = simple_strtoul(argv[4], NULL, 10);
>>
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp,
>> int flag,
>>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>>
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int
>> flag,
>>
>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int
>> flag,
>>  		return CMD_RET_USAGE;
>>  	}
>>
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl
>> *cmdtp, int flag,
>>
>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>
>> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int
>> flag,
>>  	int err;
>>  	struct mmc *mmc;
>>
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  	if (IS_SD(mmc)) {
>> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {  #if
>> CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>> #endif
>> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
>> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
>> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
>> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),  #if
>> CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "",
>> ""), @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>>  	"mmc swrite addr blk#\n"
>>  #endif
>>  	"mmc erase blk# cnt\n"
>> -	"mmc rescan\n"
>> +	"mmc rescan [mode]\n"
>>  	"mmc part - lists available partition on current mmc device\n"
>> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
>> +	"mmc dev [dev] [part] [mode] - show or set current mmc device
>> [partition] and set mode\n"
>> +	"  - the required speed mode is passed as the index from the following
>> list\n"
>> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52,
>> UHS_SDR12, UHS_SDR25,\n"
>> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200,
>> MMC_HS_400, MMC_HS_400_ES]\n"
>>  	"mmc list - lists available devices\n"
>>  	"mmc wp - power on write protect boot partitions\n"
>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c index
>> 0e13238c7e7a..66fe8bed984b 100644
>> --- a/drivers/mmc/mmc-uclass.c
>> +++ b/drivers/mmc/mmc-uclass.c
>> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc,
>> const struct mmc_config *cfg)
>>  	bdesc->part_type = cfg->part_type;
>>  	mmc->dev = dev;
>>
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	mmc->user_speed_mode = MMC_MODES_END;
>> +#endif
> 
> same here
> 
>>  	return 0;
>>  }
>>
>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index
>> 8078a89f18cb..b24a45d458d4 100644
>> --- a/drivers/mmc/mmc.c
>> +++ b/drivers/mmc/mmc.c
>> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>>  	 */
>>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY)
>> |
>>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
>> +
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> 
> here  as well
> 

I can't use if (IS_ENABLED(CONFIG_MMC_SPEED_MODE_SET)  because of [1],
as it would lead to build errors.

If it is ok, to remove #ifdef around [1] and add user_speed_mode field
irrespective of config, then I will be able to use it.

Thanks,
Aswath

> Thanks,
> Ashok
> 
>> +	if (mmc->user_speed_mode != MMC_MODES_END) {
>> +		int i;
>> +		/* set host caps */
>> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
>> +			/* Remove all existing speed capabilities */
>> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
>> +				mmc->host_caps &= ~MMC_CAP(i);
>> +			mmc->host_caps |= (MMC_CAP(mmc-
>>> user_speed_mode)
>> +					   | MMC_CAP(MMC_LEGACY) |
>> +					   MMC_CAP(MMC_LEGACY) |
>> MMC_MODE_1BIT);
>> +		} else {
>> +			pr_err("bus_mode requested is not supported\n");
>> +			return -EINVAL;
>> +		}
>> +	}
>> +#endif
>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>  	mmc_deferred_probe(mmc);
>>  #endif
>> diff --git a/include/mmc.h b/include/mmc.h index
>> 0bf19de20e52..e64ef7611dd7 100644
>> --- a/include/mmc.h
>> +++ b/include/mmc.h
>> @@ -726,6 +726,10 @@ struct mmc {
>>  				  */
>>  	u32 quirks;
>>  	u8 hs400_tuning;
>> +
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	enum bus_mode user_speed_mode;
>> +#endif

[1]

>>  };
>>
>>  #if CONFIG_IS_ENABLED(DM_MMC)
>> --
>> 2.17.1
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-29 22:30   ` Jaehoon Chung
@ 2021-07-30  5:12     ` Aswath Govindraju
  2021-07-30  9:14       ` Jaehoon Chung
  0 siblings, 1 reply; 10+ messages in thread
From: Aswath Govindraju @ 2021-07-30  5:12 UTC (permalink / raw)
  To: Jaehoon Chung
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Simon Glass, Heinrich Schuchardt, Bin Meng,
	Patrick Delaunay, Pragnesh Patel, Frédéric Danis,
	Reuben Dowle, Yangbo Lu, Stefan Bosch, Ashok Reddy Soma,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Jaehoon,

On 30/07/21 4:00 am, Jaehoon Chung wrote:
> Hi Aswath,
> 
> On 7/29/21 11:55 PM, Aswath Govindraju wrote:
>> Add support for enumerating MMC card in a given mode using mmc rescan and
>> mmc dev commands. The speed mode is provided as the last argument in these
>> commands and is indicated using the index from enum bus_mode in
>> include/mmc.h. A speed mode can be set only if it has already been enabled
>> in the device tree.
> 
> Thanks for this patch. It seems that it's useful to develope and debug.
> I will test with this patch.
> 
> Could you also update doc/usage/mmc.rst file?
> 

Sure, I'll update it in the respin.

Thanks,
Aswath

> Best Regards,
> Jaehoo Chung
> 
>>
>> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
>> ---
>>  cmd/Kconfig              | 10 ++++++
>>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>>  drivers/mmc/mmc-uclass.c |  3 ++
>>  drivers/mmc/mmc.c        | 18 ++++++++++
>>  include/mmc.h            |  4 +++
>>  5 files changed, 85 insertions(+), 21 deletions(-)
>>
>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>> index ffef3cc76ca4..3a857b3f6e2e 100644
>> --- a/cmd/Kconfig
>> +++ b/cmd/Kconfig
>> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>>  	help
>>  	  UBIFS is a file system for flash devices which works on top of UBI.
>>  
>> +config MMC_SPEED_MODE_SET
>> +	bool "set speed mode using mmc command"
>> +	depends on CMD_MMC
>> +	default n
>> +	help
>> +	  Enable setting speed mode using mmc rescan and mmc dev commands.
>> +	  The speed mode is provided as the last argument in these commands
>> +	  and is indicated using the index from enum bus_mode in
>> +	  include/mmc.h. A speed mode can be set only if it has already
>> +	  been enabled in the device tree.
>>  endmenu
>> diff --git a/cmd/mmc.c b/cmd/mmc.c
>> index b942576b58ac..073e87d69634 100644
>> --- a/cmd/mmc.c
>> +++ b/cmd/mmc.c
>> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>>  		}
>>  	}
>>  }
>> -static struct mmc *init_mmc_device(int dev, bool force_init)
>> +
>> +static struct mmc *init_mmc_device(int dev, bool force_init,
>> +				   enum bus_mode speed_mode)
>>  {
>>  	struct mmc *mmc;
>>  	mmc = find_mmc_device(dev);
>> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
>>  
>>  	if (force_init)
>>  		mmc->has_init = 0;
>> +
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	mmc->user_speed_mode = speed_mode;
>> +#endif
>> +
>>  	if (mmc_init(mmc))
>>  		return NULL;
>>  
>> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
>>  		}
>>  	}
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>>  		return CMD_RET_SUCCESS;
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
>>  		return CMD_RET_FAILURE;
>>  	}
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
>>  	blk = simple_strtoul(argv[1], NULL, 16);
>>  	cnt = simple_strtoul(argv[2], NULL, 16);
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
>>  			 int argc, char *const argv[])
>>  {
>>  	struct mmc *mmc;
>> +	enum bus_mode speed_mode = MMC_MODES_END;
>> +
>> +	if (argc == 1) {
>> +		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
>> +	} else if (argc == 2) {
>> +		/* parse the mode */
>> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
>> +		/* Need to pass the the speed mode required too */
>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>> +	} else {
>> +		return CMD_RET_USAGE;
>> +	}
>>  
>> -	mmc = init_mmc_device(curr_device, true);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>>  	struct blk_desc *mmc_dev;
>>  	struct mmc *mmc;
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>  {
>>  	int dev, part = 0, ret;
>>  	struct mmc *mmc;
>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>  
>>  	if (argc == 1) {
>>  		dev = curr_device;
>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>  	} else if (argc == 2) {
>>  		dev = simple_strtoul(argv[1], NULL, 10);
>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>  	} else if (argc == 3) {
>>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>  		part = (int)simple_strtoul(argv[2], NULL, 10);
>> @@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>  			       PART_ACCESS_MASK);
>>  			return CMD_RET_FAILURE;
>>  		}
>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>> +	} else if (argc == 4) {
>> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
>> +		part = (int)simple_strtoul(argv[2], NULL, 10);
>> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>  	} else {
>>  		return CMD_RET_USAGE;
>>  	}
>>  
>> -	mmc = init_mmc_device(dev, true);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>>  	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
>>  	int i, r, pidx;
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
>>  	reset = simple_strtoul(argv[3], NULL, 10);
>>  	mode = simple_strtoul(argv[4], NULL, 10);
>>  
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
>>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>>  
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
>>  
>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>  
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
>>  		return CMD_RET_USAGE;
>>  	}
>>  
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
>>  
>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>  
>> -	mmc = init_mmc_device(dev, false);
>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  
>> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
>>  	int err;
>>  	struct mmc *mmc;
>>  
>> -	mmc = init_mmc_device(curr_device, false);
>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>  	if (!mmc)
>>  		return CMD_RET_FAILURE;
>>  	if (IS_SD(mmc)) {
>> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
>>  #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>>  #endif
>> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
>> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
>> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
>> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
>> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>>  	"mmc swrite addr blk#\n"
>>  #endif
>>  	"mmc erase blk# cnt\n"
>> -	"mmc rescan\n"
>> +	"mmc rescan [mode]\n"
>>  	"mmc part - lists available partition on current mmc device\n"
>> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
>> +	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
>> +	"  - the required speed mode is passed as the index from the following list\n"
>> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
>> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
>>  	"mmc list - lists available devices\n"
>>  	"mmc wp - power on write protect boot partitions\n"
>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
>> index 0e13238c7e7a..66fe8bed984b 100644
>> --- a/drivers/mmc/mmc-uclass.c
>> +++ b/drivers/mmc/mmc-uclass.c
>> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
>>  	bdesc->part_type = cfg->part_type;
>>  	mmc->dev = dev;
>>  
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	mmc->user_speed_mode = MMC_MODES_END;
>> +#endif
>>  	return 0;
>>  }
>>  
>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>> index 8078a89f18cb..b24a45d458d4 100644
>> --- a/drivers/mmc/mmc.c
>> +++ b/drivers/mmc/mmc.c
>> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>>  	 */
>>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
>>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
>> +
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	if (mmc->user_speed_mode != MMC_MODES_END) {
>> +		int i;
>> +		/* set host caps */
>> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
>> +			/* Remove all existing speed capabilities */
>> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
>> +				mmc->host_caps &= ~MMC_CAP(i);
>> +			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
>> +					   | MMC_CAP(MMC_LEGACY) |
>> +					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
>> +		} else {
>> +			pr_err("bus_mode requested is not supported\n");
>> +			return -EINVAL;
>> +		}
>> +	}
>> +#endif
>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>  	mmc_deferred_probe(mmc);
>>  #endif
>> diff --git a/include/mmc.h b/include/mmc.h
>> index 0bf19de20e52..e64ef7611dd7 100644
>> --- a/include/mmc.h
>> +++ b/include/mmc.h
>> @@ -726,6 +726,10 @@ struct mmc {
>>  				  */
>>  	u32 quirks;
>>  	u8 hs400_tuning;
>> +
>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>> +	enum bus_mode user_speed_mode;
>> +#endif
>>  };
>>  
>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-30  5:10     ` Aswath Govindraju
@ 2021-07-30  5:21       ` Ashok Reddy Soma
  0 siblings, 0 replies; 10+ messages in thread
From: Ashok Reddy Soma @ 2021-07-30  5:21 UTC (permalink / raw)
  To: Aswath Govindraju
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Jaehoon Chung, Simon Glass, Heinrich Schuchardt,
	Bin Meng, Patrick Delaunay, Pragnesh Patel,
	Frédéric Danis, Reuben Dowle, Yangbo Lu, Stefan Bosch,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

HI Aswath,

> -----Original Message-----
> From: Aswath Govindraju <a-govindraju@ti.com>
> Sent: Friday, July 30, 2021 10:41 AM
> To: Ashok Reddy Soma <ashokred@xilinx.com>
> Cc: Lokesh Vutla <lokeshvutla@ti.com>; Vignesh Raghavendra
> <vigneshr@ti.com>; Kishon Vijay Abraham I <kishon@ti.com>; Peng Fan
> <peng.fan@nxp.com>; Jaehoon Chung <jh80.chung@samsung.com>; Simon
> Glass <sjg@chromium.org>; Heinrich Schuchardt <xypron.glpk@gmx.de>; Bin
> Meng <bmeng.cn@gmail.com>; Patrick Delaunay
> <patrick.delaunay@foss.st.com>; Pragnesh Patel <pragnesh.patel@sifive.com>;
> Frédéric Danis <frederic.danis@collabora.com>; Reuben Dowle
> <reubendowle0@gmail.com>; Yangbo Lu <yangbo.lu@nxp.com>; Stefan Bosch
> <stefan_b@posteo.net>; Nicolas Saenz Julienne <nsaenzjulienne@suse.de>; Pali
> Rohár <pali@kernel.org>; u-boot@lists.denx.de
> Subject: Re: [PATCH] mmc: Add support for enumerating MMC card in a given
> mode using mmc command
> 
> Hi Ashok,
> 
> On 30/07/21 10:17 am, Ashok Reddy Soma wrote:
> > Hi Aswath,
> >
> >> -----Original Message-----
> >> From: Aswath Govindraju <a-govindraju@ti.com>
> >> Sent: Thursday, July 29, 2021 8:25 PM
> >> Cc: Lokesh Vutla <lokeshvutla@ti.com>; Vignesh Raghavendra
> >> <vigneshr@ti.com>; Kishon Vijay Abraham I <kishon@ti.com>; Aswath
> >> Govindraju <a-govindraju@ti.com>; Peng Fan <peng.fan@nxp.com>;
> >> Jaehoon Chung <jh80.chung@samsung.com>; Simon Glass
> >> <sjg@chromium.org>; Heinrich Schuchardt <xypron.glpk@gmx.de>; Bin
> >> Meng <bmeng.cn@gmail.com>; Patrick Delaunay
> >> <patrick.delaunay@foss.st.com>; Pragnesh Patel
> >> <pragnesh.patel@sifive.com>; Frédéric Danis
> >> <frederic.danis@collabora.com>; Reuben Dowle
> >> <reubendowle0@gmail.com>; Yangbo Lu <yangbo.lu@nxp.com>; Stefan
> Bosch
> >> <stefan_b@posteo.net>; Ashok Reddy Soma <ashokred@xilinx.com>;
> >> Nicolas Saenz Julienne <nsaenzjulienne@suse.de>; Pali Rohár
> >> <pali@kernel.org>; u-boot@lists.denx.de
> >> Subject: [PATCH] mmc: Add support for enumerating MMC card in a given
> >> mode using mmc command
> >>
> >> Add support for enumerating MMC card in a given mode using mmc rescan
> >> and mmc dev commands. The speed mode is provided as the last argument
> >> in these commands and is indicated using the index from enum bus_mode
> >> in include/mmc.h. A speed mode can be set only if it has already been
> >> enabled in the device tree.
> >>
> >> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
> >> ---
> >>  cmd/Kconfig              | 10 ++++++
> >>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
> >>  drivers/mmc/mmc-uclass.c |  3 ++
> >>  drivers/mmc/mmc.c        | 18 ++++++++++
> >>  include/mmc.h            |  4 +++
> >>  5 files changed, 85 insertions(+), 21 deletions(-)
> >>
> >> diff --git a/cmd/Kconfig b/cmd/Kconfig index
> >> ffef3cc76ca4..3a857b3f6e2e 100644
> >> --- a/cmd/Kconfig
> >> +++ b/cmd/Kconfig
> >> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
> >>  	help
> >>  	  UBIFS is a file system for flash devices which works on top of UBI.
> >>
> >> +config MMC_SPEED_MODE_SET
> >> +	bool "set speed mode using mmc command"
> >> +	depends on CMD_MMC
> >> +	default n
> >> +	help
> >> +	  Enable setting speed mode using mmc rescan and mmc dev
> >> commands.
> >> +	  The speed mode is provided as the last argument in these commands
> >> +	  and is indicated using the index from enum bus_mode in
> >> +	  include/mmc.h. A speed mode can be set only if it has already
> >> +	  been enabled in the device tree.
> >>  endmenu
> >> diff --git a/cmd/mmc.c b/cmd/mmc.c
> >> index b942576b58ac..073e87d69634 100644
> >> --- a/cmd/mmc.c
> >> +++ b/cmd/mmc.c
> >> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
> >>  		}
> >>  	}
> >>  }
> >> -static struct mmc *init_mmc_device(int dev, bool force_init)
> >> +
> >> +static struct mmc *init_mmc_device(int dev, bool force_init,
> >> +				   enum bus_mode speed_mode)
> >>  {
> >>  	struct mmc *mmc;
> >>  	mmc = find_mmc_device(dev);
> >> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool
> >> force_init)
> >>
> >>  	if (force_init)
> >>  		mmc->has_init = 0;
> >> +
> >> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> >> +	mmc->user_speed_mode = speed_mode;
> >> +#endif
> >> +
> > Can you please use  if (IS_ENABLED(CONFIG_MMC_SPEED_MODE_SET)
> >
> >>  	if (mmc_init(mmc))
> >>  		return NULL;
> >>
> >> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int
> >> flag, int argc,
> >>  		}
> >>  	}
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int
> flag,
> >>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
> >>  		return CMD_RET_SUCCESS;
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int
> >> flag,
> >>  	blk = simple_strtoul(argv[2], NULL, 16);
> >>  	cnt = simple_strtoul(argv[3], NULL, 16);
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl
> >> *cmdtp, int flag,
> >>  		return CMD_RET_FAILURE;
> >>  	}
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp,
> >> int flag,
> >>  	blk = simple_strtoul(argv[2], NULL, 16);
> >>  	cnt = simple_strtoul(argv[3], NULL, 16);
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp,
> >> int flag,
> >>  	blk = simple_strtoul(argv[1], NULL, 16);
> >>  	cnt = simple_strtoul(argv[2], NULL, 16);
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp,
> >> int flag,
> >>  			 int argc, char *const argv[])
> >>  {
> >>  	struct mmc *mmc;
> >> +	enum bus_mode speed_mode = MMC_MODES_END;
> >> +
> >> +	if (argc == 1) {
> >> +		mmc = init_mmc_device(curr_device, true,
> >> MMC_MODES_END);
> >> +	} else if (argc == 2) {
> >> +		/* parse the mode */
> >> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
> >> +		/* Need to pass the the speed mode required too */
> >> +		mmc = init_mmc_device(curr_device, true, speed_mode);
> >> +	} else {
> >> +		return CMD_RET_USAGE;
> >> +	}
> >>
> >> -	mmc = init_mmc_device(curr_device, true);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int
> flag,
> >>  	struct blk_desc *mmc_dev;
> >>  	struct mmc *mmc;
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp,
> >> int flag,  {
> >>  	int dev, part = 0, ret;
> >>  	struct mmc *mmc;
> >> +	enum bus_mode speed_mode = MMC_MODES_END;
> >>
> >>  	if (argc == 1) {
> >>  		dev = curr_device;
> >> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
> >>  	} else if (argc == 2) {
> >>  		dev = simple_strtoul(argv[1], NULL, 10);
> >> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
> >>  	} else if (argc == 3) {
> >>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
> >>  		part = (int)simple_strtoul(argv[2], NULL, 10); @@ -528,11
> >> +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
> >>  			       PART_ACCESS_MASK);
> >>  			return CMD_RET_FAILURE;
> >>  		}
> >> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
> >> +	} else if (argc == 4) {
> >> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
> >> +		part = (int)simple_strtoul(argv[2], NULL, 10);
> >> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
> >> +		mmc = init_mmc_device(curr_device, true, speed_mode);
> >>  	} else {
> >>  		return CMD_RET_USAGE;
> >>  	}
> >>
> >> -	mmc = init_mmc_device(dev, true);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl
> >> *cmdtp, int flag,
> >>  	enum mmc_hwpart_conf_mode mode =
> >> MMC_HWPART_CONF_CHECK;
> >>  	int i, r, pidx;
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp,
> >> int flag,
> >>  	reset = simple_strtoul(argv[3], NULL, 10);
> >>  	mode = simple_strtoul(argv[4], NULL, 10);
> >>
> >> -	mmc = init_mmc_device(dev, false);
> >> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl
> >> *cmdtp, int flag,
> >>  	bootsize = simple_strtoul(argv[2], NULL, 10);
> >>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
> >>
> >> -	mmc = init_mmc_device(dev, false);
> >> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp,
> >> int flag,
> >>
> >>  	dev = simple_strtoul(argv[1], NULL, 10);
> >>
> >> -	mmc = init_mmc_device(dev, false);
> >> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp,
> >> int flag,
> >>  		return CMD_RET_USAGE;
> >>  	}
> >>
> >> -	mmc = init_mmc_device(dev, false);
> >> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl
> >> *cmdtp, int flag,
> >>
> >>  	dev = simple_strtoul(argv[1], NULL, 10);
> >>
> >> -	mmc = init_mmc_device(dev, false);
> >> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>
> >> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp,
> >> int flag,
> >>  	int err;
> >>  	struct mmc *mmc;
> >>
> >> -	mmc = init_mmc_device(curr_device, false);
> >> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
> >>  	if (!mmc)
> >>  		return CMD_RET_FAILURE;
> >>  	if (IS_SD(mmc)) {
> >> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {  #if
> >> CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
> >>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
> #endif
> >> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
> >> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
> >>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
> >> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
> >> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
> >>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),  #if
> >> CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> >>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "",
> ""),
> >> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
> >>  	"mmc swrite addr blk#\n"
> >>  #endif
> >>  	"mmc erase blk# cnt\n"
> >> -	"mmc rescan\n"
> >> +	"mmc rescan [mode]\n"
> >>  	"mmc part - lists available partition on current mmc device\n"
> >> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
> >> +	"mmc dev [dev] [part] [mode] - show or set current mmc device
> >> [partition] and set mode\n"
> >> +	"  - the required speed mode is passed as the index from the
> >> +following
> >> list\n"
> >> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52,
> >> UHS_SDR12, UHS_SDR25,\n"
> >> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200,
> >> MMC_HS_400, MMC_HS_400_ES]\n"
> >>  	"mmc list - lists available devices\n"
> >>  	"mmc wp - power on write protect boot partitions\n"
> >>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> >> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
> >> index 0e13238c7e7a..66fe8bed984b 100644
> >> --- a/drivers/mmc/mmc-uclass.c
> >> +++ b/drivers/mmc/mmc-uclass.c
> >> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc
> >> *mmc, const struct mmc_config *cfg)
> >>  	bdesc->part_type = cfg->part_type;
> >>  	mmc->dev = dev;
> >>
> >> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> >> +	mmc->user_speed_mode = MMC_MODES_END; #endif
> >
> > same here
> >
> >>  	return 0;
> >>  }
> >>
> >> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index
> >> 8078a89f18cb..b24a45d458d4 100644
> >> --- a/drivers/mmc/mmc.c
> >> +++ b/drivers/mmc/mmc.c
> >> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
> >>  	 */
> >>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY)
> >> |
> >>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
> >> +
> >> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> >
> > here  as well
> >
> 
> I can't use if (IS_ENABLED(CONFIG_MMC_SPEED_MODE_SET)  because of [1],
> as it would lead to build errors.
> 
> If it is ok, to remove #ifdef around [1] and add user_speed_mode field
> irrespective of config, then I will be able to use it.

I see no problem in removing [1]. Please go ahead.

Thanks,
Ashok
> 
> Thanks,
> Aswath
> 
> > Thanks,
> > Ashok
> >
> >> +	if (mmc->user_speed_mode != MMC_MODES_END) {
> >> +		int i;
> >> +		/* set host caps */
> >> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
> >> +			/* Remove all existing speed capabilities */
> >> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
> >> +				mmc->host_caps &= ~MMC_CAP(i);
> >> +			mmc->host_caps |= (MMC_CAP(mmc-
> >>> user_speed_mode)
> >> +					   | MMC_CAP(MMC_LEGACY) |
> >> +					   MMC_CAP(MMC_LEGACY) |
> >> MMC_MODE_1BIT);
> >> +		} else {
> >> +			pr_err("bus_mode requested is not supported\n");
> >> +			return -EINVAL;
> >> +		}
> >> +	}
> >> +#endif
> >>  #if CONFIG_IS_ENABLED(DM_MMC)
> >>  	mmc_deferred_probe(mmc);
> >>  #endif
> >> diff --git a/include/mmc.h b/include/mmc.h index
> >> 0bf19de20e52..e64ef7611dd7 100644
> >> --- a/include/mmc.h
> >> +++ b/include/mmc.h
> >> @@ -726,6 +726,10 @@ struct mmc {
> >>  				  */
> >>  	u32 quirks;
> >>  	u8 hs400_tuning;
> >> +
> >> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
> >> +	enum bus_mode user_speed_mode;
> >> +#endif
> 
> [1]
> 
> >>  };
> >>
> >>  #if CONFIG_IS_ENABLED(DM_MMC)
> >> --
> >> 2.17.1
> >


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-30  5:12     ` Aswath Govindraju
@ 2021-07-30  9:14       ` Jaehoon Chung
  2021-07-30  9:20         ` Aswath Govindraju
  0 siblings, 1 reply; 10+ messages in thread
From: Jaehoon Chung @ 2021-07-30  9:14 UTC (permalink / raw)
  To: Aswath Govindraju
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Simon Glass, Heinrich Schuchardt, Bin Meng,
	Patrick Delaunay, Pragnesh Patel, Frédéric Danis,
	Reuben Dowle, Yangbo Lu, Stefan Bosch, Ashok Reddy Soma,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Aswath,

On 7/30/21 2:12 PM, Aswath Govindraju wrote:
> Hi Jaehoon,
> 
> On 30/07/21 4:00 am, Jaehoon Chung wrote:
>> Hi Aswath,
>>
>> On 7/29/21 11:55 PM, Aswath Govindraju wrote:
>>> Add support for enumerating MMC card in a given mode using mmc rescan and
>>> mmc dev commands. The speed mode is provided as the last argument in these
>>> commands and is indicated using the index from enum bus_mode in
>>> include/mmc.h. A speed mode can be set only if it has already been enabled
>>> in the device tree.
>>
>> Thanks for this patch. It seems that it's useful to develope and debug.
>> I will test with this patch.
>>
>> Could you also update doc/usage/mmc.rst file?
>>
> 
> Sure, I'll update it in the respin.

When I have simply tested with this patch, it's not working correct.
I will test more and share them. Did you test about SD-card?

Best Regards,
Jaehoon Chung

> 
> Thanks,
> Aswath
> 
>> Best Regards,
>> Jaehoo Chung
>>
>>>
>>> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
>>> ---
>>>  cmd/Kconfig              | 10 ++++++
>>>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>>>  drivers/mmc/mmc-uclass.c |  3 ++
>>>  drivers/mmc/mmc.c        | 18 ++++++++++
>>>  include/mmc.h            |  4 +++
>>>  5 files changed, 85 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>>> index ffef3cc76ca4..3a857b3f6e2e 100644
>>> --- a/cmd/Kconfig
>>> +++ b/cmd/Kconfig
>>> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>>>  	help
>>>  	  UBIFS is a file system for flash devices which works on top of UBI.
>>>  
>>> +config MMC_SPEED_MODE_SET
>>> +	bool "set speed mode using mmc command"
>>> +	depends on CMD_MMC
>>> +	default n
>>> +	help
>>> +	  Enable setting speed mode using mmc rescan and mmc dev commands.
>>> +	  The speed mode is provided as the last argument in these commands
>>> +	  and is indicated using the index from enum bus_mode in
>>> +	  include/mmc.h. A speed mode can be set only if it has already
>>> +	  been enabled in the device tree.
>>>  endmenu
>>> diff --git a/cmd/mmc.c b/cmd/mmc.c
>>> index b942576b58ac..073e87d69634 100644
>>> --- a/cmd/mmc.c
>>> +++ b/cmd/mmc.c
>>> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>>>  		}
>>>  	}
>>>  }
>>> -static struct mmc *init_mmc_device(int dev, bool force_init)
>>> +
>>> +static struct mmc *init_mmc_device(int dev, bool force_init,
>>> +				   enum bus_mode speed_mode)
>>>  {
>>>  	struct mmc *mmc;
>>>  	mmc = find_mmc_device(dev);
>>> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
>>>  
>>>  	if (force_init)
>>>  		mmc->has_init = 0;
>>> +
>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>> +	mmc->user_speed_mode = speed_mode;
>>> +#endif
>>> +
>>>  	if (mmc_init(mmc))
>>>  		return NULL;
>>>  
>>> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
>>>  		}
>>>  	}
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>>>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>>>  		return CMD_RET_SUCCESS;
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
>>>  		return CMD_RET_FAILURE;
>>>  	}
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
>>>  	blk = simple_strtoul(argv[1], NULL, 16);
>>>  	cnt = simple_strtoul(argv[2], NULL, 16);
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
>>>  			 int argc, char *const argv[])
>>>  {
>>>  	struct mmc *mmc;
>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>> +
>>> +	if (argc == 1) {
>>> +		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
>>> +	} else if (argc == 2) {
>>> +		/* parse the mode */
>>> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
>>> +		/* Need to pass the the speed mode required too */
>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>> +	} else {
>>> +		return CMD_RET_USAGE;
>>> +	}
>>>  
>>> -	mmc = init_mmc_device(curr_device, true);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>>>  	struct blk_desc *mmc_dev;
>>>  	struct mmc *mmc;
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>  {
>>>  	int dev, part = 0, ret;
>>>  	struct mmc *mmc;
>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>  
>>>  	if (argc == 1) {
>>>  		dev = curr_device;
>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>  	} else if (argc == 2) {
>>>  		dev = simple_strtoul(argv[1], NULL, 10);
>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>  	} else if (argc == 3) {
>>>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>  		part = (int)simple_strtoul(argv[2], NULL, 10);
>>> @@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>  			       PART_ACCESS_MASK);
>>>  			return CMD_RET_FAILURE;
>>>  		}
>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>> +	} else if (argc == 4) {
>>> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>> +		part = (int)simple_strtoul(argv[2], NULL, 10);
>>> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>>  	} else {
>>>  		return CMD_RET_USAGE;
>>>  	}
>>>  
>>> -	mmc = init_mmc_device(dev, true);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>>>  	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
>>>  	int i, r, pidx;
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
>>>  	reset = simple_strtoul(argv[3], NULL, 10);
>>>  	mode = simple_strtoul(argv[4], NULL, 10);
>>>  
>>> -	mmc = init_mmc_device(dev, false);
>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
>>>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>>>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>>>  
>>> -	mmc = init_mmc_device(dev, false);
>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
>>>  
>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>  
>>> -	mmc = init_mmc_device(dev, false);
>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
>>>  		return CMD_RET_USAGE;
>>>  	}
>>>  
>>> -	mmc = init_mmc_device(dev, false);
>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
>>>  
>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>  
>>> -	mmc = init_mmc_device(dev, false);
>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  
>>> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
>>>  	int err;
>>>  	struct mmc *mmc;
>>>  
>>> -	mmc = init_mmc_device(curr_device, false);
>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>  	if (!mmc)
>>>  		return CMD_RET_FAILURE;
>>>  	if (IS_SD(mmc)) {
>>> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
>>>  #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>>>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>>>  #endif
>>> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
>>> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>>>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
>>> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
>>> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>>>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
>>> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>>>  	"mmc swrite addr blk#\n"
>>>  #endif
>>>  	"mmc erase blk# cnt\n"
>>> -	"mmc rescan\n"
>>> +	"mmc rescan [mode]\n"
>>>  	"mmc part - lists available partition on current mmc device\n"
>>> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
>>> +	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
>>> +	"  - the required speed mode is passed as the index from the following list\n"
>>> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
>>> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
>>>  	"mmc list - lists available devices\n"
>>>  	"mmc wp - power on write protect boot partitions\n"
>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
>>> index 0e13238c7e7a..66fe8bed984b 100644
>>> --- a/drivers/mmc/mmc-uclass.c
>>> +++ b/drivers/mmc/mmc-uclass.c
>>> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
>>>  	bdesc->part_type = cfg->part_type;
>>>  	mmc->dev = dev;
>>>  
>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>> +	mmc->user_speed_mode = MMC_MODES_END;
>>> +#endif
>>>  	return 0;
>>>  }
>>>  
>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>>> index 8078a89f18cb..b24a45d458d4 100644
>>> --- a/drivers/mmc/mmc.c
>>> +++ b/drivers/mmc/mmc.c
>>> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>>>  	 */
>>>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
>>>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
>>> +
>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>> +	if (mmc->user_speed_mode != MMC_MODES_END) {
>>> +		int i;
>>> +		/* set host caps */
>>> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
>>> +			/* Remove all existing speed capabilities */
>>> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
>>> +				mmc->host_caps &= ~MMC_CAP(i);
>>> +			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
>>> +					   | MMC_CAP(MMC_LEGACY) |
>>> +					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
>>> +		} else {
>>> +			pr_err("bus_mode requested is not supported\n");
>>> +			return -EINVAL;
>>> +		}
>>> +	}
>>> +#endif
>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>  	mmc_deferred_probe(mmc);
>>>  #endif
>>> diff --git a/include/mmc.h b/include/mmc.h
>>> index 0bf19de20e52..e64ef7611dd7 100644
>>> --- a/include/mmc.h
>>> +++ b/include/mmc.h
>>> @@ -726,6 +726,10 @@ struct mmc {
>>>  				  */
>>>  	u32 quirks;
>>>  	u8 hs400_tuning;
>>> +
>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>> +	enum bus_mode user_speed_mode;
>>> +#endif
>>>  };
>>>  
>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>
>>
> 
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-30  9:14       ` Jaehoon Chung
@ 2021-07-30  9:20         ` Aswath Govindraju
  2021-07-30  9:32           ` Jaehoon Chung
  0 siblings, 1 reply; 10+ messages in thread
From: Aswath Govindraju @ 2021-07-30  9:20 UTC (permalink / raw)
  To: Jaehoon Chung
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Simon Glass, Heinrich Schuchardt, Bin Meng,
	Patrick Delaunay, Pragnesh Patel, Frédéric Danis,
	Reuben Dowle, Yangbo Lu, Stefan Bosch, Ashok Reddy Soma,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Jaehoon,

On 30/07/21 2:44 pm, Jaehoon Chung wrote:
> Hi Aswath,
> 
> On 7/30/21 2:12 PM, Aswath Govindraju wrote:
>> Hi Jaehoon,
>>
>> On 30/07/21 4:00 am, Jaehoon Chung wrote:
>>> Hi Aswath,
>>>
>>> On 7/29/21 11:55 PM, Aswath Govindraju wrote:
>>>> Add support for enumerating MMC card in a given mode using mmc rescan and
>>>> mmc dev commands. The speed mode is provided as the last argument in these
>>>> commands and is indicated using the index from enum bus_mode in
>>>> include/mmc.h. A speed mode can be set only if it has already been enabled
>>>> in the device tree.
>>>
>>> Thanks for this patch. It seems that it's useful to develope and debug.
>>> I will test with this patch.
>>>
>>> Could you also update doc/usage/mmc.rst file?
>>>
>>
>> Sure, I'll update it in the respin.
> 
> When I have simply tested with this patch, it's not working correct.
> I will test more and share them. Did you test about SD-card?
> 

Yes, I tested with both SD-Card and eMMC.

Also, please note that MMC_SPEED_MODE_SET has to be enabled in the
defconfig files.

Thanks,
Aswath

> Best Regards,
> Jaehoon Chung
> 
>>
>> Thanks,
>> Aswath
>>
>>> Best Regards,
>>> Jaehoo Chung
>>>
>>>>
>>>> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
>>>> ---
>>>>  cmd/Kconfig              | 10 ++++++
>>>>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>>>>  drivers/mmc/mmc-uclass.c |  3 ++
>>>>  drivers/mmc/mmc.c        | 18 ++++++++++
>>>>  include/mmc.h            |  4 +++
>>>>  5 files changed, 85 insertions(+), 21 deletions(-)
>>>>
>>>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>>>> index ffef3cc76ca4..3a857b3f6e2e 100644
>>>> --- a/cmd/Kconfig
>>>> +++ b/cmd/Kconfig
>>>> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>>>>  	help
>>>>  	  UBIFS is a file system for flash devices which works on top of UBI.
>>>>  
>>>> +config MMC_SPEED_MODE_SET
>>>> +	bool "set speed mode using mmc command"
>>>> +	depends on CMD_MMC
>>>> +	default n
>>>> +	help
>>>> +	  Enable setting speed mode using mmc rescan and mmc dev commands.
>>>> +	  The speed mode is provided as the last argument in these commands
>>>> +	  and is indicated using the index from enum bus_mode in
>>>> +	  include/mmc.h. A speed mode can be set only if it has already
>>>> +	  been enabled in the device tree.
>>>>  endmenu
>>>> diff --git a/cmd/mmc.c b/cmd/mmc.c
>>>> index b942576b58ac..073e87d69634 100644
>>>> --- a/cmd/mmc.c
>>>> +++ b/cmd/mmc.c
>>>> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>>>>  		}
>>>>  	}
>>>>  }
>>>> -static struct mmc *init_mmc_device(int dev, bool force_init)
>>>> +
>>>> +static struct mmc *init_mmc_device(int dev, bool force_init,
>>>> +				   enum bus_mode speed_mode)
>>>>  {
>>>>  	struct mmc *mmc;
>>>>  	mmc = find_mmc_device(dev);
>>>> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
>>>>  
>>>>  	if (force_init)
>>>>  		mmc->has_init = 0;
>>>> +
>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>> +	mmc->user_speed_mode = speed_mode;
>>>> +#endif
>>>> +
>>>>  	if (mmc_init(mmc))
>>>>  		return NULL;
>>>>  
>>>> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
>>>>  		}
>>>>  	}
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>>>>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>>>>  		return CMD_RET_SUCCESS;
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
>>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
>>>>  		return CMD_RET_FAILURE;
>>>>  	}
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
>>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
>>>>  	blk = simple_strtoul(argv[1], NULL, 16);
>>>>  	cnt = simple_strtoul(argv[2], NULL, 16);
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
>>>>  			 int argc, char *const argv[])
>>>>  {
>>>>  	struct mmc *mmc;
>>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>> +
>>>> +	if (argc == 1) {
>>>> +		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
>>>> +	} else if (argc == 2) {
>>>> +		/* parse the mode */
>>>> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
>>>> +		/* Need to pass the the speed mode required too */
>>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>>> +	} else {
>>>> +		return CMD_RET_USAGE;
>>>> +	}
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, true);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>>>>  	struct blk_desc *mmc_dev;
>>>>  	struct mmc *mmc;
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>>  {
>>>>  	int dev, part = 0, ret;
>>>>  	struct mmc *mmc;
>>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>>  
>>>>  	if (argc == 1) {
>>>>  		dev = curr_device;
>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>  	} else if (argc == 2) {
>>>>  		dev = simple_strtoul(argv[1], NULL, 10);
>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>  	} else if (argc == 3) {
>>>>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>>  		part = (int)simple_strtoul(argv[2], NULL, 10);
>>>> @@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>>  			       PART_ACCESS_MASK);
>>>>  			return CMD_RET_FAILURE;
>>>>  		}
>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>> +	} else if (argc == 4) {
>>>> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>> +		part = (int)simple_strtoul(argv[2], NULL, 10);
>>>> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
>>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>>>  	} else {
>>>>  		return CMD_RET_USAGE;
>>>>  	}
>>>>  
>>>> -	mmc = init_mmc_device(dev, true);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>>>>  	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
>>>>  	int i, r, pidx;
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
>>>>  	reset = simple_strtoul(argv[3], NULL, 10);
>>>>  	mode = simple_strtoul(argv[4], NULL, 10);
>>>>  
>>>> -	mmc = init_mmc_device(dev, false);
>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
>>>>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>>>>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>>>>  
>>>> -	mmc = init_mmc_device(dev, false);
>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
>>>>  
>>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>>  
>>>> -	mmc = init_mmc_device(dev, false);
>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
>>>>  		return CMD_RET_USAGE;
>>>>  	}
>>>>  
>>>> -	mmc = init_mmc_device(dev, false);
>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
>>>>  
>>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>>  
>>>> -	mmc = init_mmc_device(dev, false);
>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  
>>>> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
>>>>  	int err;
>>>>  	struct mmc *mmc;
>>>>  
>>>> -	mmc = init_mmc_device(curr_device, false);
>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>  	if (!mmc)
>>>>  		return CMD_RET_FAILURE;
>>>>  	if (IS_SD(mmc)) {
>>>> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
>>>>  #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>>>>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>>>>  #endif
>>>> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
>>>> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>>>>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
>>>> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
>>>> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>>>>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
>>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
>>>> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>>>>  	"mmc swrite addr blk#\n"
>>>>  #endif
>>>>  	"mmc erase blk# cnt\n"
>>>> -	"mmc rescan\n"
>>>> +	"mmc rescan [mode]\n"
>>>>  	"mmc part - lists available partition on current mmc device\n"
>>>> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
>>>> +	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
>>>> +	"  - the required speed mode is passed as the index from the following list\n"
>>>> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
>>>> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
>>>>  	"mmc list - lists available devices\n"
>>>>  	"mmc wp - power on write protect boot partitions\n"
>>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
>>>> index 0e13238c7e7a..66fe8bed984b 100644
>>>> --- a/drivers/mmc/mmc-uclass.c
>>>> +++ b/drivers/mmc/mmc-uclass.c
>>>> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
>>>>  	bdesc->part_type = cfg->part_type;
>>>>  	mmc->dev = dev;
>>>>  
>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>> +	mmc->user_speed_mode = MMC_MODES_END;
>>>> +#endif
>>>>  	return 0;
>>>>  }
>>>>  
>>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>>>> index 8078a89f18cb..b24a45d458d4 100644
>>>> --- a/drivers/mmc/mmc.c
>>>> +++ b/drivers/mmc/mmc.c
>>>> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>>>>  	 */
>>>>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
>>>>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
>>>> +
>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>> +	if (mmc->user_speed_mode != MMC_MODES_END) {
>>>> +		int i;
>>>> +		/* set host caps */
>>>> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
>>>> +			/* Remove all existing speed capabilities */
>>>> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
>>>> +				mmc->host_caps &= ~MMC_CAP(i);
>>>> +			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
>>>> +					   | MMC_CAP(MMC_LEGACY) |
>>>> +					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
>>>> +		} else {
>>>> +			pr_err("bus_mode requested is not supported\n");
>>>> +			return -EINVAL;
>>>> +		}
>>>> +	}
>>>> +#endif
>>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>>  	mmc_deferred_probe(mmc);
>>>>  #endif
>>>> diff --git a/include/mmc.h b/include/mmc.h
>>>> index 0bf19de20e52..e64ef7611dd7 100644
>>>> --- a/include/mmc.h
>>>> +++ b/include/mmc.h
>>>> @@ -726,6 +726,10 @@ struct mmc {
>>>>  				  */
>>>>  	u32 quirks;
>>>>  	u8 hs400_tuning;
>>>> +
>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>> +	enum bus_mode user_speed_mode;
>>>> +#endif
>>>>  };
>>>>  
>>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>>
>>>
>>
>>
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-30  9:20         ` Aswath Govindraju
@ 2021-07-30  9:32           ` Jaehoon Chung
  2021-07-30 10:06             ` Aswath Govindraju
  0 siblings, 1 reply; 10+ messages in thread
From: Jaehoon Chung @ 2021-07-30  9:32 UTC (permalink / raw)
  To: Aswath Govindraju
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Simon Glass, Heinrich Schuchardt, Bin Meng,
	Patrick Delaunay, Pragnesh Patel, Frédéric Danis,
	Reuben Dowle, Yangbo Lu, Stefan Bosch, Ashok Reddy Soma,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

On 7/30/21 6:20 PM, Aswath Govindraju wrote:
> Hi Jaehoon,
> 
> On 30/07/21 2:44 pm, Jaehoon Chung wrote:
>> Hi Aswath,
>>
>> On 7/30/21 2:12 PM, Aswath Govindraju wrote:
>>> Hi Jaehoon,
>>>
>>> On 30/07/21 4:00 am, Jaehoon Chung wrote:
>>>> Hi Aswath,
>>>>
>>>> On 7/29/21 11:55 PM, Aswath Govindraju wrote:
>>>>> Add support for enumerating MMC card in a given mode using mmc rescan and
>>>>> mmc dev commands. The speed mode is provided as the last argument in these
>>>>> commands and is indicated using the index from enum bus_mode in
>>>>> include/mmc.h. A speed mode can be set only if it has already been enabled
>>>>> in the device tree.
>>>>
>>>> Thanks for this patch. It seems that it's useful to develope and debug.
>>>> I will test with this patch.
>>>>
>>>> Could you also update doc/usage/mmc.rst file?
>>>>
>>>
>>> Sure, I'll update it in the respin.
>>
>> When I have simply tested with this patch, it's not working correct.
>> I will test more and share them. Did you test about SD-card?
>>
> 
> Yes, I tested with both SD-Card and eMMC.
> 
> Also, please note that MMC_SPEED_MODE_SET has to be enabled in the
> defconfig files.

I did. :)  (enabled MMC_SPEED_MODE_SET). 
If it's not supported mode, it seems that always set to LEGACY mode. Is it intention behavior?

I will test on eMMC and SD. Well it will take a little time. Maybe Next week?

Best Regards,
Jaehoon Chung

> 
> Thanks,
> Aswath
> 
>> Best Regards,
>> Jaehoon Chung
>>
>>>
>>> Thanks,
>>> Aswath
>>>
>>>> Best Regards,
>>>> Jaehoo Chung
>>>>
>>>>>
>>>>> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
>>>>> ---
>>>>>  cmd/Kconfig              | 10 ++++++
>>>>>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>>>>>  drivers/mmc/mmc-uclass.c |  3 ++
>>>>>  drivers/mmc/mmc.c        | 18 ++++++++++
>>>>>  include/mmc.h            |  4 +++
>>>>>  5 files changed, 85 insertions(+), 21 deletions(-)
>>>>>
>>>>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>>>>> index ffef3cc76ca4..3a857b3f6e2e 100644
>>>>> --- a/cmd/Kconfig
>>>>> +++ b/cmd/Kconfig
>>>>> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>>>>>  	help
>>>>>  	  UBIFS is a file system for flash devices which works on top of UBI.
>>>>>  
>>>>> +config MMC_SPEED_MODE_SET
>>>>> +	bool "set speed mode using mmc command"
>>>>> +	depends on CMD_MMC
>>>>> +	default n
>>>>> +	help
>>>>> +	  Enable setting speed mode using mmc rescan and mmc dev commands.
>>>>> +	  The speed mode is provided as the last argument in these commands
>>>>> +	  and is indicated using the index from enum bus_mode in
>>>>> +	  include/mmc.h. A speed mode can be set only if it has already
>>>>> +	  been enabled in the device tree.
>>>>>  endmenu
>>>>> diff --git a/cmd/mmc.c b/cmd/mmc.c
>>>>> index b942576b58ac..073e87d69634 100644
>>>>> --- a/cmd/mmc.c
>>>>> +++ b/cmd/mmc.c
>>>>> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>>>>>  		}
>>>>>  	}
>>>>>  }
>>>>> -static struct mmc *init_mmc_device(int dev, bool force_init)
>>>>> +
>>>>> +static struct mmc *init_mmc_device(int dev, bool force_init,
>>>>> +				   enum bus_mode speed_mode)
>>>>>  {
>>>>>  	struct mmc *mmc;
>>>>>  	mmc = find_mmc_device(dev);
>>>>> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
>>>>>  
>>>>>  	if (force_init)
>>>>>  		mmc->has_init = 0;
>>>>> +
>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>> +	mmc->user_speed_mode = speed_mode;
>>>>> +#endif
>>>>> +
>>>>>  	if (mmc_init(mmc))
>>>>>  		return NULL;
>>>>>  
>>>>> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
>>>>>  		}
>>>>>  	}
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>>>>>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>>>>>  		return CMD_RET_SUCCESS;
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
>>>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
>>>>>  		return CMD_RET_FAILURE;
>>>>>  	}
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
>>>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
>>>>>  	blk = simple_strtoul(argv[1], NULL, 16);
>>>>>  	cnt = simple_strtoul(argv[2], NULL, 16);
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
>>>>>  			 int argc, char *const argv[])
>>>>>  {
>>>>>  	struct mmc *mmc;
>>>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>>> +
>>>>> +	if (argc == 1) {
>>>>> +		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
>>>>> +	} else if (argc == 2) {
>>>>> +		/* parse the mode */
>>>>> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
>>>>> +		/* Need to pass the the speed mode required too */
>>>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>>>> +	} else {
>>>>> +		return CMD_RET_USAGE;
>>>>> +	}
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, true);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>>>>>  	struct blk_desc *mmc_dev;
>>>>>  	struct mmc *mmc;
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>>>  {
>>>>>  	int dev, part = 0, ret;
>>>>>  	struct mmc *mmc;
>>>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>>>  
>>>>>  	if (argc == 1) {
>>>>>  		dev = curr_device;
>>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>>  	} else if (argc == 2) {
>>>>>  		dev = simple_strtoul(argv[1], NULL, 10);
>>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>>  	} else if (argc == 3) {
>>>>>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>>>  		part = (int)simple_strtoul(argv[2], NULL, 10);
>>>>> @@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>>>  			       PART_ACCESS_MASK);
>>>>>  			return CMD_RET_FAILURE;
>>>>>  		}
>>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>> +	} else if (argc == 4) {
>>>>> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>>> +		part = (int)simple_strtoul(argv[2], NULL, 10);
>>>>> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
>>>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>>>>  	} else {
>>>>>  		return CMD_RET_USAGE;
>>>>>  	}
>>>>>  
>>>>> -	mmc = init_mmc_device(dev, true);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>>>>>  	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
>>>>>  	int i, r, pidx;
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
>>>>>  	reset = simple_strtoul(argv[3], NULL, 10);
>>>>>  	mode = simple_strtoul(argv[4], NULL, 10);
>>>>>  
>>>>> -	mmc = init_mmc_device(dev, false);
>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
>>>>>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>>>>>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>>>>>  
>>>>> -	mmc = init_mmc_device(dev, false);
>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
>>>>>  
>>>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>>>  
>>>>> -	mmc = init_mmc_device(dev, false);
>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
>>>>>  		return CMD_RET_USAGE;
>>>>>  	}
>>>>>  
>>>>> -	mmc = init_mmc_device(dev, false);
>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
>>>>>  
>>>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>>>  
>>>>> -	mmc = init_mmc_device(dev, false);
>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  
>>>>> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
>>>>>  	int err;
>>>>>  	struct mmc *mmc;
>>>>>  
>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>  	if (!mmc)
>>>>>  		return CMD_RET_FAILURE;
>>>>>  	if (IS_SD(mmc)) {
>>>>> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
>>>>>  #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>>>>>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>>>>>  #endif
>>>>> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
>>>>> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>>>>>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
>>>>> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
>>>>> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>>>>>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
>>>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>>>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
>>>>> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>>>>>  	"mmc swrite addr blk#\n"
>>>>>  #endif
>>>>>  	"mmc erase blk# cnt\n"
>>>>> -	"mmc rescan\n"
>>>>> +	"mmc rescan [mode]\n"
>>>>>  	"mmc part - lists available partition on current mmc device\n"
>>>>> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
>>>>> +	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
>>>>> +	"  - the required speed mode is passed as the index from the following list\n"
>>>>> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
>>>>> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
>>>>>  	"mmc list - lists available devices\n"
>>>>>  	"mmc wp - power on write protect boot partitions\n"
>>>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>>> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
>>>>> index 0e13238c7e7a..66fe8bed984b 100644
>>>>> --- a/drivers/mmc/mmc-uclass.c
>>>>> +++ b/drivers/mmc/mmc-uclass.c
>>>>> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
>>>>>  	bdesc->part_type = cfg->part_type;
>>>>>  	mmc->dev = dev;
>>>>>  
>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>> +	mmc->user_speed_mode = MMC_MODES_END;
>>>>> +#endif
>>>>>  	return 0;
>>>>>  }
>>>>>  
>>>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>>>>> index 8078a89f18cb..b24a45d458d4 100644
>>>>> --- a/drivers/mmc/mmc.c
>>>>> +++ b/drivers/mmc/mmc.c
>>>>> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>>>>>  	 */
>>>>>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
>>>>>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
>>>>> +
>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>> +	if (mmc->user_speed_mode != MMC_MODES_END) {
>>>>> +		int i;
>>>>> +		/* set host caps */
>>>>> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
>>>>> +			/* Remove all existing speed capabilities */
>>>>> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
>>>>> +				mmc->host_caps &= ~MMC_CAP(i);
>>>>> +			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
>>>>> +					   | MMC_CAP(MMC_LEGACY) |
>>>>> +					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
>>>>> +		} else {
>>>>> +			pr_err("bus_mode requested is not supported\n");
>>>>> +			return -EINVAL;
>>>>> +		}
>>>>> +	}
>>>>> +#endif
>>>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>>>  	mmc_deferred_probe(mmc);
>>>>>  #endif
>>>>> diff --git a/include/mmc.h b/include/mmc.h
>>>>> index 0bf19de20e52..e64ef7611dd7 100644
>>>>> --- a/include/mmc.h
>>>>> +++ b/include/mmc.h
>>>>> @@ -726,6 +726,10 @@ struct mmc {
>>>>>  				  */
>>>>>  	u32 quirks;
>>>>>  	u8 hs400_tuning;
>>>>> +
>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>> +	enum bus_mode user_speed_mode;
>>>>> +#endif
>>>>>  };
>>>>>  
>>>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>>>
>>>>
>>>
>>>
>>
> 
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command
  2021-07-30  9:32           ` Jaehoon Chung
@ 2021-07-30 10:06             ` Aswath Govindraju
  0 siblings, 0 replies; 10+ messages in thread
From: Aswath Govindraju @ 2021-07-30 10:06 UTC (permalink / raw)
  To: Jaehoon Chung
  Cc: Lokesh Vutla, Vignesh Raghavendra, Kishon Vijay Abraham I,
	Peng Fan, Simon Glass, Heinrich Schuchardt, Bin Meng,
	Patrick Delaunay, Pragnesh Patel, Frédéric Danis,
	Reuben Dowle, Yangbo Lu, Stefan Bosch, Ashok Reddy Soma,
	Nicolas Saenz Julienne, Pali Rohár, u-boot

Hi Jaehoon,

On 30/07/21 3:02 pm, Jaehoon Chung wrote:
> On 7/30/21 6:20 PM, Aswath Govindraju wrote:
>> Hi Jaehoon,
>>
>> On 30/07/21 2:44 pm, Jaehoon Chung wrote:
>>> Hi Aswath,
>>>
>>> On 7/30/21 2:12 PM, Aswath Govindraju wrote:
>>>> Hi Jaehoon,
>>>>
>>>> On 30/07/21 4:00 am, Jaehoon Chung wrote:
>>>>> Hi Aswath,
>>>>>
>>>>> On 7/29/21 11:55 PM, Aswath Govindraju wrote:
>>>>>> Add support for enumerating MMC card in a given mode using mmc rescan and
>>>>>> mmc dev commands. The speed mode is provided as the last argument in these
>>>>>> commands and is indicated using the index from enum bus_mode in
>>>>>> include/mmc.h. A speed mode can be set only if it has already been enabled
>>>>>> in the device tree.
>>>>>
>>>>> Thanks for this patch. It seems that it's useful to develope and debug.
>>>>> I will test with this patch.
>>>>>
>>>>> Could you also update doc/usage/mmc.rst file?
>>>>>
>>>>
>>>> Sure, I'll update it in the respin.
>>>
>>> When I have simply tested with this patch, it's not working correct.
>>> I will test more and share them. Did you test about SD-card?
>>>

Actually I just found one error but I am not sure if it is the same
error you are seeing.

In my case even if mode is supported it shows that if is not supported
and this is because of [1], it should have been dev there. On correcting
it I don't see this error anymore.


>>
>> Yes, I tested with both SD-Card and eMMC.
>>
>> Also, please note that MMC_SPEED_MODE_SET has to be enabled in the
>> defconfig files.
> 
> I did. :)  (enabled MMC_SPEED_MODE_SET). 
> If it's not supported mode, it seems that always set to LEGACY mode. Is it intention behavior?
> 

No, it is not expected to always set to MMC_LEGACY mode if an
unsupported mode is input.

> I will test on eMMC and SD. Well it will take a little time. Maybe Next week?
> 

Sure, I will post a respin before this weekend. Please do test and share
your results.

Thanks,
Aswath


> Best Regards,
> Jaehoon Chung
> 
>>
>> Thanks,
>> Aswath
>>
>>> Best Regards,
>>> Jaehoon Chung
>>>
>>>>
>>>> Thanks,
>>>> Aswath
>>>>
>>>>> Best Regards,
>>>>> Jaehoo Chung
>>>>>
>>>>>>
>>>>>> Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
>>>>>> ---
>>>>>>  cmd/Kconfig              | 10 ++++++
>>>>>>  cmd/mmc.c                | 71 ++++++++++++++++++++++++++++------------
>>>>>>  drivers/mmc/mmc-uclass.c |  3 ++
>>>>>>  drivers/mmc/mmc.c        | 18 ++++++++++
>>>>>>  include/mmc.h            |  4 +++
>>>>>>  5 files changed, 85 insertions(+), 21 deletions(-)
>>>>>>
>>>>>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>>>>>> index ffef3cc76ca4..3a857b3f6e2e 100644
>>>>>> --- a/cmd/Kconfig
>>>>>> +++ b/cmd/Kconfig
>>>>>> @@ -2389,4 +2389,14 @@ config CMD_UBIFS
>>>>>>  	help
>>>>>>  	  UBIFS is a file system for flash devices which works on top of UBI.
>>>>>>  
>>>>>> +config MMC_SPEED_MODE_SET
>>>>>> +	bool "set speed mode using mmc command"
>>>>>> +	depends on CMD_MMC
>>>>>> +	default n
>>>>>> +	help
>>>>>> +	  Enable setting speed mode using mmc rescan and mmc dev commands.
>>>>>> +	  The speed mode is provided as the last argument in these commands
>>>>>> +	  and is indicated using the index from enum bus_mode in
>>>>>> +	  include/mmc.h. A speed mode can be set only if it has already
>>>>>> +	  been enabled in the device tree.
>>>>>>  endmenu
>>>>>> diff --git a/cmd/mmc.c b/cmd/mmc.c
>>>>>> index b942576b58ac..073e87d69634 100644
>>>>>> --- a/cmd/mmc.c
>>>>>> +++ b/cmd/mmc.c
>>>>>> @@ -120,7 +120,9 @@ static void print_mmcinfo(struct mmc *mmc)
>>>>>>  		}
>>>>>>  	}
>>>>>>  }
>>>>>> -static struct mmc *init_mmc_device(int dev, bool force_init)
>>>>>> +
>>>>>> +static struct mmc *init_mmc_device(int dev, bool force_init,
>>>>>> +				   enum bus_mode speed_mode)
>>>>>>  {
>>>>>>  	struct mmc *mmc;
>>>>>>  	mmc = find_mmc_device(dev);
>>>>>> @@ -134,6 +136,11 @@ static struct mmc *init_mmc_device(int dev, bool force_init)
>>>>>>  
>>>>>>  	if (force_init)
>>>>>>  		mmc->has_init = 0;
>>>>>> +
>>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>>> +	mmc->user_speed_mode = speed_mode;
>>>>>> +#endif
>>>>>> +
>>>>>>  	if (mmc_init(mmc))
>>>>>>  		return NULL;
>>>>>>  
>>>>>> @@ -159,7 +166,7 @@ static int do_mmcinfo(struct cmd_tbl *cmdtp, int flag, int argc,
>>>>>>  		}
>>>>>>  	}
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -293,7 +300,7 @@ static int do_mmcrpmb(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
>>>>>>  		return CMD_RET_SUCCESS;
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -338,7 +345,7 @@ static int do_mmc_read(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -387,7 +394,7 @@ static int do_mmc_sparse_write(struct cmd_tbl *cmdtp, int flag,
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  	}
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -431,7 +438,7 @@ static int do_mmc_write(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	blk = simple_strtoul(argv[2], NULL, 16);
>>>>>>  	cnt = simple_strtoul(argv[3], NULL, 16);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -460,7 +467,7 @@ static int do_mmc_erase(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	blk = simple_strtoul(argv[1], NULL, 16);
>>>>>>  	cnt = simple_strtoul(argv[2], NULL, 16);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -482,8 +489,19 @@ static int do_mmc_rescan(struct cmd_tbl *cmdtp, int flag,
>>>>>>  			 int argc, char *const argv[])
>>>>>>  {
>>>>>>  	struct mmc *mmc;
>>>>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>>>> +
>>>>>> +	if (argc == 1) {
>>>>>> +		mmc = init_mmc_device(curr_device, true, MMC_MODES_END);
>>>>>> +	} else if (argc == 2) {
>>>>>> +		/* parse the mode */
>>>>>> +		speed_mode = simple_strtoul(argv[1], NULL, 10);
>>>>>> +		/* Need to pass the the speed mode required too */
>>>>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);
>>>>>> +	} else {
>>>>>> +		return CMD_RET_USAGE;
>>>>>> +	}
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, true);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -496,7 +514,7 @@ static int do_mmc_part(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	struct blk_desc *mmc_dev;
>>>>>>  	struct mmc *mmc;
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -515,11 +533,14 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>>>>  {
>>>>>>  	int dev, part = 0, ret;
>>>>>>  	struct mmc *mmc;
>>>>>> +	enum bus_mode speed_mode = MMC_MODES_END;
>>>>>>  
>>>>>>  	if (argc == 1) {
>>>>>>  		dev = curr_device;
>>>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>>>  	} else if (argc == 2) {
>>>>>>  		dev = simple_strtoul(argv[1], NULL, 10);
>>>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>>>  	} else if (argc == 3) {
>>>>>>  		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>>>>  		part = (int)simple_strtoul(argv[2], NULL, 10);
>>>>>> @@ -528,11 +549,16 @@ static int do_mmc_dev(struct cmd_tbl *cmdtp, int flag,
>>>>>>  			       PART_ACCESS_MASK);
>>>>>>  			return CMD_RET_FAILURE;
>>>>>>  		}
>>>>>> +		mmc = init_mmc_device(dev, true, MMC_MODES_END);
>>>>>> +	} else if (argc == 4) {
>>>>>> +		dev = (int)simple_strtoul(argv[1], NULL, 10);
>>>>>> +		part = (int)simple_strtoul(argv[2], NULL, 10);
>>>>>> +		speed_mode = simple_strtoul(argv[3], NULL, 10);
>>>>>> +		mmc = init_mmc_device(curr_device, true, speed_mode);


[1]


>>>>>>  	} else {
>>>>>>  		return CMD_RET_USAGE;
>>>>>>  	}
>>>>>>  
>>>>>> -	mmc = init_mmc_device(dev, true);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -636,7 +662,7 @@ static int do_mmc_hwpartition(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	enum mmc_hwpart_conf_mode mode = MMC_HWPART_CONF_CHECK;
>>>>>>  	int i, r, pidx;
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -726,7 +752,7 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	reset = simple_strtoul(argv[3], NULL, 10);
>>>>>>  	mode = simple_strtoul(argv[4], NULL, 10);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(dev, false);
>>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -789,7 +815,7 @@ static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	bootsize = simple_strtoul(argv[2], NULL, 10);
>>>>>>  	rpmbsize = simple_strtoul(argv[3], NULL, 10);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(dev, false);
>>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -844,7 +870,7 @@ static int do_mmc_partconf(struct cmd_tbl *cmdtp, int flag,
>>>>>>  
>>>>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(dev, false);
>>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -887,7 +913,7 @@ static int do_mmc_rst_func(struct cmd_tbl *cmdtp, int flag,
>>>>>>  		return CMD_RET_USAGE;
>>>>>>  	}
>>>>>>  
>>>>>> -	mmc = init_mmc_device(dev, false);
>>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -939,7 +965,7 @@ static int do_mmc_bkops_enable(struct cmd_tbl *cmdtp, int flag,
>>>>>>  
>>>>>>  	dev = simple_strtoul(argv[1], NULL, 10);
>>>>>>  
>>>>>> -	mmc = init_mmc_device(dev, false);
>>>>>> +	mmc = init_mmc_device(dev, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  
>>>>>> @@ -958,7 +984,7 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag,
>>>>>>  	int err;
>>>>>>  	struct mmc *mmc;
>>>>>>  
>>>>>> -	mmc = init_mmc_device(curr_device, false);
>>>>>> +	mmc = init_mmc_device(curr_device, false, MMC_MODES_END);
>>>>>>  	if (!mmc)
>>>>>>  		return CMD_RET_FAILURE;
>>>>>>  	if (IS_SD(mmc)) {
>>>>>> @@ -983,9 +1009,9 @@ static struct cmd_tbl cmd_mmc[] = {
>>>>>>  #if CONFIG_IS_ENABLED(CMD_MMC_SWRITE)
>>>>>>  	U_BOOT_CMD_MKENT(swrite, 3, 0, do_mmc_sparse_write, "", ""),
>>>>>>  #endif
>>>>>> -	U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, "", ""),
>>>>>> +	U_BOOT_CMD_MKENT(rescan, 2, 1, do_mmc_rescan, "", ""),
>>>>>>  	U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, "", ""),
>>>>>> -	U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, "", ""),
>>>>>> +	U_BOOT_CMD_MKENT(dev, 4, 0, do_mmc_dev, "", ""),
>>>>>>  	U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, "", ""),
>>>>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>>>>  	U_BOOT_CMD_MKENT(hwpartition, 28, 0, do_mmc_hwpartition, "", ""),
>>>>>> @@ -1042,9 +1068,12 @@ U_BOOT_CMD(
>>>>>>  	"mmc swrite addr blk#\n"
>>>>>>  #endif
>>>>>>  	"mmc erase blk# cnt\n"
>>>>>> -	"mmc rescan\n"
>>>>>> +	"mmc rescan [mode]\n"
>>>>>>  	"mmc part - lists available partition on current mmc device\n"
>>>>>> -	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"
>>>>>> +	"mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode\n"
>>>>>> +	"  - the required speed mode is passed as the index from the following list\n"
>>>>>> +	"    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,\n"
>>>>>> +	"    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]\n"
>>>>>>  	"mmc list - lists available devices\n"
>>>>>>  	"mmc wp - power on write protect boot partitions\n"
>>>>>>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
>>>>>> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
>>>>>> index 0e13238c7e7a..66fe8bed984b 100644
>>>>>> --- a/drivers/mmc/mmc-uclass.c
>>>>>> +++ b/drivers/mmc/mmc-uclass.c
>>>>>> @@ -415,6 +415,9 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
>>>>>>  	bdesc->part_type = cfg->part_type;
>>>>>>  	mmc->dev = dev;
>>>>>>  
>>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>>> +	mmc->user_speed_mode = MMC_MODES_END;
>>>>>> +#endif
>>>>>>  	return 0;
>>>>>>  }
>>>>>>  
>>>>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>>>>>> index 8078a89f18cb..b24a45d458d4 100644
>>>>>> --- a/drivers/mmc/mmc.c
>>>>>> +++ b/drivers/mmc/mmc.c
>>>>>> @@ -2863,6 +2863,24 @@ int mmc_start_init(struct mmc *mmc)
>>>>>>  	 */
>>>>>>  	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
>>>>>>  			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
>>>>>> +
>>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>>> +	if (mmc->user_speed_mode != MMC_MODES_END) {
>>>>>> +		int i;
>>>>>> +		/* set host caps */
>>>>>> +		if (mmc->host_caps & MMC_CAP(mmc->user_speed_mode)) {
>>>>>> +			/* Remove all existing speed capabilities */
>>>>>> +			for (i = MMC_LEGACY; i < MMC_MODES_END; i++)
>>>>>> +				mmc->host_caps &= ~MMC_CAP(i);
>>>>>> +			mmc->host_caps |= (MMC_CAP(mmc->user_speed_mode)
>>>>>> +					   | MMC_CAP(MMC_LEGACY) |
>>>>>> +					   MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT);
>>>>>> +		} else {
>>>>>> +			pr_err("bus_mode requested is not supported\n");
>>>>>> +			return -EINVAL;
>>>>>> +		}
>>>>>> +	}
>>>>>> +#endif
>>>>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>>>>  	mmc_deferred_probe(mmc);
>>>>>>  #endif
>>>>>> diff --git a/include/mmc.h b/include/mmc.h
>>>>>> index 0bf19de20e52..e64ef7611dd7 100644
>>>>>> --- a/include/mmc.h
>>>>>> +++ b/include/mmc.h
>>>>>> @@ -726,6 +726,10 @@ struct mmc {
>>>>>>  				  */
>>>>>>  	u32 quirks;
>>>>>>  	u8 hs400_tuning;
>>>>>> +
>>>>>> +#if CONFIG_IS_ENABLED(MMC_SPEED_MODE_SET)
>>>>>> +	enum bus_mode user_speed_mode;
>>>>>> +#endif
>>>>>>  };
>>>>>>  
>>>>>>  #if CONFIG_IS_ENABLED(DM_MMC)
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2021-07-30 10:06 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20210729145609epcas1p2cbcf3ea3b79069f62e54e879390a76fd@epcas1p2.samsung.com>
2021-07-29 14:55 ` [PATCH] mmc: Add support for enumerating MMC card in a given mode using mmc command Aswath Govindraju
2021-07-29 22:30   ` Jaehoon Chung
2021-07-30  5:12     ` Aswath Govindraju
2021-07-30  9:14       ` Jaehoon Chung
2021-07-30  9:20         ` Aswath Govindraju
2021-07-30  9:32           ` Jaehoon Chung
2021-07-30 10:06             ` Aswath Govindraju
2021-07-30  4:47   ` Ashok Reddy Soma
2021-07-30  5:10     ` Aswath Govindraju
2021-07-30  5:21       ` Ashok Reddy Soma

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.