Lines Matching refs:card
70 static int mmc_decode_cid(struct mmc_card *card) in mmc_decode_cid() argument
72 u32 *resp = card->raw_cid; in mmc_decode_cid()
78 switch (card->csd.mmca_vsn) { in mmc_decode_cid()
81 card->cid.manfid = UNSTUFF_BITS(resp, 104, 24); in mmc_decode_cid()
82 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); in mmc_decode_cid()
83 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); in mmc_decode_cid()
84 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); in mmc_decode_cid()
85 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); in mmc_decode_cid()
86 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); in mmc_decode_cid()
87 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); in mmc_decode_cid()
88 card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8); in mmc_decode_cid()
89 card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4); in mmc_decode_cid()
90 card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4); in mmc_decode_cid()
91 card->cid.serial = UNSTUFF_BITS(resp, 16, 24); in mmc_decode_cid()
92 card->cid.month = UNSTUFF_BITS(resp, 12, 4); in mmc_decode_cid()
93 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; in mmc_decode_cid()
99 card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); in mmc_decode_cid()
100 card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); in mmc_decode_cid()
101 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); in mmc_decode_cid()
102 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); in mmc_decode_cid()
103 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); in mmc_decode_cid()
104 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); in mmc_decode_cid()
105 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); in mmc_decode_cid()
106 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); in mmc_decode_cid()
107 card->cid.prv = UNSTUFF_BITS(resp, 48, 8); in mmc_decode_cid()
108 card->cid.serial = UNSTUFF_BITS(resp, 16, 32); in mmc_decode_cid()
109 card->cid.month = UNSTUFF_BITS(resp, 12, 4); in mmc_decode_cid()
110 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; in mmc_decode_cid()
115 mmc_hostname(card->host), card->csd.mmca_vsn); in mmc_decode_cid()
122 static void mmc_set_erase_size(struct mmc_card *card) in mmc_set_erase_size() argument
124 if (card->ext_csd.erase_group_def & 1) in mmc_set_erase_size()
125 card->erase_size = card->ext_csd.hc_erase_size; in mmc_set_erase_size()
127 card->erase_size = card->csd.erase_size; in mmc_set_erase_size()
129 mmc_init_erase(card); in mmc_set_erase_size()
135 static int mmc_decode_csd(struct mmc_card *card) in mmc_decode_csd() argument
137 struct mmc_csd *csd = &card->csd; in mmc_decode_csd()
139 u32 *resp = card->raw_csd; in mmc_decode_csd()
149 mmc_hostname(card->host), csd->structure); in mmc_decode_csd()
187 static void mmc_select_card_type(struct mmc_card *card) in mmc_select_card_type() argument
189 struct mmc_host *host = card->host; in mmc_select_card_type()
190 u8 card_type = card->ext_csd.raw_card_type; in mmc_select_card_type()
244 card->ext_csd.strobe_support && in mmc_select_card_type()
248 card->ext_csd.hs_max_dtr = hs_max_dtr; in mmc_select_card_type()
249 card->ext_csd.hs200_max_dtr = hs200_max_dtr; in mmc_select_card_type()
250 card->mmc_avail_type = avail_type; in mmc_select_card_type()
253 static void mmc_manage_enhanced_area(struct mmc_card *card, u8 *ext_csd) in mmc_manage_enhanced_area() argument
260 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_manage_enhanced_area()
261 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_manage_enhanced_area()
270 if (card->ext_csd.partition_setting_completed) { in mmc_manage_enhanced_area()
279 card->ext_csd.enhanced_area_offset = in mmc_manage_enhanced_area()
284 if (mmc_card_blockaddr(card)) in mmc_manage_enhanced_area()
285 card->ext_csd.enhanced_area_offset <<= 9; in mmc_manage_enhanced_area()
289 card->ext_csd.enhanced_area_size = in mmc_manage_enhanced_area()
292 card->ext_csd.enhanced_area_size *= in mmc_manage_enhanced_area()
294 card->ext_csd.enhanced_area_size <<= 9; in mmc_manage_enhanced_area()
297 mmc_hostname(card->host)); in mmc_manage_enhanced_area()
302 static void mmc_part_add(struct mmc_card *card, unsigned int size, in mmc_part_add() argument
306 card->part[card->nr_parts].size = size; in mmc_part_add()
307 card->part[card->nr_parts].part_cfg = part_cfg; in mmc_part_add()
308 sprintf(card->part[card->nr_parts].name, name, idx); in mmc_part_add()
309 card->part[card->nr_parts].force_ro = ro; in mmc_part_add()
310 card->part[card->nr_parts].area_type = area_type; in mmc_part_add()
311 card->nr_parts++; in mmc_part_add()
314 static void mmc_manage_gp_partitions(struct mmc_card *card, u8 *ext_csd) in mmc_manage_gp_partitions() argument
337 if (card->ext_csd.partition_setting_completed == 0) { in mmc_manage_gp_partitions()
339 mmc_hostname(card->host)); in mmc_manage_gp_partitions()
350 mmc_part_add(card, part_size << 19, in mmc_manage_gp_partitions()
364 static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) in mmc_decode_ext_csd() argument
372 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; in mmc_decode_ext_csd()
373 if (card->csd.structure == 3) { in mmc_decode_ext_csd()
374 if (card->ext_csd.raw_ext_csd_structure > 2) { in mmc_decode_ext_csd()
376 "version %d\n", mmc_hostname(card->host), in mmc_decode_ext_csd()
377 card->ext_csd.raw_ext_csd_structure); in mmc_decode_ext_csd()
383 np = mmc_of_find_child_device(card->host, 0); in mmc_decode_ext_csd()
393 card->ext_csd.rev = ext_csd[EXT_CSD_REV]; in mmc_decode_ext_csd()
396 mmc_fixup_device(card, mmc_ext_csd_fixups); in mmc_decode_ext_csd()
398 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; in mmc_decode_ext_csd()
399 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; in mmc_decode_ext_csd()
400 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; in mmc_decode_ext_csd()
401 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3]; in mmc_decode_ext_csd()
402 if (card->ext_csd.rev >= 2) { in mmc_decode_ext_csd()
403 card->ext_csd.sectors = in mmc_decode_ext_csd()
410 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) in mmc_decode_ext_csd()
411 mmc_card_set_blockaddr(card); in mmc_decode_ext_csd()
414 card->ext_csd.strobe_support = ext_csd[EXT_CSD_STROBE_SUPPORT]; in mmc_decode_ext_csd()
415 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; in mmc_decode_ext_csd()
416 mmc_select_card_type(card); in mmc_decode_ext_csd()
418 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; in mmc_decode_ext_csd()
419 card->ext_csd.raw_erase_timeout_mult = in mmc_decode_ext_csd()
421 card->ext_csd.raw_hc_erase_grp_size = in mmc_decode_ext_csd()
423 if (card->ext_csd.rev >= 3) { in mmc_decode_ext_csd()
425 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; in mmc_decode_ext_csd()
428 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; in mmc_decode_ext_csd()
430 if (card->ext_csd.part_time && in mmc_decode_ext_csd()
431 card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) in mmc_decode_ext_csd()
432 card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; in mmc_decode_ext_csd()
436 card->ext_csd.sa_timeout = in mmc_decode_ext_csd()
438 card->ext_csd.erase_group_def = in mmc_decode_ext_csd()
440 card->ext_csd.hc_erase_timeout = 300 * in mmc_decode_ext_csd()
442 card->ext_csd.hc_erase_size = in mmc_decode_ext_csd()
445 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C]; in mmc_decode_ext_csd()
451 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) { in mmc_decode_ext_csd()
454 mmc_part_add(card, part_size, in mmc_decode_ext_csd()
462 card->ext_csd.raw_hc_erase_gap_size = in mmc_decode_ext_csd()
464 card->ext_csd.raw_sec_trim_mult = in mmc_decode_ext_csd()
466 card->ext_csd.raw_sec_erase_mult = in mmc_decode_ext_csd()
468 card->ext_csd.raw_sec_feature_support = in mmc_decode_ext_csd()
470 card->ext_csd.raw_trim_mult = in mmc_decode_ext_csd()
472 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; in mmc_decode_ext_csd()
473 card->ext_csd.raw_driver_strength = ext_csd[EXT_CSD_DRIVER_STRENGTH]; in mmc_decode_ext_csd()
474 if (card->ext_csd.rev >= 4) { in mmc_decode_ext_csd()
477 card->ext_csd.partition_setting_completed = 1; in mmc_decode_ext_csd()
479 card->ext_csd.partition_setting_completed = 0; in mmc_decode_ext_csd()
481 mmc_manage_enhanced_area(card, ext_csd); in mmc_decode_ext_csd()
483 mmc_manage_gp_partitions(card, ext_csd); in mmc_decode_ext_csd()
485 card->ext_csd.sec_trim_mult = in mmc_decode_ext_csd()
487 card->ext_csd.sec_erase_mult = in mmc_decode_ext_csd()
489 card->ext_csd.sec_feature_support = in mmc_decode_ext_csd()
491 card->ext_csd.trim_timeout = 300 * in mmc_decode_ext_csd()
499 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP]; in mmc_decode_ext_csd()
500 card->ext_csd.boot_ro_lockable = true; in mmc_decode_ext_csd()
503 card->ext_csd.raw_pwr_cl_52_195 = in mmc_decode_ext_csd()
505 card->ext_csd.raw_pwr_cl_26_195 = in mmc_decode_ext_csd()
507 card->ext_csd.raw_pwr_cl_52_360 = in mmc_decode_ext_csd()
509 card->ext_csd.raw_pwr_cl_26_360 = in mmc_decode_ext_csd()
511 card->ext_csd.raw_pwr_cl_200_195 = in mmc_decode_ext_csd()
513 card->ext_csd.raw_pwr_cl_200_360 = in mmc_decode_ext_csd()
515 card->ext_csd.raw_pwr_cl_ddr_52_195 = in mmc_decode_ext_csd()
517 card->ext_csd.raw_pwr_cl_ddr_52_360 = in mmc_decode_ext_csd()
519 card->ext_csd.raw_pwr_cl_ddr_200_360 = in mmc_decode_ext_csd()
523 if (card->ext_csd.rev >= 5) { in mmc_decode_ext_csd()
525 if (card->cid.year < 2010) in mmc_decode_ext_csd()
526 card->cid.year += 16; in mmc_decode_ext_csd()
529 if (!mmc_card_broken_hpi(card) && in mmc_decode_ext_csd()
531 card->ext_csd.bkops = 1; in mmc_decode_ext_csd()
532 card->ext_csd.man_bkops_en = in mmc_decode_ext_csd()
535 card->ext_csd.raw_bkops_status = in mmc_decode_ext_csd()
537 if (card->ext_csd.man_bkops_en) in mmc_decode_ext_csd()
539 mmc_hostname(card->host)); in mmc_decode_ext_csd()
540 card->ext_csd.auto_bkops_en = in mmc_decode_ext_csd()
543 if (card->ext_csd.auto_bkops_en) in mmc_decode_ext_csd()
545 mmc_hostname(card->host)); in mmc_decode_ext_csd()
549 if (!mmc_card_broken_hpi(card) && in mmc_decode_ext_csd()
551 card->ext_csd.hpi = 1; in mmc_decode_ext_csd()
553 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION; in mmc_decode_ext_csd()
555 card->ext_csd.hpi_cmd = MMC_SEND_STATUS; in mmc_decode_ext_csd()
560 card->ext_csd.out_of_int_time = in mmc_decode_ext_csd()
564 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; in mmc_decode_ext_csd()
565 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; in mmc_decode_ext_csd()
570 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT]; in mmc_decode_ext_csd()
571 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) { in mmc_decode_ext_csd()
572 mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17, in mmc_decode_ext_csd()
579 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT]; in mmc_decode_ext_csd()
581 card->erased_byte = 0xFF; in mmc_decode_ext_csd()
583 card->erased_byte = 0x0; in mmc_decode_ext_csd()
586 card->ext_csd.generic_cmd6_time = DEFAULT_CMD6_TIMEOUT_MS; in mmc_decode_ext_csd()
587 if (card->ext_csd.rev >= 6) { in mmc_decode_ext_csd()
588 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE; in mmc_decode_ext_csd()
590 card->ext_csd.generic_cmd6_time = 10 * in mmc_decode_ext_csd()
592 card->ext_csd.power_off_longtime = 10 * in mmc_decode_ext_csd()
595 card->ext_csd.cache_size = in mmc_decode_ext_csd()
602 card->ext_csd.data_sector_size = 4096; in mmc_decode_ext_csd()
604 card->ext_csd.data_sector_size = 512; in mmc_decode_ext_csd()
608 card->ext_csd.data_tag_unit_size = in mmc_decode_ext_csd()
610 (card->ext_csd.data_sector_size); in mmc_decode_ext_csd()
612 card->ext_csd.data_tag_unit_size = 0; in mmc_decode_ext_csd()
615 card->ext_csd.max_packed_writes = in mmc_decode_ext_csd()
617 card->ext_csd.max_packed_reads = in mmc_decode_ext_csd()
620 card->ext_csd.data_sector_size = 512; in mmc_decode_ext_csd()
624 if (card->ext_csd.rev >= 7) { in mmc_decode_ext_csd()
625 memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION], in mmc_decode_ext_csd()
627 card->ext_csd.ffu_capable = in mmc_decode_ext_csd()
631 card->ext_csd.pre_eol_info = ext_csd[EXT_CSD_PRE_EOL_INFO]; in mmc_decode_ext_csd()
632 card->ext_csd.device_life_time_est_typ_a = in mmc_decode_ext_csd()
634 card->ext_csd.device_life_time_est_typ_b = in mmc_decode_ext_csd()
639 if (card->ext_csd.rev >= 8) { in mmc_decode_ext_csd()
640 card->ext_csd.cmdq_support = ext_csd[EXT_CSD_CMDQ_SUPPORT] & in mmc_decode_ext_csd()
642 card->ext_csd.cmdq_depth = (ext_csd[EXT_CSD_CMDQ_DEPTH] & in mmc_decode_ext_csd()
645 if (card->ext_csd.cmdq_depth <= 2) { in mmc_decode_ext_csd()
646 card->ext_csd.cmdq_support = false; in mmc_decode_ext_csd()
647 card->ext_csd.cmdq_depth = 0; in mmc_decode_ext_csd()
649 if (card->ext_csd.cmdq_support) { in mmc_decode_ext_csd()
651 mmc_hostname(card->host), in mmc_decode_ext_csd()
652 card->ext_csd.cmdq_depth); in mmc_decode_ext_csd()
659 static int mmc_read_ext_csd(struct mmc_card *card) in mmc_read_ext_csd() argument
664 if (!mmc_can_ext_csd(card)) in mmc_read_ext_csd()
667 err = mmc_get_ext_csd(card, &ext_csd); in mmc_read_ext_csd()
680 if (card->csd.capacity == (4096 * 512)) { in mmc_read_ext_csd()
682 mmc_hostname(card->host)); in mmc_read_ext_csd()
685 mmc_hostname(card->host)); in mmc_read_ext_csd()
692 err = mmc_decode_ext_csd(card, ext_csd); in mmc_read_ext_csd()
697 static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) in mmc_compare_ext_csds() argument
705 err = mmc_get_ext_csd(card, &bw_ext_csd); in mmc_compare_ext_csds()
710 err = !((card->ext_csd.raw_partition_support == in mmc_compare_ext_csds()
712 (card->ext_csd.raw_erased_mem_count == in mmc_compare_ext_csds()
714 (card->ext_csd.rev == in mmc_compare_ext_csds()
716 (card->ext_csd.raw_ext_csd_structure == in mmc_compare_ext_csds()
718 (card->ext_csd.raw_card_type == in mmc_compare_ext_csds()
720 (card->ext_csd.raw_s_a_timeout == in mmc_compare_ext_csds()
722 (card->ext_csd.raw_hc_erase_gap_size == in mmc_compare_ext_csds()
724 (card->ext_csd.raw_erase_timeout_mult == in mmc_compare_ext_csds()
726 (card->ext_csd.raw_hc_erase_grp_size == in mmc_compare_ext_csds()
728 (card->ext_csd.raw_sec_trim_mult == in mmc_compare_ext_csds()
730 (card->ext_csd.raw_sec_erase_mult == in mmc_compare_ext_csds()
732 (card->ext_csd.raw_sec_feature_support == in mmc_compare_ext_csds()
734 (card->ext_csd.raw_trim_mult == in mmc_compare_ext_csds()
736 (card->ext_csd.raw_sectors[0] == in mmc_compare_ext_csds()
738 (card->ext_csd.raw_sectors[1] == in mmc_compare_ext_csds()
740 (card->ext_csd.raw_sectors[2] == in mmc_compare_ext_csds()
742 (card->ext_csd.raw_sectors[3] == in mmc_compare_ext_csds()
744 (card->ext_csd.raw_pwr_cl_52_195 == in mmc_compare_ext_csds()
746 (card->ext_csd.raw_pwr_cl_26_195 == in mmc_compare_ext_csds()
748 (card->ext_csd.raw_pwr_cl_52_360 == in mmc_compare_ext_csds()
750 (card->ext_csd.raw_pwr_cl_26_360 == in mmc_compare_ext_csds()
752 (card->ext_csd.raw_pwr_cl_200_195 == in mmc_compare_ext_csds()
754 (card->ext_csd.raw_pwr_cl_200_360 == in mmc_compare_ext_csds()
756 (card->ext_csd.raw_pwr_cl_ddr_52_195 == in mmc_compare_ext_csds()
758 (card->ext_csd.raw_pwr_cl_ddr_52_360 == in mmc_compare_ext_csds()
760 (card->ext_csd.raw_pwr_cl_ddr_200_360 == in mmc_compare_ext_csds()
770 MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
771 card->raw_cid[2], card->raw_cid[3]);
772 MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
773 card->raw_csd[2], card->raw_csd[3]);
774 MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
775 MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
776 MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
777 MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
778 MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
779 MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
780 MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
781 MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
782 MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
783 MMC_DEV_ATTR(rev, "0x%x\n", card->ext_csd.rev);
784 MMC_DEV_ATTR(pre_eol_info, "0x%02x\n", card->ext_csd.pre_eol_info);
786 card->ext_csd.device_life_time_est_typ_a,
787 card->ext_csd.device_life_time_est_typ_b);
788 MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
790 card->ext_csd.enhanced_area_offset);
791 MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
792 MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
793 MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
794 MMC_DEV_ATTR(ocr, "0x%08x\n", card->ocr);
795 MMC_DEV_ATTR(rca, "0x%04x\n", card->rca);
796 MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en);
802 struct mmc_card *card = mmc_dev_to_card(dev); in mmc_fwrev_show() local
804 if (card->ext_csd.rev < 7) { in mmc_fwrev_show()
805 return sprintf(buf, "0x%x\n", card->cid.fwrev); in mmc_fwrev_show()
808 card->ext_csd.fwrev); in mmc_fwrev_show()
818 struct mmc_card *card = mmc_dev_to_card(dev); in mmc_dsr_show() local
819 struct mmc_host *host = card->host; in mmc_dsr_show()
821 if (card->csd.dsr_imp && host->dsr_req) in mmc_dsr_show()
869 static int __mmc_select_powerclass(struct mmc_card *card, in __mmc_select_powerclass() argument
872 struct mmc_host *host = card->host; in __mmc_select_powerclass()
873 struct mmc_ext_csd *ext_csd = &card->ext_csd; in __mmc_select_powerclass()
923 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in __mmc_select_powerclass()
926 card->ext_csd.generic_cmd6_time); in __mmc_select_powerclass()
932 static int mmc_select_powerclass(struct mmc_card *card) in mmc_select_powerclass() argument
934 struct mmc_host *host = card->host; in mmc_select_powerclass()
939 if (!mmc_can_ext_csd(card)) in mmc_select_powerclass()
947 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52; in mmc_select_powerclass()
955 err = __mmc_select_powerclass(card, ext_csd_bits); in mmc_select_powerclass()
966 static void mmc_set_bus_speed(struct mmc_card *card) in mmc_set_bus_speed() argument
970 if ((mmc_card_hs200(card) || mmc_card_hs400(card)) && in mmc_set_bus_speed()
971 max_dtr > card->ext_csd.hs200_max_dtr) in mmc_set_bus_speed()
972 max_dtr = card->ext_csd.hs200_max_dtr; in mmc_set_bus_speed()
973 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr) in mmc_set_bus_speed()
974 max_dtr = card->ext_csd.hs_max_dtr; in mmc_set_bus_speed()
975 else if (max_dtr > card->csd.max_dtr) in mmc_set_bus_speed()
976 max_dtr = card->csd.max_dtr; in mmc_set_bus_speed()
978 mmc_set_clock(card->host, max_dtr); in mmc_set_bus_speed()
986 static int mmc_select_bus_width(struct mmc_card *card) in mmc_select_bus_width() argument
996 struct mmc_host *host = card->host; in mmc_select_bus_width()
1000 if (!mmc_can_ext_csd(card) || in mmc_select_bus_width()
1020 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_bus_width()
1023 card->ext_csd.generic_cmd6_time); in mmc_select_bus_width()
1036 err = mmc_compare_ext_csds(card, bus_width); in mmc_select_bus_width()
1038 err = mmc_bus_test(card, bus_width); in mmc_select_bus_width()
1055 static int mmc_select_hs(struct mmc_card *card) in mmc_select_hs() argument
1059 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs()
1061 card->ext_csd.generic_cmd6_time, MMC_TIMING_MMC_HS, in mmc_select_hs()
1065 mmc_hostname(card->host), err); in mmc_select_hs()
1073 static int mmc_select_hs_ddr(struct mmc_card *card) in mmc_select_hs_ddr() argument
1075 struct mmc_host *host = card->host; in mmc_select_hs_ddr()
1079 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52)) in mmc_select_hs_ddr()
1089 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs_ddr()
1092 card->ext_csd.generic_cmd6_time, in mmc_select_hs_ddr()
1126 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) { in mmc_select_hs_ddr()
1132 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V && in mmc_select_hs_ddr()
1143 static int mmc_select_hs400(struct mmc_card *card) in mmc_select_hs400() argument
1145 struct mmc_host *host = card->host; in mmc_select_hs400()
1153 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && in mmc_select_hs400()
1159 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400()
1161 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400()
1170 mmc_set_timing(card->host, MMC_TIMING_MMC_HS); in mmc_select_hs400()
1177 max_dtr = card->ext_csd.hs_max_dtr; in mmc_select_hs400()
1180 err = mmc_switch_status(card); in mmc_select_hs400()
1185 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400()
1188 card->ext_csd.generic_cmd6_time); in mmc_select_hs400()
1197 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs400()
1198 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400()
1200 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400()
1210 mmc_set_bus_speed(card); in mmc_select_hs400()
1212 err = mmc_switch_status(card); in mmc_select_hs400()
1222 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs400()
1227 int mmc_hs200_to_hs400(struct mmc_card *card) in mmc_hs200_to_hs400() argument
1229 return mmc_select_hs400(card); in mmc_hs200_to_hs400()
1232 int mmc_hs400_to_hs200(struct mmc_card *card) in mmc_hs400_to_hs200() argument
1234 struct mmc_host *host = card->host; in mmc_hs400_to_hs200()
1240 max_dtr = card->ext_csd.hs_max_dtr; in mmc_hs400_to_hs200()
1245 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, in mmc_hs400_to_hs200()
1246 val, card->ext_csd.generic_cmd6_time, 0, in mmc_hs400_to_hs200()
1253 err = mmc_switch_status(card); in mmc_hs400_to_hs200()
1258 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, in mmc_hs400_to_hs200()
1259 EXT_CSD_BUS_WIDTH_8, card->ext_csd.generic_cmd6_time, in mmc_hs400_to_hs200()
1269 err = mmc_switch_status(card); in mmc_hs400_to_hs200()
1275 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_hs400_to_hs200()
1276 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, in mmc_hs400_to_hs200()
1277 val, card->ext_csd.generic_cmd6_time, 0, in mmc_hs400_to_hs200()
1289 err = __mmc_switch_status(card, false); in mmc_hs400_to_hs200()
1293 mmc_set_bus_speed(card); in mmc_hs400_to_hs200()
1302 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_hs400_to_hs200()
1307 static void mmc_select_driver_type(struct mmc_card *card) in mmc_select_driver_type() argument
1310 int fixed_drv_type = card->host->fixed_drv_type; in mmc_select_driver_type()
1312 card_drv_type = card->ext_csd.raw_driver_strength | in mmc_select_driver_type()
1319 drive_strength = mmc_select_drive_strength(card, in mmc_select_driver_type()
1320 card->ext_csd.hs200_max_dtr, in mmc_select_driver_type()
1323 card->drive_strength = drive_strength; in mmc_select_driver_type()
1326 mmc_set_driver_type(card->host, drv_type); in mmc_select_driver_type()
1329 static int mmc_select_hs400es(struct mmc_card *card) in mmc_select_hs400es() argument
1331 struct mmc_host *host = card->host; in mmc_select_hs400es()
1340 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_2V) in mmc_select_hs400es()
1343 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_8V) in mmc_select_hs400es()
1350 err = mmc_select_bus_width(card); in mmc_select_hs400es()
1359 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400es()
1361 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400es()
1370 err = mmc_switch_status(card); in mmc_select_hs400es()
1374 mmc_set_clock(host, card->ext_csd.hs_max_dtr); in mmc_select_hs400es()
1378 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400es()
1381 card->ext_csd.generic_cmd6_time); in mmc_select_hs400es()
1388 mmc_select_driver_type(card); in mmc_select_hs400es()
1392 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs400es()
1393 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs400es()
1395 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400es()
1411 err = mmc_switch_status(card); in mmc_select_hs400es()
1418 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs400es()
1430 static int mmc_select_hs200(struct mmc_card *card) in mmc_select_hs200() argument
1432 struct mmc_host *host = card->host; in mmc_select_hs200()
1438 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V) in mmc_select_hs200()
1441 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V) in mmc_select_hs200()
1448 mmc_select_driver_type(card); in mmc_select_hs200()
1454 err = mmc_select_bus_width(card); in mmc_select_hs200()
1457 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs200()
1458 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs200()
1460 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs200()
1472 err = __mmc_switch_status(card, false); in mmc_select_hs200()
1487 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs200()
1496 static int mmc_select_timing(struct mmc_card *card) in mmc_select_timing() argument
1500 if (!mmc_can_ext_csd(card)) in mmc_select_timing()
1503 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES) in mmc_select_timing()
1504 err = mmc_select_hs400es(card); in mmc_select_timing()
1505 else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200) in mmc_select_timing()
1506 err = mmc_select_hs200(card); in mmc_select_timing()
1507 else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS) in mmc_select_timing()
1508 err = mmc_select_hs(card); in mmc_select_timing()
1518 mmc_set_bus_speed(card); in mmc_select_timing()
1526 static int mmc_hs200_tuning(struct mmc_card *card) in mmc_hs200_tuning() argument
1528 struct mmc_host *host = card->host; in mmc_hs200_tuning()
1534 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && in mmc_hs200_tuning()
1539 return mmc_execute_tuning(card); in mmc_hs200_tuning()
1551 struct mmc_card *card; in mmc_init_card() local
1598 card = oldcard; in mmc_init_card()
1603 card = mmc_alloc_card(host, &mmc_type); in mmc_init_card()
1604 if (IS_ERR(card)) { in mmc_init_card()
1605 err = PTR_ERR(card); in mmc_init_card()
1609 card->ocr = ocr; in mmc_init_card()
1610 card->type = MMC_TYPE_MMC; in mmc_init_card()
1611 card->rca = 1; in mmc_init_card()
1612 memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); in mmc_init_card()
1619 host->ops->init_card(host, card); in mmc_init_card()
1625 err = mmc_set_relative_addr(card); in mmc_init_card()
1636 err = mmc_send_csd(card, card->raw_csd); in mmc_init_card()
1640 err = mmc_decode_csd(card); in mmc_init_card()
1643 err = mmc_decode_cid(card); in mmc_init_card()
1652 if (card->csd.dsr_imp && host->dsr_req) in mmc_init_card()
1659 err = mmc_select_card(card); in mmc_init_card()
1666 err = mmc_read_ext_csd(card); in mmc_init_card()
1677 mmc_card_set_blockaddr(card); in mmc_init_card()
1680 mmc_set_erase_size(card); in mmc_init_card()
1684 if (card->ext_csd.rev >= 3) { in mmc_init_card()
1685 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1687 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1699 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_init_card()
1700 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_init_card()
1702 card->ext_csd.erase_group_def = 1; in mmc_init_card()
1708 mmc_set_erase_size(card); in mmc_init_card()
1715 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) { in mmc_init_card()
1716 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; in mmc_init_card()
1717 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, in mmc_init_card()
1718 card->ext_csd.part_config, in mmc_init_card()
1719 card->ext_csd.part_time); in mmc_init_card()
1727 if (card->ext_csd.rev >= 6) { in mmc_init_card()
1728 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1731 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1740 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; in mmc_init_card()
1746 err = mmc_select_timing(card); in mmc_init_card()
1750 if (mmc_card_hs200(card)) { in mmc_init_card()
1751 err = mmc_hs200_tuning(card); in mmc_init_card()
1755 err = mmc_select_hs400(card); in mmc_init_card()
1758 } else if (!mmc_card_hs400es(card)) { in mmc_init_card()
1760 err = mmc_select_bus_width(card); in mmc_init_card()
1761 if (err > 0 && mmc_card_hs(card)) { in mmc_init_card()
1762 err = mmc_select_hs_ddr(card); in mmc_init_card()
1771 mmc_select_powerclass(card); in mmc_init_card()
1776 if (card->ext_csd.hpi) { in mmc_init_card()
1777 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1779 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1784 mmc_hostname(card->host)); in mmc_init_card()
1787 card->ext_csd.hpi_en = 1; in mmc_init_card()
1794 if (!mmc_card_broken_hpi(card) && in mmc_init_card()
1795 card->ext_csd.cache_size > 0) { in mmc_init_card()
1796 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1798 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1807 mmc_hostname(card->host), err); in mmc_init_card()
1808 card->ext_csd.cache_ctrl = 0; in mmc_init_card()
1811 card->ext_csd.cache_ctrl = 1; in mmc_init_card()
1819 card->ext_csd.cmdq_en = false; in mmc_init_card()
1820 if (card->ext_csd.cmdq_support && host->caps2 & MMC_CAP2_CQE) { in mmc_init_card()
1821 err = mmc_cmdq_enable(card); in mmc_init_card()
1826 mmc_hostname(card->host)); in mmc_init_card()
1827 card->ext_csd.cmdq_support = false; in mmc_init_card()
1828 card->ext_csd.cmdq_depth = 0; in mmc_init_card()
1837 card->reenable_cmdq = card->ext_csd.cmdq_en; in mmc_init_card()
1839 if (card->ext_csd.cmdq_en && !host->cqe_enabled) { in mmc_init_card()
1840 err = host->cqe_ops->cqe_enable(host, card); in mmc_init_card()
1860 host->card = card; in mmc_init_card()
1866 mmc_remove_card(card); in mmc_init_card()
1871 static int mmc_can_sleep(struct mmc_card *card) in mmc_can_sleep() argument
1873 return (card && card->ext_csd.rev >= 3); in mmc_can_sleep()
1879 struct mmc_card *card = host->card; in mmc_sleep() local
1880 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000); in mmc_sleep()
1891 cmd.arg = card->rca << 16; in mmc_sleep()
1925 static int mmc_can_poweroff_notify(const struct mmc_card *card) in mmc_can_poweroff_notify() argument
1927 return card && in mmc_can_poweroff_notify()
1928 mmc_card_mmc(card) && in mmc_can_poweroff_notify()
1929 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON); in mmc_can_poweroff_notify()
1932 static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type) in mmc_poweroff_notify() argument
1934 unsigned int timeout = card->ext_csd.generic_cmd6_time; in mmc_poweroff_notify()
1939 timeout = card->ext_csd.power_off_longtime; in mmc_poweroff_notify()
1941 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_poweroff_notify()
1946 mmc_hostname(card->host), timeout); in mmc_poweroff_notify()
1949 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION; in mmc_poweroff_notify()
1959 mmc_remove_card(host->card); in mmc_remove()
1960 host->card = NULL; in mmc_remove()
1968 return mmc_send_status(host->card, NULL); in mmc_alive()
1978 mmc_get_card(host->card, NULL); in mmc_detect()
1985 mmc_put_card(host->card, NULL); in mmc_detect()
2005 if (mmc_card_suspended(host->card)) in _mmc_suspend()
2008 if (mmc_card_doing_bkops(host->card)) { in _mmc_suspend()
2009 err = mmc_stop_bkops(host->card); in _mmc_suspend()
2014 err = mmc_flush_cache(host->card); in _mmc_suspend()
2018 if (mmc_can_poweroff_notify(host->card) && in _mmc_suspend()
2020 err = mmc_poweroff_notify(host->card, notify_type); in _mmc_suspend()
2021 else if (mmc_can_sleep(host->card)) in _mmc_suspend()
2028 mmc_card_set_suspended(host->card); in _mmc_suspend()
2044 pm_runtime_disable(&host->card->dev); in mmc_suspend()
2045 pm_runtime_set_suspended(&host->card->dev); in mmc_suspend()
2061 if (!mmc_card_suspended(host->card)) in _mmc_resume()
2064 mmc_power_up(host, host->card->ocr); in _mmc_resume()
2065 err = mmc_init_card(host, host->card->ocr, host->card); in _mmc_resume()
2066 mmc_card_clr_suspended(host->card); in _mmc_resume()
2084 if (mmc_can_poweroff_notify(host->card) && in mmc_shutdown()
2099 pm_runtime_enable(&host->card->dev); in mmc_resume()
2136 static int mmc_can_reset(struct mmc_card *card) in mmc_can_reset() argument
2140 rst_n_function = card->ext_csd.rst_n_function; in mmc_can_reset()
2148 struct mmc_card *card = host->card; in _mmc_hw_reset() local
2154 mmc_flush_cache(host->card); in _mmc_hw_reset()
2157 mmc_can_reset(card)) { in _mmc_hw_reset()
2165 mmc_power_cycle(host, card->ocr); in _mmc_hw_reset()
2168 return mmc_init_card(host, card->ocr, card); in _mmc_hw_reset()
2232 err = mmc_add_card(host->card); in mmc_attach_mmc()
2240 mmc_remove_card(host->card); in mmc_attach_mmc()
2242 host->card = NULL; in mmc_attach_mmc()