Lines Matching +full:no +full:- +full:mmc
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * linux/drivers/mmc/host/sdhci_uhs2.c - Secure Digital Host Controller
18 #include <linux/mmc/mmc.h>
19 #include <linux/mmc/host.h>
22 #include "sdhci-uhs2.h"
28 pr_err("%s: " DRIVER_NAME ": " f, mmc_hostname(host->mmc), ## x)
39 if (!(mmc_card_uhs2(host->mmc))) in sdhci_uhs2_dump_regs()
73 return be16_to_cpu((__force __be16)cmd->uhs2_cmd->arg) & UHS2_ARG_IOADR_MASK; in uhs2_dev_cmd()
76 static inline int mmc_opt_regulator_set_ocr(struct mmc_host *mmc, in mmc_opt_regulator_set_ocr() argument
80 return IS_ERR_OR_NULL(supply) ? 0 : mmc_regulator_set_ocr(mmc, supply, vdd_bit); in mmc_opt_regulator_set_ocr()
84 * sdhci_uhs2_reset - invoke SW reset
97 host->clock = 0; in sdhci_uhs2_reset()
103 mmc_hostname(host->mmc), (int)mask, mmc_hostname(host->mmc)); in sdhci_uhs2_reset()
114 if (host->mmc->uhs2_sd_tran) { in sdhci_uhs2_reset_cmd_data()
117 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_uhs2_reset_cmd_data()
118 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_uhs2_reset_cmd_data()
125 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_set_power() local
132 mmc_hostname(host->mmc), vdd); in sdhci_uhs2_set_power()
136 if (host->pwr == pwr) in sdhci_uhs2_set_power()
138 host->pwr = pwr; in sdhci_uhs2_set_power()
143 mmc_opt_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); in sdhci_uhs2_set_power()
144 mmc_regulator_set_vqmmc2(mmc, &mmc->ios); in sdhci_uhs2_set_power()
146 mmc_opt_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); in sdhci_uhs2_set_power()
148 mmc_regulator_set_vqmmc2(mmc, &mmc->ios); in sdhci_uhs2_set_power()
179 * (2) host->timeout_clk < 2^16 in sdhci_calc_timeout_uhs2()
184 current_timeout = (1 << 13) * 1000 / host->timeout_clk; in sdhci_calc_timeout_uhs2()
194 mmc_hostname(host->mmc), count); in sdhci_calc_timeout_uhs2()
200 current_timeout = (1 << 13) * 1000 / host->timeout_clk; in sdhci_calc_timeout_uhs2()
210 mmc_hostname(host->mmc), count); in sdhci_calc_timeout_uhs2()
231 if (mmc_card_uhs2(host->mmc)) in sdhci_uhs2_set_timeout()
237 * sdhci_uhs2_clear_set_irqs - set Error Interrupt Status Enable register
239 * @clear: bit-wise clear mask
240 * @set: bit-wise set mask
242 * Set/unset bits in UHS-II Error Interrupt Status Enable register
256 static void __sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) in __sdhci_uhs2_set_ios() argument
258 struct sdhci_host *host = mmc_priv(mmc); in __sdhci_uhs2_set_ios()
279 if (ios->power_mode != MMC_POWER_OFF && in __sdhci_uhs2_set_ios()
280 (ios->timing == MMC_TIMING_UHS2_SPEED_A || in __sdhci_uhs2_set_ios()
281 ios->timing == MMC_TIMING_UHS2_SPEED_A_HD || in __sdhci_uhs2_set_ios()
282 ios->timing == MMC_TIMING_UHS2_SPEED_B || in __sdhci_uhs2_set_ios()
283 ios->timing == MMC_TIMING_UHS2_SPEED_B_HD)) in __sdhci_uhs2_set_ios()
288 host->timing = ios->timing; in __sdhci_uhs2_set_ios()
290 if (!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN)) in __sdhci_uhs2_set_ios()
293 if (host->ops->set_power) in __sdhci_uhs2_set_ios()
294 host->ops->set_power(host, ios->power_mode, ios->vdd); in __sdhci_uhs2_set_ios()
296 sdhci_uhs2_set_power(host, ios->power_mode, ios->vdd); in __sdhci_uhs2_set_ios()
298 sdhci_set_clock(host, host->clock); in __sdhci_uhs2_set_ios()
301 static int sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) in sdhci_uhs2_set_ios() argument
303 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_set_ios()
306 mmc_hostname(mmc), ios->clock, ios->power_mode, ios->vdd, ios->timing); in sdhci_uhs2_set_ios()
308 if (!mmc_card_uhs2(mmc)) { in sdhci_uhs2_set_ios()
309 sdhci_set_ios(mmc, ios); in sdhci_uhs2_set_ios()
313 if (ios->power_mode == MMC_POWER_UNDEFINED) in sdhci_uhs2_set_ios()
316 if (host->flags & SDHCI_DEVICE_DEAD) { in sdhci_uhs2_set_ios()
317 if (ios->power_mode == MMC_POWER_OFF) { in sdhci_uhs2_set_ios()
318 mmc_opt_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); in sdhci_uhs2_set_ios()
319 mmc_regulator_set_vqmmc2(mmc, ios); in sdhci_uhs2_set_ios()
321 return -1; in sdhci_uhs2_set_ios()
324 sdhci_set_ios_common(mmc, ios); in sdhci_uhs2_set_ios()
326 __sdhci_uhs2_set_ios(mmc, ios); in sdhci_uhs2_set_ios()
338 pr_warn("%s: not detect UHS2 interface in 100ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
340 return -EIO; in sdhci_uhs2_interface_detect()
348 pr_warn("%s: UHS2 Lane sync fail in 150ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
350 return -EIO; in sdhci_uhs2_interface_detect()
354 mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
364 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_init() local
369 mmc_hostname(mmc), caps_ptr); in sdhci_uhs2_init()
370 return -ENODEV; in sdhci_uhs2_init()
378 mmc->uhs2_caps.dap = caps_gen & SDHCI_UHS2_CAPS_DAP_MASK; in sdhci_uhs2_init()
379 mmc->uhs2_caps.gap = FIELD_GET(SDHCI_UHS2_CAPS_GAP_MASK, caps_gen); in sdhci_uhs2_init()
380 mmc->uhs2_caps.n_lanes = FIELD_GET(SDHCI_UHS2_CAPS_LANE_MASK, caps_gen); in sdhci_uhs2_init()
381 mmc->uhs2_caps.addr64 = (caps_gen & SDHCI_UHS2_CAPS_ADDR_64) ? 1 : 0; in sdhci_uhs2_init()
382 mmc->uhs2_caps.card_type = FIELD_GET(SDHCI_UHS2_CAPS_DEV_TYPE_MASK, caps_gen); in sdhci_uhs2_init()
385 mmc->uhs2_caps.phy_rev = caps_phy & SDHCI_UHS2_CAPS_PHY_REV_MASK; in sdhci_uhs2_init()
386 mmc->uhs2_caps.speed_range = FIELD_GET(SDHCI_UHS2_CAPS_PHY_RANGE_MASK, caps_phy); in sdhci_uhs2_init()
387 mmc->uhs2_caps.n_lss_sync = FIELD_GET(SDHCI_UHS2_CAPS_PHY_N_LSS_SYN_MASK, caps_phy); in sdhci_uhs2_init()
388 mmc->uhs2_caps.n_lss_dir = FIELD_GET(SDHCI_UHS2_CAPS_PHY_N_LSS_DIR_MASK, caps_phy); in sdhci_uhs2_init()
389 if (mmc->uhs2_caps.n_lss_sync == 0) in sdhci_uhs2_init()
390 mmc->uhs2_caps.n_lss_sync = 16 << 2; in sdhci_uhs2_init()
392 mmc->uhs2_caps.n_lss_sync <<= 2; in sdhci_uhs2_init()
393 if (mmc->uhs2_caps.n_lss_dir == 0) in sdhci_uhs2_init()
394 mmc->uhs2_caps.n_lss_dir = 16 << 3; in sdhci_uhs2_init()
396 mmc->uhs2_caps.n_lss_dir <<= 3; in sdhci_uhs2_init()
399 mmc->uhs2_caps.link_rev = caps_tran[0] & SDHCI_UHS2_CAPS_TRAN_LINK_REV_MASK; in sdhci_uhs2_init()
400 mmc->uhs2_caps.n_fcu = FIELD_GET(SDHCI_UHS2_CAPS_TRAN_N_FCU_MASK, caps_tran[0]); in sdhci_uhs2_init()
401 if (mmc->uhs2_caps.n_fcu == 0) in sdhci_uhs2_init()
402 mmc->uhs2_caps.n_fcu = 256; in sdhci_uhs2_init()
403 mmc->uhs2_caps.host_type = FIELD_GET(SDHCI_UHS2_CAPS_TRAN_HOST_TYPE_MASK, caps_tran[0]); in sdhci_uhs2_init()
404 mmc->uhs2_caps.maxblk_len = FIELD_GET(SDHCI_UHS2_CAPS_TRAN_BLK_LEN_MASK, caps_tran[0]); in sdhci_uhs2_init()
405 mmc->uhs2_caps.n_data_gap = caps_tran[1] & SDHCI_UHS2_CAPS_TRAN_1_N_DATA_GAP_MASK; in sdhci_uhs2_init()
410 static int sdhci_uhs2_do_detect_init(struct mmc_host *mmc) in sdhci_uhs2_do_detect_init() argument
412 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_do_detect_init()
416 if (host->ops->uhs2_pre_detect_init) in sdhci_uhs2_do_detect_init()
417 host->ops->uhs2_pre_detect_init(host); in sdhci_uhs2_do_detect_init()
420 pr_warn("%s: cannot detect UHS2 interface.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_do_detect_init()
421 return -EIO; in sdhci_uhs2_do_detect_init()
425 pr_warn("%s: UHS2 init fail.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_do_detect_init()
426 return -EIO; in sdhci_uhs2_do_detect_init()
436 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_uhs2_do_detect_init()
437 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_uhs2_do_detect_init()
442 static int sdhci_uhs2_disable_clk(struct mmc_host *mmc) in sdhci_uhs2_disable_clk() argument
444 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_disable_clk()
453 static int sdhci_uhs2_enable_clk(struct mmc_host *mmc) in sdhci_uhs2_enable_clk() argument
455 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_enable_clk()
465 pr_err("%s: Internal clock never stabilised.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_enable_clk()
467 return -EIO; in sdhci_uhs2_enable_clk()
482 value = FIELD_PREP(SDHCI_UHS2_GEN_SETTINGS_N_LANES_MASK, host->mmc->uhs2_caps.n_lanes_set); in sdhci_uhs2_set_config()
486 value = FIELD_PREP(SDHCI_UHS2_PHY_N_LSS_DIR_MASK, host->mmc->uhs2_caps.n_lss_dir_set) | in sdhci_uhs2_set_config()
487 FIELD_PREP(SDHCI_UHS2_PHY_N_LSS_SYN_MASK, host->mmc->uhs2_caps.n_lss_sync_set); in sdhci_uhs2_set_config()
488 if (host->mmc->ios.timing == MMC_TIMING_UHS2_SPEED_B || in sdhci_uhs2_set_config()
489 host->mmc->ios.timing == MMC_TIMING_UHS2_SPEED_B_HD) in sdhci_uhs2_set_config()
493 /* Set LINK-TRAN Settings */ in sdhci_uhs2_set_config()
494 value = FIELD_PREP(SDHCI_UHS2_TRAN_RETRY_CNT_MASK, host->mmc->uhs2_caps.max_retry_set) | in sdhci_uhs2_set_config()
495 FIELD_PREP(SDHCI_UHS2_TRAN_N_FCU_MASK, host->mmc->uhs2_caps.n_fcu_set); in sdhci_uhs2_set_config()
497 sdhci_writel(host, host->mmc->uhs2_caps.n_data_gap_set, sdhci_uhs2_tran_set_1_reg); in sdhci_uhs2_set_config()
507 pr_warn("%s: UHS2 IN_DORMANT fail in 100ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_check_dormant()
509 return -EIO; in sdhci_uhs2_check_dormant()
514 static int sdhci_uhs2_control(struct mmc_host *mmc, enum sd_uhs2_operation op) in sdhci_uhs2_control() argument
516 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_control()
517 struct mmc_ios *ios = &mmc->ios; in sdhci_uhs2_control()
524 err = sdhci_uhs2_do_detect_init(mmc); in sdhci_uhs2_control()
539 err = sdhci_uhs2_disable_clk(mmc); in sdhci_uhs2_control()
542 err = sdhci_uhs2_enable_clk(mmc); in sdhci_uhs2_control()
545 err = sdhci_uhs2_set_ios(mmc, ios); in sdhci_uhs2_control()
549 mmc_hostname(host->mmc), op); in sdhci_uhs2_control()
550 err = -EIO; in sdhci_uhs2_control()
565 struct mmc_data *data = cmd->data; in sdhci_uhs2_prepare_data()
571 sdhci_writew(host, data->blksz, SDHCI_UHS2_BLOCK_SIZE); in sdhci_uhs2_prepare_data()
572 sdhci_writew(host, data->blocks, SDHCI_UHS2_BLOCK_COUNT); in sdhci_uhs2_prepare_data()
577 struct mmc_data *data = host->data; in sdhci_uhs2_finish_data()
581 __sdhci_finish_mrq(host, data->mrq); in sdhci_uhs2_finish_data()
587 struct mmc_data *data = cmd->data; in sdhci_uhs2_set_transfer_mode()
590 /* clear Auto CMD settings for no data CMDs */ in sdhci_uhs2_set_transfer_mode()
595 if (cmd->opcode == MMC_STOP_TRANSMISSION || cmd->opcode == MMC_ERASE) in sdhci_uhs2_set_transfer_mode()
599 if (cmd->opcode == MMC_SEND_STATUS) in sdhci_uhs2_set_transfer_mode()
603 DBG("UHS2 no data trans mode is 0x%x.\n", mode); in sdhci_uhs2_set_transfer_mode()
609 WARN_ON(!host->data); in sdhci_uhs2_set_transfer_mode()
612 if (data->flags & MMC_DATA_WRITE) in sdhci_uhs2_set_transfer_mode()
615 if (data->blocks == 1 && in sdhci_uhs2_set_transfer_mode()
616 data->blksz != 512 && in sdhci_uhs2_set_transfer_mode()
617 cmd->opcode != MMC_READ_SINGLE_BLOCK && in sdhci_uhs2_set_transfer_mode()
618 cmd->opcode != MMC_WRITE_BLOCK) { in sdhci_uhs2_set_transfer_mode()
623 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_uhs2_set_transfer_mode()
626 if (cmd->uhs2_cmd->tmode_half_duplex) in sdhci_uhs2_set_transfer_mode()
641 ((u32)cmd->uhs2_cmd->arg << 16) | in __sdhci_uhs2_send_command()
642 (u32)cmd->uhs2_cmd->header, in __sdhci_uhs2_send_command()
651 for (j = 0; j < cmd->uhs2_cmd->payload_len / sizeof(u32); j++) { in __sdhci_uhs2_send_command()
652 sdhci_writel(host, *(__force u32 *)(cmd->uhs2_cmd->payload + j), in __sdhci_uhs2_send_command()
660 DBG("UHS2 CMD packet_len = %d.\n", cmd->uhs2_cmd->packet_len); in __sdhci_uhs2_send_command()
661 for (i = 0; i < cmd->uhs2_cmd->packet_len; i++) in __sdhci_uhs2_send_command()
665 cmd_reg = FIELD_PREP(SDHCI_UHS2_CMD_PACK_LEN_MASK, cmd->uhs2_cmd->packet_len); in __sdhci_uhs2_send_command()
666 if ((cmd->flags & MMC_CMD_MASK) == MMC_CMD_ADTC) in __sdhci_uhs2_send_command()
668 if (cmd->opcode == MMC_STOP_TRANSMISSION) in __sdhci_uhs2_send_command()
672 if ((cmd->uhs2_cmd->header & UHS2_NATIVE_PACKET) && in __sdhci_uhs2_send_command()
677 if ((cmd->uhs2_cmd->header & UHS2_NATIVE_PACKET) && in __sdhci_uhs2_send_command()
691 WARN_ON(host->cmd); in sdhci_uhs2_send_command()
693 /* Initially, a command has no error */ in sdhci_uhs2_send_command()
694 cmd->error = 0; in sdhci_uhs2_send_command()
696 if (cmd->opcode == MMC_STOP_TRANSMISSION) in sdhci_uhs2_send_command()
697 cmd->flags |= MMC_RSP_BUSY; in sdhci_uhs2_send_command()
704 host->cmd = cmd; in sdhci_uhs2_send_command()
705 host->data_timeout = 0; in sdhci_uhs2_send_command()
707 WARN_ON(host->data_cmd); in sdhci_uhs2_send_command()
708 host->data_cmd = cmd; in sdhci_uhs2_send_command()
712 if (cmd->data) in sdhci_uhs2_send_command()
718 if (host->data_timeout) in sdhci_uhs2_send_command()
719 timeout += nsecs_to_jiffies(host->data_timeout); in sdhci_uhs2_send_command()
720 else if (!cmd->data && cmd->busy_timeout > 9000) in sdhci_uhs2_send_command()
721 timeout += DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ; in sdhci_uhs2_send_command()
724 sdhci_mod_timer(host, cmd->mrq, timeout); in sdhci_uhs2_send_command()
734 __releases(host->lock) in sdhci_uhs2_send_command_retry()
735 __acquires(host->lock) in sdhci_uhs2_send_command_retry()
737 struct mmc_command *deferred_cmd = host->deferred_cmd; in sdhci_uhs2_send_command_retry()
742 if (!timeout--) { in sdhci_uhs2_send_command_retry()
744 mmc_hostname(host->mmc)); in sdhci_uhs2_send_command_retry()
746 cmd->error = -EIO; in sdhci_uhs2_send_command_retry()
750 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_send_command_retry()
754 present = host->mmc->ops->get_cd(host->mmc); in sdhci_uhs2_send_command_retry()
756 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_send_command_retry()
759 if (cmd == deferred_cmd && cmd != host->deferred_cmd) in sdhci_uhs2_send_command_retry()
766 if (cmd == host->deferred_cmd) in sdhci_uhs2_send_command_retry()
767 host->deferred_cmd = NULL; in sdhci_uhs2_send_command_retry()
774 struct mmc_command *cmd = host->cmd; in __sdhci_uhs2_finish_command()
780 if (host->mmc->uhs2_sd_tran) { in __sdhci_uhs2_finish_command()
785 mmc_hostname(host->mmc), error_code); in __sdhci_uhs2_finish_command()
790 if (cmd->uhs2_cmd->uhs2_resp_len) { in __sdhci_uhs2_finish_command()
791 int len = min_t(int, cmd->uhs2_cmd->uhs2_resp_len, UHS2_MAX_RESP_LEN); in __sdhci_uhs2_finish_command()
797 cmd->uhs2_cmd->uhs2_resp[i] = sdhci_readb(host, SDHCI_UHS2_RESPONSE + i); in __sdhci_uhs2_finish_command()
809 cmd->resp[i / 4 - 1] = in __sdhci_uhs2_finish_command()
825 struct mmc_command *cmd = host->cmd; in sdhci_uhs2_finish_command()
829 host->cmd = NULL; in sdhci_uhs2_finish_command()
831 if (cmd->mrq->cap_cmd_during_tfr && cmd == cmd->mrq->cmd) in sdhci_uhs2_finish_command()
832 mmc_command_done(host->mmc, cmd->mrq); in sdhci_uhs2_finish_command()
844 if (cmd->flags & MMC_RSP_BUSY) { in sdhci_uhs2_finish_command()
845 if (cmd->data) { in sdhci_uhs2_finish_command()
847 } else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ) && in sdhci_uhs2_finish_command()
848 cmd == host->data_cmd) { in sdhci_uhs2_finish_command()
855 if (host->data && host->data_early) in sdhci_uhs2_finish_command()
858 if (!cmd->data) in sdhci_uhs2_finish_command()
859 __sdhci_finish_mrq(host, cmd->mrq); in sdhci_uhs2_finish_command()
862 static void sdhci_uhs2_request(struct mmc_host *mmc, struct mmc_request *mrq) in sdhci_uhs2_request() argument
864 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_request()
869 if (!(mmc_card_uhs2(mmc))) { in sdhci_uhs2_request()
870 sdhci_request(mmc, mrq); in sdhci_uhs2_request()
874 mrq->stop = NULL; in sdhci_uhs2_request()
875 mrq->sbc = NULL; in sdhci_uhs2_request()
876 if (mrq->data) in sdhci_uhs2_request()
877 mrq->data->stop = NULL; in sdhci_uhs2_request()
880 present = mmc->ops->get_cd(mmc); in sdhci_uhs2_request()
882 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_request()
884 if (sdhci_present_error(host, mrq->cmd, present)) in sdhci_uhs2_request()
887 cmd = mrq->cmd; in sdhci_uhs2_request()
892 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request()
898 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request()
910 (!(host->flags & SDHCI_DEVICE_DEAD) && mrq->data && mrq->data->error); in sdhci_uhs2_needs_reset()
919 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_request_done()
922 mrq = host->mrqs_done[i]; in sdhci_uhs2_request_done()
928 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request_done()
937 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_uhs2_request_done()
948 * also be in mrqs_done, otherwise host->cmd and host->data_cmd in sdhci_uhs2_request_done()
951 if (host->cmd || host->data_cmd) { in sdhci_uhs2_request_done()
952 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request_done()
956 if (mrq->cmd->error || mrq->data->error) in sdhci_uhs2_request_done()
960 host->pending_reset = false; in sdhci_uhs2_request_done()
963 host->mrqs_done[i] = NULL; in sdhci_uhs2_request_done()
965 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request_done()
967 if (host->ops->request_done) in sdhci_uhs2_request_done()
968 host->ops->request_done(host, mrq); in sdhci_uhs2_request_done()
970 mmc_request_done(host->mmc, mrq); in sdhci_uhs2_request_done()
980 if (!mmc_card_uhs2(host->mmc)) { in sdhci_uhs2_complete_work()
997 struct mmc_command *cmd = host->cmd; in __sdhci_uhs2_irq()
1000 mmc_hostname(host->mmc), uhs2mask); in __sdhci_uhs2_irq()
1003 if (!host->cmd) { in __sdhci_uhs2_irq()
1004 pr_err("%s: Got cmd interrupt 0x%08x but no cmd.\n", in __sdhci_uhs2_irq()
1005 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1010 host->cmd->error = -EILSEQ; in __sdhci_uhs2_irq()
1012 host->cmd->error = -ETIMEDOUT; in __sdhci_uhs2_irq()
1016 if (!host->data) { in __sdhci_uhs2_irq()
1017 pr_err("%s: Got data interrupt 0x%08x but no data.\n", in __sdhci_uhs2_irq()
1018 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1026 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1028 host->data->error = -ETIMEDOUT; in __sdhci_uhs2_irq()
1031 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1033 host->data->error = -EIO; in __sdhci_uhs2_irq()
1035 host->data->error = -EILSEQ; in __sdhci_uhs2_irq()
1039 if (host->data && host->data->error) in __sdhci_uhs2_irq()
1042 sdhci_finish_mrq(host, cmd->mrq); in __sdhci_uhs2_irq()
1050 if (!mmc_card_uhs2(host->mmc)) in sdhci_uhs2_irq()
1065 /* Caller, sdhci_irq(), doesn't have to care about UHS-2 errors */ in sdhci_uhs2_irq()
1079 /* Caller, sdhci_irq(), doesn't have to care about UHS-2 commands */ in sdhci_uhs2_irq()
1084 /* Clear already-handled interrupts. */ in sdhci_uhs2_irq()
1099 if (!mmc_card_uhs2(host->mmc)) in sdhci_uhs2_thread_irq()
1105 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_thread_irq()
1107 isr = host->thread_isr; in sdhci_uhs2_thread_irq()
1108 host->thread_isr = 0; in sdhci_uhs2_thread_irq()
1110 cmd = host->deferred_cmd; in sdhci_uhs2_thread_irq()
1112 sdhci_finish_mrq(host, cmd->mrq); in sdhci_uhs2_thread_irq()
1114 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_thread_irq()
1117 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_thread_irq() local
1119 mmc->ops->card_event(mmc); in sdhci_uhs2_thread_irq()
1120 mmc_detect_change(mmc, msecs_to_jiffies(200)); in sdhci_uhs2_thread_irq()
1134 host->mmc_host_ops.uhs2_control = sdhci_uhs2_control; in sdhci_uhs2_host_ops_init()
1135 host->mmc_host_ops.request = sdhci_uhs2_request; in sdhci_uhs2_host_ops_init()
1159 struct mmc_host *mmc; in __sdhci_uhs2_add_host_v4() local
1162 mmc = host->mmc; in __sdhci_uhs2_add_host_v4()
1166 mmc->caps2 |= MMC_CAP2_SD_UHS2; in __sdhci_uhs2_add_host_v4()
1172 !IS_ERR(mmc->supply.vqmmc2)) { in __sdhci_uhs2_add_host_v4()
1173 /* UHS2 - VDD2 */ in __sdhci_uhs2_add_host_v4()
1174 int curr = regulator_get_current_limit(mmc->supply.vqmmc2); in __sdhci_uhs2_add_host_v4()
1186 mmc->caps2 &= ~MMC_CAP2_SD_UHS2; in __sdhci_uhs2_add_host_v4()
1191 if (!mmc_card_uhs2(host->mmc)) in __sdhci_uhs2_remove_host()
1200 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_add_host() local
1207 if (host->version >= SDHCI_SPEC_400) in sdhci_uhs2_add_host()
1208 __sdhci_uhs2_add_host_v4(host, host->caps1); in sdhci_uhs2_add_host()
1210 if ((mmc->caps2 & MMC_CAP2_SD_UHS2) && !host->v4_mode) in sdhci_uhs2_add_host()
1212 mmc->caps2 &= ~MMC_CAP2_SD_UHS2; in sdhci_uhs2_add_host()
1215 if (mmc->caps2 & MMC_CAP2_SD_UHS2) in sdhci_uhs2_add_host()
1218 host->complete_work_fn = sdhci_uhs2_complete_work; in sdhci_uhs2_add_host()
1219 host->thread_irq_fn = sdhci_uhs2_thread_irq; in sdhci_uhs2_add_host()
1222 host->quirks |= SDHCI_QUIRK_NO_LED; in sdhci_uhs2_add_host()
1231 if (host->version >= SDHCI_SPEC_400) in sdhci_uhs2_add_host()
1249 MODULE_DESCRIPTION("MMC UHS-II Support");