diff mbox series

[3/3] mmc: stm32_sdmmc2: manage vqmmc

Message ID 20220913112346.301480-3-yann.gautier@foss.st.com
State Accepted
Delegated to: Jaehoon Chung
Headers show
Series [1/3] mmc: stm32_sdmmc2: add dual data rate support | expand

Commit Message

Yann Gautier Sept. 13, 2022, 11:23 a.m. UTC
The SDMMC IOs can be in an IO domain, that has to be enabled.
This is done by enabling vqmmc in the driver.
This has no impact on configurations not using an IO domain, the check
can then be executed on all platforms managing regulator, and the vqmmc
regulator enabled on all platforms having it in their DT.

Signed-off-by: Yann Gautier <yann.gautier@foss.st.com>

---
There are 2 checkpatch warnings:
drivers/mmc/stm32_sdmmc2.c:40: warning: Use 'if (IS_ENABLED(CONFIG...))'
 instead of '#if or #ifdef' where possible
drivers/mmc/stm32_sdmmc2.c:580: warning: Use 'if (IS_ENABLED(CONFIG...))'
 instead of '#if or #ifdef' where possible
But this cannot be changed as the vqmmc_supply field in struct mmc is
under flag: #if CONFIG_IS_ENABLED(DM_REGULATOR). For platforms not
enabling this flag there would be a compilation error.

 drivers/mmc/stm32_sdmmc2.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

Jaehoon Chung Oct. 7, 2022, 12:33 p.m. UTC | #1
On 9/13/22 20:23, Yann Gautier wrote:
> The SDMMC IOs can be in an IO domain, that has to be enabled.
> This is done by enabling vqmmc in the driver.
> This has no impact on configurations not using an IO domain, the check
> can then be executed on all platforms managing regulator, and the vqmmc
> regulator enabled on all platforms having it in their DT.
> 
> Signed-off-by: Yann Gautier <yann.gautier@foss.st.com>

Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> 
> ---
> There are 2 checkpatch warnings:
> drivers/mmc/stm32_sdmmc2.c:40: warning: Use 'if (IS_ENABLED(CONFIG...))'
>  instead of '#if or #ifdef' where possible
> drivers/mmc/stm32_sdmmc2.c:580: warning: Use 'if (IS_ENABLED(CONFIG...))'
>  instead of '#if or #ifdef' where possible
> But this cannot be changed as the vqmmc_supply field in struct mmc is
> under flag: #if CONFIG_IS_ENABLED(DM_REGULATOR). For platforms not
> enabling this flag there would be a compilation error.
> 
>  drivers/mmc/stm32_sdmmc2.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/drivers/mmc/stm32_sdmmc2.c b/drivers/mmc/stm32_sdmmc2.c
> index e1240b0cf3..1195134844 100644
> --- a/drivers/mmc/stm32_sdmmc2.c
> +++ b/drivers/mmc/stm32_sdmmc2.c
> @@ -25,6 +25,7 @@
>  #include <asm/io.h>
>  #include <asm/gpio.h>
>  #include <linux/iopoll.h>
> +#include <power/regulator.h>
>  #include <watchdog.h>
>  
>  struct stm32_sdmmc2_plat {
> @@ -36,6 +37,9 @@ struct stm32_sdmmc2_plat {
>  	struct gpio_desc cd_gpio;
>  	u32 clk_reg_msk;
>  	u32 pwr_reg_msk;
> +#if CONFIG_IS_ENABLED(DM_REGULATOR)
> +	bool vqmmc_enabled;
> +#endif
>  };
>  
>  struct stm32_sdmmc2_ctx {
> @@ -572,6 +576,15 @@ static void stm32_sdmmc2_pwron(struct stm32_sdmmc2_plat *plat)
>  	       plat->base + SDMMC_POWER);
>  
>  	/* during the first 74 SDMMC_CK cycles the SDMMC is still disabled. */
> +
> +#if CONFIG_IS_ENABLED(DM_REGULATOR)
> +	if (plat->mmc.vqmmc_supply && !plat->vqmmc_enabled) {
> +		if (regulator_set_enable_if_allowed(plat->mmc.vqmmc_supply, true))
> +			dev_dbg(plat->mmc.dev, "failed to enable vqmmc-supply\n");
> +		else
> +			plat->vqmmc_enabled = true;
> +	}
> +#endif
>  }
>  
>  #define IS_RISING_EDGE(reg) (reg & SDMMC_CLKCR_NEGEDGE ? 0 : 1)
diff mbox series

Patch

diff --git a/drivers/mmc/stm32_sdmmc2.c b/drivers/mmc/stm32_sdmmc2.c
index e1240b0cf3..1195134844 100644
--- a/drivers/mmc/stm32_sdmmc2.c
+++ b/drivers/mmc/stm32_sdmmc2.c
@@ -25,6 +25,7 @@ 
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include <linux/iopoll.h>
+#include <power/regulator.h>
 #include <watchdog.h>
 
 struct stm32_sdmmc2_plat {
@@ -36,6 +37,9 @@  struct stm32_sdmmc2_plat {
 	struct gpio_desc cd_gpio;
 	u32 clk_reg_msk;
 	u32 pwr_reg_msk;
+#if CONFIG_IS_ENABLED(DM_REGULATOR)
+	bool vqmmc_enabled;
+#endif
 };
 
 struct stm32_sdmmc2_ctx {
@@ -572,6 +576,15 @@  static void stm32_sdmmc2_pwron(struct stm32_sdmmc2_plat *plat)
 	       plat->base + SDMMC_POWER);
 
 	/* during the first 74 SDMMC_CK cycles the SDMMC is still disabled. */
+
+#if CONFIG_IS_ENABLED(DM_REGULATOR)
+	if (plat->mmc.vqmmc_supply && !plat->vqmmc_enabled) {
+		if (regulator_set_enable_if_allowed(plat->mmc.vqmmc_supply, true))
+			dev_dbg(plat->mmc.dev, "failed to enable vqmmc-supply\n");
+		else
+			plat->vqmmc_enabled = true;
+	}
+#endif
 }
 
 #define IS_RISING_EDGE(reg) (reg & SDMMC_CLKCR_NEGEDGE ? 0 : 1)