sd: add check for maximum supported voltage by host controller

add check for maximum voltage supported by hc before apply card voltage.

Signed-off-by: Najumon B.A <najumon.ba@intel.com>
This commit is contained in:
Najumon B.A 2023-08-03 14:36:14 +05:30 committed by Carles Cufí
parent 12fa534089
commit c5094776e9

View file

@ -117,7 +117,8 @@ static int sd_common_init(struct sd_card *card)
static int sd_init_io(struct sd_card *card) static int sd_init_io(struct sd_card *card)
{ {
struct sdhc_io *bus_io = &card->bus_io; struct sdhc_io *bus_io = &card->bus_io;
int ret; struct sdhc_host_props *host_props = &card->host_props;
int ret, voltage;
/* SD clock should start gated */ /* SD clock should start gated */
bus_io->clock = 0; bus_io->clock = 0;
@ -125,9 +126,22 @@ static int sd_init_io(struct sd_card *card)
bus_io->bus_mode = SDHC_BUSMODE_PUSHPULL; bus_io->bus_mode = SDHC_BUSMODE_PUSHPULL;
bus_io->power_mode = SDHC_POWER_ON; bus_io->power_mode = SDHC_POWER_ON;
bus_io->bus_width = SDHC_BUS_WIDTH1BIT; bus_io->bus_width = SDHC_BUS_WIDTH1BIT;
/* Cards start with legacy timing and 3.3V signalling at power on */ /* Cards start with legacy timing and Maximum voltage Host controller support */
bus_io->timing = SDHC_TIMING_LEGACY; bus_io->timing = SDHC_TIMING_LEGACY;
bus_io->signal_voltage = SD_VOL_3_3_V;
if (host_props->host_caps.vol_330_support) {
LOG_DBG("Host controller support 3.3V max");
voltage = SD_VOL_3_3_V;
} else if (host_props->host_caps.vol_300_support) {
LOG_DBG("Host controller support 3.0V max");
voltage = SD_VOL_3_0_V;
} else {
LOG_DBG("Host controller support 1.8V max");
voltage = SD_VOL_1_8_V;
}
/* Set to maximum voltage support by Host controller */
bus_io->signal_voltage = voltage;
/* Toggle power to card to reset it */ /* Toggle power to card to reset it */
LOG_DBG("Resetting power to card"); LOG_DBG("Resetting power to card");
@ -144,8 +158,8 @@ static int sd_init_io(struct sd_card *card)
LOG_ERR("Could not disable card power via SDHC"); LOG_ERR("Could not disable card power via SDHC");
return ret; return ret;
} }
/* After reset or init, card voltage should be 3.3V */ /* After reset or init, card voltage should be max HC support */
card->card_voltage = SD_VOL_3_3_V; card->card_voltage = voltage;
/* Reset card flags */ /* Reset card flags */
card->flags = 0U; card->flags = 0U;
/* Delay so card can power up */ /* Delay so card can power up */