Message ID | 20221207051909.32126-1-wenchao.chen@unisoc.com |
---|---|
State | New |
Headers | show |
Series | mmc: sdhci-sprd: Disable CLK_AUTO when the clock is less than 400K | expand |
On Wed, 7 Dec 2022 at 06:20, Wenchao Chen <wenchao.chen@unisoc.com> wrote: > > When the clock is less than 400K, some SD cards fail to initialize > because CLK_AUTO is enabled. > > Fixes: fb8bd90f83c4 ("mmc: sdhci-sprd: Add Spreadtrum's initial host controller") > Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com> Applied for next, and by adding a stable tag, thanks! Kind regards Uffe > --- > drivers/mmc/host/sdhci-sprd.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c > index bec3f9e3cd3f..525f979e2a97 100644 > --- a/drivers/mmc/host/sdhci-sprd.c > +++ b/drivers/mmc/host/sdhci-sprd.c > @@ -228,13 +228,15 @@ static inline void _sdhci_sprd_set_clock(struct sdhci_host *host, > div = ((div & 0x300) >> 2) | ((div & 0xFF) << 8); > sdhci_enable_clk(host, div); > > - /* enable auto gate sdhc_enable_auto_gate */ > - val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI); > - mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | > - SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN; > - if (mask != (val & mask)) { > - val |= mask; > - sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI); > + /* Enable CLK_AUTO when the clock is greater than 400K. */ > + if (clk > 400000) { > + val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI); > + mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | > + SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN; > + if (mask != (val & mask)) { > + val |= mask; > + sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI); > + } > } > } > > -- > 2.17.1 >
diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c index bec3f9e3cd3f..525f979e2a97 100644 --- a/drivers/mmc/host/sdhci-sprd.c +++ b/drivers/mmc/host/sdhci-sprd.c @@ -228,13 +228,15 @@ static inline void _sdhci_sprd_set_clock(struct sdhci_host *host, div = ((div & 0x300) >> 2) | ((div & 0xFF) << 8); sdhci_enable_clk(host, div); - /* enable auto gate sdhc_enable_auto_gate */ - val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI); - mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | - SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN; - if (mask != (val & mask)) { - val |= mask; - sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI); + /* Enable CLK_AUTO when the clock is greater than 400K. */ + if (clk > 400000) { + val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI); + mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | + SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN; + if (mask != (val & mask)) { + val |= mask; + sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI); + } } }
When the clock is less than 400K, some SD cards fail to initialize because CLK_AUTO is enabled. Fixes: fb8bd90f83c4 ("mmc: sdhci-sprd: Add Spreadtrum's initial host controller") Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com> --- drivers/mmc/host/sdhci-sprd.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)