Hi Uffe, > -----Original Message----- > From: Ulf Hansson [mailto:ulf.hansson@xxxxxxxxxx] > Sent: 2017年11月16日 15:34 > To: Yinbo Zhu <yinbo.zhu@xxxxxxx> > Cc: Adrian Hunter <adrian.hunter@xxxxxxxxx>; Y.b. Lu <yangbo.lu@xxxxxxx>; > linux-mmc@xxxxxxxxxxxxxxx > Subject: Re: [PATCH v1] mmc: sdhci-of-esdhc: Workaround for reducing the > maximum speed on ls1021atwr > > On 15 November 2017 at 10:01, <yinbo.zhu@xxxxxxx> wrote: > > From: "yinbo.zhu" <yinbo.zhu@xxxxxxx> > > > > In SDHC high speed AC timing, the tshivkh parameter is defined as > > input setup times:SDHC_CMD, SDHC_DATx, to SDHC_CLK. The value of the > > tshivkh should be 2.5 ns considering the round trip delay, board/data > > skew. > > However, because of this erratum, it needs at least 4.1 ns. > > > > eSDHC cannot run at the maximum clock speed for the high speed mode, > > or there is a limit on the length of the trace on the board for data, > > command, and clock lines of the SDHC. > > > > Signed-off-by: yinbo.zhu <yinbo.zhu@xxxxxxx> > > --- > > drivers/mmc/host/sdhci-of-esdhc.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/drivers/mmc/host/sdhci-of-esdhc.c > > b/drivers/mmc/host/sdhci-of-esdhc.c > > index 023c24bd0d94..2744dd58a573 100644 > > --- a/drivers/mmc/host/sdhci-of-esdhc.c > > +++ b/drivers/mmc/host/sdhci-of-esdhc.c > > @@ -498,6 +498,12 @@ static void esdhc_of_set_clock(struct sdhci_host > *host, unsigned int clock) > > clock -= 5000000; > > } > > > > + /* Workaround to reduce the clock frequency for ls1021a esdhc */ > > + if (of_find_compatible_node(NULL, NULL, "fsl,ls1021a-esdhc")) > > + { > > It's better to use the ->data pointer in the struct of_device_id for this kind of > variant data. > > In ->probe() you then call of_match_device() and pick up the ->data pointer > and assign it to your driver private data. > > Many drivers already do like this. Have a look at dw_mmc-exynos.c for > example. > [Y.b. Lu] How about using soc_device_match()? There is also .data member could be used in soc_device_attribute structure. Use soc_device_match() in esdhc_init and get .data information into sdhci_esdhc structure which is private data. Current incorrect host version register value fix-up for some platforms is using this method. Thanks a lot:) > > + if (clock == 50000000) > > + clock = 46500000; > > + } > > + > > temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); > > temp &= ~(ESDHC_CLOCK_SDCLKEN | ESDHC_CLOCK_IPGEN | > ESDHC_CLOCK_HCKEN | > > ESDHC_CLOCK_PEREN | ESDHC_CLOCK_MASK); > > Kind regards > Uffe ��.n��������+%������w��{.n�����{��i��)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥