[Linux-stm32] [PATCH 00/13] Fix busydetect on Ux500 PL180/MMCI
Yann Gautier
yann.gautier at foss.st.com
Thu Apr 6 09:27:00 UTC 2023
On 4/5/23 08:50, Linus Walleij wrote:
> This series fixes a pretty serious problem in the MMCI
> busy detect handling, discovered only after going up and
> down a ladder of refactorings.
>
> The code is written expecting the Ux500 busy detect
> to fire two interrupts: one at the start of the busy
> signalling and one at the end of the busy signalling.
>
> The root cause of the problem seen on some devices
> is that only the first IRQ arrives, and then the device
> hangs, waiting perpetually for the next IRQ to arrive.
>
> This is eventually solved by adding a timeout using
> a delayed work that fire after 10 ms if the busy detect
> has not stopped at this point. (Other delay spans can
> be suggested.) This is the last patch in the series.
>
> I included the rewrite of the entire busy detect logic
> to use a state machine as this makes it way easier to
> debug and will print messages about other error
> conditions as well.
>
> The problem affects especially the Skomer
> (Samsung GT-I9070) and Kyle (Samsung SGH-I407).
>
> It is fine to just apply this for the -next kernel,
> despite it fixes the busy detect that has been broken
> for these devices for a while, we can think about
> backporting a simpler version of the timeout for
> stable kernels if we want.
>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> Linus Walleij (13):
> mmc: mmci: Only call busy_complete if callback defined
> mmc: mmci: Clear busy_status when starting command
> mmc: mmci: Unwind big if() clause
> mmc: mmci: Stash status while waiting for busy
> mmc: mmci: Break out error check in busy detect
> mmc: mmci: Make busy complete state machine explicit
> mmc: mmci: Retry the busy start condition
> mmc: mmci: Use state machine state as exit condition
> mmc: mmci: Use a switch statement machine
> mmc: mmci: Break out a helper function
> mmc: mmci: mmci_card_busy() from state machine
> mmc: mmci: Drop end IRQ from Ux500 busydetect
> mmc: mmci: Add busydetect timeout
>
> drivers/mmc/host/mmci.c | 165 +++++++++++++++++++++++++++---------
> drivers/mmc/host/mmci.h | 17 ++++
> drivers/mmc/host/mmci_stm32_sdmmc.c | 6 +-
> 3 files changed, 149 insertions(+), 39 deletions(-)
> ---
> base-commit: fe15c26ee26efa11741a7b632e9f23b01aca4cc6
> change-id: 20230405-pl180-busydetect-fix-66a0360d398a
>
> Best regards,
Hi Linus,
With this series, it is no more possible to switch to UHS modes on
STM32MP1. I will add some traces and try to see what's wrong or missing
to have it working again.
I've tested on STM32MP157F-EV1 board and got those traces:
[ 3.186504] mmc0: Skipping voltage switch
[ 3.302170] mmc0: new high speed SDHC card at address aaaa
Whereas with the previous version I had:
[ 1.882084] mmc0: new ultra high speed DDR50 SDHC card at address aaaa
[ 1.899142] mmcblk0: mmc0:aaaa SC16G 14.8 GiB
On STM32MP13 that can do SDR104 (tested on an internal board), it fails
to initialized the card:
[ 3.194072] mmc0: error -110 whilst initialising SD card
When adding some dynamic debug traces, I can see this in the trace:
[ 78.039648] mmc0: Signal voltage switch failed, power cycling card
I'll try to add more traces to see what happens exactly.
Best regards,
Yann
More information about the Linux-stm32
mailing list