• Home
  • Raw
  • Download

Lines Matching refs:card

62 static int mmc_decode_cid(struct mmc_card *card)  in mmc_decode_cid()  argument
64 u32 *resp = card->raw_cid; in mmc_decode_cid()
70 switch (card->csd.mmca_vsn) { in mmc_decode_cid()
73 card->cid.manfid = UNSTUFF_BITS(resp, 104, 24); in mmc_decode_cid()
74 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); in mmc_decode_cid()
75 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); in mmc_decode_cid()
76 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); in mmc_decode_cid()
77 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); in mmc_decode_cid()
78 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); in mmc_decode_cid()
79 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); in mmc_decode_cid()
80 card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8); in mmc_decode_cid()
81 card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4); in mmc_decode_cid()
82 card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4); in mmc_decode_cid()
83 card->cid.serial = UNSTUFF_BITS(resp, 16, 24); in mmc_decode_cid()
84 card->cid.month = UNSTUFF_BITS(resp, 12, 4); in mmc_decode_cid()
85 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; in mmc_decode_cid()
91 card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); in mmc_decode_cid()
92 card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); in mmc_decode_cid()
93 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); in mmc_decode_cid()
94 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); in mmc_decode_cid()
95 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); in mmc_decode_cid()
96 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); in mmc_decode_cid()
97 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); in mmc_decode_cid()
98 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); in mmc_decode_cid()
99 card->cid.prv = UNSTUFF_BITS(resp, 48, 8); in mmc_decode_cid()
100 card->cid.serial = UNSTUFF_BITS(resp, 16, 32); in mmc_decode_cid()
101 card->cid.month = UNSTUFF_BITS(resp, 12, 4); in mmc_decode_cid()
102 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; in mmc_decode_cid()
107 mmc_hostname(card->host), card->csd.mmca_vsn); in mmc_decode_cid()
114 static void mmc_set_erase_size(struct mmc_card *card) in mmc_set_erase_size() argument
116 if (card->ext_csd.erase_group_def & 1) in mmc_set_erase_size()
117 card->erase_size = card->ext_csd.hc_erase_size; in mmc_set_erase_size()
119 card->erase_size = card->csd.erase_size; in mmc_set_erase_size()
121 mmc_init_erase(card); in mmc_set_erase_size()
127 static int mmc_decode_csd(struct mmc_card *card) in mmc_decode_csd() argument
129 struct mmc_csd *csd = &card->csd; in mmc_decode_csd()
131 u32 *resp = card->raw_csd; in mmc_decode_csd()
141 mmc_hostname(card->host), csd->structure); in mmc_decode_csd()
181 static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd) in mmc_get_ext_csd() argument
186 BUG_ON(!card); in mmc_get_ext_csd()
191 if (card->csd.mmca_vsn < CSD_SPEC_VER_4) in mmc_get_ext_csd()
201 "receive the ext_csd.\n", mmc_hostname(card->host)); in mmc_get_ext_csd()
205 err = mmc_send_ext_csd(card, ext_csd); in mmc_get_ext_csd()
221 if (card->csd.capacity == (4096 * 512)) { in mmc_get_ext_csd()
225 mmc_hostname(card->host)); in mmc_get_ext_csd()
230 mmc_hostname(card->host)); in mmc_get_ext_csd()
239 static void mmc_select_card_type(struct mmc_card *card) in mmc_select_card_type() argument
241 struct mmc_host *host = card->host; in mmc_select_card_type()
242 u8 card_type = card->ext_csd.raw_card_type & EXT_CSD_CARD_TYPE_MASK; in mmc_select_card_type()
265 card->ext_csd.hs_max_dtr = hs_max_dtr; in mmc_select_card_type()
266 card->ext_csd.card_type = card_type; in mmc_select_card_type()
272 static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) in mmc_read_ext_csd() argument
278 BUG_ON(!card); in mmc_read_ext_csd()
284 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; in mmc_read_ext_csd()
285 if (card->csd.structure == 3) { in mmc_read_ext_csd()
286 if (card->ext_csd.raw_ext_csd_structure > 2) { in mmc_read_ext_csd()
288 "version %d\n", mmc_hostname(card->host), in mmc_read_ext_csd()
289 card->ext_csd.raw_ext_csd_structure); in mmc_read_ext_csd()
295 card->ext_csd.rev = ext_csd[EXT_CSD_REV]; in mmc_read_ext_csd()
296 if (card->ext_csd.rev > 6) { in mmc_read_ext_csd()
298 mmc_hostname(card->host), card->ext_csd.rev); in mmc_read_ext_csd()
303 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; in mmc_read_ext_csd()
304 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; in mmc_read_ext_csd()
305 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; in mmc_read_ext_csd()
306 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3]; in mmc_read_ext_csd()
307 if (card->ext_csd.rev >= 2) { in mmc_read_ext_csd()
308 card->ext_csd.sectors = in mmc_read_ext_csd()
315 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) in mmc_read_ext_csd()
316 mmc_card_set_blockaddr(card); in mmc_read_ext_csd()
319 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; in mmc_read_ext_csd()
320 mmc_select_card_type(card); in mmc_read_ext_csd()
322 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; in mmc_read_ext_csd()
323 card->ext_csd.raw_erase_timeout_mult = in mmc_read_ext_csd()
325 card->ext_csd.raw_hc_erase_grp_size = in mmc_read_ext_csd()
327 if (card->ext_csd.rev >= 3) { in mmc_read_ext_csd()
329 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; in mmc_read_ext_csd()
332 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; in mmc_read_ext_csd()
336 card->ext_csd.sa_timeout = in mmc_read_ext_csd()
338 card->ext_csd.erase_group_def = in mmc_read_ext_csd()
340 card->ext_csd.hc_erase_timeout = 300 * in mmc_read_ext_csd()
342 card->ext_csd.hc_erase_size = in mmc_read_ext_csd()
345 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C]; in mmc_read_ext_csd()
351 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) { in mmc_read_ext_csd()
354 mmc_part_add(card, part_size, in mmc_read_ext_csd()
362 card->ext_csd.raw_hc_erase_gap_size = in mmc_read_ext_csd()
364 card->ext_csd.raw_sec_trim_mult = in mmc_read_ext_csd()
366 card->ext_csd.raw_sec_erase_mult = in mmc_read_ext_csd()
368 card->ext_csd.raw_sec_feature_support = in mmc_read_ext_csd()
370 card->ext_csd.raw_trim_mult = in mmc_read_ext_csd()
372 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; in mmc_read_ext_csd()
373 if (card->ext_csd.rev >= 4) { in mmc_read_ext_csd()
386 card->ext_csd.enhanced_area_en = 1; in mmc_read_ext_csd()
390 card->ext_csd.enhanced_area_offset = in mmc_read_ext_csd()
393 if (mmc_card_blockaddr(card)) in mmc_read_ext_csd()
394 card->ext_csd.enhanced_area_offset <<= 9; in mmc_read_ext_csd()
398 card->ext_csd.enhanced_area_size = in mmc_read_ext_csd()
401 card->ext_csd.enhanced_area_size *= in mmc_read_ext_csd()
403 card->ext_csd.enhanced_area_size <<= 9; in mmc_read_ext_csd()
409 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_read_ext_csd()
410 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_read_ext_csd()
420 if (card->ext_csd.enhanced_area_en != 1) { in mmc_read_ext_csd()
426 card->ext_csd.enhanced_area_en = 1; in mmc_read_ext_csd()
442 mmc_part_add(card, part_size << 19, in mmc_read_ext_csd()
448 card->ext_csd.sec_trim_mult = in mmc_read_ext_csd()
450 card->ext_csd.sec_erase_mult = in mmc_read_ext_csd()
452 card->ext_csd.sec_feature_support = in mmc_read_ext_csd()
454 card->ext_csd.trim_timeout = 300 * in mmc_read_ext_csd()
462 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP]; in mmc_read_ext_csd()
463 card->ext_csd.boot_ro_lockable = true; in mmc_read_ext_csd()
466 if (card->ext_csd.rev >= 5) { in mmc_read_ext_csd()
469 card->ext_csd.bkops = 1; in mmc_read_ext_csd()
470 card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN]; in mmc_read_ext_csd()
471 card->ext_csd.raw_bkops_status = in mmc_read_ext_csd()
473 if (!card->ext_csd.bkops_en) in mmc_read_ext_csd()
475 mmc_hostname(card->host)); in mmc_read_ext_csd()
480 card->ext_csd.hpi = 1; in mmc_read_ext_csd()
482 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION; in mmc_read_ext_csd()
484 card->ext_csd.hpi_cmd = MMC_SEND_STATUS; in mmc_read_ext_csd()
489 card->ext_csd.out_of_int_time = in mmc_read_ext_csd()
493 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; in mmc_read_ext_csd()
494 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; in mmc_read_ext_csd()
499 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT]; in mmc_read_ext_csd()
500 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) { in mmc_read_ext_csd()
501 mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17, in mmc_read_ext_csd()
508 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT]; in mmc_read_ext_csd()
510 card->erased_byte = 0xFF; in mmc_read_ext_csd()
512 card->erased_byte = 0x0; in mmc_read_ext_csd()
515 if (card->ext_csd.rev >= 6) { in mmc_read_ext_csd()
516 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE; in mmc_read_ext_csd()
518 card->ext_csd.generic_cmd6_time = 10 * in mmc_read_ext_csd()
520 card->ext_csd.power_off_longtime = 10 * in mmc_read_ext_csd()
523 card->ext_csd.cache_size = in mmc_read_ext_csd()
530 card->ext_csd.data_sector_size = 4096; in mmc_read_ext_csd()
532 card->ext_csd.data_sector_size = 512; in mmc_read_ext_csd()
536 card->ext_csd.data_tag_unit_size = in mmc_read_ext_csd()
538 (card->ext_csd.data_sector_size); in mmc_read_ext_csd()
540 card->ext_csd.data_tag_unit_size = 0; in mmc_read_ext_csd()
543 card->ext_csd.max_packed_writes = in mmc_read_ext_csd()
545 card->ext_csd.max_packed_reads = in mmc_read_ext_csd()
548 card->ext_csd.data_sector_size = 512; in mmc_read_ext_csd()
561 static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) in mmc_compare_ext_csds() argument
569 err = mmc_get_ext_csd(card, &bw_ext_csd); in mmc_compare_ext_csds()
577 err = !((card->ext_csd.raw_partition_support == in mmc_compare_ext_csds()
579 (card->ext_csd.raw_erased_mem_count == in mmc_compare_ext_csds()
581 (card->ext_csd.rev == in mmc_compare_ext_csds()
583 (card->ext_csd.raw_ext_csd_structure == in mmc_compare_ext_csds()
585 (card->ext_csd.raw_card_type == in mmc_compare_ext_csds()
587 (card->ext_csd.raw_s_a_timeout == in mmc_compare_ext_csds()
589 (card->ext_csd.raw_hc_erase_gap_size == in mmc_compare_ext_csds()
591 (card->ext_csd.raw_erase_timeout_mult == in mmc_compare_ext_csds()
593 (card->ext_csd.raw_hc_erase_grp_size == in mmc_compare_ext_csds()
595 (card->ext_csd.raw_sec_trim_mult == in mmc_compare_ext_csds()
597 (card->ext_csd.raw_sec_erase_mult == in mmc_compare_ext_csds()
599 (card->ext_csd.raw_sec_feature_support == in mmc_compare_ext_csds()
601 (card->ext_csd.raw_trim_mult == in mmc_compare_ext_csds()
603 (card->ext_csd.raw_sectors[0] == in mmc_compare_ext_csds()
605 (card->ext_csd.raw_sectors[1] == in mmc_compare_ext_csds()
607 (card->ext_csd.raw_sectors[2] == in mmc_compare_ext_csds()
609 (card->ext_csd.raw_sectors[3] == in mmc_compare_ext_csds()
619 MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
620 card->raw_cid[2], card->raw_cid[3]);
621 MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
622 card->raw_csd[2], card->raw_csd[3]);
623 MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
624 MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
625 MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
626 MMC_DEV_ATTR(fwrev, "0x%x\n", card->cid.fwrev);
627 MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
628 MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
629 MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
630 MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
631 MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
632 MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
634 card->ext_csd.enhanced_area_offset);
635 MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
636 MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
637 MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
678 static int mmc_select_powerclass(struct mmc_card *card, in mmc_select_powerclass() argument
686 BUG_ON(!card); in mmc_select_powerclass()
688 host = card->host; in mmc_select_powerclass()
695 if (card->csd.mmca_vsn < CSD_SPEC_VER_4) in mmc_select_powerclass()
748 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_powerclass()
751 card->ext_csd.generic_cmd6_time); in mmc_select_powerclass()
761 static int mmc_select_hs200(struct mmc_card *card) in mmc_select_hs200() argument
774 BUG_ON(!card); in mmc_select_hs200()
776 host = card->host; in mmc_select_hs200()
778 if (card->ext_csd.card_type & EXT_CSD_CARD_TYPE_SDR_1_2V && in mmc_select_hs200()
782 if (err && card->ext_csd.card_type & EXT_CSD_CARD_TYPE_SDR_1_8V && in mmc_select_hs200()
807 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs200()
810 card->ext_csd.generic_cmd6_time); in mmc_select_hs200()
814 mmc_set_bus_width(card->host, bus_widths[idx]); in mmc_select_hs200()
817 err = mmc_compare_ext_csds(card, bus_widths[idx]); in mmc_select_hs200()
819 err = mmc_bus_test(card, bus_widths[idx]); in mmc_select_hs200()
826 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs200()
841 struct mmc_card *card; in mmc_init_card() local
894 card = oldcard; in mmc_init_card()
899 card = mmc_alloc_card(host, &mmc_type); in mmc_init_card()
900 if (IS_ERR(card)) { in mmc_init_card()
901 err = PTR_ERR(card); in mmc_init_card()
905 card->type = MMC_TYPE_MMC; in mmc_init_card()
906 card->rca = 1; in mmc_init_card()
907 memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); in mmc_init_card()
914 err = mmc_set_relative_addr(card); in mmc_init_card()
925 err = mmc_send_csd(card, card->raw_csd); in mmc_init_card()
929 err = mmc_decode_csd(card); in mmc_init_card()
932 err = mmc_decode_cid(card); in mmc_init_card()
941 err = mmc_select_card(card); in mmc_init_card()
951 err = mmc_get_ext_csd(card, &ext_csd); in mmc_init_card()
954 err = mmc_read_ext_csd(card, ext_csd); in mmc_init_card()
963 if (!(mmc_card_blockaddr(card)) && (rocr & (1<<30))) in mmc_init_card()
964 mmc_card_set_blockaddr(card); in mmc_init_card()
967 mmc_set_erase_size(card); in mmc_init_card()
974 if (card->ext_csd.enhanced_area_en || in mmc_init_card()
975 (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) { in mmc_init_card()
976 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
978 card->ext_csd.generic_cmd6_time); in mmc_init_card()
990 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_init_card()
991 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_init_card()
993 card->ext_csd.erase_group_def = 1; in mmc_init_card()
999 mmc_set_erase_size(card); in mmc_init_card()
1006 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) { in mmc_init_card()
1007 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; in mmc_init_card()
1008 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, in mmc_init_card()
1009 card->ext_csd.part_config, in mmc_init_card()
1010 card->ext_csd.part_time); in mmc_init_card()
1018 if (card->ext_csd.rev >= 6) { in mmc_init_card()
1019 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1022 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1031 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; in mmc_init_card()
1037 if (card->ext_csd.hs_max_dtr != 0) { in mmc_init_card()
1039 if (card->ext_csd.hs_max_dtr > 52000000 && in mmc_init_card()
1041 err = mmc_select_hs200(card); in mmc_init_card()
1043 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1045 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1052 mmc_hostname(card->host)); in mmc_init_card()
1055 if (card->ext_csd.hs_max_dtr > 52000000 && in mmc_init_card()
1057 mmc_card_set_hs200(card); in mmc_init_card()
1058 mmc_set_timing(card->host, in mmc_init_card()
1061 mmc_card_set_highspeed(card); in mmc_init_card()
1062 mmc_set_timing(card->host, MMC_TIMING_MMC_HS); in mmc_init_card()
1072 if (mmc_card_highspeed(card) || mmc_card_hs200(card)) { in mmc_init_card()
1073 if (max_dtr > card->ext_csd.hs_max_dtr) in mmc_init_card()
1074 max_dtr = card->ext_csd.hs_max_dtr; in mmc_init_card()
1075 if (mmc_card_highspeed(card) && (max_dtr > 52000000)) in mmc_init_card()
1077 } else if (max_dtr > card->csd.max_dtr) { in mmc_init_card()
1078 max_dtr = card->csd.max_dtr; in mmc_init_card()
1086 if (mmc_card_highspeed(card)) { in mmc_init_card()
1087 if ((card->ext_csd.card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) in mmc_init_card()
1092 else if ((card->ext_csd.card_type & EXT_CSD_CARD_TYPE_DDR_1_2V) in mmc_init_card()
1102 if (mmc_card_hs200(card)) { in mmc_init_card()
1104 u32 bus_width = card->host->ios.bus_width; in mmc_init_card()
1118 card->host->ops->execute_tuning) { in mmc_init_card()
1119 mmc_host_clk_hold(card->host); in mmc_init_card()
1120 err = card->host->ops->execute_tuning(card->host, in mmc_init_card()
1122 mmc_host_clk_release(card->host); in mmc_init_card()
1126 mmc_hostname(card->host)); in mmc_init_card()
1132 err = mmc_select_powerclass(card, ext_csd_bits, ext_csd); in mmc_init_card()
1135 " failed\n", mmc_hostname(card->host), in mmc_init_card()
1142 if (!mmc_card_hs200(card) && in mmc_init_card()
1143 (card->csd.mmca_vsn >= CSD_SPEC_VER_4) && in mmc_init_card()
1165 err = mmc_select_powerclass(card, ext_csd_bits[idx][0], in mmc_init_card()
1170 mmc_hostname(card->host), in mmc_init_card()
1173 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1176 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1178 mmc_set_bus_width(card->host, bus_width); in mmc_init_card()
1186 err = mmc_compare_ext_csds(card, in mmc_init_card()
1189 err = mmc_bus_test(card, bus_width); in mmc_init_card()
1196 err = mmc_select_powerclass(card, ext_csd_bits[idx][1], in mmc_init_card()
1201 mmc_hostname(card->host), in mmc_init_card()
1204 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1207 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1211 "failed\n", mmc_hostname(card->host), in mmc_init_card()
1235 mmc_card_set_ddr_mode(card); in mmc_init_card()
1236 mmc_set_timing(card->host, MMC_TIMING_UHS_DDR50); in mmc_init_card()
1237 mmc_set_bus_width(card->host, bus_width); in mmc_init_card()
1244 if (card->ext_csd.hpi) { in mmc_init_card()
1245 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1247 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1252 mmc_hostname(card->host)); in mmc_init_card()
1255 card->ext_csd.hpi_en = 1; in mmc_init_card()
1263 card->ext_csd.cache_size > 0) { in mmc_init_card()
1264 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1266 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1276 mmc_hostname(card->host), err); in mmc_init_card()
1277 card->ext_csd.cache_ctrl = 0; in mmc_init_card()
1280 card->ext_csd.cache_ctrl = 1; in mmc_init_card()
1288 if (card->ext_csd.max_packed_writes >= 3 && in mmc_init_card()
1289 card->ext_csd.max_packed_reads >= 5 && in mmc_init_card()
1291 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_init_card()
1294 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1299 mmc_hostname(card->host)); in mmc_init_card()
1300 card->ext_csd.packed_event_en = 0; in mmc_init_card()
1303 card->ext_csd.packed_event_en = 1; in mmc_init_card()
1308 host->card = card; in mmc_init_card()
1315 mmc_remove_card(card); in mmc_init_card()
1322 static int mmc_can_poweroff_notify(const struct mmc_card *card) in mmc_can_poweroff_notify() argument
1324 return card && in mmc_can_poweroff_notify()
1325 mmc_card_mmc(card) && in mmc_can_poweroff_notify()
1326 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON); in mmc_can_poweroff_notify()
1329 static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type) in mmc_poweroff_notify() argument
1331 unsigned int timeout = card->ext_csd.generic_cmd6_time; in mmc_poweroff_notify()
1336 timeout = card->ext_csd.power_off_longtime; in mmc_poweroff_notify()
1338 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_poweroff_notify()
1343 mmc_hostname(card->host), timeout); in mmc_poweroff_notify()
1346 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION; in mmc_poweroff_notify()
1357 BUG_ON(!host->card); in mmc_remove()
1359 mmc_remove_card(host->card); in mmc_remove()
1360 host->card = NULL; in mmc_remove()
1368 return mmc_send_status(host->card, NULL); in mmc_alive()
1379 BUG_ON(!host->card); in mmc_detect()
1407 BUG_ON(!host->card); in _mmc_suspend()
1411 err = mmc_flush_cache(host->card); in _mmc_suspend()
1415 if (mmc_can_poweroff_notify(host->card) && in _mmc_suspend()
1417 err = mmc_poweroff_notify(host->card, notify_type); in _mmc_suspend()
1422 host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200); in _mmc_suspend()
1456 BUG_ON(!host->card); in mmc_resume()
1459 err = mmc_init_card(host, host->ocr, host->card); in mmc_resume()
1469 host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200); in mmc_power_restore()
1471 ret = mmc_init_card(host, host->ocr, host->card); in mmc_power_restore()
1479 struct mmc_card *card = host->card; in mmc_sleep() local
1482 if (card && card->ext_csd.rev >= 3) { in mmc_sleep()
1494 struct mmc_card *card = host->card; in mmc_awake() local
1497 if (card && card->ext_csd.rev >= 3) { in mmc_awake()
1603 err = mmc_add_card(host->card); in mmc_attach_mmc()
1612 mmc_remove_card(host->card); in mmc_attach_mmc()
1614 host->card = NULL; in mmc_attach_mmc()