Hi Stephen, On 07/28/2016 06:24 AM, Stephen Warren wrote: > From: Stephen Warren <swar...@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 <swar...@nvidia.com> > Cc: Pantelis Antoniou <pa...@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__); > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot