static int omap_mmc_set_clock( u32 rate ) { int retval; DEBUG(3, ": Set rate: %d \n", rate); u32 master = OMAP_MMC_MASTER_CLOCK; /* Default master clock */ u8 divisor = master / rate; retval = omap_mmc_stop_clock(); if ( retval ) return retval; outw(inw(OMAP_MMC_CON) | divisor, OMAP_MMC_CON); mmc_delay(); /* FIX-ME: Time out values */ outw(0x90, OMAP_MMC_CTO); mmc_delay(); outw(0xffff, OMAP_MMC_DTO) ; mmc_delay(); g_omap_mmc_data.clock = rate; return MMC_NO_ERROR; }
/* * Apply power to the MMC stack. This is a two-stage process. * First, we enable power to the card without the clock running. * We then wait a bit for the power to stabilise. Finally, * enable the bus drivers and clock to the card. * * We must _NOT_ enable the clock prior to power stablising. * * If a host does all the power sequencing itself, ignore the * initial MMC_POWER_UP stage. */ static void mmc_power_up(struct mmc_host *host) { int bit = fls(host->ocr_avail) - 1; host->ios.vdd = bit; if (mmc_host_is_spi(host)) { host->ios.chip_select = MMC_CS_HIGH; host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; } else { host->ios.chip_select = MMC_CS_DONTCARE; host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; } host->ios.power_mode = MMC_POWER_UP; host->ios.bus_width = MMC_BUS_WIDTH_1; host->ios.timing = MMC_TIMING_LEGACY; mmc_set_ios(host); /* * This delay should be sufficient to allow the power supply * to reach the minimum voltage. */ mmc_delay(10); host->ios.clock = host->f_min; host->ios.power_mode = MMC_POWER_ON; mmc_set_ios(host); /* * This delay must be at least 74 clock sizes, or 1 ms, or the * time required to reach a stable voltage. */ mmc_delay(10); }
int mmc_go_idle(struct mmc_host *host) { int err; struct mmc_command cmd; mmc_set_chip_select(host, MMC_CS_HIGH); mmc_delay(1); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_GO_IDLE_STATE; cmd.arg = 0; cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; err = mmc_wait_for_cmd(host, &cmd, 0); mmc_delay(1); mmc_set_chip_select(host, MMC_CS_DONTCARE); mmc_delay(1); return err; }
int mmc_go_idle(struct mmc_host *host) { int err; struct mmc_command cmd = {0}; if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_HIGH); mmc_delay(1); } cmd.opcode = MMC_GO_IDLE_STATE; cmd.arg = 0; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_NONE | MMC_CMD_BC; err = mmc_wait_for_cmd(host, &cmd, 0); mmc_delay(1); if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_DONTCARE); mmc_delay(1); } host->use_spi_crc = 0; return err; }
int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value) { int err; int retries = 3; struct mmc_command cmd; u32 status; unsigned long delay = jiffies + HZ; BUG_ON(!card); BUG_ON(!card->host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_SWITCH; cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (index << 16) | (value << 8) | set; cmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES); if (err) return err; mmc_delay(1); /* Must check status to be sure of no errors */ do { err = mmc_send_status(card, &status); if (err) { printk(KERN_ERR "%s: failed to get status (%d)\n", __func__, err); mmc_delay(5); retries--; continue; } if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) break; if (mmc_host_is_spi(card->host)) break; if (time_after(jiffies, delay)) { printk(KERN_ERR "failed to get card ready!!!\n"); break; } } while (retries && R1_CURRENT_STATE(status) == 7); if (mmc_host_is_spi(card->host)) { if (status & R1_SPI_ILLEGAL_COMMAND) return -EBADMSG; } else { if (status & 0xFDFFA000) printk(KERN_WARNING "%s: unexpected status %#x after " "switch", mmc_hostname(card->host), status); if (status & R1_SWITCH_ERROR) return -EBADMSG; } return 0; }
int mmc_go_idle(struct mmc_host *host) { int err; struct mmc_command cmd; /* * Non-SPI hosts need to prevent chipselect going active during * GO_IDLE; that would put chips into SPI mode. Remind them of * that in case of hardware that won't pull up DAT3/nCS otherwise. * * SPI hosts ignore ios.chip_select; it's managed according to * rules that must accomodate non-MMC slaves which this layer * won't even know about. */ if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_HIGH); mmc_delay(1); } memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_GO_IDLE_STATE; cmd.arg = 0; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_NONE | MMC_CMD_BC; #if defined(CONFIG_AMBARELLA_IPC) && defined(CONFIG_MMC_AMBARELLA) && !defined(CONFIG_NOT_SHARE_SD_CONTROLLER_WITH_UITRON) { struct ipc_sdinfo *sdinfo = ambarella_sd_get_sdinfo(host); if (sdinfo->from_ipc && !sdinfo->is_sdio) { err = 0; } else err = mmc_wait_for_cmd(host, &cmd, 0); } #else err = mmc_wait_for_cmd(host, &cmd, 0); #endif mmc_delay(1); if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_DONTCARE); mmc_delay(1); } host->use_spi_crc = 0; return err; }
int mmc_card_sleepawake(struct mmc_host *host, int sleep) { struct mmc_command cmd = {0}; struct mmc_card *card = host->card; int err; if (sleep) mmc_deselect_cards(host); cmd.opcode = MMC_SLEEP_AWAKE; cmd.arg = card->rca << 16; if (sleep) cmd.arg |= 1 << 15; cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; err = mmc_wait_for_cmd(host, &cmd, 0); if (err) return err; /* * If the host does not wait while the card signals busy, then we will * will have to wait the sleep/awake timeout. Note, we cannot use the * SEND_STATUS command to poll the status because that command (and most * others) is invalid while the card sleeps. */ if (!(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) mmc_delay(DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000)); if (!sleep) err = mmc_select_card(card); return err; }
/* * Mask off any voltages we don't support and select * the lowest voltage */ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) { int bit; ocr &= host->ocr_avail; bit = ffs(ocr); if (bit) { bit -= 1; ocr &= 3 << bit; host->ios.vdd = bit; mmc_set_ios(host); } else { pr_warning("%s: host doesn't support card's voltages\n", mmc_hostname(host)); ocr = 0; } mmc_delay(30); return ocr; }
int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd; int i, err = 0; BUG_ON(!host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = SD_APP_OP_COND; cmd.arg = ocr; cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; for (i = 100; i; i--) { err = mmc_wait_for_app_cmd(host, NULL, &cmd, MMC_CMD_RETRIES); if (err != MMC_ERR_NONE) break; if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0) break; err = MMC_ERR_TIMEOUT; mmc_delay(10); } if (rocr) *rocr = cmd.resp[0]; return err; }
int mmc_card_sleepawake(struct mmc_host *host, int sleep) { struct mmc_command cmd = {0}; struct mmc_card *card = host->card; int err; if (sleep) mmc_deselect_cards(host); cmd.opcode = MMC_SLEEP_AWAKE; cmd.arg = card->rca << 16; if (sleep) cmd.arg |= 1 << 15; cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; err = mmc_wait_for_cmd(host, &cmd, 0); if (err) return err; if (!(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) mmc_delay(DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000)); if (!sleep) err = mmc_select_card(card); return err; }
/** * mmc_switch - modify EXT_CSD register * @card: the MMC card associated with the data transfer * @set: cmd set values * @index: EXT_CSD register index * @value: value to program into EXT_CSD register * @timeout_ms: timeout (ms) for operation performed by register write, * timeout of zero implies maximum possible timeout * * Modifies the EXT_CSD register for selected card. */ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, unsigned int timeout_ms) { int err; struct mmc_command cmd = {0}; u32 status; BUG_ON(!card); BUG_ON(!card->host); cmd.opcode = MMC_SWITCH; cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (index << 16) | (value << 8) | set; cmd.flags = MMC_CMD_AC; #if 1 if (index == EXT_CSD_BKOPS_START /*&& card->ext_csd.raw_bkops_status < EXT_CSD_BKOPS_LEVEL_2*/) cmd.flags |= MMC_RSP_SPI_R1 | MMC_RSP_R1; else cmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; #else cmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; #endif cmd.cmd_timeout_ms = timeout_ms; err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES); if (err) return err; /* No need to check card status in case of BKOPS switch*/ if (index == EXT_CSD_BKOPS_START) return 0; mmc_delay(1); /* Must check status to be sure of no errors */ do { err = mmc_send_status(card, &status); if (err) return err; if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) break; if (mmc_host_is_spi(card->host)) break; } while (!(status & R1_READY_FOR_DATA) || (R1_CURRENT_STATE(status) == R1_STATE_PRG)); if (mmc_host_is_spi(card->host)) { if (status & R1_SPI_ILLEGAL_COMMAND) return -EBADMSG; } else { if (status & 0xFDFFA000) pr_warning("%s: unexpected status %#x after " "switch", mmc_hostname(card->host), status); if (status & R1_SWITCH_ERROR) return -EBADMSG; } return 0; }
int mmc_card_sleepawake(struct mmc_host *host, int sleep) { struct mmc_command cmd = {0}; struct mmc_card *card = host->card; int err; unsigned long timeout; if (sleep) mmc_deselect_cards(host); cmd.opcode = MMC_SLEEP_AWAKE; cmd.arg = card->rca << 16; if (sleep) cmd.arg |= 1 << 15; cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; err = mmc_wait_for_cmd(host, &cmd, 0); if (err) return err; /* * If the host does not wait while the card signals busy, then we will * will have to wait the sleep/awake timeout. Note, we cannot use the * SEND_STATUS command to poll the status because that command (and most * others) is invalid while the card sleeps. */ if (!(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) { /* longest waiting time in ms */ timeout = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000); if (host->ops->mmc_poll_busy) { timeout = jiffies + msecs_to_jiffies(timeout); do { mmc_delay(1); if (!(host->ops->mmc_poll_busy)(host)) break; } while(time_before(jiffies, timeout)); } else mmc_delay(timeout); } if (!sleep) err = mmc_select_card(card); return err; }
static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, bool send_status, bool retry_crc_err) { struct mmc_host *host = card->host; int err; unsigned long timeout; u32 status = 0; bool expired = false; bool busy = false; /* We have an unspecified cmd timeout, use the fallback value. */ if (!timeout_ms) timeout_ms = MMC_OPS_TIMEOUT_MS; /* * In cases when not allowed to poll by using CMD13 or because we aren't * capable of polling by using ->card_busy(), then rely on waiting the * stated timeout to be sufficient. */ if (!send_status && !host->ops->card_busy) { mmc_delay(timeout_ms); return 0; } timeout = jiffies + msecs_to_jiffies(timeout_ms) + 1; do { /* * Due to the possibility of being preempted while polling, * check the expiration time first. */ expired = time_after(jiffies, timeout); if (host->ops->card_busy) { busy = host->ops->card_busy(host); } else { err = mmc_send_status(card, &status); if (retry_crc_err && err == -EILSEQ) { busy = true; } else if (err) { return err; } else { err = mmc_switch_status_error(host, status); if (err) return err; busy = R1_CURRENT_STATE(status) == R1_STATE_PRG; } } /* Timeout if the device still remains busy. */ if (expired && busy) { pr_err("%s: Card stuck being busy! %s\n", mmc_hostname(host), __func__); return -ETIMEDOUT; } } while (busy); return 0; }
/* * Apply power to the MMC stack. This is a two-stage process. * First, we enable power to the card without the clock running. * We then wait a bit for the power to stabilise. Finally, * enable the bus drivers and clock to the card. * * We must _NOT_ enable the clock prior to power stablising. * * If a host does all the power sequencing itself, ignore the * initial MMC_POWER_UP stage. */ static void mmc_power_up(struct mmc_host *host) { int bit; /* If ocr is set, we use it */ if (host->ocr) bit = ffs(host->ocr) - 1; else bit = fls(host->ocr_avail) - 1; host->ios.vdd = bit; if (mmc_host_is_spi(host)) { host->ios.chip_select = MMC_CS_HIGH; host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; } else { host->ios.chip_select = MMC_CS_DONTCARE; host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; } host->ios.power_mode = MMC_POWER_UP; host->ios.bus_width = MMC_BUS_WIDTH_1; host->ios.timing = MMC_TIMING_LEGACY; mmc_set_ios(host); /* * This delay should be sufficient to allow the power supply * to reach the minimum voltage. */ mmc_delay(10); if (host->f_min > 400000) { pr_warning("%s: Minimum clock frequency too high for " "identification mode\n", mmc_hostname(host)); host->ios.clock = host->f_min; } else host->ios.clock = 400000; host->ios.power_mode = MMC_POWER_ON; mmc_set_ios(host); /* * This delay must be at least 74 clock sizes, or 1 ms, or the * time required to reach a stable voltage. */ mmc_delay(10); }
static void tegra_power_off(struct sdhci_host *sdhost) { struct tegra_sdhci_host *host = sdhci_priv(sdhost); if (host->power_gpio != -1) { sdhc_pinmux_config_gpio_enable(host); gpio_set_value(host->power_gpio, !host->power_gpio_polarity); mmc_delay(10); } }
int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd = {0}; int i, err = 0; BUG_ON(!host); cmd.opcode = SD_APP_OP_COND; if (mmc_host_is_spi(host)) cmd.arg = ocr & (1 << 30); /* SPI only defines one bit */ else cmd.arg = ocr; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; for (i = 200; i; i--) { err = mmc_wait_for_app_cmd(host, NULL, &cmd, MMC_CMD_RETRIES); if (err) break; /* if we're just probing, do a single pass */ if (ocr == 0) break; /* otherwise wait until reset completes */ if (mmc_host_is_spi(host)) { if (!(cmd.resp[0] & R1_SPI_IDLE)) break; } else { if (cmd.resp[0] & MMC_CARD_BUSY) break; } err = -ETIMEDOUT; mmc_delay(10); } if (rocr && !mmc_host_is_spi(host)) *rocr = cmd.resp[0]; if (i == 0 && err == -ETIMEDOUT) { pr_info("[T][ARM]Event:0x4E Info:0xE96E0069%08X\n", cmd.resp[0]); } return err; }
/* * Apply power to the MMC stack. This is a two-stage process. * First, we enable power to the card without the clock running. * We then wait a bit for the power to stabilise. Finally, * enable the bus drivers and clock to the card. * * We must _NOT_ enable the clock prior to power stablising. * * If a host does all the power sequencing itself, ignore the * initial MMC_POWER_UP stage. */ static void mmc_power_up(struct mmc_host *host) { int bit = fls(host->ocr_avail) - 1; host->ios.vdd = bit; host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; host->ios.chip_select = MMC_CS_DONTCARE; host->ios.power_mode = MMC_POWER_UP; host->ios.bus_width = MMC_BUS_WIDTH_1; host->ios.timing = MMC_TIMING_LEGACY; mmc_set_ios(host); mmc_delay(1); host->ios.clock = host->f_min; host->ios.power_mode = MMC_POWER_ON; mmc_set_ios(host); mmc_delay(2); }
static void tegra_do_initial_sequence(struct sdhci_host *sdhost) { struct tegra_sdhci_host *host = sdhci_priv(sdhost); dev_info(&host->pdev->dev, "%s, %s: card_present = %d\n", __func__, mmc_hostname(sdhost->mmc), host->card_present); if (host->card_present) { if (host->power_gpio != -1) { gpio_set_value(host->power_gpio, host->power_gpio_polarity); mmc_delay(10); sdhc_pinmux_config_gpio_disable(host); mmc_delay(50); } } else { if (host->power_gpio != -1) { sdhc_pinmux_config_gpio_enable(host); gpio_set_value(host->power_gpio, !host->power_gpio_polarity); } } }
int mmc_go_idle(struct mmc_host *host) { int err; struct mmc_command cmd; DBG("[%s] s\n",__func__); /* * Non-SPI hosts need to prevent chipselect going active during * GO_IDLE; that would put chips into SPI mode. Remind them of * that in case of hardware that won't pull up DAT3/nCS otherwise. * * SPI hosts ignore ios.chip_select; it's managed according to * rules that must accomodate non-MMC slaves which this layer * won't even know about. */ if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_HIGH); mmc_delay(1); } memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_GO_IDLE_STATE; cmd.arg = 0; // cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_NONE | MMC_CMD_BC; cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; //zhf: mark SPI mode temporarily by James Tian err = mmc_wait_for_cmd(host, &cmd, 0); mmc_delay(1); if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_DONTCARE); mmc_delay(1); } host->use_spi_crc = 0; DBG("[%s] e\n",__func__); return err; }
/** * mmc_wait_for_req - start a request and wait for completion * @host: MMC host to start command * @mrq: MMC request to start * * Start a new MMC custom command request for a host, and wait * for the command to complete. Does not attempt to parse the * response. */ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) { DECLARE_COMPLETION_ONSTACK(complete); mrq->done_data = &complete; mrq->done = mmc_wait_done; mmc_start_request(host, mrq); if(host->index == 0) mmc_delay(10); wait_for_completion_io(&complete); }
/** * mmc_switch - modify EXT_CSD register * @card: the MMC card associated with the data transfer * @set: cmd set values * @index: EXT_CSD register index * @value: value to program into EXT_CSD register * @timeout_ms: timeout (ms) for operation performed by register write, * timeout of zero implies maximum possible timeout * * Modifies the EXT_CSD register for selected card. */ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, unsigned int timeout_ms) { int err; struct mmc_command cmd = {0}; u32 status; BUG_ON(!card); BUG_ON(!card->host); cmd.opcode = MMC_SWITCH; cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (index << 16) | (value << 8) | set; cmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; cmd.cmd_timeout_ms = timeout_ms; err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES); if (err) return err; /* Must check status to be sure of no errors */ do { #if defined(CONFIG_MACH_SMDKC210) || defined(CONFIG_MACH_SMDKV310) /* HACK: in case of smdkc210, smdkv310 has problem at inand */ mmc_delay(3); #endif err = mmc_send_status(card, &status); if (err) return err; if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) break; if (mmc_host_is_spi(card->host)) break; } while (R1_CURRENT_STATE(status) == 7); if (mmc_host_is_spi(card->host)) { if (status & R1_SPI_ILLEGAL_COMMAND) return -EBADMSG; } else { if (status & 0xFDFFA000) printk(KERN_WARNING "%s: unexpected status %#x after " "switch", mmc_hostname(card->host), status); if (status & R1_SWITCH_ERROR) return -EBADMSG; } return 0; }
/** * mmc_switch - modify EXT_CSD register * @card: the MMC card associated with the data transfer * @set: cmd set values * @index: EXT_CSD register index * @value: value to program into EXT_CSD register * * Modifies the EXT_CSD register for selected card. */ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value) { int err; struct mmc_command cmd; u32 status; BUG_ON(!card); BUG_ON(!card->host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_SWITCH; cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (index << 16) | (value << 8) | set; cmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES); if (err) return err; /* Sandisk iNAND needs this delay */ mmc_delay(1); /* Must check status to be sure of no errors */ do { err = mmc_send_status(card, &status); if (err) return err; if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) break; if (mmc_host_is_spi(card->host)) break; } while (R1_CURRENT_STATE(status) == 7); if (mmc_host_is_spi(card->host)) { if (status & R1_SPI_ILLEGAL_COMMAND) return -EBADMSG; } else { if (status & 0xFDFFA000) printk(KERN_WARNING "%s: unexpected status %#x after " "switch", mmc_hostname(card->host), status); if (status & R1_SWITCH_ERROR) return -EBADMSG; } return 0; }
int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd; int i, err = 0; #if defined(CONFIG_AMBARELLA_IPC) && defined(CONFIG_MMC_AMBARELLA) && !defined(CONFIG_NOT_SHARE_SD_CONTROLLER_WITH_UITRON) struct ipc_sdinfo *sdinfo = ambarella_sd_get_sdinfo(host); if (sdinfo->from_ipc && sdinfo->is_mmc) { if (rocr) *rocr = sdinfo->ocr; return 0; } #endif BUG_ON(!host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_SEND_OP_COND; cmd.arg = mmc_host_is_spi(host) ? 0 : ocr; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; for (i = 100; i; i--) { err = mmc_wait_for_cmd(host, &cmd, 0); if (err) break; /* if we're just probing, do a single pass */ if (ocr == 0) break; /* otherwise wait until reset completes */ if (mmc_host_is_spi(host)) { if (!(cmd.resp[0] & R1_SPI_IDLE)) break; } else { if (cmd.resp[0] & MMC_CARD_BUSY) break; } err = -ETIMEDOUT; mmc_delay(10); } if (rocr && !mmc_host_is_spi(host)) *rocr = cmd.resp[0]; return err; }
int mmc_card_sleepawake(struct mmc_host *host, int sleep) { struct mmc_command cmd = {0}; struct mmc_card *card = host->card; int err; if (sleep) mmc_deselect_cards(host); #ifdef CONFIG_HUAWEI_KERNEL /* Hynix eMMC not send CMD5 to avoid data partition read-only when sudden power off */ if(EMMC_HYNIX_MID != card->cid.manfid) { #endif cmd.opcode = MMC_SLEEP_AWAKE; cmd.arg = card->rca << 16; if (sleep) cmd.arg |= 1 << 15; cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; err = mmc_wait_for_cmd(host, &cmd, 0); if (err) return err; #ifdef CONFIG_HUAWEI_KERNEL } else { printk("eMMC enter sleep mode without send CMD5!\r\n"); } #endif /* * If the host does not wait while the card signals busy, then we will * will have to wait the sleep/awake timeout. Note, we cannot use the * SEND_STATUS command to poll the status because that command (and most * others) is invalid while the card sleeps. */ if (!(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) mmc_delay(DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000)); if (!sleep) err = mmc_select_card(card); return err; }
int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd; int i, err = 0; BUG_ON(!host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = SD_IO_SEND_OP_COND; cmd.arg = ocr; cmd.flags = MMC_RSP_SPI_R4 | MMC_RSP_R4 | MMC_CMD_BCR; for (i = 100; i; i--) { err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES); if (err) break; /* if we're just probing, do a single pass */ if (ocr == 0) break; /* otherwise wait until reset completes */ if (mmc_host_is_spi(host)) { /* * Both R1_SPI_IDLE and MMC_CARD_BUSY indicate * an initialized card under SPI, but some cards * (Marvell's) only behave when looking at this * one. */ if (cmd.resp[1] & MMC_CARD_BUSY) break; } else { if (cmd.resp[0] & MMC_CARD_BUSY) break; } err = -ETIMEDOUT; mmc_delay(10); } if (rocr) *rocr = cmd.resp[mmc_host_is_spi(host) ? 1 : 0]; return err; }
int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd = {0}; int i, err = 0; BUG_ON(!host); cmd.opcode = SD_APP_OP_COND; if (mmc_host_is_spi(host)) cmd.arg = ocr & (1 << 30); else cmd.arg = ocr; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; for (i = 100; i; i--) { err = mmc_wait_for_app_cmd(host, NULL, &cmd, MMC_CMD_RETRIES); if (err) break; if (ocr == 0) break; if (mmc_host_is_spi(host)) { if (!(cmd.resp[0] & R1_SPI_IDLE)) break; } else { if (cmd.resp[0] & MMC_CARD_BUSY) break; } err = -ETIMEDOUT; mmc_delay(10); } if(err) printk(KERN_ERR "%s: ACMD 41 init process fail : resp : %#x\n", mmc_hostname(host), cmd.resp[0]); if (rocr && !mmc_host_is_spi(host)) *rocr = cmd.resp[0]; return err; }
int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd; int i, err = 0; DBG("[%s] s\n",__func__); BUG_ON(!host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_SEND_OP_COND; cmd.arg = mmc_host_is_spi(host) ? 0 : ocr; // cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; //zhf: mark SPI mode temporarily by James Tian for (i = 100; i; i--) { err = mmc_wait_for_cmd(host, &cmd, 0); if (err) break; /* if we're just probing, do a single pass */ if (ocr == 0) break; /* otherwise wait until reset completes */ if (mmc_host_is_spi(host)) { if (!(cmd.resp[0] & R1_SPI_IDLE)) break; } else { if (cmd.resp[0] & MMC_CARD_BUSY) break; } err = -ETIMEDOUT; mmc_delay(10); } if (rocr && !mmc_host_is_spi(host)) *rocr = cmd.resp[0]; DBG("[%s] e\n",__func__); return err; }
int mmc_set_block_length(struct mmc_card *card, u32 length) { int err; int retries = 3; struct mmc_command cmd; u32 status = 0; unsigned long delay = jiffies + HZ; BUG_ON(!card); BUG_ON(!card->host); memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = MMC_SET_BLOCKLEN; cmd.arg = length; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES); if (err) return err; do { err = mmc_send_status(card, &status); if (err) { printk(KERN_ERR "%s: failed to get status (%d)\n", __func__, err); mmc_delay(5); retries--; continue; } if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) break; if (mmc_host_is_spi(card->host)) break; if (time_after(jiffies, delay)) { printk(KERN_ERR "failed to get card ready!!!\n"); break; } } while (retries && R1_CURRENT_STATE(status) == 7); return 0; }
int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) { struct mmc_command cmd = {0}; int i, err = 0; BUG_ON(!host); cmd.opcode = MMC_SEND_OP_COND; cmd.arg = mmc_host_is_spi(host) ? 0 : ocr; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; for (i = 100; i; i--) { err = mmc_wait_for_cmd(host, &cmd, 0); if (err) break; /* if we're just probing, do a single pass */ if (ocr == 0) break; /* otherwise wait until reset completes */ if (mmc_host_is_spi(host)) { if (!(cmd.resp[0] & R1_SPI_IDLE)) break; } else { if (cmd.resp[0] & MMC_CARD_BUSY) break; } err = -ETIMEDOUT; mmc_delay(10); } if (rocr && !mmc_host_is_spi(host)) *rocr = cmd.resp[0]; return err; }
int mmc_send_speed_class_ctrl(struct mmc_host *host, unsigned int speed_class_ctrl_arg) { int err = 0; struct mmc_command cmd = { .opcode = SD_SPEED_CLASS_CONTROL, .arg = (speed_class_ctrl_arg << 28), .flags = MMC_RSP_R1B | MMC_CMD_AC | MMC_RSP_BUSY, }; BUG_ON(!host); BUG_ON(speed_class_ctrl_arg > 3); err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES); if (err) return err; /* * If the host does not wait while the card signals busy, then we will * will have to wait the max busy indication timeout. */ if (!(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) mmc_delay(1000); return err; }