void do_remaining_work(struct rtsx_chip *chip) { struct sd_info *sd_card = &(chip->sd_card); #ifdef XD_DELAY_WRITE struct xd_info *xd_card = &(chip->xd_card); #endif struct ms_info *ms_card = &(chip->ms_card); if (chip->card_ready & SD_CARD) { if (sd_card->seq_mode) { rtsx_set_stat(chip, RTSX_STAT_RUN); sd_card->cleanup_counter ++; } else { sd_card->cleanup_counter = 0; } } #ifdef XD_DELAY_WRITE if (chip->card_ready & XD_CARD) { if (xd_card->delay_write.delay_write_flag) { rtsx_set_stat(chip, RTSX_STAT_RUN); xd_card->cleanup_counter ++; } else { xd_card->cleanup_counter = 0; } } #endif if (chip->card_ready & MS_CARD) { if (CHK_MSPRO(ms_card)) { if (ms_card->seq_mode) { rtsx_set_stat(chip, RTSX_STAT_RUN); ms_card->cleanup_counter ++; } else { ms_card->cleanup_counter = 0; } } else { #ifdef MS_DELAY_WRITE if (ms_card->delay_write.delay_write_flag) { rtsx_set_stat(chip, RTSX_STAT_RUN); ms_card->cleanup_counter ++; } else { ms_card->cleanup_counter = 0; } #endif } } if (sd_card->cleanup_counter > POLLING_WAIT_CNT) { sd_cleanup_work(chip); } if (xd_card->cleanup_counter > POLLING_WAIT_CNT) { xd_cleanup_work(chip); } if (ms_card->cleanup_counter > POLLING_WAIT_CNT) { ms_cleanup_work(chip); } }
void rtsx_release_cards(struct rtsx_chip *chip) { chip->int_reg = rtsx_readl(chip, RTSX_BIPR); if ((chip->card_ready & SD_CARD) || chip->sd_io) { if (chip->int_reg & SD_EXIST) { sd_cleanup_work(chip); } release_sd_card(chip); } if (chip->card_ready & XD_CARD) { if (chip->int_reg & XD_EXIST) { xd_cleanup_work(chip); } release_xd_card(chip); } if (chip->card_ready & MS_CARD) { if (chip->int_reg & MS_EXIST) { ms_cleanup_work(chip); } release_ms_card(chip); } }
void rtsx_power_off_card(struct rtsx_chip *chip) { if ((chip->card_ready & SD_CARD) || chip->sd_io) { sd_cleanup_work(chip); sd_power_off_card3v3(chip); } if (chip->card_ready & XD_CARD) { xd_cleanup_work(chip); xd_power_off_card3v3(chip); } if (chip->card_ready & MS_CARD) { ms_cleanup_work(chip); ms_power_off_card3v3(chip); } }