Lines Matching refs:card
149 if (err && cmd->retries && !mmc_card_removed(host->card)) { in mmc_request_done()
235 if (mmc_card_removed(host->card)) in mmc_start_request()
309 void mmc_start_bkops(struct mmc_card *card, bool from_exception) in mmc_start_bkops() argument
315 BUG_ON(!card); in mmc_start_bkops()
317 if (!card->ext_csd.man_bkops_en || mmc_card_doing_bkops(card)) in mmc_start_bkops()
320 err = mmc_read_bkops_status(card); in mmc_start_bkops()
323 mmc_hostname(card->host), err); in mmc_start_bkops()
327 if (!card->ext_csd.raw_bkops_status) in mmc_start_bkops()
330 if (card->ext_csd.raw_bkops_status < EXT_CSD_BKOPS_LEVEL_2 && in mmc_start_bkops()
334 mmc_claim_host(card->host); in mmc_start_bkops()
335 if (card->ext_csd.raw_bkops_status >= EXT_CSD_BKOPS_LEVEL_2) { in mmc_start_bkops()
343 mmc_retune_hold(card->host); in mmc_start_bkops()
345 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_start_bkops()
350 mmc_hostname(card->host), err); in mmc_start_bkops()
351 mmc_retune_release(card->host); in mmc_start_bkops()
361 mmc_card_set_doing_bkops(card); in mmc_start_bkops()
363 mmc_retune_release(card->host); in mmc_start_bkops()
365 mmc_release_host(card->host); in mmc_start_bkops()
461 mmc_card_removed(host->card)) { in mmc_wait_for_data_req_done()
462 err = host->areq->err_check(host->card, in mmc_wait_for_data_req_done()
502 if (!mmc_interrupt_hpi(host->card)) { in mmc_wait_for_req_done()
513 mmc_card_removed(host->card)) in mmc_wait_for_req_done()
603 if (host->card && mmc_card_mmc(host->card) && in mmc_start_req()
612 mmc_start_bkops(host->card, true); in mmc_start_req()
664 int mmc_interrupt_hpi(struct mmc_card *card) in mmc_interrupt_hpi() argument
670 BUG_ON(!card); in mmc_interrupt_hpi()
672 if (!card->ext_csd.hpi_en) { in mmc_interrupt_hpi()
673 pr_info("%s: HPI enable bit unset\n", mmc_hostname(card->host)); in mmc_interrupt_hpi()
677 mmc_claim_host(card->host); in mmc_interrupt_hpi()
678 err = mmc_send_status(card, &status); in mmc_interrupt_hpi()
680 pr_err("%s: Get card status fail\n", mmc_hostname(card->host)); in mmc_interrupt_hpi()
699 mmc_hostname(card->host), R1_CURRENT_STATE(status)); in mmc_interrupt_hpi()
704 err = mmc_send_hpi_cmd(card, &status); in mmc_interrupt_hpi()
708 prg_wait = jiffies + msecs_to_jiffies(card->ext_csd.out_of_int_time); in mmc_interrupt_hpi()
710 err = mmc_send_status(card, &status); in mmc_interrupt_hpi()
719 mmc_release_host(card->host); in mmc_interrupt_hpi()
762 int mmc_stop_bkops(struct mmc_card *card) in mmc_stop_bkops() argument
766 BUG_ON(!card); in mmc_stop_bkops()
767 err = mmc_interrupt_hpi(card); in mmc_stop_bkops()
774 mmc_card_clr_doing_bkops(card); in mmc_stop_bkops()
775 mmc_retune_release(card->host); in mmc_stop_bkops()
783 int mmc_read_bkops_status(struct mmc_card *card) in mmc_read_bkops_status() argument
788 mmc_claim_host(card->host); in mmc_read_bkops_status()
789 err = mmc_get_ext_csd(card, &ext_csd); in mmc_read_bkops_status()
790 mmc_release_host(card->host); in mmc_read_bkops_status()
794 card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS]; in mmc_read_bkops_status()
795 card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS]; in mmc_read_bkops_status()
809 void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card) in mmc_set_data_timeout() argument
816 if (mmc_card_sdio(card)) { in mmc_set_data_timeout()
825 mult = mmc_card_sd(card) ? 100 : 10; in mmc_set_data_timeout()
832 mult <<= card->csd.r2w_factor; in mmc_set_data_timeout()
834 data->timeout_ns = card->csd.tacc_ns * mult; in mmc_set_data_timeout()
835 data->timeout_clks = card->csd.tacc_clks * mult; in mmc_set_data_timeout()
840 if (mmc_card_sd(card)) { in mmc_set_data_timeout()
844 if (card->host->ios.clock) in mmc_set_data_timeout()
846 (card->host->ios.clock / 1000); in mmc_set_data_timeout()
864 if (timeout_us > limit_us || mmc_card_blockaddr(card)) { in mmc_set_data_timeout()
880 if (mmc_card_long_read_time(card) && data->flags & MMC_DATA_READ) { in mmc_set_data_timeout()
891 if (mmc_host_is_spi(card->host)) { in mmc_set_data_timeout()
917 unsigned int mmc_align_data_size(struct mmc_card *card, unsigned int sz) in mmc_align_data_size() argument
1011 void mmc_get_card(struct mmc_card *card) in mmc_get_card() argument
1013 pm_runtime_get_sync(&card->dev); in mmc_get_card()
1014 mmc_claim_host(card->host); in mmc_get_card()
1022 void mmc_put_card(struct mmc_card *card) in mmc_put_card() argument
1024 mmc_release_host(card->host); in mmc_put_card()
1025 pm_runtime_mark_last_busy(&card->dev); in mmc_put_card()
1026 pm_runtime_put_autosuspend(&card->dev); in mmc_put_card()
1071 int mmc_execute_tuning(struct mmc_card *card) in mmc_execute_tuning() argument
1073 struct mmc_host *host = card->host; in mmc_execute_tuning()
1080 if (mmc_card_mmc(card)) in mmc_execute_tuning()
1666 int mmc_select_drive_strength(struct mmc_card *card, unsigned int max_dtr, in mmc_select_drive_strength() argument
1669 struct mmc_host *host = card->host; in mmc_select_drive_strength()
1693 return host->ops->select_drive_strength(card, max_dtr, in mmc_select_drive_strength()
1903 void mmc_init_erase(struct mmc_card *card) in mmc_init_erase() argument
1907 if (is_power_of_2(card->erase_size)) in mmc_init_erase()
1908 card->erase_shift = ffs(card->erase_size) - 1; in mmc_init_erase()
1910 card->erase_shift = 0; in mmc_init_erase()
1927 if (mmc_card_sd(card) && card->ssr.au) { in mmc_init_erase()
1928 card->pref_erase = card->ssr.au; in mmc_init_erase()
1929 card->erase_shift = ffs(card->ssr.au) - 1; in mmc_init_erase()
1930 } else if (card->ext_csd.hc_erase_size) { in mmc_init_erase()
1931 card->pref_erase = card->ext_csd.hc_erase_size; in mmc_init_erase()
1932 } else if (card->erase_size) { in mmc_init_erase()
1933 sz = (card->csd.capacity << (card->csd.read_blkbits - 9)) >> 11; in mmc_init_erase()
1935 card->pref_erase = 512 * 1024 / 512; in mmc_init_erase()
1937 card->pref_erase = 1024 * 1024 / 512; in mmc_init_erase()
1939 card->pref_erase = 2 * 1024 * 1024 / 512; in mmc_init_erase()
1941 card->pref_erase = 4 * 1024 * 1024 / 512; in mmc_init_erase()
1942 if (card->pref_erase < card->erase_size) in mmc_init_erase()
1943 card->pref_erase = card->erase_size; in mmc_init_erase()
1945 sz = card->pref_erase % card->erase_size; in mmc_init_erase()
1947 card->pref_erase += card->erase_size - sz; in mmc_init_erase()
1950 card->pref_erase = 0; in mmc_init_erase()
1953 static unsigned int mmc_mmc_erase_timeout(struct mmc_card *card, in mmc_mmc_erase_timeout() argument
1959 (arg == MMC_TRIM_ARG && card->ext_csd.rev >= 6)) { in mmc_mmc_erase_timeout()
1960 erase_timeout = card->ext_csd.trim_timeout; in mmc_mmc_erase_timeout()
1961 } else if (card->ext_csd.erase_group_def & 1) { in mmc_mmc_erase_timeout()
1964 erase_timeout = card->ext_csd.trim_timeout; in mmc_mmc_erase_timeout()
1966 erase_timeout = card->ext_csd.hc_erase_timeout; in mmc_mmc_erase_timeout()
1969 unsigned int mult = (10 << card->csd.r2w_factor); in mmc_mmc_erase_timeout()
1970 unsigned int timeout_clks = card->csd.tacc_clks * mult; in mmc_mmc_erase_timeout()
1974 if (card->csd.tacc_ns < 1000000) in mmc_mmc_erase_timeout()
1975 timeout_us = (card->csd.tacc_ns * mult) / 1000; in mmc_mmc_erase_timeout()
1977 timeout_us = (card->csd.tacc_ns / 1000) * mult; in mmc_mmc_erase_timeout()
1985 (card->host->ios.clock / 1000); in mmc_mmc_erase_timeout()
2000 erase_timeout *= card->ext_csd.sec_erase_mult; in mmc_mmc_erase_timeout()
2002 erase_timeout *= card->ext_csd.sec_trim_mult; in mmc_mmc_erase_timeout()
2011 if (mmc_host_is_spi(card->host) && erase_timeout < 1000) in mmc_mmc_erase_timeout()
2017 static unsigned int mmc_sd_erase_timeout(struct mmc_card *card, in mmc_sd_erase_timeout() argument
2023 if (card->ssr.erase_timeout) { in mmc_sd_erase_timeout()
2025 erase_timeout = card->ssr.erase_timeout * qty + in mmc_sd_erase_timeout()
2026 card->ssr.erase_offset; in mmc_sd_erase_timeout()
2042 static unsigned int mmc_erase_timeout(struct mmc_card *card, in mmc_erase_timeout() argument
2046 if (mmc_card_sd(card)) in mmc_erase_timeout()
2047 return mmc_sd_erase_timeout(card, arg, qty); in mmc_erase_timeout()
2049 return mmc_mmc_erase_timeout(card, arg, qty); in mmc_erase_timeout()
2052 static int mmc_do_erase(struct mmc_card *card, unsigned int from, in mmc_do_erase() argument
2060 mmc_retune_hold(card->host); in mmc_do_erase()
2078 if (card->erase_shift) in mmc_do_erase()
2079 qty += ((to >> card->erase_shift) - in mmc_do_erase()
2080 (from >> card->erase_shift)) + 1; in mmc_do_erase()
2081 else if (mmc_card_sd(card)) in mmc_do_erase()
2084 qty += ((to / card->erase_size) - in mmc_do_erase()
2085 (from / card->erase_size)) + 1; in mmc_do_erase()
2087 if (!mmc_card_blockaddr(card)) { in mmc_do_erase()
2092 if (mmc_card_sd(card)) in mmc_do_erase()
2098 err = mmc_wait_for_cmd(card->host, &cmd, 0); in mmc_do_erase()
2107 if (mmc_card_sd(card)) in mmc_do_erase()
2113 err = mmc_wait_for_cmd(card->host, &cmd, 0); in mmc_do_erase()
2125 cmd.busy_timeout = mmc_erase_timeout(card, arg, qty); in mmc_do_erase()
2126 err = mmc_wait_for_cmd(card->host, &cmd, 0); in mmc_do_erase()
2134 if (mmc_host_is_spi(card->host)) in mmc_do_erase()
2141 cmd.arg = card->rca << 16; in mmc_do_erase()
2144 err = mmc_wait_for_cmd(card->host, &cmd, 0); in mmc_do_erase()
2157 mmc_hostname(card->host), __func__); in mmc_do_erase()
2165 mmc_retune_release(card->host); in mmc_do_erase()
2178 int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr, in mmc_erase() argument
2184 if (!(card->host->caps & MMC_CAP_ERASE) || in mmc_erase()
2185 !(card->csd.cmdclass & CCC_ERASE)) in mmc_erase()
2188 if (!card->erase_size) in mmc_erase()
2191 if (mmc_card_sd(card) && arg != MMC_ERASE_ARG) in mmc_erase()
2195 !(card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN)) in mmc_erase()
2199 !(card->ext_csd.sec_feature_support & EXT_CSD_SEC_GB_CL_EN)) in mmc_erase()
2203 if (from % card->erase_size || nr % card->erase_size) in mmc_erase()
2208 rem = from % card->erase_size; in mmc_erase()
2210 rem = card->erase_size - rem; in mmc_erase()
2217 rem = nr % card->erase_size; in mmc_erase()
2241 rem = card->erase_size - (from % card->erase_size); in mmc_erase()
2242 if ((arg & MMC_TRIM_ARGS) && (card->eg_boundary) && (nr > rem)) { in mmc_erase()
2243 err = mmc_do_erase(card, from, from + rem - 1, arg); in mmc_erase()
2249 return mmc_do_erase(card, from, to, arg); in mmc_erase()
2253 int mmc_can_erase(struct mmc_card *card) in mmc_can_erase() argument
2255 if ((card->host->caps & MMC_CAP_ERASE) && in mmc_can_erase()
2256 (card->csd.cmdclass & CCC_ERASE) && card->erase_size) in mmc_can_erase()
2262 int mmc_can_trim(struct mmc_card *card) in mmc_can_trim() argument
2264 if ((card->ext_csd.sec_feature_support & EXT_CSD_SEC_GB_CL_EN) && in mmc_can_trim()
2265 (!(card->quirks & MMC_QUIRK_TRIM_BROKEN))) in mmc_can_trim()
2271 int mmc_can_discard(struct mmc_card *card) in mmc_can_discard() argument
2277 if (card->ext_csd.feature_support & MMC_DISCARD_FEATURE) in mmc_can_discard()
2283 int mmc_can_sanitize(struct mmc_card *card) in mmc_can_sanitize() argument
2285 if (!mmc_can_trim(card) && !mmc_can_erase(card)) in mmc_can_sanitize()
2287 if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_SANITIZE) in mmc_can_sanitize()
2293 int mmc_can_secure_erase_trim(struct mmc_card *card) in mmc_can_secure_erase_trim() argument
2295 if ((card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN) && in mmc_can_secure_erase_trim()
2296 !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN)) in mmc_can_secure_erase_trim()
2302 int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from, in mmc_erase_group_aligned() argument
2305 if (!card->erase_size) in mmc_erase_group_aligned()
2307 if (from % card->erase_size || nr % card->erase_size) in mmc_erase_group_aligned()
2313 static unsigned int mmc_do_calc_max_discard(struct mmc_card *card, in mmc_do_calc_max_discard() argument
2316 struct mmc_host *host = card->host; in mmc_do_calc_max_discard()
2320 if (card->erase_shift) in mmc_do_calc_max_discard()
2321 max_qty = UINT_MAX >> card->erase_shift; in mmc_do_calc_max_discard()
2322 else if (mmc_card_sd(card)) in mmc_do_calc_max_discard()
2325 max_qty = UINT_MAX / card->erase_size; in mmc_do_calc_max_discard()
2331 timeout = mmc_erase_timeout(card, arg, qty + x); in mmc_do_calc_max_discard()
2356 card->eg_boundary = 1; in mmc_do_calc_max_discard()
2361 if (card->erase_shift) in mmc_do_calc_max_discard()
2362 max_discard = qty << card->erase_shift; in mmc_do_calc_max_discard()
2363 else if (mmc_card_sd(card)) in mmc_do_calc_max_discard()
2366 max_discard = qty * card->erase_size; in mmc_do_calc_max_discard()
2371 unsigned int mmc_calc_max_discard(struct mmc_card *card) in mmc_calc_max_discard() argument
2373 struct mmc_host *host = card->host; in mmc_calc_max_discard()
2384 if (mmc_card_mmc(card) && !(card->ext_csd.erase_group_def & 1)) in mmc_calc_max_discard()
2385 return card->pref_erase; in mmc_calc_max_discard()
2387 max_discard = mmc_do_calc_max_discard(card, MMC_ERASE_ARG); in mmc_calc_max_discard()
2388 if (mmc_can_trim(card)) { in mmc_calc_max_discard()
2389 max_trim = mmc_do_calc_max_discard(card, MMC_TRIM_ARG); in mmc_calc_max_discard()
2392 } else if (max_discard < card->erase_size) { in mmc_calc_max_discard()
2401 int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen) in mmc_set_blocklen() argument
2405 if (mmc_card_blockaddr(card) || mmc_card_ddr52(card)) in mmc_set_blocklen()
2411 return mmc_wait_for_cmd(card->host, &cmd, 5); in mmc_set_blocklen()
2415 int mmc_set_blockcount(struct mmc_card *card, unsigned int blockcount, in mmc_set_blockcount() argument
2425 return mmc_wait_for_cmd(card->host, &cmd, 5); in mmc_set_blockcount()
2440 if (!host->card) in mmc_hw_reset()
2504 if (!host->card || mmc_card_removed(host->card)) in _mmc_detect_card_removed()
2522 mmc_card_set_removed(host->card); in _mmc_detect_card_removed()
2531 struct mmc_card *card = host->card; in mmc_detect_card_removed() local
2536 if (!card) in mmc_detect_card_removed()
2539 ret = mmc_card_removed(card); in mmc_detect_card_removed()
2684 BUG_ON(host->card); in mmc_stop_host()
2732 mmc_power_up(host, host->card->ocr); in mmc_power_restore_host()
2744 int mmc_flush_cache(struct mmc_card *card) in mmc_flush_cache() argument
2748 if (mmc_card_mmc(card) && in mmc_flush_cache()
2749 (card->ext_csd.cache_size > 0) && in mmc_flush_cache()
2750 (card->ext_csd.cache_ctrl & 1)) { in mmc_flush_cache()
2751 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_flush_cache()
2755 mmc_hostname(card->host), err); in mmc_flush_cache()