Message ID | 20250615035803.3752235-1-cool_lee@aspeedtech.com |
---|---|
Headers | show |
Series | Aspeed SDHCI driver workaround and auto tune | expand |
On So, 2025-06-15 at 11:57 +0800, Cool Lee wrote: > Replace sdhci software reset by scu reset from top. > > Signed-off-by: Cool Lee <cool_lee@aspeedtech.com> > --- > drivers/mmc/host/sdhci-of-aspeed.c | 55 +++++++++++++++++++++++++++++- > 1 file changed, 54 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of-aspeed.c > index d6de010551b9..01bc574272eb 100644 > --- a/drivers/mmc/host/sdhci-of-aspeed.c > +++ b/drivers/mmc/host/sdhci-of-aspeed.c > @@ -13,6 +13,7 @@ > #include <linux/of.h> > #include <linux/of_platform.h> > #include <linux/platform_device.h> > +#include <linux/reset.h> > #include <linux/spinlock.h> > > #include "sdhci-pltfm.h" > @@ -39,6 +40,7 @@ > struct aspeed_sdc { > struct clk *clk; > struct resource *res; > + struct reset_control *rst; > > spinlock_t lock; > void __iomem *regs; > @@ -328,13 +330,58 @@ static u32 aspeed_sdhci_readl(struct sdhci_host *host, int reg) > return val; > } > > +static void aspeed_sdhci_reset(struct sdhci_host *host, u8 mask) > +{ > + struct sdhci_pltfm_host *pltfm_priv; > + struct aspeed_sdhci *aspeed_sdhci; > + struct aspeed_sdc *aspeed_sdc; > + u32 save_array[7]; > + u32 reg_array[] = {SDHCI_DMA_ADDRESS, > + SDHCI_BLOCK_SIZE, > + SDHCI_ARGUMENT, > + SDHCI_HOST_CONTROL, > + SDHCI_CLOCK_CONTROL, > + SDHCI_INT_ENABLE, > + SDHCI_SIGNAL_ENABLE}; > + int i; > + u16 tran_mode; > + u32 mmc8_mode; > + > + pltfm_priv = sdhci_priv(host); > + aspeed_sdhci = sdhci_pltfm_priv(pltfm_priv); > + aspeed_sdc = aspeed_sdhci->parent; > + > + if (!IS_ERR(aspeed_sdc->rst)) { > + for (i = 0; i < ARRAY_SIZE(reg_array); i++) > + save_array[i] = sdhci_readl(host, reg_array[i]); > + > + tran_mode = sdhci_readw(host, SDHCI_TRANSFER_MODE); > + mmc8_mode = readl(aspeed_sdc->regs); > + > + reset_control_assert(aspeed_sdc->rst); > + mdelay(1); > + reset_control_deassert(aspeed_sdc->rst); > + mdelay(1); Why are there delays here ... [...] > @@ -535,6 +582,12 @@ static int aspeed_sdc_probe(struct platform_device *pdev) > > spin_lock_init(&sdc->lock); > > + sdc->rst = devm_reset_control_get(&pdev->dev, NULL); > + if (!IS_ERR(sdc->rst)) { > + reset_control_assert(sdc->rst); > + reset_control_deassert(sdc->rst); ... but not here? regards Philipp