From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Date: Thu, 28 Jul 2016 10:09:30 +0900 Subject: [U-Boot] [PATCH 8/9] mmc: tegra: port to standard clock/reset APIs In-Reply-To: <20160727212457.20038-8-swarren@wwwdotorg.org> References: <20160727212457.20038-1-swarren@wwwdotorg.org> <20160727212457.20038-8-swarren@wwwdotorg.org> Message-ID: <57995B4A.3070207@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Stephen, On 07/28/2016 06:24 AM, Stephen Warren wrote: > From: Stephen Warren > > 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 > Cc: Pantelis Antoniou > --- > 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 > +#include > +#include > #include > #include > > @@ -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 > #include > +#include > #include > #include > #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__); >