[Letux-kernel] X1600 / LX16 support - here: adding MMC
Paul Boddie
paul at boddie.org.uk
Sun Feb 11 00:44:21 CET 2024
On Saturday, 10 February 2024 14:58:45 CET H. Nikolaus Schaller wrote:
>
> So someone calls jz4740_mmc_clock_disable() after doing jz4740_mmc_reset()
> and that resets the IS_RESETTING flag.
>
> But what does that exactly mean?
>
> BTW: clock_disable loops until JZ_MMC_STATUS_CLK_EN is 0.
> But it already is...
As I noted before, the U-Boot code for setting up the MMC/SD controller on the
X1600 and other newer SoCs doesn't test IS_RESETTING. Here it is slightly
reformatted:
#if defined(CONFIG_M200) || defined(CONFIG_X1000) || defined(CONFIG_X1630) \
|| defined(CONFIG_X1830) || defined(CONFIG_X1800) \
|| defined(CONFIG_X1520) || defined(CONFIG_T31) \
|| defined(CONFIG_X1021) || defined(CONFIG_X1521) \
|| defined(CONFIG_X1600)
int tmp;
tmp = jz_mmc_readl(priv, MSC_STRPCL);
tmp &= ~MSC_STRPCL_RESET;
jz_mmc_writel(tmp, priv, MSC_STRPCL);
#else
while (jz_mmc_readl(priv, MSC_STAT) & MSC_STAT_IS_RESETTING);
#endif
So, I imagine that the hardware behaviour changed after the JZ4780. I can
confirm that the above trick gets past the resetting obstacle. It seems likely
that such a workaround might be necessary, and it is hardly worse than the
ubiquitous timeout loops in all the Linux drivers.
I have also spent a lot of time trying to get the peripheral to work
independently of Linux and U-Boot, as previously noted, including much time
trying to get data transfer to work. I aim to apply some of the lessons from
this activity to the Linux driver.
Other things that will be checked include the clock support, where I didn't
manage to finish off the divider computation, and any pinctrl anomalies. My
parallel development efforts should be able to inform these areas because I am
quite able to configure the clocks and utilise a range of peripherals given my
own understanding of the hardware.
Hopefully, I will be able to look into this tomorrow.
Paul
More information about the Letux-kernel
mailing list