Lines Matching refs:card
66 static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card) in mmcsd_parse_csd() argument
69 struct rt_mmcsd_csd *csd = &card->csd; in mmcsd_parse_csd()
70 rt_uint32_t *resp = card->resp_csd; in mmcsd_parse_csd()
101 card->card_blksize = 1 << csd->rd_blk_len; in mmcsd_parse_csd()
102 card->tacc_clks = csd->nsac * 100; in mmcsd_parse_csd()
103 card->tacc_ns = (tacc_uint[csd->taac & 0x07] * tacc_value[(csd->taac & 0x78) >> 3] + 9) / 10; in mmcsd_parse_csd()
104 …card->max_data_rate = tran_unit[csd->tran_speed & 0x07] * tran_value[(csd->tran_speed & 0x78) >> 3… in mmcsd_parse_csd()
109 card->erase_size = (a + 1) * (b + 1); in mmcsd_parse_csd()
110 card->erase_size <<= csd->wr_blk_len - 9; in mmcsd_parse_csd()
119 static int mmc_get_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t **new_ext_csd) in mmc_get_ext_csd() argument
127 if (GET_BITS(card->resp_csd, 122, 4) < 4) in mmc_get_ext_csd()
172 mmcsd_send_request(card->host, &req); in mmc_get_ext_csd()
186 static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd) in mmc_parse_ext_csd() argument
190 if (card == RT_NULL || ext_csd == RT_NULL) in mmc_parse_ext_csd()
196 host = card->host; in mmc_parse_ext_csd()
201 card->flags |= CARD_FLAG_HS400; in mmc_parse_ext_csd()
202 card->max_data_rate = 200000000; in mmc_parse_ext_csd()
206 card->flags |= CARD_FLAG_HS200; in mmc_parse_ext_csd()
207 card->max_data_rate = 200000000; in mmc_parse_ext_csd()
211 card->flags |= CARD_FLAG_HIGHSPEED_DDR; in mmc_parse_ext_csd()
212 card->hs_max_data_rate = 52000000; in mmc_parse_ext_csd()
216 card->flags |= CARD_FLAG_HIGHSPEED; in mmc_parse_ext_csd()
217 card->hs_max_data_rate = 52000000; in mmc_parse_ext_csd()
222 card->ext_csd.enhanced_data_strobe = 1; in mmc_parse_ext_csd()
225 card->ext_csd.cache_size = in mmc_parse_ext_csd()
232 card->card_sec_cnt = card_capacity; in mmc_parse_ext_csd()
233 card_capacity *= card->card_blksize; in mmc_parse_ext_csd()
235 card->card_capacity = card_capacity; in mmc_parse_ext_csd()
236 LOG_I("emmc card capacity %d KB, card sec count:%d.", card->card_capacity, card->card_sec_cnt); in mmc_parse_ext_csd()
250 static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set, in mmc_switch() argument
254 struct rt_mmcsd_host *host = card->host; in mmc_switch()
269 static int mmc_compare_ext_csds(struct rt_mmcsd_card *card, in mmc_compare_ext_csds() argument
278 err = mmc_get_ext_csd(card, &bw_ext_csd); in mmc_compare_ext_csds()
327 static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd) in mmc_select_bus_width() argument
341 struct rt_mmcsd_host *host = card->host; in mmc_select_bus_width()
345 if (GET_BITS(card->resp_csd, 122, 4) < 4) in mmc_select_bus_width()
348 if (card->flags & CARD_FLAG_HIGHSPEED_DDR) in mmc_select_bus_width()
374 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_bus_width()
382 err = mmc_compare_ext_csds(card, ext_csd, bus_width); in mmc_select_bus_width()
408 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_bus_width()
415 if (card->flags & (CARD_FLAG_HIGHSPEED | CARD_FLAG_HIGHSPEED_DDR)) in mmc_select_bus_width()
418 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_bus_width()
491 static int mmc_select_hs200(struct rt_mmcsd_card *card) in mmc_select_hs200() argument
495 ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_select_hs200()
500 mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS200); in mmc_select_hs200()
501 mmcsd_set_clock(card->host, card->max_data_rate); in mmc_select_hs200()
503 ret = mmcsd_excute_tuning(card); in mmc_select_hs200()
508 static int mmc_switch_to_hs400(struct rt_mmcsd_card *card) in mmc_switch_to_hs400() argument
510 struct rt_mmcsd_host *host = card->host; in mmc_switch_to_hs400()
516 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_switch_to_hs400()
522 mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS); in mmc_switch_to_hs400()
524 mmcsd_set_clock(card->host, 52000000); in mmc_switch_to_hs400()
526 rt_bool_t support_enhanced_ds = ((card->ext_csd.enhanced_data_strobe != 0) && in mmc_switch_to_hs400()
537 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_switch_to_hs400()
546 err = mmc_switch(card, in mmc_switch_to_hs400()
562 mmcsd_set_clock(card->host, card->max_data_rate); in mmc_switch_to_hs400()
567 static int mmc_select_hs400(struct rt_mmcsd_card *card) in mmc_select_hs400() argument
570 struct rt_mmcsd_host *host = card->host; in mmc_select_hs400()
572 if ((card->ext_csd.enhanced_data_strobe == 0) || ((host->flags & MMCSD_SUP_ENH_DS) == 0)) in mmc_select_hs400()
574 ret = mmc_select_hs200(card); in mmc_select_hs400()
580 return mmc_switch_to_hs400(card); in mmc_select_hs400()
583 static int mmc_select_timing(struct rt_mmcsd_card *card) in mmc_select_timing() argument
587 if (card->flags & CARD_FLAG_HS400) in mmc_select_timing()
590 ret = mmc_select_hs400(card); in mmc_select_timing()
592 else if (card->flags & CARD_FLAG_HS200) in mmc_select_timing()
595 ret = mmc_select_hs200(card); in mmc_select_timing()
597 else if (card->flags & CARD_FLAG_HIGHSPEED_DDR) in mmc_select_timing()
600 mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_DDR52); in mmc_select_timing()
601 mmcsd_set_clock(card->host, card->hs_max_data_rate); in mmc_select_timing()
606 mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS); in mmc_select_timing()
607 mmcsd_set_clock(card->host, card->hs_max_data_rate); in mmc_select_timing()
620 struct rt_mmcsd_card *card = RT_NULL; in mmcsd_mmc_init_card() local
643 card = rt_malloc(sizeof(struct rt_mmcsd_card)); in mmcsd_mmc_init_card()
644 if (!card) in mmcsd_mmc_init_card()
650 rt_memset(card, 0, sizeof(struct rt_mmcsd_card)); in mmcsd_mmc_init_card()
652 card->card_type = CARD_TYPE_MMC; in mmcsd_mmc_init_card()
653 card->host = host; in mmcsd_mmc_init_card()
654 card->rca = 1; in mmcsd_mmc_init_card()
655 rt_memcpy(card->resp_cid, resp, sizeof(card->resp_cid)); in mmcsd_mmc_init_card()
662 err = mmc_set_card_addr(host, card->rca); in mmcsd_mmc_init_card()
669 err = mmcsd_get_csd(card, card->resp_csd); in mmcsd_mmc_init_card()
673 err = mmcsd_parse_csd(card); in mmcsd_mmc_init_card()
679 err = mmcsd_select_card(card); in mmcsd_mmc_init_card()
688 err = mmc_get_ext_csd(card, &ext_csd); in mmcsd_mmc_init_card()
691 err = mmc_parse_ext_csd(card, ext_csd); in mmcsd_mmc_init_card()
700 if (!(card->flags & CARD_FLAG_SDHC) && (rocr & (1 << 30))) in mmcsd_mmc_init_card()
701 card->flags |= CARD_FLAG_SDHC; in mmcsd_mmc_init_card()
704 err = mmc_select_bus_width(card, ext_csd); in mmcsd_mmc_init_card()
711 err = mmc_select_timing(card); in mmcsd_mmc_init_card()
718 if (card->ext_csd.cache_size > 0) in mmcsd_mmc_init_card()
720 mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmcsd_mmc_init_card()
724 host->card = card; in mmcsd_mmc_init_card()
732 rt_free(card); in mmcsd_mmc_init_card()
775 err = rt_mmcsd_blk_probe(host->card); in init_mmc()
784 rt_mmcsd_blk_remove(host->card); in init_mmc()
785 rt_free(host->card); in init_mmc()
786 host->card = RT_NULL; in init_mmc()