void mmc_power_save_host(struct mmc_host *host) { mmc_bus_get(host); if (!host->bus_ops || host->bus_dead || !host->bus_ops->power_restore) { mmc_bus_put(host); return; } if (host->bus_ops->power_save) host->bus_ops->power_save(host); mmc_bus_put(host); mmc_power_off(host); }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (host->bus_resume_flags & MMC_BUSRESUME_MANUAL_RESUME) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { if (!host->card || host->card->type != MMC_TYPE_SDIO) mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); // remove sdcard linux patch // following codes causes lock-up. bus_ops->remove function never returns. #if 0 if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); #endif /* no need to bother upper layers */ err = 0; } } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ if (!host->card || host->card->type != MMC_TYPE_SDIO) mmc_detect_change(host, 1); return err; }
int mmc_power_restore_host(struct mmc_host *host) { int ret; mmc_bus_get(host); if (!host->bus_ops || host->bus_dead || !host->bus_ops->power_restore) { mmc_bus_put(host); return -EINVAL; } mmc_power_up(host); ret = host->bus_ops->power_restore(host); mmc_bus_put(host); return ret; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (mmc_bus_manual_resume(host)) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { if (!mmc_card_keep_power(host)) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); /* * Tell runtime PM core we just powered up the card, * since it still believes the card is powered off. * Note that currently runtime PM is only enabled * for SDIO cards that are MMC_CAP_POWER_OFF_CARD */ if (mmc_card_sdio(host->card) && (host->caps & MMC_CAP_POWER_OFF_CARD)) { pm_runtime_disable(&host->card->dev); pm_runtime_set_active(&host->card->dev); pm_runtime_enable(&host->card->dev); } } BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } /* clear flag */ host->pm_flags &= ~MMC_PM_KEEP_POWER; mmc_bus_put(host); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (mmc_bus_manual_resume(host)) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { #ifdef CONFIG_ATH_WIFI if (!host->suspend_keep_power) { #endif mmc_power_up(host); mmc_select_voltage(host, host->ocr); #ifdef CONFIG_ATH_WIFI } #endif BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } mmc_bus_put(host); #if defined(CONFIG_ATH_WIFI) || defined(CONFIG_BCM_WIFI) if (host->index == ATH_WIFI_SDCC_INDEX) { pr_info("%s: mmc_resume_host in wifi slot skip cmd7\n", mmc_hostname(host)); return err; } #endif /* * We add a slight delay here so that resume can progress * in parallel. */ mmc_detect_change(host, 1); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { mmc_power_up(host); BUG_ON(!host->bus_ops->resume); host->bus_ops->resume(host); } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ mmc_detect_change(host, 1); return 0; }
/** * mmc_suspend_host - suspend a host * @host: mmc host * @state: suspend mode (PM_SUSPEND_xxx) */ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) { mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_detach_bus(host); } mmc_bus_put(host); BUG_ON(host->card); mmc_power_off(host); return 0; }
/** * mmc_suspend_host - suspend a host * @host: mmc host * @state: suspend mode (PM_SUSPEND_xxx) */ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) { int err = 0; if (mmc_bus_needs_resume(host)) return 0; if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); if (unlikely(cancel_delayed_work(&host->detect))) { atomic_dec(&wakelock_refs); } mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); if (err == -ENOSYS || !host->bus_ops->resume) { /* * We simply "remove" the card in this case. * It will be redetected on resume. */ if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); err = 0; } } mmc_bus_put(host); if (!host->card || host->card->type != MMC_TYPE_SDIO) { if (!err) mmc_power_off(host); } else if(!host->card || host->card->type == MMC_TYPE_SDIO) { is_mmc_resume = 1; } return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); #ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME if (host->deferred_resume) { host->need_resume = 1; mmc_bus_put(host); return 0; } #endif if (host->bus_ops && !host->bus_dead) { if (!(host->pm_flags & MMC_PM_KEEP_POWER)) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); } BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); /* no need to bother upper layers */ err = 0; } } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ mmc_detect_change(host, 1); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (host->bus_resume_flags & MMC_BUSRESUME_MANUAL_RESUME) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { struct mmc_card *card = host->card; mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { /* restore mmc_card because resume() clears host->card when error occured */ host->card = card; printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); /* no need to bother upper layers */ err = 0; } } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ mmc_detect_change(host, 1); return err; }
void mmc_remove_sd_card(struct work_struct *work) { struct mmc_host *host = container_of(work, struct mmc_host, remove.work); printk(KERN_INFO "%s: %s\n", mmc_hostname(host), __func__); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } mmc_bus_put(host); wake_unlock(&host->wakelock); printk(KERN_INFO "%s: %s exit\n", mmc_hostname(host), __func__); }
void mmc_force_remove_card(struct mmc_host *host) { DBG("[%s] s\n",__func__); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } mmc_bus_put(host); mmc_power_off(host); DBG("[%s] e\n",__func__); return ; }
/** * mmc_suspend_host - suspend a host * @host: mmc host * @state: suspend mode (PM_SUSPEND_xxx) */ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) { int err = 0; if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); } mmc_bus_put(host); if (!err) mmc_power_off(host); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (mmc_bus_manual_resume(host)) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { if (!(host->pm_flags & MMC_PM_KEEP_POWER)) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); } BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ #if 1 /* ATHENV */ if (!host->card || host->card->type != MMC_TYPE_SDIO) #endif /* ATHENV */ #if 1//PMMC ; #else//ORG mmc_detect_change(host, 2); #endif//PMMC return err; }
int mmc_resume_bus(struct mmc_host *host) { if (!mmc_bus_needs_resume(host)) return -EINVAL; printk("%s: Starting deferred resume\n", mmc_hostname(host)); host->bus_resume_flags &= ~MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { mmc_power_up(host); BUG_ON(!host->bus_ops->resume); host->bus_ops->resume(host); } mmc_detect_change(host, 0); mmc_bus_put(host); printk("%s: Deferred resume completed\n", mmc_hostname(host)); return 0; }
/** * mmc_suspend_host - suspend a host * @host: mmc host */ int mmc_suspend_host(struct mmc_host *host) { int err = 0; if (mmc_bus_needs_resume(host)) return 0; if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); cancel_delayed_work(&host->detect); mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); if (err == -ENOSYS || !host->bus_ops->resume) { /* * We simply "remove" the card in this case. * It will be redetected on resume. */ if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); host->pm_flags = 0; err = 0; } } #ifdef CONFIG_PM_RUNTIME if (mmc_bus_manual_resume(host)) host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; #endif mmc_bus_put(host); if (!err && !(host->pm_flags & MMC_PM_KEEP_POWER)) mmc_power_off(host); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; DBG("[%s] s\n",__func__); mmc_bus_get(host); if (host->bus_resume_flags & MMC_BUSRESUME_MANUAL_RESUME) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); DBG("[%s] e1\n",__func__); return 0; } if (host->bus_ops && !host->bus_dead) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (0) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); /* no need to bother upper layers */ err = 0; } } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ mmc_detect_change(host, HZ*3); DBG("[%s] e2\n",__func__); return err; }
/** * mmc_suspend_host - suspend a host * @host: mmc host */ int mmc_suspend_host(struct mmc_host *host) { int err = 0; if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); cancel_delayed_work(&host->detect); mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); } mmc_bus_put(host); if (!err && !(host->pm_flags & MMC_PM_KEEP_POWER)) mmc_power_off(host); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } mmc_bus_put(host); return err; }
int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (mmc_bus_manual_resume(host)) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { if (!(host->pm_flags & MMC_PM_KEEP_POWER)) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); } BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } if(!strncmp(mmc_hostname(host),"mmc1",4)) { memcpy(&host->ios,&ios_backup,sizeof(struct mmc_ios)); mmc_set_ios(host); printk("\n(IOS restore)\n%s: clock %uHz busmode %u powermode %u cs %u Vdd %u width %u timing %u\n",mmc_hostname(host), ios_backup.clock, ios_backup.bus_mode,ios_backup.power_mode, ios_backup.chip_select, ios_backup.vdd,ios_backup.bus_width, ios_backup.timing); } mmc_bus_put(host); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (host->bus_resume_flags & MMC_BUSRESUME_MANUAL_RESUME) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ /* FIH, SimonSSChang, 2010/02/26 { */ /* Avoid resume will hang here when wifi has trun on */ #ifdef CONFIG_FIH_FXX mmc_detect_change(host, 0); #else mmc_detect_change(host, 1); #endif /* } FIH, SimonSSChang, 2010/02/26 */ return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { #if 0 // kimhyuns remove to recognize card // for issue fix for ecim G0100145817 if(host->bus_dead ) #else if((host->bus_dead) && (host->index!=0)) #endif { printk("No Suspend resume in case of bus-dead if init failed -- %s \r\n",__FUNCTION__); return 0; } mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if ( host->card && mmc_card_sdio(host->card)){ //ijihyun.jung -Sec VinsQ printk("mmc%d:mmc_resume_host: skip mmc_power_up()\n", host->index); } else { mmc_power_up(host); } mmc_select_voltage(host, host->ocr);//cyj_dc23 -kernel 협의 BUG_ON(!host->bus_ops->resume); host->bus_ops->resume(host); } mmc_bus_put(host); /* * We add a slight delay here so that resume can progress * in parallel. */ if ( host->card && mmc_card_sdio(host->card)) { //ijihyun.jung -Sec VinsQ printk("mmc%d:mmc_resume_host: skip mmc_detect_change()\n", host->index); } else{ printk("mmc%d:mmc_resume_host: excute mmc_detect_change()\n", host->index); mmc_detect_change(host, 1); } return 0; }
/** * mmc_suspend_host - suspend a host * @host: mmc host * @state: suspend mode (PM_SUSPEND_xxx) */ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) { int err = 0; DBG("[%s] s\n",__func__); if (mmc_bus_needs_resume(host)) { DBG("[%s] e1\n",__func__); return 0; } if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); cancel_delayed_work(&host->detect); mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); if (err == -ENOSYS || !host->bus_ops->resume) { /* * We simply "remove" the card in this case. * It will be redetected on resume. */ if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); err = 0; } } mmc_bus_put(host); if (!err) mmc_power_off(host); DBG("[%s] e2\n",__func__); return err; }
/** * mmc_suspend_host - suspend a host * @host: mmc host */ int mmc_suspend_host(struct mmc_host *host) { int err = 0; if (mmc_bus_needs_resume(host)) return 0; if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); if (unlikely(cancel_delayed_work(&host->detect))) { atomic_dec(&wakelock_refs); } mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); if (err == -ENOSYS || !host->bus_ops->resume) { /* * We simply "remove" the card in this case. * It will be redetected on resume. */ if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); host->pm_flags = 0; err = 0; } } mmc_bus_put(host); if (!err && !(host->pm_flags & MMC_PM_KEEP_POWER)) mmc_power_off(host); return err; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (host->bus_resume_flags & MMC_BUSRESUME_MANUAL_RESUME) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } mmc_bus_put(host); /* ATHENV */ if (host->index == ATH_WIFI_SDCC_INDEX) { pr_info("%s: mmc_resume_host in wifi slot skip cmd7\n", mmc_hostname(host)); return err; } /* ATHENV */ /* * We add a slight delay here so that resume can progress * in parallel. */ mmc_detect_change(host, 1); return err; }
/** * mmc_suspend_host - suspend a host * @host: mmc host * @state: suspend mode (PM_SUSPEND_xxx) */ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) { #if 0 // kimhyuns remove to recognize card // for issue fix for ecim G0100145817 if(host->bus_dead ) #else if((host->bus_dead) && (host->index!=0)) #endif { printk("No Suspend resume in case of bus-dead if init failed (%s) \r\n",__FUNCTION__); return 0; } printk("Soni calling mmc_flush_scheduled_work (%s)",__FUNCTION__); mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) host->bus_ops->suspend(host); if (!host->bus_ops->resume) { if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } } mmc_bus_put(host); if (host->card && mmc_card_sdio(host->card)) { //ijihyun.jung -Sec VinsQ printk("mmc%d:mmc_suspend_host: skip mmc_power_off()\n", host->index); } else { mmc_power_off(host); } return 0; }
/** * mmc_suspend_host - suspend a host * @host: mmc host * @state: suspend mode (PM_SUSPEND_xxx) */ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) { int err = 0; if (mmc_bus_needs_resume(host)) return 0; if (host->caps & MMC_CAP_DISABLE) cancel_delayed_work(&host->disable); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->suspend) err = host->bus_ops->suspend(host); } mmc_bus_put(host); if (!err && !(host->pm_flags & MMC_PM_KEEP_POWER)) mmc_power_off(host); return err; }
int mmc_reinit_card(struct mmc_host *host) { int err = 0; printk(KERN_INFO "%s: %s\n", mmc_hostname(host), __func__); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead && host->bus_ops->resume) { if (host->card && mmc_card_sd(host->card)) { mmc_power_off(host); mdelay(5); } mmc_power_up(host); err = host->bus_ops->resume(host); } mmc_bus_put(host); printk(KERN_INFO "%s: %s return %d\n", mmc_hostname(host), __func__, err); return err; }
static void s3c24xx_irq_cd_handler( void *param ) { struct mmc_host *host=(struct mmc_host *) param; /* We want the MMC/SD stack to redetect if this IRQ goes off. To do this */ /* we remove the bus when this IRQ occurs. mmc_detect_change will then */ /* make sure the bus is reenumerated. */ mmc_flush_scheduled_work(); mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { if (host->bus_ops->remove) host->bus_ops->remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } mmc_bus_put(host); mmc_detect_change( host, HZ/10 ); return; }
/** * mmc_resume_host - resume a previously suspended host * @host: mmc host */ int mmc_resume_host(struct mmc_host *host) { int err = 0; mmc_bus_get(host); if (mmc_bus_manual_resume(host)) { host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME; mmc_bus_put(host); return 0; } if (host->bus_ops && !host->bus_dead) { if (!(host->pm_flags & MMC_PM_KEEP_POWER)) { mmc_power_up(host); mmc_select_voltage(host, host->ocr); } BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { struct mmc_ios *ios = &host->ios; //temporary debug code pr_debug("%s: clock %uHz busmode %u powermode %u cs %u Vdd %u " "width %u timing %u\n", mmc_hostname(host), ios->clock, ios->bus_mode, ios->power_mode, ios->chip_select, ios->vdd, ios->bus_width, ios->timing); printk(KERN_WARNING "%s: error %d during resume " "(card was removed?)\n", mmc_hostname(host), err); err = 0; } } mmc_bus_put(host); return err; }