Message ID | 1440429171-2555-5-git-send-email-sjg@chromium.org |
---|---|
State | Superseded |
Delegated to: | Tom Rini |
Headers | show |
Hi, Simon. Acked-by: Jaehoon Chung <jh80.chung@samsung.com> Best Regards, Jaehoon Chung On 08/25/2015 12:12 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. > > Signed-off-by: Simon Glass <sjg@chromium.org> > --- > > Changes in v4: None > 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 77b87e0..1117fed 100644 > --- a/drivers/mmc/dw_mmc.c > +++ b/drivers/mmc/dw_mmc.c > @@ -266,7 +266,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 cde2ba7..863bbb3 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 --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 77b87e0..1117fed 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -266,7 +266,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 cde2ba7..863bbb3 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; };
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 v4: None 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(-)