diff mbox

[U-Boot,v3,31/54] mmc: Support bypass mode with the get_mmc_clk() method

Message ID 1435095556-15924-32-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass June 23, 2015, 9:38 p.m. UTC
Some SoCs want to adjust the input clock to the DWMMC block as a way of
controlling the MMC bus clock. Update the get_mmc_clk() method to support
this.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v3: None
Changes in v2: None

 drivers/mmc/dw_mmc.c        |  2 +-
 drivers/mmc/exynos_dw_mmc.c |  2 +-
 include/dwmmc.h             | 16 +++++++++++++++-
 3 files changed, 17 insertions(+), 3 deletions(-)

Comments

Chen-Yu Tsai June 24, 2015, 1:50 a.m. UTC | #1
Hi,

On Wed, Jun 24, 2015 at 5:38 AM, Simon Glass <sjg@chromium.org> wrote:
> Some SoCs want to adjust the input clock to the DWMMC block as a way of
> controlling the MMC bus clock. Update the get_mmc_clk() method to support
> this.

The subject line should probably reflect this is a DWMMC only patch?
There are systems that have MMC and don't use the DWMMC controller.

ChenYu

> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v3: None
> Changes in v2: None
>
>  drivers/mmc/dw_mmc.c        |  2 +-
>  drivers/mmc/exynos_dw_mmc.c |  2 +-
>  include/dwmmc.h             | 16 +++++++++++++++-
>  3 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
> index 8f28d7e..a034c3f 100644
> --- a/drivers/mmc/dw_mmc.c
> +++ b/drivers/mmc/dw_mmc.c
> @@ -248,7 +248,7 @@ static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
>          * host->bus_hz should be set by user.
>          */
>         if (host->get_mmc_clk)
> -               sclk = host->get_mmc_clk(host);
> +               sclk = host->get_mmc_clk(host, freq);
>         else if (host->bus_hz)
>                 sclk = host->bus_hz;
>         else {
> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c
> index e083745..3f702ba 100644
> --- a/drivers/mmc/exynos_dw_mmc.c
> +++ b/drivers/mmc/exynos_dw_mmc.c
> @@ -39,7 +39,7 @@ static void exynos_dwmci_clksel(struct dwmci_host *host)
>         dwmci_writel(host, DWMCI_CLKSEL, priv->sdr_timing);
>  }
>
> -unsigned int exynos_dwmci_get_clk(struct dwmci_host *host)
> +unsigned int exynos_dwmci_get_clk(struct dwmci_host *host, uint freq)
>  {
>         unsigned long sclk;
>         int8_t clk_div;
> diff --git a/include/dwmmc.h b/include/dwmmc.h
> index 7a7555a..25cf42c 100644
> --- a/include/dwmmc.h
> +++ b/include/dwmmc.h
> @@ -163,7 +163,21 @@ struct dwmci_host {
>
>         void (*clksel)(struct dwmci_host *host);
>         void (*board_init)(struct dwmci_host *host);
> -       unsigned int (*get_mmc_clk)(struct dwmci_host *host);
> +
> +       /**
> +        * Get / set a particular MMC clock frequency
> +        *
> +        * This is used to request the current clock frequency of the clock
> +        * that drives the DWMMC peripheral. The caller will then use this
> +        * information to work out the divider it needs to achieve the
> +        * required MMC bus clock frequency. If you want to handle the
> +        * clock external to DWMMC, use @freq to select the frequency and
> +        * return that value too. Then DWMMC will put itself in bypass mode.
> +        *
> +        * @host:       DWMMC host
> +        * @freq:       Frequency the host is trying to achieve
> +        */
> +       unsigned int (*get_mmc_clk)(struct dwmci_host *host, uint freq);
>
>         struct mmc_config cfg;
>  };
> --
> 2.4.3.573.g4eafbef
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Jaehoon Chung June 25, 2015, 1:58 a.m. UTC | #2
Hi, Simon.

On 06/24/2015 06:38 AM, Simon Glass wrote:
> Some SoCs want to adjust the input clock to the DWMMC block as a way of
> controlling the MMC bus clock. Update the get_mmc_clk() method to support
> this.

I didn't see your other patches.
But i don't know this patch's purpose.
I think that @freq usage seems like host->bus_hz ("bus_hz" property), doesn't it?

Best Regards,
Jaehoon Chung

> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
> Changes in v3: None
> Changes in v2: None
> 
>  drivers/mmc/dw_mmc.c        |  2 +-
>  drivers/mmc/exynos_dw_mmc.c |  2 +-
>  include/dwmmc.h             | 16 +++++++++++++++-
>  3 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
> index 8f28d7e..a034c3f 100644
> --- a/drivers/mmc/dw_mmc.c
> +++ b/drivers/mmc/dw_mmc.c
> @@ -248,7 +248,7 @@ static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
>  	 * host->bus_hz should be set by user.
>  	 */
>  	if (host->get_mmc_clk)
> -		sclk = host->get_mmc_clk(host);
> +		sclk = host->get_mmc_clk(host, freq);
>  	else if (host->bus_hz)
>  		sclk = host->bus_hz;
>  	else {
> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c
> index e083745..3f702ba 100644
> --- a/drivers/mmc/exynos_dw_mmc.c
> +++ b/drivers/mmc/exynos_dw_mmc.c
> @@ -39,7 +39,7 @@ static void exynos_dwmci_clksel(struct dwmci_host *host)
>  	dwmci_writel(host, DWMCI_CLKSEL, priv->sdr_timing);
>  }
>  
> -unsigned int exynos_dwmci_get_clk(struct dwmci_host *host)
> +unsigned int exynos_dwmci_get_clk(struct dwmci_host *host, uint freq)
>  {
>  	unsigned long sclk;
>  	int8_t clk_div;
> diff --git a/include/dwmmc.h b/include/dwmmc.h
> index 7a7555a..25cf42c 100644
> --- a/include/dwmmc.h
> +++ b/include/dwmmc.h
> @@ -163,7 +163,21 @@ struct dwmci_host {
>  
>  	void (*clksel)(struct dwmci_host *host);
>  	void (*board_init)(struct dwmci_host *host);
> -	unsigned int (*get_mmc_clk)(struct dwmci_host *host);
> +
> +	/**
> +	 * Get / set a particular MMC clock frequency
> +	 *
> +	 * This is used to request the current clock frequency of the clock
> +	 * that drives the DWMMC peripheral. The caller will then use this
> +	 * information to work out the divider it needs to achieve the
> +	 * required MMC bus clock frequency. If you want to handle the
> +	 * clock external to DWMMC, use @freq to select the frequency and
> +	 * return that value too. Then DWMMC will put itself in bypass mode.
> +	 *
> +	 * @host:	DWMMC host
> +	 * @freq:	Frequency the host is trying to achieve
> +	 */
> +	unsigned int (*get_mmc_clk)(struct dwmci_host *host, uint freq);
>  
>  	struct mmc_config cfg;
>  };
>
diff mbox

Patch

diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
index 8f28d7e..a034c3f 100644
--- a/drivers/mmc/dw_mmc.c
+++ b/drivers/mmc/dw_mmc.c
@@ -248,7 +248,7 @@  static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
 	 * host->bus_hz should be set by user.
 	 */
 	if (host->get_mmc_clk)
-		sclk = host->get_mmc_clk(host);
+		sclk = host->get_mmc_clk(host, freq);
 	else if (host->bus_hz)
 		sclk = host->bus_hz;
 	else {
diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c
index e083745..3f702ba 100644
--- a/drivers/mmc/exynos_dw_mmc.c
+++ b/drivers/mmc/exynos_dw_mmc.c
@@ -39,7 +39,7 @@  static void exynos_dwmci_clksel(struct dwmci_host *host)
 	dwmci_writel(host, DWMCI_CLKSEL, priv->sdr_timing);
 }
 
-unsigned int exynos_dwmci_get_clk(struct dwmci_host *host)
+unsigned int exynos_dwmci_get_clk(struct dwmci_host *host, uint freq)
 {
 	unsigned long sclk;
 	int8_t clk_div;
diff --git a/include/dwmmc.h b/include/dwmmc.h
index 7a7555a..25cf42c 100644
--- a/include/dwmmc.h
+++ b/include/dwmmc.h
@@ -163,7 +163,21 @@  struct dwmci_host {
 
 	void (*clksel)(struct dwmci_host *host);
 	void (*board_init)(struct dwmci_host *host);
-	unsigned int (*get_mmc_clk)(struct dwmci_host *host);
+
+	/**
+	 * Get / set a particular MMC clock frequency
+	 *
+	 * This is used to request the current clock frequency of the clock
+	 * that drives the DWMMC peripheral. The caller will then use this
+	 * information to work out the divider it needs to achieve the
+	 * required MMC bus clock frequency. If you want to handle the
+	 * clock external to DWMMC, use @freq to select the frequency and
+	 * return that value too. Then DWMMC will put itself in bypass mode.
+	 *
+	 * @host:	DWMMC host
+	 * @freq:	Frequency the host is trying to achieve
+	 */
+	unsigned int (*get_mmc_clk)(struct dwmci_host *host, uint freq);
 
 	struct mmc_config cfg;
 };