From cc62418d75f641e7dc34ecc178e1e68640bffe5a Mon Sep 17 00:00:00 2001 From: Daniel DeGrasse Date: Tue, 20 Aug 2024 12:04:59 -0500 Subject: [PATCH] drivers: sdhc: imx_usdhc: assume card is present if no detection method The imx USDHC driver previously queried the peripheral's internal card detect signal to check card presence if no card detect method was configured. However, some boards do not route the card detect signal and do not work correctly with the DAT3 detection method supported by this peripheral. As a fallback, assume the card is present in the slot but log a warning to the user. Fixes #42227 Signed-off-by: Daniel DeGrasse (cherry picked from commit 17f71e19f01e36cbde14b78d90449b73300a66f9) --- drivers/sdhc/imx_usdhc.c | 12 +++++++++++- dts/bindings/sdhc/nxp,imx-usdhc.yaml | 7 +++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/sdhc/imx_usdhc.c b/drivers/sdhc/imx_usdhc.c index 2909ea104b15d0..5a7f372dd201ea 100644 --- a/drivers/sdhc/imx_usdhc.c +++ b/drivers/sdhc/imx_usdhc.c @@ -58,6 +58,7 @@ struct usdhc_config { const struct gpio_dt_spec pwr_gpio; const struct gpio_dt_spec detect_gpio; bool detect_dat3; + bool detect_cd; bool no_180_vol; uint32_t data_timeout; uint32_t read_watermark; @@ -809,10 +810,18 @@ static int imx_usdhc_get_card_present(const struct device *dev) imx_usdhc_dat3_pull(cfg, true); USDHC_CardDetectByData3(cfg->base, false); } + } else if (cfg->detect_cd) { + /* + * Detect the card via the USDHC_CD signal internal to + * the peripheral + */ + data->card_present = USDHC_DetectCardInsert(cfg->base); } else if (cfg->detect_gpio.port) { data->card_present = gpio_pin_get_dt(&cfg->detect_gpio) > 0; } else { - data->card_present = USDHC_DetectCardInsert(cfg->base); + LOG_WRN("No card detection method configured, assuming card " + "is present"); + data->card_present = true; } return ((int)data->card_present); } @@ -1090,6 +1099,7 @@ static const struct sdhc_driver_api usdhc_api = { .detect_gpio = GPIO_DT_SPEC_INST_GET_OR(n, cd_gpios, {0}), \ .data_timeout = DT_INST_PROP(n, data_timeout), \ .detect_dat3 = DT_INST_PROP(n, detect_dat3), \ + .detect_cd = DT_INST_PROP(n, detect_cd), \ .no_180_vol = DT_INST_PROP(n, no_1_8_v), \ .read_watermark = DT_INST_PROP(n, read_watermark), \ .write_watermark = DT_INST_PROP(n, write_watermark), \ diff --git a/dts/bindings/sdhc/nxp,imx-usdhc.yaml b/dts/bindings/sdhc/nxp,imx-usdhc.yaml index 3b8df7db39f185..bccdf51d72306e 100644 --- a/dts/bindings/sdhc/nxp,imx-usdhc.yaml +++ b/dts/bindings/sdhc/nxp,imx-usdhc.yaml @@ -66,3 +66,10 @@ properties: Enable the host to detect an SD card via the DAT3 line of the SD card connection. Requires the board to define a function to pull DAT3 low or high using pullup/pulldown resistors. + + detect-cd: + type: boolean + description: | + Use the host's internal card detect signal (USDHC_CD) to detect the SD + card. This signal is available as an alternative to card detect via GPIO, + and should be connected to the SD slot's detect pin if used.