diff --git a/drivers/disk/sdmmc_subsys.c b/drivers/disk/sdmmc_subsys.c index e2511d1b100..4eb61c90e7f 100644 --- a/drivers/disk/sdmmc_subsys.c +++ b/drivers/disk/sdmmc_subsys.c @@ -93,12 +93,9 @@ static int disk_sdmmc_access_ioctl(struct disk_info *disk, uint8_t cmd, void *bu case DISK_IOCTL_CTRL_INIT: return disk_sdmmc_access_init(disk); case DISK_IOCTL_CTRL_DEINIT: - sdmmc_ioctl(&data->card, DISK_IOCTL_CTRL_SYNC, NULL); - /* sd_init() will toggle power to SDMMC, so we can just mark - * disk as uninitialized - */ + /* Card will be uninitialized after DEINIT */ data->status = SD_UNINIT; - return 0; + return sdmmc_ioctl(&data->card, DISK_IOCTL_CTRL_DEINIT, NULL); default: return sdmmc_ioctl(&data->card, cmd, buf); } diff --git a/subsys/sd/sd_ops.c b/subsys/sd/sd_ops.c index 9daa1f1f0c2..da5e0ff74f9 100644 --- a/subsys/sd/sd_ops.c +++ b/subsys/sd/sd_ops.c @@ -795,6 +795,16 @@ int card_ioctl(struct sd_card *card, uint8_t cmd, void *buf) */ ret = sdmmc_wait_ready(card); break; + case DISK_IOCTL_CTRL_DEINIT: + /* Ensure card is not busy with data write */ + ret = sdmmc_wait_ready(card); + if (ret < 0) { + LOG_WRN("Card busy when powering off"); + } + /* Power down the card */ + card->bus_io.power_mode = SDHC_POWER_OFF; + ret = sdhc_set_io(card->sdhc, &card->bus_io); + break; default: ret = -ENOTSUP; }