[U-Boot] [PATCH 8/9] mmc: tegra: port to standard clock/reset APIs
Jaehoon Chung
jh80.chung at samsung.com
Thu Jul 28 03:09:30 CEST 2016
Hi Stephen,
On 07/28/2016 06:24 AM, Stephen Warren wrote:
> From: Stephen Warren <swarren at nvidia.com>
>
> Tegra186 supports the new standard clock and reset APIs. Older Tegra SoCs
> still use custom APIs. Enhance the Tegra MMC driver so that it can operate
> with either set of APIs.
>
> Signed-off-by: Stephen Warren <swarren at nvidia.com>
> Cc: Pantelis Antoniou <panto at antoniou-consulting.com>
> ---
> arch/arm/include/asm/arch-tegra/tegra_mmc.h | 8 ++++-
> drivers/mmc/tegra_mmc.c | 55 ++++++++++++++++++++++++-----
> 2 files changed, 53 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-tegra/tegra_mmc.h b/arch/arm/include/asm/arch-tegra/tegra_mmc.h
> index 75e56c4ea786..07ef4c04c858 100644
> --- a/arch/arm/include/asm/arch-tegra/tegra_mmc.h
> +++ b/arch/arm/include/asm/arch-tegra/tegra_mmc.h
> @@ -9,6 +9,9 @@
> #ifndef __TEGRA_MMC_H_
> #define __TEGRA_MMC_H_
>
> +#include <common.h>
> +#include <clk.h>
> +#include <reset.h>
> #include <fdtdec.h>
> #include <asm/gpio.h>
>
> @@ -134,7 +137,10 @@ struct mmc_host {
> int id; /* device id/number, 0-3 */
> int enabled; /* 1 to enable, 0 to disable */
> int width; /* Bus Width, 1, 4 or 8 */
> -#ifndef CONFIG_TEGRA186
> +#ifdef CONFIG_TEGRA186
> + struct reset_ctl reset_ctl;
> + struct clk clk;
> +#else
> enum periph_id mmc_id; /* Peripheral ID: PERIPH_ID_... */
> #endif
> struct gpio_desc cd_gpio; /* Change Detect GPIO */
> diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c
> index c9d9432e5e87..b27ca635ac50 100644
> --- a/drivers/mmc/tegra_mmc.c
> +++ b/drivers/mmc/tegra_mmc.c
> @@ -9,6 +9,7 @@
>
> #include <bouncebuf.h>
> #include <common.h>
> +#include <dm/device.h>
> #include <asm/gpio.h>
> #include <asm/io.h>
> #ifndef CONFIG_TEGRA186
> @@ -359,11 +360,14 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
> */
> if (clock == 0)
> goto out;
> -#ifndef CONFIG_TEGRA186
> +#ifdef CONFIG_TEGRA186
> + {
> + ulong rate = clk_set_rate(&host->clk, clock);
> + div = (rate + clock - 1) / clock;
> + }
It seems that doesn't need to add the bracket.
> +#else
> clock_adjust_periph_pll_div(host->mmc_id, CLOCK_ID_PERIPH, clock,
> &div);
> -#else
> - div = (20000000 + clock - 1) / clock;
> #endif
> debug("div = %d\n", div);
>
> @@ -538,6 +542,9 @@ static int do_mmc_init(int dev_index, bool removable)
> {
> struct mmc_host *host;
> struct mmc *mmc;
> +#ifdef CONFIG_TEGRA186
> + int ret;
> +#endif
>
> /* DT should have been read & host config filled in */
> host = &mmc_host[dev_index];
> @@ -549,7 +556,21 @@ static int do_mmc_init(int dev_index, bool removable)
> gpio_get_number(&host->cd_gpio));
>
> host->clock = 0;
> -#ifndef CONFIG_TEGRA186
> +
> +#ifdef CONFIG_TEGRA186
> + ret = reset_assert(&host->reset_ctl);
> + if (ret)
> + return ret;
> + ret = clk_enable(&host->clk);
> + if (ret)
> + return ret;
> + ret = clk_set_rate(&host->clk, 20000000);
> + if (IS_ERR_VALUE(ret))
> + return ret;
> + ret = reset_deassert(&host->reset_ctl);
> + if (ret)
> + return ret;
> +#else
> clock_start_periph_pll(host->mmc_id, CLOCK_ID_PERIPH, 20000000);
> #endif
>
> @@ -576,11 +597,7 @@ static int do_mmc_init(int dev_index, bool removable)
> * (actually 52MHz)
> */
> host->cfg.f_min = 375000;
> -#ifndef CONFIG_TEGRA186
> host->cfg.f_max = 48000000;
> -#else
> - host->cfg.f_max = 375000;
> -#endif
>
> host->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
>
> @@ -612,7 +629,27 @@ static int mmc_get_config(const void *blob, int node, struct mmc_host *host,
> return -FDT_ERR_NOTFOUND;
> }
>
> -#ifndef CONFIG_TEGRA186
> +#ifdef CONFIG_TEGRA186
> + {
> + /*
> + * FIXME: This variable should go away when the MMC device
> + * actually is a udevice.
> + */
> + struct udevice dev;
> + int ret;
> + dev.of_offset = node;
> + ret = reset_get_by_name(&dev, "sdmmc", &host->reset_ctl);
> + if (ret) {
> + debug("reset_get_by_index() failed: %d\n", ret);
> + return ret;
> + }
> + ret = clk_get_by_name(&dev, "sdmmc", &host->clk);
> + if (ret) {
> + debug("clk_get_by_index() failed: %d\n", ret);
> + return ret;
> + }
> + }
Ditto.
Best Regards,
Jaehoon Chung
> +#else
> host->mmc_id = clock_decode_periph_id(blob, node);
> if (host->mmc_id == PERIPH_ID_NONE) {
> debug("%s: could not decode periph id\n", __func__);
>
More information about the U-Boot
mailing list