Hi, Adrian On Wed, Apr 12, 2023 at 9:10 PM Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > > On 31/03/23 13:55, Victor Shih wrote: > > Sdhci_uhs2_reset() does a UHS-II specific reset operation. > > > > Signed-off-by: Ben Chuang <ben.chuang@xxxxxxxxxxxxxxxxxxx> > > Signed-off-by: AKASHI Takahiro <takahiro.akashi@xxxxxxxxxx> > > Signed-off-by: Victor Shih <victor.shih@xxxxxxxxxxxxxxxxxxx> > > --- > > drivers/mmc/host/sdhci-uhs2.c | 46 +++++++++++++++++++++++++++++++++++ > > drivers/mmc/host/sdhci-uhs2.h | 2 ++ > > 2 files changed, 48 insertions(+) > > > > diff --git a/drivers/mmc/host/sdhci-uhs2.c b/drivers/mmc/host/sdhci-uhs2.c > > index 524d7cb6f2fd..67621eaabafc 100644 > > --- a/drivers/mmc/host/sdhci-uhs2.c > > +++ b/drivers/mmc/host/sdhci-uhs2.c > > @@ -10,7 +10,9 @@ > > * Author: AKASHI Takahiro <takahiro.akashi@xxxxxxxxxx> > > */ > > > > +#include <linux/delay.h> > > #include <linux/module.h> > > +#include <linux/iopoll.h> > > > > #include "sdhci.h" > > #include "sdhci-uhs2.h" > > @@ -49,6 +51,50 @@ void sdhci_uhs2_dump_regs(struct sdhci_host *host) > > } > > EXPORT_SYMBOL_GPL(sdhci_uhs2_dump_regs); > > > > +/*****************************************************************************\ > > + * * > > + * Low level functions * > > + * * > > +\*****************************************************************************/ > > + > > +bool sdhci_uhs2_mode(struct sdhci_host *host) > > +{ > > + return host->mmc->flags & MMC_UHS2_SUPPORT; > > +} > > + > > +/** > > + * sdhci_uhs2_reset - invoke SW reset > > + * @host: SDHCI host > > + * @mask: Control mask > > + * > > + * Invoke SW reset, depending on a bit in @mask and wait for completion. > > + */ > > +void sdhci_uhs2_reset(struct sdhci_host *host, u16 mask) > > +{ > > + unsigned long timeout; > > + u32 val; > > + > > + sdhci_writew(host, mask, SDHCI_UHS2_SW_RESET); > > + > > + if (mask & SDHCI_UHS2_SW_RESET_FULL) > > + host->clock = 0; > > + > > + /* Wait max 100 ms */ > > + timeout = 100000; > > + > > + /* hw clears the bit when it's done */ > > + if (read_poll_timeout_atomic(sdhci_readw, val, !(val & mask), 10, > > + timeout, true, host, SDHCI_UHS2_SW_RESET)) { > > + pr_err("%s: %s: Reset 0x%x never completed.\n", > > + __func__, mmc_hostname(host->mmc), (int)mask); > > CHECK: Alignment should match open parenthesis > #70: FILE: drivers/mmc/host/sdhci-uhs2.c:89: > + pr_err("%s: %s: Reset 0x%x never completed.\n", > + __func__, mmc_hostname(host->mmc), (int)mask); > I will fix it in the V8 version. > > + pr_err("%s: clean reset bit\n", > > + mmc_hostname(host->mmc)); > > Line wrap not needed > I will update it to the V8 version. > > + sdhci_writeb(host, 0, SDHCI_UHS2_SW_RESET); > > + return; > > + } > > +} > > +EXPORT_SYMBOL_GPL(sdhci_uhs2_reset); > > + > > /*****************************************************************************\ > > * * > > * Driver init/exit * > > diff --git a/drivers/mmc/host/sdhci-uhs2.h b/drivers/mmc/host/sdhci-uhs2.h > > index e948119348da..6834893eee85 100644 > > --- a/drivers/mmc/host/sdhci-uhs2.h > > +++ b/drivers/mmc/host/sdhci-uhs2.h > > @@ -178,5 +178,7 @@ > > struct sdhci_host; > > > > void sdhci_uhs2_dump_regs(struct sdhci_host *host); > > +bool sdhci_uhs2_mode(struct sdhci_host *host); > > +void sdhci_uhs2_reset(struct sdhci_host *host, u16 mask); > > > > #endif /* __SDHCI_UHS2_H */ > Thanks, Victor Shih