FAILED: patch "[PATCH] mmc: sdhci-of-esdhc: make sure delay chain locked for HS400" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 011fde48394b7dc8dfd6660d1013b26a00157b80 Mon Sep 17 00:00:00 2001
From: Yangbo Lu <[email protected]>
Date: Tue, 20 Oct 2020 16:11:16 +0800
Subject: [PATCH] mmc: sdhci-of-esdhc: make sure delay chain locked for HS400
For eMMC HS400 mode initialization, the DLL reset is a required step if DLL is enabled to use previously, like in bootloader. This step has not been documented in reference manual, but the RM will be fixed sooner or later.
This patch is to add the step of DLL reset, and make sure delay chain locked for HS400.
drivers/mmc/host/sdhci-esdhc.h +2 -0
@@ -5,6 +5,7 @@* Copyright (c) 2007 Freescale Semiconductor, Inc. * Copyright (c) 2009 MontaVista Software, Inc. * Copyright (c) 2010 Pengutronix e.K. +* Copyright 2020 NXP * Author: Wolfram Sang <[email protected]> */
@@ -88,6 +89,7 @@/* DLL Config 0 Register */ #define ESDHC_DLLCFG0 0x160#define ESDHC_DLL_ENABLE 0x80000000 +#define ESDHC_DLL_RESET 0x40000000#define ESDHC_DLL_FREQ_SEL 0x08000000/* DLL Config 1 Register */
drivers/mmc/host/sdhci-of-esdhc.c +17 -0
@@ -4,6 +4,7 @@* * Copyright (c) 2007, 2010, 2012 Freescale Semiconductor, Inc. * Copyright (c) 2009 MontaVista Software, Inc. +* Copyright 2020 NXP * * Authors: Xiaobo Xie <[email protected]> * Anton Vorontsov <[email protected]>
@@ -19,6 +20,7 @@#include <linux/clk.h> #include <linux/ktime.h> #include <linux/dma-mapping.h> +#include <linux/iopoll.h> #include <linux/mmc/host.h> #include <linux/mmc/mmc.h> #include "sdhci-pltfm.h"
@@ -743,6 +745,21 @@ static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock)if (host->mmc->actual_clock ==MMC_HS200_MAX_DTR ) temp |=ESDHC_DLL_FREQ_SEL ;sdhci_writel (host, temp,ESDHC_DLLCFG0 ); + + temp |=ESDHC_DLL_RESET ; +sdhci_writel (host, temp,ESDHC_DLLCFG0 ); +udelay (1 ); + temp &= ~ESDHC_DLL_RESET ; +sdhci_writel (host, temp,ESDHC_DLLCFG0 ); + +/* Wait max 20 ms */ +if (read_poll_timeout (sdhci_readl, temp, + temp &ESDHC_DLL_STS_SLV_LOCK , +10 ,20000 , false, + host,ESDHC_DLLSTAT0 )) +pr_err ("%s: timeout for delay chain lock.\n" , +mmc_hostname (host->mmc)); + temp =sdhci_readl (host,ESDHC_TBCTL );sdhci_writel (host, temp |ESDHC_HS400_WNDW_ADJUST ,ESDHC_TBCTL );