static int mmc_sd_resume(struct mmc_host *host) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mmc_direct_power_off(host); mdelay(20); retries--; mmc_direct_power_up(host); continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); return err; }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { //20110922 [email protected] blocking SDcard re-init[Start] #if 1 return 0; #else int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { // re-initialize the SD card power to re-establish on resume #ifdef CONFIG_LGE_MMC_WORKAROUND if (!strcmp(mmc_hostname(host), "mmc2")) { printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d), power off\n", mmc_hostname(host), err); mmc_power_off(host); } #endif printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); #ifdef CONFIG_LGE_MMC_WORKAROUND if (!strcmp(mmc_hostname(host), "mmc2")) { printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d), power up again\n", mmc_hostname(host), err); mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); } #endif mdelay(5); retries--; continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); return err; #endif //20110922 [email protected] blocking SDcard re-init[End] }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static void mmc_sd_resume(struct mmc_host *host) { int err = 0; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); #ifndef CONFIG_ARCH_EMXX BUG_ON(!host->card); #endif mmc_claim_host(host); #ifdef CONFIG_ARCH_EMXX if (host->card[0]) { err = mmc_sd_init_card(host, host->ocr, host->card[0]); if (err) { mmc_sd_remove(host); mmc_detach_bus(host); } } #else #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mdelay(5); retries--; continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif #endif mmc_release_host(host); #ifndef CONFIG_ARCH_EMXX if (err) { mmc_sd_remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } #endif }
static void mmc_sd_power_restore(struct mmc_host *host) { #ifdef CONFIG_ARCH_EMXX host->card[0]->state &= ~MMC_STATE_HIGHSPEED; mmc_claim_host(host); mmc_sd_init_card(host, host->ocr, host->card[0]); mmc_release_host(host); #else host->card->state &= ~MMC_STATE_HIGHSPEED; mmc_claim_host(host); mmc_sd_init_card(host, host->ocr, host->card); mmc_release_host(host); #endif }
static void mmc_sd_power_restore(struct mmc_host *host) { host->card->state &= ~MMC_STATE_HIGHSPEED; mmc_claim_host(host); mmc_sd_init_card(host, host->ocr, host->card); mmc_release_host(host); }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static void mmc_sd_resume(struct mmc_host *host) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mmc_power_off(host); mdelay(5); mmc_power_up(host); retries--; continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); #ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME if (err) mmc_sd_err_with_deferred_resume(host); #else if (err) { mmc_sd_remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } #endif }
int mmc_sd_reinit_card(struct mmc_host *host) { if (NULL == host) { return -1; } return mmc_sd_init_card(host, host->ocr, host->card); //return mmc_sd_init_card(host, ocr, oldcard); }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; int retries; BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mdelay(5); retries--; continue; } break; } #else retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); gpio_set_value(31, 0); /* SDIF_VDD_ON(GPIO[31]) 'H' -> 'L'(PWR_OFF) */ mdelay(500); gpio_set_value(31, 1); /* SDIF_VDD_ON(GPIO[31]) 'L' -> 'H'(PWR_ON) */ mdelay(10); retries--; continue; } break; } #endif mmc_release_host(host); return err; }
void mmc_sd_reset_card(struct mmc_card *card ) { mdelay(10); mmc_power_off(card->host); mdelay(10); mmc_power_up(card->host); mdelay(10); mmc_sd_init_card(card->host, card->host->ocr, card->host->card); mdelay(50); }
static int mmc_sd_power_restore(struct mmc_host *host) { int ret; host->card->state &= ~MMC_STATE_HIGHSPEED; mmc_claim_host(host); ret = mmc_sd_init_card(host, host->ocr, host->card); mmc_release_host(host); return ret; }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; struct bcmsdhc_host *bcm_host; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); BUG_ON(!host->card); bcm_host = mmc_priv(host); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mdelay(5); retries--; if(bcm_host->bcm_plat->flags&SDHC_DEVTYPE_SD){ //force to power-off/on mmc_power_off_brcm(host); mdelay(1); mmc_power_up_brcm(host); } continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); return err; }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { // re-initialize the SD card power to re-establish on resume #if 1//def CONFIG_LGE_MMC_WORKAROUND//LGE_CHANGES mmc_power_off(host); #endif printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); #if 1//def CONFIG_LGE_MMC_WORKAROUND//LGE_CHANGES mmc_power_up(host); mmc_select_voltage(host, host->ocr); BUG_ON(!host->bus_ops->resume); #endif mdelay(5); retries--; continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); return err; }
/* * Starting point for MMC card init. */ int mmc_attach_mmc(struct mmc_host *host, u32 ocr) { int err; BUG_ON(!host); BUG_ON(!host->claimed); mmc_attach_bus(host, &mmc_ops); /* * Sanity check the voltages that the card claims to * support. */ if (ocr & 0x7F) { printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; } host->ocr = mmc_select_voltage(host, ocr); /* * Can we support the voltage of the card? */ if (!host->ocr) goto err; /* * Detect and init the card. */ err = mmc_sd_init_card(host, host->ocr, NULL); if (err != MMC_ERR_NONE) goto err; mmc_release_host(host); err = mmc_register_card(host->card); if (err) goto reclaim_host; return 0; reclaim_host: mmc_claim_host(host); mmc_remove_card(host->card); host->card = NULL; err: mmc_detach_bus(host); mmc_release_host(host); return 0; }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); err = mmc_sd_init_card(host, host->ocr, host->card); mmc_release_host(host); return err; }
static void mmc_sd_power_restore(struct mmc_host *host) { //[NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion mutex_lock(&host->carddetect_lock); //]NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion host->card->state &= ~MMC_STATE_HIGHSPEED; mmc_claim_host(host); mmc_sd_init_card(host, host->ocr, host->card); mmc_release_host(host); //[NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion mutex_unlock(&host->carddetect_lock); //]NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif //[NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion mutex_lock(&host->carddetect_lock); //]NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mdelay(5); retries--; continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); //[NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion mutex_unlock(&host->carddetect_lock); //]NAGSM_Android_HDLNC_SDcard_shinjonghyun_20100504 : mutual exclusion when MoviNand and SD cardusing using this funtion return err; }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif DBG("[%s] s\n",__func__); BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mdelay(5); retries--; continue; } break; } #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); #ifdef CONFIG_MMC_UNSAFE_RESUME if (err) host->card_attath_status = card_attach_status_change; #endif return err; }
/* * Card detection callback from host. */ static void mmc_sd_detect(struct mmc_host *host) { int err = 0; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries = 5; #endif BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); if (host->card->err_count >= ERR_TRIGGER_REINIT) err = mmc_sd_init_card(host, host->ocr, host->card); /* * Just check if our card has been removed. */ #ifdef CONFIG_MMC_PARANOID_SD_INIT while(retries) { err = mmc_send_status(host->card, NULL); if (err) { retries--; udelay(5); continue; } break; } if (!retries) { printk(KERN_ERR "%s(%s): Unable to re-detect card (%d)\n", __func__, mmc_hostname(host), err); } #else if (!err) err = mmc_send_status(host->card, NULL); #endif mmc_release_host(host); if (err) { mmc_sd_remove(host); mmc_claim_host(host); mmc_detach_bus(host); mmc_release_host(host); } }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static void mmc_resume(struct mmc_host *host) { int err; BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); err = mmc_sd_init_card(host, host->ocr, host->card); if (err != MMC_ERR_NONE) { mmc_remove_card(host->card); host->card = NULL; mmc_detach_bus(host); } mmc_release_host(host); }
int mmc_attach_sd(struct mmc_host *host, u32 ocr) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); WARN_ON(!host->claimed); mmc_sd_attach_bus_ops(host); if (mmc_host_is_spi(host)) { mmc_go_idle(host); err = mmc_spi_read_ocr(host, 0, &ocr); if (err) goto err; } if (ocr & 0x7F) { printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; } if (ocr & MMC_VDD_165_195) { printk(KERN_WARNING "%s: SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.\n", mmc_hostname(host)); ocr &= ~MMC_VDD_165_195; } host->ocr = mmc_select_voltage(host, ocr); if (!host->ocr) { err = -EINVAL; goto err; } #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, NULL); if (err) { retries--; continue; } break; } if (!retries) { printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d)\n", mmc_hostname(host), err); goto err; } #else err = mmc_sd_init_card(host, host->ocr, NULL); if (err) goto err; #endif mmc_release_host(host); err = mmc_add_card(host->card); if (err) goto remove_card; return 0; remove_card: mmc_remove_card(host->card); host->card = NULL; mmc_claim_host(host); err: mmc_detach_bus(host); mmc_release_host(host); printk(KERN_ERR "%s: error %d whilst initialising SD card\n", mmc_hostname(host), err); return err; }
/* * Starting point for SD card init. */ int mmc_attach_sd(struct mmc_host *host, u32 ocr) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); WARN_ON(!host->claimed); mmc_sd_attach_bus_ops(host); /* * We need to get OCR a different way for SPI. */ if (mmc_host_is_spi(host)) { mmc_go_idle(host); err = mmc_spi_read_ocr(host, 0, &ocr); if (err) goto err; } /* * Sanity check the voltages that the card claims to * support. */ if (ocr & 0x7F) { printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; } if (ocr & MMC_VDD_165_195) { printk(KERN_WARNING "%s: SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.\n", mmc_hostname(host)); ocr &= ~MMC_VDD_165_195; } host->ocr = mmc_select_voltage(host, ocr); /* * Can we support the voltage(s) of the card(s)? */ if (!host->ocr) { err = -EINVAL; goto err; } /* * Detect and init the card. */ #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, NULL); if (err) { #if 1 if (!strcmp(mmc_hostname(host), "mmc2")) { g_sd_power_dircect_ctrl = 1; mmc_power_off(host); mdelay(200); mmc_power_up(host); mmc_select_voltage(host, host->ocr); mdelay(10); g_sd_power_dircect_ctrl = 0; printk("\n(SD initialization) retry count=%d\n",retries); } #endif retries--; continue; } break; } if (!retries) { printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d)\n", mmc_hostname(host), err); goto err; } #else err = mmc_sd_init_card(host, host->ocr, NULL); if (err) goto err; #endif mmc_release_host(host); err = mmc_add_card(host->card); if (err) goto remove_card; return 0; remove_card: mmc_remove_card(host->card); host->card = NULL; mmc_claim_host(host); err: mmc_detach_bus(host); mmc_release_host(host); printk(KERN_ERR "%s: error %d whilst initialising SD card\n", mmc_hostname(host), err); return err; }
int mmc_sd_reinit_card(struct mmc_host *host, u32 ocr) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); WARN_ON(!host->claimed); /* * Sanity check the voltages that the card claims to * support. */ if (ocr & 0x7F) { printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; } if (ocr & MMC_VDD_165_195) { printk(KERN_WARNING "%s: SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.\n", mmc_hostname(host)); ocr &= ~MMC_VDD_165_195; } host->ocr = mmc_select_voltage(host, ocr); /* * Can we support the voltage(s) of the card(s)? */ if (!host->ocr) { err = -EINVAL; goto err; } /* * Detect and init the card. */ #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 2; while (retries) { err = mmc_sd_init_card(host, host->ocr, NULL); if (err) { retries--; continue; } break; } if (!retries) { printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d)\n", mmc_hostname(host), err); goto err; } #else err = mmc_sd_init_card(host, host->ocr, NULL); if (err) goto err; #endif return 0; err: return err; }
/* * Starting point for SD card init. */ int mmc_attach_sd(struct mmc_host *host) { int err; u32 ocr; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif BUG_ON(!host); WARN_ON(!host->claimed); /* Make sure we are at 3.3V signalling voltage */ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330); if (err) return err; err = mmc_send_app_op_cond(host, 0, &ocr); if (err) return err; mmc_sd_attach_bus_ops(host); if (host->ocr_avail_sd) host->ocr_avail = host->ocr_avail_sd; /* * We need to get OCR a different way for SPI. */ if (mmc_host_is_spi(host)) { mmc_go_idle(host); err = mmc_spi_read_ocr(host, 0, &ocr); if (err) goto err; } /* * Sanity check the voltages that the card claims to * support. */ if (ocr & 0x7F) { printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; } if ((ocr & MMC_VDD_165_195) && !(host->ocr_avail_sd & MMC_VDD_165_195)) { printk(KERN_WARNING "%s: SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.\n", mmc_hostname(host)); ocr &= ~MMC_VDD_165_195; } host->ocr = mmc_select_voltage(host, ocr); /* * Can we support the voltage(s) of the card(s)? */ if (!host->ocr) { err = -EINVAL; goto err; } /* * Detect and init the card. */ #ifdef CONFIG_MMC_PARANOID_SD_INIT retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, NULL); if (err) { retries--; continue; } break; } if (!retries) { printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d)\n", mmc_hostname(host), err); goto err; } #else err = mmc_sd_init_card(host, host->ocr, NULL); if (err) goto err; #endif mmc_release_host(host); err = mmc_add_card(host->card); mmc_claim_host(host); if (err) goto remove_card; return 0; remove_card: mmc_release_host(host); mmc_remove_card(host->card); host->card = NULL; mmc_claim_host(host); err: mmc_detach_bus(host); printk(KERN_ERR "%s: error %d whilst initialising SD card\n", mmc_hostname(host), err); return err; }
/* * Resume callback from host. * * This function tries to determine if the same card is still present * and, if so, restore all state to it. */ static int mmc_sd_resume(struct mmc_host *host) { int err; #ifdef CONFIG_MMC_PARANOID_SD_INIT int retries; #endif #ifdef CONFIG_EF12_BOARD int rc; int retry_cnt; #endif BUG_ON(!host); BUG_ON(!host->card); mmc_claim_host(host); #ifdef CONFIG_MMC_PARANOID_SD_INIT #ifdef CONFIG_EF12_BOARD /* KKLIM 20101102 */ retry_cnt = 3; while (retry_cnt) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "(skymmc) sdcard init error!! : Retry(%d)\n", retry_cnt); rc = gpio_request(89,"sdcc_vdd"); if( rc >= 0 ) { gpio_set_value(89,0); msleep(10); gpio_set_value(89,1); } gpio_free(89); msleep(5); retry_cnt--; continue; } break; } #else retries = 5; while (retries) { err = mmc_sd_init_card(host, host->ocr, host->card); if (err) { printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n", mmc_hostname(host), err, retries); mdelay(5); retries--; continue; } break; } #endif #else err = mmc_sd_init_card(host, host->ocr, host->card); #endif mmc_release_host(host); return err; }
/* * Starting point for SD card init. */ int mmc_attach_sd(struct mmc_host *host) { int err; u32 ocr; BUG_ON(!host); WARN_ON(!host->claimed); err = mmc_send_app_op_cond(host, 0, &ocr); if (err) return err; mmc_sd_attach_bus_ops(host); if (host->ocr_avail_sd) host->ocr_avail = host->ocr_avail_sd; /* * We need to get OCR a different way for SPI. */ if (mmc_host_is_spi(host)) { mmc_go_idle(host); err = mmc_spi_read_ocr(host, 0, &ocr); if (err) goto err; } /* * Sanity check the voltages that the card claims to * support. */ if (ocr & 0x7F) { printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; } if ((ocr & MMC_VDD_165_195) && !(host->ocr_avail_sd & MMC_VDD_165_195)) { printk(KERN_WARNING "%s: SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.\n", mmc_hostname(host)); ocr &= ~MMC_VDD_165_195; } host->ocr = mmc_select_voltage(host, ocr); /* * Can we support the voltage(s) of the card(s)? */ if (!host->ocr) { err = -EINVAL; goto err; } /* * Detect and init the card. */ err = mmc_sd_init_card(host, host->ocr, NULL); if (err) goto err; mmc_release_host(host); err = mmc_add_card(host->card); mmc_claim_host(host); if (err) goto remove_card; return 0; remove_card: mmc_release_host(host); mmc_remove_card(host->card); host->card = NULL; mmc_claim_host(host); err: mmc_detach_bus(host); printk(KERN_ERR "%s: error %d whilst initialising SD card\n", mmc_hostname(host), err); return err; }