public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Thierry Reding <thierry.reding@gmail.com>
To: Svyatoslav Ryhel <clamor95@gmail.com>
Cc: Thierry Reding <treding@nvidia.com>, Peng Fan <peng.fan@nxp.com>,
	Jaehoon Chung <jh80.chung@samsung.com>,
	u-boot@lists.denx.de
Subject: Re: [PATCH v1 1/1] mmc: tegra: get default-tap and default-trim from device tree
Date: Thu, 24 Aug 2023 15:30:18 +0200	[thread overview]
Message-ID: <ZOdbaul2TQ4CwndZ@orome> (raw)
In-Reply-To: <E8D9B66C-E23C-4359-928F-D510C8D4AF22@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 4797 bytes --]

On Wed, Aug 23, 2023 at 03:02:42PM +0300, Svyatoslav Ryhel wrote:
> 
> 
> 23 серпня 2023 р. 14:03:25 GMT+03:00, Thierry Reding <thierry.reding@gmail.com> написав(-ла):
> >On Sat, Aug 19, 2023 at 06:35:01PM +0300, Svyatoslav Ryhel wrote:
> >> Default-tap and default-trim values are used for eMMC setup
> >> mostly on T114+ devices. As for now, those values are hardcoded
> >> for T210 and ignored for all other Tegra generations. Fix this
> >> by passing tap and trim values from dts.
> >> 
> >> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # ASUS TF701T
> >> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> >> ---
> >>  arch/arm/include/asm/arch-tegra/tegra_mmc.h | 17 ++++----
> >>  drivers/mmc/tegra_mmc.c                     | 46 ++++++++++-----------
> >>  2 files changed, 30 insertions(+), 33 deletions(-)
> >> 
> >> diff --git a/arch/arm/include/asm/arch-tegra/tegra_mmc.h b/arch/arm/include/asm/arch-tegra/tegra_mmc.h
> >> index d6a55764ba..750c7d809e 100644
> >> --- a/arch/arm/include/asm/arch-tegra/tegra_mmc.h
> >> +++ b/arch/arm/include/asm/arch-tegra/tegra_mmc.h
> >> @@ -128,21 +128,22 @@ struct tegra_mmc {
> >>  
> >>  /* SDMMC1/3 settings from SDMMCx Initialization Sequence of TRM */
> >>  #define MEMCOMP_PADCTRL_VREF	7
> >> -#define AUTO_CAL_ENABLE		(1 << 29)
> >> -#define AUTO_CAL_ACTIVE		(1 << 31)
> >> -#define AUTO_CAL_START		(1 << 31)
> >> +#define AUTO_CAL_ENABLE		BIT(29)
> >> +#define AUTO_CAL_ACTIVE		BIT(31)
> >> +#define AUTO_CAL_START		BIT(31)
> >> +
> >>  #if defined(CONFIG_TEGRA210)
> >>  #define AUTO_CAL_PD_OFFSET	(0x7D << 8)
> >>  #define AUTO_CAL_PU_OFFSET	(0 << 0)
> >> -#define IO_TRIM_BYPASS_MASK	(1 << 2)
> >> -#define TRIM_VAL_SHIFT		24
> >> -#define TRIM_VAL_MASK		(0x1F << TRIM_VAL_SHIFT)
> >> -#define TAP_VAL_SHIFT		16
> >> -#define TAP_VAL_MASK		(0xFF << TAP_VAL_SHIFT)
> >>  #else
> >>  #define AUTO_CAL_PD_OFFSET	(0x70 << 8)
> >>  #define AUTO_CAL_PU_OFFSET	(0x62 << 0)
> >>  #endif
> >>  
> >> +#define TRIM_VAL_SHIFT		24
> >> +#define TRIM_VAL_MASK		(0x1F << TRIM_VAL_SHIFT)
> >> +#define TAP_VAL_SHIFT		16
> >> +#define TAP_VAL_MASK		(0xFF << TAP_VAL_SHIFT)
> >> +
> >>  #endif	/* __ASSEMBLY__ */
> >>  #endif	/* __TEGRA_MMC_H_ */
> >> diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c
> >> index f76fee3ea0..7627800261 100644
> >> --- a/drivers/mmc/tegra_mmc.c
> >> +++ b/drivers/mmc/tegra_mmc.c
> >> @@ -37,6 +37,9 @@ struct tegra_mmc_priv {
> >>  	unsigned int version;	/* SDHCI spec. version */
> >>  	unsigned int clock;	/* Current clock (MHz) */
> >>  	int mmc_id;		/* peripheral id */
> >> +
> >> +	u32 tap_value;
> >> +	u32 trim_value;
> >>  };
> >>  
> >>  static void tegra_mmc_set_power(struct tegra_mmc_priv *priv,
> >> @@ -526,31 +529,6 @@ static void tegra_mmc_pad_init(struct tegra_mmc_priv *priv)
> >>  		printf("%s: Warning: Autocal timed out!\n", __func__);
> >>  		/* TBD: Set CFG2TMC_SDMMC1_PAD_CAL_DRV* regs here */
> >>  	}
> >> -
> >> -#if defined(CONFIG_TEGRA210)
> >> -	u32 tap_value, trim_value;
> >> -
> >> -	/* Set tap/trim values for SDMMC1/3 @ <48MHz here */
> >> -	val = readl(&priv->reg->venspictl);	/* aka VENDOR_SYS_SW_CNTL */
> >> -	val &= IO_TRIM_BYPASS_MASK;
> >> -	if (id == PERIPH_ID_SDMMC1) {
> >> -		tap_value = 4;			/* default */
> >> -		if (val)
> >> -			tap_value = 3;
> >> -		trim_value = 2;
> >> -	} else {				/* SDMMC3 */
> >> -		tap_value = 3;
> >> -		trim_value = 3;
> >> -	}
> >> -
> >> -	val = readl(&priv->reg->venclkctl);
> >> -	val &= ~TRIM_VAL_MASK;
> >> -	val |= (trim_value << TRIM_VAL_SHIFT);
> >> -	val &= ~TAP_VAL_MASK;
> >> -	val |= (tap_value << TAP_VAL_SHIFT);
> >> -	writel(val, &priv->reg->venclkctl);
> >> -	debug("%s: VENDOR_CLOCK_CNTRL = 0x%08X\n", __func__, val);
> >> -#endif	/* T210 */
> >>  #endif	/* T30/T210 */
> >>  }
> >>  
> >> @@ -588,6 +566,21 @@ static void tegra_mmc_reset(struct tegra_mmc_priv *priv, struct mmc *mmc)
> >>  
> >>  	/* Make sure SDIO pads are set up */
> >>  	tegra_mmc_pad_init(priv);
> >> +
> >> +	if (priv->tap_value || priv->trim_value) {
> >
> >I think 0 is a valid value for both tap and trim, so you want to be able
> >to write that. I suggest getting rid of the conditional and always
> >writing these values and rely on defaults to make sure that a good value
> >is always programmed.
> >
> >Alternatively if you really only want to program these when they've been
> >specified, use an extra variable (or something like -1 as a default
> >value) to discriminate.
> 
> I may propose a compromise. Do not set default value at all and when time comes just check if tap or trim is not error.

Yes, that's essentially a variant of the second option and it should
work.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2023-08-24 13:30 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-19 15:35 [PATCH v1 0/1] tegra_mmc: get tap and trim from dts Svyatoslav Ryhel
2023-08-19 15:35 ` [PATCH v1 1/1] mmc: tegra: get default-tap and default-trim from device tree Svyatoslav Ryhel
2023-08-23 11:03   ` Thierry Reding
2023-08-23 11:38     ` Svyatoslav Ryhel
2023-08-24 13:29       ` Thierry Reding
2023-08-24 13:33         ` Svyatoslav Ryhel
2023-08-23 12:02     ` Svyatoslav Ryhel
2023-08-24 13:30       ` Thierry Reding [this message]
2023-08-23 10:53 ` [PATCH v1 0/1] tegra_mmc: get tap and trim from dts Thierry Reding
2023-08-23 11:30   ` Svyatoslav Ryhel
2023-08-24 13:27     ` Thierry Reding
2023-08-24 13:31       ` Svyatoslav Ryhel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZOdbaul2TQ4CwndZ@orome \
    --to=thierry.reding@gmail.com \
    --cc=clamor95@gmail.com \
    --cc=jh80.chung@samsung.com \
    --cc=peng.fan@nxp.com \
    --cc=treding@nvidia.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox