static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) { struct sh_mmcif_host *host = mmc_priv(mmc); unsigned long flags; spin_lock_irqsave(&host->lock, flags); if (host->state != STATE_IDLE) { dev_dbg(&host->pd->dev, "%s() rejected, state %u\n", __func__, host->state); spin_unlock_irqrestore(&host->lock, flags); return; } host->state = STATE_IOS; spin_unlock_irqrestore(&host->lock, flags); if (ios->power_mode == MMC_POWER_UP) { if (!host->card_present) { /* See if we also get DMA */ sh_mmcif_request_dma(host, host->pd->dev.platform_data); host->card_present = true; } sh_mmcif_set_power(host, ios); } else if (ios->power_mode == MMC_POWER_OFF || !ios->clock) { /* clock stop */ sh_mmcif_clock_control(host, 0); if (ios->power_mode == MMC_POWER_OFF) { if (host->card_present) { sh_mmcif_release_dma(host); host->card_present = false; } } if (host->power) { pm_runtime_put_sync(&host->pd->dev); clk_disable_unprepare(host->hclk); host->power = false; if (ios->power_mode == MMC_POWER_OFF) sh_mmcif_set_power(host, ios); } host->state = STATE_IDLE; return; } if (ios->clock) { if (!host->power) { sh_mmcif_clk_update(host); pm_runtime_get_sync(&host->pd->dev); host->power = true; sh_mmcif_sync_reset(host); } sh_mmcif_clock_control(host, ios->clock); } host->timing = ios->timing; host->bus_width = ios->bus_width; host->state = STATE_IDLE; }
static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) { struct sh_mmcif_host *host = mmc_priv(mmc); struct sh_mmcif_plat_data *p = host->pd->dev.platform_data; if (ios->power_mode == MMC_POWER_OFF) { /* clock stop */ sh_mmcif_clock_control(host, 0); if (p->down_pwr) p->down_pwr(host->pd); return; } else if (ios->power_mode == MMC_POWER_UP) { if (p->set_pwr) p->set_pwr(host->pd, ios->power_mode); } if (ios->clock) sh_mmcif_clock_control(host, ios->clock); host->bus_width = ios->bus_width; }
static void sh_mmcif_set_ios(struct mmc *mmc) { struct sh_mmcif_host *host = mmc_priv(mmc); if (mmc->clock) sh_mmcif_clock_control(host, mmc->clock); if (mmc->bus_width == 8) host->bus_width = MMC_BUS_WIDTH_8; else if (mmc->bus_width == 4) host->bus_width = MMC_BUS_WIDTH_4; else host->bus_width = MMC_BUS_WIDTH_1; debug("clock = %d, buswidth = %d\n", mmc->clock, mmc->bus_width); }