Lines Matching full:card

20 #include <linux/mmc/card.h>
24 #include "card.h"
65 static int mmc_decode_cid(struct mmc_card *card) in mmc_decode_cid() argument
67 u32 *resp = card->raw_cid; in mmc_decode_cid()
70 * Add the raw card ID (cid) data to the entropy pool. It doesn't in mmc_decode_cid()
73 add_device_randomness(&card->raw_cid, sizeof(card->raw_cid)); in mmc_decode_cid()
79 switch (card->csd.mmca_vsn) { in mmc_decode_cid()
82 card->cid.manfid = unstuff_bits(resp, 104, 24); in mmc_decode_cid()
83 card->cid.prod_name[0] = unstuff_bits(resp, 96, 8); in mmc_decode_cid()
84 card->cid.prod_name[1] = unstuff_bits(resp, 88, 8); in mmc_decode_cid()
85 card->cid.prod_name[2] = unstuff_bits(resp, 80, 8); in mmc_decode_cid()
86 card->cid.prod_name[3] = unstuff_bits(resp, 72, 8); in mmc_decode_cid()
87 card->cid.prod_name[4] = unstuff_bits(resp, 64, 8); in mmc_decode_cid()
88 card->cid.prod_name[5] = unstuff_bits(resp, 56, 8); in mmc_decode_cid()
89 card->cid.prod_name[6] = unstuff_bits(resp, 48, 8); in mmc_decode_cid()
90 card->cid.hwrev = unstuff_bits(resp, 44, 4); in mmc_decode_cid()
91 card->cid.fwrev = unstuff_bits(resp, 40, 4); in mmc_decode_cid()
92 card->cid.serial = unstuff_bits(resp, 16, 24); in mmc_decode_cid()
93 card->cid.month = unstuff_bits(resp, 12, 4); in mmc_decode_cid()
94 card->cid.year = unstuff_bits(resp, 8, 4) + 1997; in mmc_decode_cid()
100 card->cid.manfid = unstuff_bits(resp, 120, 8); in mmc_decode_cid()
101 card->cid.oemid = unstuff_bits(resp, 104, 16); in mmc_decode_cid()
102 card->cid.prod_name[0] = unstuff_bits(resp, 96, 8); in mmc_decode_cid()
103 card->cid.prod_name[1] = unstuff_bits(resp, 88, 8); in mmc_decode_cid()
104 card->cid.prod_name[2] = unstuff_bits(resp, 80, 8); in mmc_decode_cid()
105 card->cid.prod_name[3] = unstuff_bits(resp, 72, 8); in mmc_decode_cid()
106 card->cid.prod_name[4] = unstuff_bits(resp, 64, 8); in mmc_decode_cid()
107 card->cid.prod_name[5] = unstuff_bits(resp, 56, 8); in mmc_decode_cid()
108 card->cid.prv = unstuff_bits(resp, 48, 8); in mmc_decode_cid()
109 card->cid.serial = unstuff_bits(resp, 16, 32); in mmc_decode_cid()
110 card->cid.month = unstuff_bits(resp, 12, 4); in mmc_decode_cid()
111 card->cid.year = unstuff_bits(resp, 8, 4) + 1997; in mmc_decode_cid()
115 pr_err("%s: card has unknown MMCA version %d\n", in mmc_decode_cid()
116 mmc_hostname(card->host), card->csd.mmca_vsn); in mmc_decode_cid()
121 strim(card->cid.prod_name); in mmc_decode_cid()
126 static void mmc_set_erase_size(struct mmc_card *card) in mmc_set_erase_size() argument
128 if (card->ext_csd.erase_group_def & 1) in mmc_set_erase_size()
129 card->erase_size = card->ext_csd.hc_erase_size; in mmc_set_erase_size()
131 card->erase_size = card->csd.erase_size; in mmc_set_erase_size()
133 mmc_init_erase(card); in mmc_set_erase_size()
137 static void mmc_set_wp_grp_size(struct mmc_card *card) in mmc_set_wp_grp_size() argument
139 if (card->ext_csd.erase_group_def & 1) in mmc_set_wp_grp_size()
140 card->wp_grp_size = card->ext_csd.hc_erase_size * in mmc_set_wp_grp_size()
141 card->ext_csd.raw_hc_erase_gap_size; in mmc_set_wp_grp_size()
143 card->wp_grp_size = card->csd.erase_size * in mmc_set_wp_grp_size()
144 (card->csd.wp_grp_size + 1); in mmc_set_wp_grp_size()
148 * Given a 128-bit response, decode to our card CSD structure.
150 static int mmc_decode_csd(struct mmc_card *card) in mmc_decode_csd() argument
152 struct mmc_csd *csd = &card->csd; in mmc_decode_csd()
154 u32 *resp = card->raw_csd; in mmc_decode_csd()
164 mmc_hostname(card->host), csd->structure); in mmc_decode_csd()
203 static void mmc_select_card_type(struct mmc_card *card) in mmc_select_card_type() argument
205 struct mmc_host *host = card->host; in mmc_select_card_type()
206 u8 card_type = card->ext_csd.raw_card_type; in mmc_select_card_type()
260 card->ext_csd.strobe_support && in mmc_select_card_type()
264 card->ext_csd.hs_max_dtr = hs_max_dtr; in mmc_select_card_type()
265 card->ext_csd.hs200_max_dtr = hs200_max_dtr; in mmc_select_card_type()
266 card->mmc_avail_type = avail_type; in mmc_select_card_type()
269 static void mmc_manage_enhanced_area(struct mmc_card *card, u8 *ext_csd) in mmc_manage_enhanced_area() argument
276 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_manage_enhanced_area()
277 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_manage_enhanced_area()
281 * card has the Enhanced area enabled. If so, export enhanced in mmc_manage_enhanced_area()
286 if (card->ext_csd.partition_setting_completed) { in mmc_manage_enhanced_area()
295 card->ext_csd.enhanced_area_offset = in mmc_manage_enhanced_area()
300 if (mmc_card_blockaddr(card)) in mmc_manage_enhanced_area()
301 card->ext_csd.enhanced_area_offset <<= 9; in mmc_manage_enhanced_area()
305 card->ext_csd.enhanced_area_size = in mmc_manage_enhanced_area()
308 card->ext_csd.enhanced_area_size *= in mmc_manage_enhanced_area()
310 card->ext_csd.enhanced_area_size <<= 9; in mmc_manage_enhanced_area()
313 mmc_hostname(card->host)); in mmc_manage_enhanced_area()
318 static void mmc_part_add(struct mmc_card *card, u64 size, in mmc_part_add() argument
322 card->part[card->nr_parts].size = size; in mmc_part_add()
323 card->part[card->nr_parts].part_cfg = part_cfg; in mmc_part_add()
324 sprintf(card->part[card->nr_parts].name, name, idx); in mmc_part_add()
325 card->part[card->nr_parts].force_ro = ro; in mmc_part_add()
326 card->part[card->nr_parts].area_type = area_type; in mmc_part_add()
327 card->nr_parts++; in mmc_part_add()
330 static void mmc_manage_gp_partitions(struct mmc_card *card, u8 *ext_csd) in mmc_manage_gp_partitions() argument
353 if (card->ext_csd.partition_setting_completed == 0) { in mmc_manage_gp_partitions()
355 mmc_hostname(card->host)); in mmc_manage_gp_partitions()
365 mmc_part_add(card, part_size << 19, in mmc_manage_gp_partitions()
379 static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) in mmc_decode_ext_csd() argument
387 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; in mmc_decode_ext_csd()
388 if (card->csd.structure == 3) { in mmc_decode_ext_csd()
389 if (card->ext_csd.raw_ext_csd_structure > 2) { in mmc_decode_ext_csd()
391 "version %d\n", mmc_hostname(card->host), in mmc_decode_ext_csd()
392 card->ext_csd.raw_ext_csd_structure); in mmc_decode_ext_csd()
398 np = mmc_of_find_child_device(card->host, 0); in mmc_decode_ext_csd()
399 if (np && of_device_is_compatible(np, "mmc-card")) in mmc_decode_ext_csd()
408 card->ext_csd.rev = ext_csd[EXT_CSD_REV]; in mmc_decode_ext_csd()
411 mmc_fixup_device(card, mmc_ext_csd_fixups); in mmc_decode_ext_csd()
413 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; in mmc_decode_ext_csd()
414 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; in mmc_decode_ext_csd()
415 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; in mmc_decode_ext_csd()
416 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3]; in mmc_decode_ext_csd()
417 if (card->ext_csd.rev >= 2) { in mmc_decode_ext_csd()
418 card->ext_csd.sectors = in mmc_decode_ext_csd()
425 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) in mmc_decode_ext_csd()
426 mmc_card_set_blockaddr(card); in mmc_decode_ext_csd()
429 card->ext_csd.strobe_support = ext_csd[EXT_CSD_STROBE_SUPPORT]; in mmc_decode_ext_csd()
430 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; in mmc_decode_ext_csd()
432 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; in mmc_decode_ext_csd()
433 card->ext_csd.raw_erase_timeout_mult = in mmc_decode_ext_csd()
435 card->ext_csd.raw_hc_erase_grp_size = in mmc_decode_ext_csd()
437 card->ext_csd.raw_boot_mult = in mmc_decode_ext_csd()
439 if (card->ext_csd.rev >= 3) { in mmc_decode_ext_csd()
441 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; in mmc_decode_ext_csd()
444 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; in mmc_decode_ext_csd()
448 card->ext_csd.sa_timeout = in mmc_decode_ext_csd()
450 card->ext_csd.erase_group_def = in mmc_decode_ext_csd()
452 card->ext_csd.hc_erase_timeout = 300 * in mmc_decode_ext_csd()
454 card->ext_csd.hc_erase_size = in mmc_decode_ext_csd()
457 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C]; in mmc_decode_ext_csd()
463 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_host_can_access_boot(card->host)) { in mmc_decode_ext_csd()
466 mmc_part_add(card, part_size, in mmc_decode_ext_csd()
474 card->ext_csd.raw_hc_erase_gap_size = in mmc_decode_ext_csd()
476 card->ext_csd.raw_sec_trim_mult = in mmc_decode_ext_csd()
478 card->ext_csd.raw_sec_erase_mult = in mmc_decode_ext_csd()
480 card->ext_csd.raw_sec_feature_support = in mmc_decode_ext_csd()
482 card->ext_csd.raw_trim_mult = in mmc_decode_ext_csd()
484 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; in mmc_decode_ext_csd()
485 card->ext_csd.raw_driver_strength = ext_csd[EXT_CSD_DRIVER_STRENGTH]; in mmc_decode_ext_csd()
486 if (card->ext_csd.rev >= 4) { in mmc_decode_ext_csd()
489 card->ext_csd.partition_setting_completed = 1; in mmc_decode_ext_csd()
491 card->ext_csd.partition_setting_completed = 0; in mmc_decode_ext_csd()
493 mmc_manage_enhanced_area(card, ext_csd); in mmc_decode_ext_csd()
495 mmc_manage_gp_partitions(card, ext_csd); in mmc_decode_ext_csd()
497 card->ext_csd.sec_trim_mult = in mmc_decode_ext_csd()
499 card->ext_csd.sec_erase_mult = in mmc_decode_ext_csd()
501 card->ext_csd.sec_feature_support = in mmc_decode_ext_csd()
503 card->ext_csd.trim_timeout = 300 * in mmc_decode_ext_csd()
511 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP]; in mmc_decode_ext_csd()
512 card->ext_csd.boot_ro_lockable = true; in mmc_decode_ext_csd()
515 card->ext_csd.raw_pwr_cl_52_195 = in mmc_decode_ext_csd()
517 card->ext_csd.raw_pwr_cl_26_195 = in mmc_decode_ext_csd()
519 card->ext_csd.raw_pwr_cl_52_360 = in mmc_decode_ext_csd()
521 card->ext_csd.raw_pwr_cl_26_360 = in mmc_decode_ext_csd()
523 card->ext_csd.raw_pwr_cl_200_195 = in mmc_decode_ext_csd()
525 card->ext_csd.raw_pwr_cl_200_360 = in mmc_decode_ext_csd()
527 card->ext_csd.raw_pwr_cl_ddr_52_195 = in mmc_decode_ext_csd()
529 card->ext_csd.raw_pwr_cl_ddr_52_360 = in mmc_decode_ext_csd()
531 card->ext_csd.raw_pwr_cl_ddr_200_360 = in mmc_decode_ext_csd()
535 if (card->ext_csd.rev >= 5) { in mmc_decode_ext_csd()
537 if (card->cid.year < 2010) in mmc_decode_ext_csd()
538 card->cid.year += 16; in mmc_decode_ext_csd()
540 /* check whether the eMMC card supports BKOPS */ in mmc_decode_ext_csd()
542 card->ext_csd.bkops = 1; in mmc_decode_ext_csd()
543 card->ext_csd.man_bkops_en = in mmc_decode_ext_csd()
546 card->ext_csd.raw_bkops_status = in mmc_decode_ext_csd()
548 if (card->ext_csd.man_bkops_en) in mmc_decode_ext_csd()
550 mmc_hostname(card->host)); in mmc_decode_ext_csd()
551 card->ext_csd.auto_bkops_en = in mmc_decode_ext_csd()
554 if (card->ext_csd.auto_bkops_en) in mmc_decode_ext_csd()
556 mmc_hostname(card->host)); in mmc_decode_ext_csd()
559 /* check whether the eMMC card supports HPI */ in mmc_decode_ext_csd()
560 if (!mmc_card_broken_hpi(card) && in mmc_decode_ext_csd()
562 card->ext_csd.hpi = 1; in mmc_decode_ext_csd()
564 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION; in mmc_decode_ext_csd()
566 card->ext_csd.hpi_cmd = MMC_SEND_STATUS; in mmc_decode_ext_csd()
571 card->ext_csd.out_of_int_time = in mmc_decode_ext_csd()
575 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; in mmc_decode_ext_csd()
576 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; in mmc_decode_ext_csd()
581 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT]; in mmc_decode_ext_csd()
582 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_can_cmd23(card->host)) { in mmc_decode_ext_csd()
583 mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17, in mmc_decode_ext_csd()
590 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT]; in mmc_decode_ext_csd()
592 card->erased_byte = 0xFF; in mmc_decode_ext_csd()
594 card->erased_byte = 0x0; in mmc_decode_ext_csd()
597 card->ext_csd.generic_cmd6_time = DEFAULT_CMD6_TIMEOUT_MS; in mmc_decode_ext_csd()
598 if (card->ext_csd.rev >= 6) { in mmc_decode_ext_csd()
599 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE; in mmc_decode_ext_csd()
601 card->ext_csd.generic_cmd6_time = 10 * in mmc_decode_ext_csd()
603 card->ext_csd.power_off_longtime = 10 * in mmc_decode_ext_csd()
606 card->ext_csd.cache_size = in mmc_decode_ext_csd()
613 card->ext_csd.data_sector_size = 4096; in mmc_decode_ext_csd()
615 card->ext_csd.data_sector_size = 512; in mmc_decode_ext_csd()
619 card->ext_csd.data_tag_unit_size = in mmc_decode_ext_csd()
621 (card->ext_csd.data_sector_size); in mmc_decode_ext_csd()
623 card->ext_csd.data_tag_unit_size = 0; in mmc_decode_ext_csd()
626 card->ext_csd.data_sector_size = 512; in mmc_decode_ext_csd()
634 if (!card->ext_csd.part_time) in mmc_decode_ext_csd()
635 card->ext_csd.part_time = card->ext_csd.generic_cmd6_time; in mmc_decode_ext_csd()
637 if (card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) in mmc_decode_ext_csd()
638 card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; in mmc_decode_ext_csd()
641 if (card->ext_csd.rev >= 7) { in mmc_decode_ext_csd()
642 memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION], in mmc_decode_ext_csd()
644 card->ext_csd.ffu_capable = in mmc_decode_ext_csd()
648 card->ext_csd.pre_eol_info = ext_csd[EXT_CSD_PRE_EOL_INFO]; in mmc_decode_ext_csd()
649 card->ext_csd.device_life_time_est_typ_a = in mmc_decode_ext_csd()
651 card->ext_csd.device_life_time_est_typ_b = in mmc_decode_ext_csd()
656 if (card->ext_csd.rev >= 8) { in mmc_decode_ext_csd()
657 card->ext_csd.cmdq_support = ext_csd[EXT_CSD_CMDQ_SUPPORT] & in mmc_decode_ext_csd()
659 card->ext_csd.cmdq_depth = (ext_csd[EXT_CSD_CMDQ_DEPTH] & in mmc_decode_ext_csd()
662 if (card->ext_csd.cmdq_depth <= 2) { in mmc_decode_ext_csd()
663 card->ext_csd.cmdq_support = false; in mmc_decode_ext_csd()
664 card->ext_csd.cmdq_depth = 0; in mmc_decode_ext_csd()
666 if (card->ext_csd.cmdq_support) { in mmc_decode_ext_csd()
668 mmc_hostname(card->host), in mmc_decode_ext_csd()
669 card->ext_csd.cmdq_depth); in mmc_decode_ext_csd()
671 card->ext_csd.enhanced_rpmb_supported = in mmc_decode_ext_csd()
672 (card->ext_csd.rel_param & in mmc_decode_ext_csd()
675 if (card->ext_csd.rev >= 9) { in mmc_decode_ext_csd()
677 if (card->cid.year < 2023) in mmc_decode_ext_csd()
678 card->cid.year += 16; in mmc_decode_ext_csd()
681 if (mmc_card_broken_mdt(card) && card->cid.year >= 2010 && in mmc_decode_ext_csd()
682 card->cid.year <= 2012) in mmc_decode_ext_csd()
683 card->cid.year += 16; in mmc_decode_ext_csd()
691 static int mmc_read_ext_csd(struct mmc_card *card) in mmc_read_ext_csd() argument
696 if (!mmc_card_can_ext_csd(card)) in mmc_read_ext_csd()
699 err = mmc_get_ext_csd(card, &ext_csd); in mmc_read_ext_csd()
701 /* If the host or the card can't do the switch, in mmc_read_ext_csd()
712 if (card->csd.capacity == (4096 * 512)) { in mmc_read_ext_csd()
713 pr_err("%s: unable to read EXT_CSD on a possible high capacity card. Card will be ignored.\n", in mmc_read_ext_csd()
714 mmc_hostname(card->host)); in mmc_read_ext_csd()
717 mmc_hostname(card->host)); in mmc_read_ext_csd()
724 err = mmc_decode_ext_csd(card, ext_csd); in mmc_read_ext_csd()
729 static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) in mmc_compare_ext_csds() argument
737 err = mmc_get_ext_csd(card, &bw_ext_csd); in mmc_compare_ext_csds()
742 err = !((card->ext_csd.raw_partition_support == in mmc_compare_ext_csds()
744 (card->ext_csd.raw_erased_mem_count == in mmc_compare_ext_csds()
746 (card->ext_csd.rev == in mmc_compare_ext_csds()
748 (card->ext_csd.raw_ext_csd_structure == in mmc_compare_ext_csds()
750 (card->ext_csd.raw_card_type == in mmc_compare_ext_csds()
752 (card->ext_csd.raw_s_a_timeout == in mmc_compare_ext_csds()
754 (card->ext_csd.raw_hc_erase_gap_size == in mmc_compare_ext_csds()
756 (card->ext_csd.raw_erase_timeout_mult == in mmc_compare_ext_csds()
758 (card->ext_csd.raw_hc_erase_grp_size == in mmc_compare_ext_csds()
760 (card->ext_csd.raw_sec_trim_mult == in mmc_compare_ext_csds()
762 (card->ext_csd.raw_sec_erase_mult == in mmc_compare_ext_csds()
764 (card->ext_csd.raw_sec_feature_support == in mmc_compare_ext_csds()
766 (card->ext_csd.raw_trim_mult == in mmc_compare_ext_csds()
768 (card->ext_csd.raw_sectors[0] == in mmc_compare_ext_csds()
770 (card->ext_csd.raw_sectors[1] == in mmc_compare_ext_csds()
772 (card->ext_csd.raw_sectors[2] == in mmc_compare_ext_csds()
774 (card->ext_csd.raw_sectors[3] == in mmc_compare_ext_csds()
776 (card->ext_csd.raw_pwr_cl_52_195 == in mmc_compare_ext_csds()
778 (card->ext_csd.raw_pwr_cl_26_195 == in mmc_compare_ext_csds()
780 (card->ext_csd.raw_pwr_cl_52_360 == in mmc_compare_ext_csds()
782 (card->ext_csd.raw_pwr_cl_26_360 == in mmc_compare_ext_csds()
784 (card->ext_csd.raw_pwr_cl_200_195 == in mmc_compare_ext_csds()
786 (card->ext_csd.raw_pwr_cl_200_360 == in mmc_compare_ext_csds()
788 (card->ext_csd.raw_pwr_cl_ddr_52_195 == in mmc_compare_ext_csds()
790 (card->ext_csd.raw_pwr_cl_ddr_52_360 == in mmc_compare_ext_csds()
792 (card->ext_csd.raw_pwr_cl_ddr_200_360 == in mmc_compare_ext_csds()
802 MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
803 card->raw_cid[2], card->raw_cid[3]);
804 MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
805 card->raw_csd[2], card->raw_csd[3]);
806 MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
807 MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
808 MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
809 MMC_DEV_ATTR(wp_grp_size, "%u\n", card->wp_grp_size << 9);
810 MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
811 MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
812 MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
813 MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
814 MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
815 MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
816 MMC_DEV_ATTR(rev, "0x%x\n", card->ext_csd.rev);
817 MMC_DEV_ATTR(pre_eol_info, "0x%02x\n", card->ext_csd.pre_eol_info);
819 card->ext_csd.device_life_time_est_typ_a,
820 card->ext_csd.device_life_time_est_typ_b);
821 MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
823 card->ext_csd.enhanced_area_offset);
824 MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
825 MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
827 card->ext_csd.enhanced_rpmb_supported);
828 MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
829 MMC_DEV_ATTR(ocr, "0x%08x\n", card->ocr);
830 MMC_DEV_ATTR(rca, "0x%04x\n", card->rca);
831 MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en);
837 struct mmc_card *card = mmc_dev_to_card(dev); in mmc_fwrev_show() local
839 if (card->ext_csd.rev < 7) in mmc_fwrev_show()
840 return sysfs_emit(buf, "0x%x\n", card->cid.fwrev); in mmc_fwrev_show()
843 card->ext_csd.fwrev); in mmc_fwrev_show()
852 struct mmc_card *card = mmc_dev_to_card(dev); in mmc_dsr_show() local
853 struct mmc_host *host = card->host; in mmc_dsr_show()
855 if (card->csd.dsr_imp && host->dsr_req) in mmc_dsr_show()
905 static int __mmc_select_powerclass(struct mmc_card *card, in __mmc_select_powerclass() argument
908 struct mmc_host *host = card->host; in __mmc_select_powerclass()
909 struct mmc_ext_csd *ext_csd = &card->ext_csd; in __mmc_select_powerclass()
959 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in __mmc_select_powerclass()
962 card->ext_csd.generic_cmd6_time); in __mmc_select_powerclass()
968 static int mmc_select_powerclass(struct mmc_card *card) in mmc_select_powerclass() argument
970 struct mmc_host *host = card->host; in mmc_select_powerclass()
975 if (!mmc_card_can_ext_csd(card)) in mmc_select_powerclass()
983 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52; in mmc_select_powerclass()
991 err = __mmc_select_powerclass(card, ext_csd_bits); in mmc_select_powerclass()
1002 static void mmc_set_bus_speed(struct mmc_card *card) in mmc_set_bus_speed() argument
1006 if ((mmc_card_hs200(card) || mmc_card_hs400(card)) && in mmc_set_bus_speed()
1007 max_dtr > card->ext_csd.hs200_max_dtr) in mmc_set_bus_speed()
1008 max_dtr = card->ext_csd.hs200_max_dtr; in mmc_set_bus_speed()
1009 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr) in mmc_set_bus_speed()
1010 max_dtr = card->ext_csd.hs_max_dtr; in mmc_set_bus_speed()
1011 else if (max_dtr > card->csd.max_dtr) in mmc_set_bus_speed()
1012 max_dtr = card->csd.max_dtr; in mmc_set_bus_speed()
1014 mmc_set_clock(card->host, max_dtr); in mmc_set_bus_speed()
1022 static int mmc_select_bus_width(struct mmc_card *card) in mmc_select_bus_width() argument
1034 struct mmc_host *host = card->host; in mmc_select_bus_width()
1038 if (!mmc_card_can_ext_csd(card) || in mmc_select_bus_width()
1058 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_bus_width()
1061 card->ext_csd.generic_cmd6_time); in mmc_select_bus_width()
1074 err = mmc_compare_ext_csds(card, bus_width); in mmc_select_bus_width()
1076 err = mmc_bus_test(card, bus_width); in mmc_select_bus_width()
1093 static int mmc_select_hs(struct mmc_card *card) in mmc_select_hs() argument
1097 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs()
1099 card->ext_csd.generic_cmd6_time, MMC_TIMING_MMC_HS, in mmc_select_hs()
1103 mmc_hostname(card->host), err); in mmc_select_hs()
1111 static int mmc_select_hs_ddr(struct mmc_card *card) in mmc_select_hs_ddr() argument
1113 struct mmc_host *host = card->host; in mmc_select_hs_ddr()
1117 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52)) in mmc_select_hs_ddr()
1127 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs_ddr()
1130 card->ext_csd.generic_cmd6_time, in mmc_select_hs_ddr()
1148 * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all in mmc_select_hs_ddr()
1164 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) { in mmc_select_hs_ddr()
1170 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V && in mmc_select_hs_ddr()
1181 static int mmc_select_hs400(struct mmc_card *card) in mmc_select_hs400() argument
1183 struct mmc_host *host = card->host; in mmc_select_hs400()
1191 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && in mmc_select_hs400()
1195 /* Switch card to HS mode */ in mmc_select_hs400()
1197 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400()
1199 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400()
1215 max_dtr = card->ext_csd.hs_max_dtr; in mmc_select_hs400()
1218 err = mmc_switch_status(card, true); in mmc_select_hs400()
1225 /* Switch card to DDR */ in mmc_select_hs400()
1226 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400()
1229 card->ext_csd.generic_cmd6_time); in mmc_select_hs400()
1236 /* Switch card to HS400 */ in mmc_select_hs400()
1238 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs400()
1239 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400()
1241 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400()
1251 mmc_set_bus_speed(card); in mmc_select_hs400()
1255 err = host->ops->execute_hs400_tuning(host, card); in mmc_select_hs400()
1264 err = mmc_switch_status(card, true); in mmc_select_hs400()
1271 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs400()
1276 int mmc_hs200_to_hs400(struct mmc_card *card) in mmc_hs200_to_hs400() argument
1278 return mmc_select_hs400(card); in mmc_hs200_to_hs400()
1281 int mmc_hs400_to_hs200(struct mmc_card *card) in mmc_hs400_to_hs200() argument
1283 struct mmc_host *host = card->host; in mmc_hs400_to_hs200()
1289 max_dtr = card->ext_csd.hs_max_dtr; in mmc_hs400_to_hs200()
1294 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, in mmc_hs400_to_hs200()
1295 val, card->ext_csd.generic_cmd6_time, 0, in mmc_hs400_to_hs200()
1305 err = mmc_switch_status(card, true); in mmc_hs400_to_hs200()
1310 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, in mmc_hs400_to_hs200()
1311 EXT_CSD_BUS_WIDTH_8, card->ext_csd.generic_cmd6_time, in mmc_hs400_to_hs200()
1318 err = mmc_switch_status(card, true); in mmc_hs400_to_hs200()
1324 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_hs400_to_hs200()
1325 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, in mmc_hs400_to_hs200()
1326 val, card->ext_csd.generic_cmd6_time, 0, in mmc_hs400_to_hs200()
1338 err = mmc_switch_status(card, false); in mmc_hs400_to_hs200()
1342 mmc_set_bus_speed(card); in mmc_hs400_to_hs200()
1351 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_hs400_to_hs200()
1356 static void mmc_select_driver_type(struct mmc_card *card) in mmc_select_driver_type() argument
1359 int fixed_drv_type = card->host->fixed_drv_type; in mmc_select_driver_type()
1361 card_drv_type = card->ext_csd.raw_driver_strength | in mmc_select_driver_type()
1368 drive_strength = mmc_select_drive_strength(card, in mmc_select_driver_type()
1369 card->ext_csd.hs200_max_dtr, in mmc_select_driver_type()
1372 card->drive_strength = drive_strength; in mmc_select_driver_type()
1375 mmc_set_driver_type(card->host, drive_strength); in mmc_select_driver_type()
1377 mmc_set_driver_type(card->host, drv_type); in mmc_select_driver_type()
1380 static int mmc_select_hs400es(struct mmc_card *card) in mmc_select_hs400es() argument
1382 struct mmc_host *host = card->host; in mmc_select_hs400es()
1386 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_2V) in mmc_select_hs400es()
1389 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_8V) in mmc_select_hs400es()
1392 /* If fails try again during next card power cycle */ in mmc_select_hs400es()
1396 err = mmc_select_bus_width(card); in mmc_select_hs400es()
1404 /* Switch card to HS mode */ in mmc_select_hs400es()
1405 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400es()
1407 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400es()
1420 mmc_set_bus_speed(card); in mmc_select_hs400es()
1422 err = mmc_switch_status(card, true); in mmc_select_hs400es()
1426 /* Switch card to DDR with strobe bit */ in mmc_select_hs400es()
1428 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400es()
1431 card->ext_csd.generic_cmd6_time); in mmc_select_hs400es()
1438 mmc_select_driver_type(card); in mmc_select_hs400es()
1440 /* Switch card to HS400 */ in mmc_select_hs400es()
1442 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs400es()
1443 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400es()
1445 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400es()
1461 err = mmc_switch_status(card, true); in mmc_select_hs400es()
1468 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs400es()
1480 static int mmc_select_hs200(struct mmc_card *card) in mmc_select_hs200() argument
1482 struct mmc_host *host = card->host; in mmc_select_hs200()
1488 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V) in mmc_select_hs200()
1491 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V) in mmc_select_hs200()
1494 /* If fails try again during next card power cycle */ in mmc_select_hs200()
1498 mmc_select_driver_type(card); in mmc_select_hs200()
1504 err = mmc_select_bus_width(card); in mmc_select_hs200()
1507 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs200()
1508 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs200()
1510 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs200()
1524 mmc_set_clock(card->host, card->ext_csd.hs_max_dtr); in mmc_select_hs200()
1531 err = mmc_switch_status(card, false); in mmc_select_hs200()
1548 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs200()
1557 static int mmc_select_timing(struct mmc_card *card) in mmc_select_timing() argument
1561 if (!mmc_card_can_ext_csd(card)) in mmc_select_timing()
1564 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES) { in mmc_select_timing()
1565 err = mmc_select_hs400es(card); in mmc_select_timing()
1569 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200) { in mmc_select_timing()
1570 err = mmc_select_hs200(card); in mmc_select_timing()
1572 card->mmc_avail_type &= ~EXT_CSD_CARD_TYPE_HS200; in mmc_select_timing()
1577 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS) in mmc_select_timing()
1578 err = mmc_select_hs(card); in mmc_select_timing()
1589 mmc_set_bus_speed(card); in mmc_select_timing()
1597 static int mmc_hs200_tuning(struct mmc_card *card) in mmc_hs200_tuning() argument
1599 struct mmc_host *host = card->host; in mmc_hs200_tuning()
1605 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && in mmc_hs200_tuning()
1610 return mmc_execute_tuning(card); in mmc_hs200_tuning()
1614 * Handle the detection and initialisation of a card.
1616 * In the case of a resume, "oldcard" will contain the card
1622 struct mmc_card *card; in mmc_init_card() local
1657 * Fetch CID from card. in mmc_init_card()
1665 pr_debug("%s: Perhaps the card was replaced\n", in mmc_init_card()
1671 card = oldcard; in mmc_init_card()
1674 * Allocate card structure. in mmc_init_card()
1676 card = mmc_alloc_card(host, &mmc_type); in mmc_init_card()
1677 if (IS_ERR(card)) { in mmc_init_card()
1678 err = PTR_ERR(card); in mmc_init_card()
1682 card->ocr = ocr; in mmc_init_card()
1683 card->type = MMC_TYPE_MMC; in mmc_init_card()
1684 card->rca = 1; in mmc_init_card()
1685 memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); in mmc_init_card()
1692 host->ops->init_card(host, card); in mmc_init_card()
1695 * For native busses: set card RCA and quit open drain mode. in mmc_init_card()
1698 err = mmc_set_relative_addr(card); in mmc_init_card()
1707 * Fetch CSD from card. in mmc_init_card()
1709 err = mmc_send_csd(card, card->raw_csd); in mmc_init_card()
1713 err = mmc_decode_csd(card); in mmc_init_card()
1716 err = mmc_decode_cid(card); in mmc_init_card()
1725 if (card->csd.dsr_imp && host->dsr_req) in mmc_init_card()
1729 * Select card, as all following commands rely on that. in mmc_init_card()
1732 err = mmc_select_card(card); in mmc_init_card()
1739 err = mmc_read_ext_csd(card); in mmc_init_card()
1750 mmc_card_set_blockaddr(card); in mmc_init_card()
1753 mmc_set_erase_size(card); in mmc_init_card()
1757 * Reselect the card type since host caps could have been changed when in mmc_init_card()
1758 * debugging even if the card is not new. in mmc_init_card()
1760 mmc_select_card_type(card); in mmc_init_card()
1763 if (card->ext_csd.rev >= 3) { in mmc_init_card()
1764 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1766 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1777 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_init_card()
1778 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_init_card()
1780 card->ext_csd.erase_group_def = 1; in mmc_init_card()
1786 mmc_set_erase_size(card); in mmc_init_card()
1789 mmc_set_wp_grp_size(card); in mmc_init_card()
1793 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) { in mmc_init_card()
1794 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; in mmc_init_card()
1795 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, in mmc_init_card()
1796 card->ext_csd.part_config, in mmc_init_card()
1797 card->ext_csd.part_time); in mmc_init_card()
1805 if (card->ext_csd.rev >= 6) { in mmc_init_card()
1806 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1809 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1818 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; in mmc_init_card()
1822 if (mmc_card_can_discard(card)) in mmc_init_card()
1823 card->erase_arg = MMC_DISCARD_ARG; in mmc_init_card()
1824 else if (mmc_card_can_trim(card)) in mmc_init_card()
1825 card->erase_arg = MMC_TRIM_ARG; in mmc_init_card()
1827 card->erase_arg = MMC_ERASE_ARG; in mmc_init_card()
1832 err = mmc_select_timing(card); in mmc_init_card()
1836 if (mmc_card_hs200(card)) { in mmc_init_card()
1839 err = mmc_hs200_tuning(card); in mmc_init_card()
1841 err = mmc_select_hs400(card); in mmc_init_card()
1847 } else if (mmc_card_hs400es(card)) { in mmc_init_card()
1849 err = host->ops->execute_hs400_tuning(host, card); in mmc_init_card()
1855 err = mmc_select_bus_width(card); in mmc_init_card()
1856 if (err > 0 && mmc_card_hs(card)) { in mmc_init_card()
1857 err = mmc_select_hs_ddr(card); in mmc_init_card()
1866 mmc_select_powerclass(card); in mmc_init_card()
1871 if (card->ext_csd.hpi) { in mmc_init_card()
1872 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1874 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1879 mmc_hostname(card->host)); in mmc_init_card()
1880 card->ext_csd.hpi_en = 0; in mmc_init_card()
1882 card->ext_csd.hpi_en = 1; in mmc_init_card()
1893 if (card->ext_csd.cache_size > 0) { in mmc_init_card()
1896 timeout_ms = max(card->ext_csd.generic_cmd6_time, timeout_ms); in mmc_init_card()
1897 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1907 mmc_hostname(card->host), err); in mmc_init_card()
1908 card->ext_csd.cache_ctrl = 0; in mmc_init_card()
1910 card->ext_csd.cache_ctrl = 1; in mmc_init_card()
1918 card->ext_csd.cmdq_en = false; in mmc_init_card()
1919 if (card->ext_csd.cmdq_support && host->caps2 & MMC_CAP2_CQE) { in mmc_init_card()
1920 err = mmc_cmdq_enable(card); in mmc_init_card()
1925 mmc_hostname(card->host)); in mmc_init_card()
1926 card->ext_csd.cmdq_support = false; in mmc_init_card()
1927 card->ext_csd.cmdq_depth = 0; in mmc_init_card()
1935 card->reenable_cmdq = card->ext_csd.cmdq_en; in mmc_init_card()
1938 err = host->cqe_ops->cqe_enable(host, card); in mmc_init_card()
1942 if (card->ext_csd.cmdq_en) { in mmc_init_card()
1962 host->card = card; in mmc_init_card()
1968 mmc_remove_card(card); in mmc_init_card()
1973 static bool mmc_card_can_sleep(struct mmc_card *card) in mmc_card_can_sleep() argument
1975 return card->ext_csd.rev >= 3; in mmc_card_can_sleep()
1989 struct mmc_card *card = host->card; in mmc_sleep() local
1990 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000); in mmc_sleep()
1994 /* Re-tuning can't be done once the card is deselected */ in mmc_sleep()
2002 cmd.arg = card->rca << 16; in mmc_sleep()
2011 * If the host does not wait while the card signals busy, then we can in mmc_sleep()
2031 static bool mmc_card_can_poweroff_notify(const struct mmc_card *card) in mmc_card_can_poweroff_notify() argument
2033 return card && in mmc_card_can_poweroff_notify()
2034 mmc_card_mmc(card) && in mmc_card_can_poweroff_notify()
2035 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON); in mmc_card_can_poweroff_notify()
2051 static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type) in mmc_poweroff_notify() argument
2053 unsigned int timeout = card->ext_csd.generic_cmd6_time; in mmc_poweroff_notify()
2058 timeout = card->ext_csd.power_off_longtime; in mmc_poweroff_notify()
2060 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_poweroff_notify()
2065 mmc_hostname(card->host), timeout); in mmc_poweroff_notify()
2068 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION; in mmc_poweroff_notify()
2074 * Card detection - card is alive.
2078 return mmc_send_status(host->card, NULL); in mmc_alive()
2082 * Card detection callback from host.
2088 mmc_get_card(host->card, NULL); in mmc_detect()
2091 * Just check if our card has been removed. in mmc_detect()
2095 mmc_put_card(host->card, NULL); in mmc_detect()
2098 mmc_remove_card(host->card); in mmc_detect()
2099 host->card = NULL; in mmc_detect()
2110 return host->card->ext_csd.cache_size > 0 && in _mmc_cache_enabled()
2111 host->card->ext_csd.cache_ctrl & 1; in _mmc_cache_enabled()
2121 if (mmc_card_broken_cache_flush(host->card) && !host->card->written_flag) in _mmc_flush_cache()
2125 err = mmc_switch(host->card, EXT_CSD_CMD_SET_NORMAL, in _mmc_flush_cache()
2131 host->card->written_flag = false; in _mmc_flush_cache()
2147 if (mmc_card_suspended(host->card)) in _mmc_suspend()
2160 if (mmc_card_can_poweroff_notify(host->card) && in _mmc_suspend()
2162 err = mmc_poweroff_notify(host->card, notify_type); in _mmc_suspend()
2163 else if (mmc_card_can_sleep(host->card)) in _mmc_suspend()
2170 mmc_card_set_suspended(host->card); in _mmc_suspend()
2178 * Host is being removed. Free up the current card and do a graceful power-off.
2182 get_device(&host->card->dev); in mmc_remove()
2183 mmc_remove_card(host->card); in mmc_remove()
2187 put_device(&host->card->dev); in mmc_remove()
2188 host->card = NULL; in mmc_remove()
2200 pm_runtime_disable(&host->card->dev); in mmc_suspend()
2201 pm_runtime_set_suspended(&host->card->dev); in mmc_suspend()
2208 * This function tries to determine if the same card is still present
2217 if (!mmc_card_suspended(host->card)) in _mmc_resume()
2220 mmc_power_up(host, host->card->ocr); in _mmc_resume()
2221 err = mmc_init_card(host, host->card->ocr, host->card); in _mmc_resume()
2222 mmc_card_clr_suspended(host->card); in _mmc_resume()
2237 * In case of undervoltage, the card will be powered off (removed) by in mmc_shutdown()
2240 if (mmc_card_removed(host->card)) in mmc_shutdown()
2244 * If the card remains suspended at this point and it was done by using in mmc_shutdown()
2248 if (mmc_card_can_poweroff_notify(host->card) && in mmc_shutdown()
2263 pm_runtime_enable(&host->card->dev); in mmc_resume()
2300 static bool mmc_card_can_reset(struct mmc_card *card) in mmc_card_can_reset() argument
2304 rst_n_function = card->ext_csd.rst_n_function; in mmc_card_can_reset()
2310 struct mmc_card *card = host->card; in _mmc_hw_reset() local
2319 mmc_card_can_reset(card)) { in _mmc_hw_reset()
2320 /* If the card accept RST_n signal, send it. */ in _mmc_hw_reset()
2327 mmc_power_cycle(host, card->ocr); in _mmc_hw_reset()
2330 return mmc_init_card(host, card->ocr, card); in _mmc_hw_reset()
2344 * deselecting the card are attempted.
2346 * - Mark the card as removed to prevent further interactions after
2357 struct mmc_card *card = host->card; in _mmc_handle_undervoltage() local
2364 * is not supported, we fall back to sleep mode or deselecting the card. in _mmc_handle_undervoltage()
2373 * Mark the card as removed to prevent further operations. in _mmc_handle_undervoltage()
2377 mmc_card_set_removed(card); in _mmc_handle_undervoltage()
2398 * Starting point for MMC card init.
2431 * Can we support the voltage of the card? in mmc_attach_mmc()
2439 * Detect and init the card. in mmc_attach_mmc()
2446 err = mmc_add_card(host->card); in mmc_attach_mmc()
2454 mmc_remove_card(host->card); in mmc_attach_mmc()
2456 host->card = NULL; in mmc_attach_mmc()
2460 pr_err("%s: error %d whilst initialising MMC card\n", in mmc_attach_mmc()