On Thu, Nov 09, 2017 at 06:08:30PM +0100, Oleksij Rempel wrote: > Am 09.11.2017 um 11:04 schrieb Sascha Hauer: > > On Wed, Nov 08, 2017 at 04:33:08PM +0100, Oleksij Rempel wrote: > >> this part of code is executed at least 4 times in eMMC probe sequence. > >> Optimizing it is reducing 20-30 msec of boot time. > >> > >> Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx> > >> --- > >> drivers/mci/imx-esdhc.c | 14 ++++++++++---- > >> 1 file changed, 10 insertions(+), 4 deletions(-) > >> > >> diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c > >> index 141d715c90..5c2a3a36e3 100644 > >> --- a/drivers/mci/imx-esdhc.c > >> +++ b/drivers/mci/imx-esdhc.c > >> @@ -95,6 +95,7 @@ struct fsl_esdhc_host { > >> struct device_d *dev; > >> struct clk *clk; > >> const struct esdhc_soc_data *socdata; > >> + u32 last_clock; > >> }; > >> > >> #define to_fsl_esdhc(mci) container_of(mci, struct fsl_esdhc_host, mci) > >> @@ -408,7 +409,7 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data) > >> > >> static void set_sysctl(struct mci_host *mci, u32 clock) > >> { > >> - int div, pre_div; > >> + int div, pre_div, i; > >> struct fsl_esdhc_host *host = to_fsl_esdhc(mci); > >> void __iomem *regs = host->regs; > >> int sdhc_clk = clk_get_rate(host->clk); > >> @@ -453,13 +454,17 @@ static void set_sysctl(struct mci_host *mci, u32 clock) > >> esdhc_clrsetbits32(regs + SDHCI_CLOCK_CONTROL__TIMEOUT_CONTROL__SOFTWARE_RESET, > >> SYSCTL_CLOCK_MASK, clk); > >> > >> - wait_on_timeout(10 * MSECOND, > >> - !(esdhc_read32(regs + SDHCI_PRESENT_STATE) & PRSSTAT_SDSTB)); > >> + for (i = 0; i < 1000; i++) { > >> + if (esdhc_read32(regs + SDHCI_PRESENT_STATE) & PRSSTAT_SDSTB) > >> + break; > >> + udelay(10); > >> + } > > > > I hope this hunk doesn't make anything better. If yes, we have a > > problem. > > this is the part which need most of the time. Some times it will pass > immediately or will take exactly 10ms. Most likely because the condition is the wrong way round. wait_on_timeout() waits for the condition to become true. We want to wait until the PRSSTAT_SDSTB bit is set, so it should be: wait_on_timeout(10 * MSECOND, esdhc_read32(regs + SDHCI_PRESENT_STATE) & PRSSTAT_SDSTB); /me looks git blame ... Damn, me! Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox