[PATCH] imx: kontron-sl-mx8mm: Fix SD card IO voltage level

Marek Vasut marex at denx.de
Wed Jan 25 18:15:31 CET 2023


On 1/25/23 14:41, Frieder Schrempf wrote:
> From: Frieder Schrempf <frieder.schrempf at kontron.de>

Subject tags should be ARM: dts: imx:

> The LDO5 of the PCA9450 PMIC can be switched between two different
> voltage settings (defaulting to 1.8V and 3.3V) using an external
> signal SD_VSEL that is connected to the VSELECT signal of the SD
> card interface.
> 
> As the regulator driver can't deal with both LDO registers (LDO5CTRL_H
> and LDO5CTRL_L) it only uses one of them, which means reading the
> voltage from the regulator can potentially return a value that does not
> reflect the actual state of the LDO5 output.

Can you fix the regulator driver ?

> In our case, after booting U-Boot we read 1.8V from the regulator
> while in fact as the VSELECT signal is still low the regulator outputs
> 3.3V. This confusion causes the MMC driver to think it is dealing with
> a 1.8V-only device. This in turn leads to SD cards being addressed
> with 1.8V IO levels even if UHS support is not available or disabled.
> 
> Some cards with UHS support still work even if they are addressed
> with 1.8V levels in non-UHS modes, but a lot of cards also fail with
> timeout errors like:
> 
>    Card did not respond to voltage select! : -110
> 
> As a workaorund we disable the vqmmc regulator for now so we can make
> sure no wrong values are read from the regulator. The switching
> between 1.8V and 3.3V still works as the ESDHC driver sets the
> VSELECT signal accordingly.
> 
> Signed-off-by: Frieder Schrempf <frieder.schrempf at kontron.de>
> ---
> By the way: I suspect that other boards using the PCA9450 might also be affected
> by this. I didn't find a nice generic solution so far. It would be possible to
> patch the pca9450 driver to use the PCA9450_LDO5CTRL_L instead of the
> PCA9450_LDO5CTRL_H register for LDO5. This would fix this particular case,
> but still not the root problem of the regulator driver returning wrong values.
> So if anyone got some idea how to properly handle this, let me know.
> The same issue is also present in Linux. While I didn't notice any problems
> with the SD card being addressed with incorrect voltage levels so far,
> reading the regulator doesn't return the correct value if VSELECT is low.

Configure VSELECT pinmux such that it is a function, as it is right now, 
MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT or similar, (so SD controller 
driver can operate the pin via SD controller), but set SION bit so GPIO 
controller can read its state (activate bit 30), i.e.:
MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0x40000004

Use sd-vsel-gpios property of PMIC, claim the VSELECT as GPIO in PMIC 
driver (this won't change pinmux, the pin would still be configured as 
function, but SION bit would allow you to read its state), read its 
state, and return the correct LDO5CTRL_H/LDO5CTRL_L value based on that.

If this works, then:
     arm64: dts: imx8mp: Drop sd-vsel-gpios from *
Linux kernel patches should not be applied.

[...]


More information about the U-Boot mailing list