Lines Matching full:host

3  *  linux/drivers/mmc/host/sdhci_uhs2.c - Secure Digital Host Controller
19 #include <linux/mmc/host.h>
28 pr_err("%s: " DRIVER_NAME ": " f, mmc_hostname(host->mmc), ## x)
37 void sdhci_uhs2_dump_regs(struct sdhci_host *host) in sdhci_uhs2_dump_regs() argument
39 if (!(mmc_card_uhs2(host->mmc))) in sdhci_uhs2_dump_regs()
44 sdhci_readw(host, SDHCI_UHS2_BLOCK_SIZE), in sdhci_uhs2_dump_regs()
45 sdhci_readl(host, SDHCI_UHS2_BLOCK_COUNT)); in sdhci_uhs2_dump_regs()
47 sdhci_readw(host, SDHCI_UHS2_CMD), in sdhci_uhs2_dump_regs()
48 sdhci_readw(host, SDHCI_UHS2_TRANS_MODE)); in sdhci_uhs2_dump_regs()
50 sdhci_readw(host, SDHCI_UHS2_DEV_INT_STATUS), in sdhci_uhs2_dump_regs()
51 sdhci_readb(host, SDHCI_UHS2_DEV_SELECT)); in sdhci_uhs2_dump_regs()
53 sdhci_readb(host, SDHCI_UHS2_DEV_INT_CODE)); in sdhci_uhs2_dump_regs()
55 sdhci_readw(host, SDHCI_UHS2_SW_RESET), in sdhci_uhs2_dump_regs()
56 sdhci_readw(host, SDHCI_UHS2_TIMER_CTRL)); in sdhci_uhs2_dump_regs()
58 sdhci_readl(host, SDHCI_UHS2_INT_STATUS), in sdhci_uhs2_dump_regs()
59 sdhci_readl(host, SDHCI_UHS2_INT_STATUS_ENABLE)); in sdhci_uhs2_dump_regs()
61 sdhci_readl(host, SDHCI_UHS2_INT_SIGNAL_ENABLE)); in sdhci_uhs2_dump_regs()
85 * @host: SDHCI host
90 void sdhci_uhs2_reset(struct sdhci_host *host, u16 mask) in sdhci_uhs2_reset() argument
94 sdhci_writew(host, mask, SDHCI_UHS2_SW_RESET); in sdhci_uhs2_reset()
97 host->clock = 0; in sdhci_uhs2_reset()
101 UHS2_RESET_TIMEOUT_100MS, true, host, SDHCI_UHS2_SW_RESET)) { in sdhci_uhs2_reset()
103 mmc_hostname(host->mmc), (int)mask, mmc_hostname(host->mmc)); in sdhci_uhs2_reset()
104 sdhci_writeb(host, 0, SDHCI_UHS2_SW_RESET); in sdhci_uhs2_reset()
110 static void sdhci_uhs2_reset_cmd_data(struct sdhci_host *host) in sdhci_uhs2_reset_cmd_data() argument
112 sdhci_do_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA); in sdhci_uhs2_reset_cmd_data()
114 if (host->mmc->uhs2_sd_tran) { in sdhci_uhs2_reset_cmd_data()
115 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_SD); 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()
119 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_ALL_MASK, SDHCI_UHS2_INT_ERROR_MASK); in sdhci_uhs2_reset_cmd_data()
123 void sdhci_uhs2_set_power(struct sdhci_host *host, unsigned char mode, unsigned short vdd) in sdhci_uhs2_set_power() argument
125 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_set_power()
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()
141 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); in sdhci_uhs2_set_power()
151 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); in sdhci_uhs2_set_power()
155 sdhci_writeb(host, pwr & 0xf, SDHCI_POWER_CONTROL); in sdhci_uhs2_set_power()
159 sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); in sdhci_uhs2_set_power()
165 static u8 sdhci_calc_timeout_uhs2(struct sdhci_host *host, u8 *cmd_res, u8 *dead_lock) in sdhci_calc_timeout_uhs2() argument
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()
218 static void __sdhci_uhs2_set_timeout(struct sdhci_host *host) in __sdhci_uhs2_set_timeout() argument
222 sdhci_calc_timeout_uhs2(host, &cmd_res, &dead_lock); in __sdhci_uhs2_set_timeout()
224 sdhci_writeb(host, cmd_res, SDHCI_UHS2_TIMER_CTRL); in __sdhci_uhs2_set_timeout()
227 void sdhci_uhs2_set_timeout(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_set_timeout() argument
229 __sdhci_set_timeout(host, cmd); in sdhci_uhs2_set_timeout()
231 if (mmc_card_uhs2(host->mmc)) in sdhci_uhs2_set_timeout()
232 __sdhci_uhs2_set_timeout(host); in sdhci_uhs2_set_timeout()
238 * @host: SDHCI host
244 void sdhci_uhs2_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set) in sdhci_uhs2_clear_set_irqs() argument
248 ier = sdhci_readl(host, SDHCI_UHS2_INT_STATUS_ENABLE); in sdhci_uhs2_clear_set_irqs()
251 sdhci_writel(host, ier, SDHCI_UHS2_INT_STATUS_ENABLE); in sdhci_uhs2_clear_set_irqs()
252 sdhci_writel(host, ier, SDHCI_UHS2_INT_SIGNAL_ENABLE); in sdhci_uhs2_clear_set_irqs()
258 struct sdhci_host *host = mmc_priv(mmc); in __sdhci_uhs2_set_ios() local
263 sdhci_calc_timeout_uhs2(host, &cmd_res, &dead_lock); in __sdhci_uhs2_set_ios()
268 sdhci_uhs2_clear_set_irqs(host, in __sdhci_uhs2_set_ios()
272 sdhci_writeb(host, cmd_res, SDHCI_UHS2_TIMER_CTRL); in __sdhci_uhs2_set_ios()
273 sdhci_uhs2_clear_set_irqs(host, 0, in __sdhci_uhs2_set_ios()
278 ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); in __sdhci_uhs2_set_ios()
287 sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); 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()
291 sdhci_enable_preset_value(host, true); 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()
303 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_set_ios() local
316 if (host->flags & SDHCI_DEVICE_DEAD) { in sdhci_uhs2_set_ios()
331 static int sdhci_uhs2_interface_detect(struct sdhci_host *host) in sdhci_uhs2_interface_detect() argument
337 host, SDHCI_PRESENT_STATE)) { in sdhci_uhs2_interface_detect()
338 pr_warn("%s: not detect UHS2 interface in 100ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
339 sdhci_dumpregs(host); in sdhci_uhs2_interface_detect()
344 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_ALL_MASK, SDHCI_UHS2_INT_ERROR_MASK); in sdhci_uhs2_interface_detect()
347 100, UHS2_LANE_SYNC_TIMEOUT_150MS, true, host, SDHCI_PRESENT_STATE)) { 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()
349 sdhci_dumpregs(host); in sdhci_uhs2_interface_detect()
354 mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
358 static int sdhci_uhs2_init(struct sdhci_host *host) in sdhci_uhs2_init() argument
364 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_init()
366 caps_ptr = sdhci_readw(host, SDHCI_UHS2_CAPS_PTR); in sdhci_uhs2_init()
372 caps_gen = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_OFFSET); in sdhci_uhs2_init()
373 caps_phy = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_PHY_OFFSET); in sdhci_uhs2_init()
374 caps_tran[0] = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_TRAN_OFFSET); in sdhci_uhs2_init()
375 caps_tran[1] = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_TRAN_1_OFFSET); in sdhci_uhs2_init()
412 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_do_detect_init() local
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()
419 if (sdhci_uhs2_interface_detect(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()
424 if (sdhci_uhs2_init(host)) { in sdhci_uhs2_do_detect_init()
425 pr_warn("%s: UHS2 init fail.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_do_detect_init()
430 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_SD); in sdhci_uhs2_do_detect_init()
431 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_ALL_MASK, SDHCI_UHS2_INT_ERROR_MASK); 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()
444 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_disable_clk() local
445 u16 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_disable_clk()
448 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_disable_clk()
455 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_enable_clk() local
456 u16 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_enable_clk()
461 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_enable_clk()
464 10, timeout_us, true, host, SDHCI_CLOCK_CONTROL)) { in sdhci_uhs2_enable_clk()
465 pr_err("%s: Internal clock never stabilised.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_enable_clk()
466 sdhci_dumpregs(host); in sdhci_uhs2_enable_clk()
472 static void sdhci_uhs2_set_config(struct sdhci_host *host) in sdhci_uhs2_set_config() argument
475 u16 sdhci_uhs2_set_ptr = sdhci_readw(host, SDHCI_UHS2_SETTINGS_PTR); in sdhci_uhs2_set_config()
482 value = FIELD_PREP(SDHCI_UHS2_GEN_SETTINGS_N_LANES_MASK, host->mmc->uhs2_caps.n_lanes_set); in sdhci_uhs2_set_config()
483 sdhci_writel(host, value, sdhci_uhs2_gen_set_reg); 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()
491 sdhci_writel(host, value, sdhci_uhs2_phy_set_reg); 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()
496 sdhci_writel(host, value, sdhci_uhs2_tran_set_reg); 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()
500 static int sdhci_uhs2_check_dormant(struct sdhci_host *host) in sdhci_uhs2_check_dormant() argument
505 100, UHS2_CHECK_DORMANT_TIMEOUT_100MS, true, host, in sdhci_uhs2_check_dormant()
507 pr_warn("%s: UHS2 IN_DORMANT fail in 100ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_check_dormant()
508 sdhci_dumpregs(host); in sdhci_uhs2_check_dormant()
516 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_control() local
527 sdhci_uhs2_set_config(host); in sdhci_uhs2_control()
530 sdhci_uhs2_clear_set_irqs(host, 0, SDHCI_INT_CARD_INT); in sdhci_uhs2_control()
533 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_CARD_INT, 0); in sdhci_uhs2_control()
536 err = sdhci_uhs2_check_dormant(host); in sdhci_uhs2_control()
549 mmc_hostname(host->mmc), op); in sdhci_uhs2_control()
563 static void sdhci_uhs2_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_prepare_data() argument
567 sdhci_initialize_data(host, data); in sdhci_uhs2_prepare_data()
569 sdhci_prepare_dma(host, 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()
575 static void sdhci_uhs2_finish_data(struct sdhci_host *host) in sdhci_uhs2_finish_data() argument
577 struct mmc_data *data = host->data; in sdhci_uhs2_finish_data()
579 __sdhci_finish_data_common(host, true); in sdhci_uhs2_finish_data()
581 __sdhci_finish_mrq(host, data->mrq); in sdhci_uhs2_finish_data()
584 static void sdhci_uhs2_set_transfer_mode(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_set_transfer_mode() argument
594 mode = sdhci_readw(host, SDHCI_UHS2_TRANS_MODE); in sdhci_uhs2_set_transfer_mode()
605 sdhci_writew(host, mode, SDHCI_UHS2_TRANS_MODE); in sdhci_uhs2_set_transfer_mode()
609 WARN_ON(!host->data); in sdhci_uhs2_set_transfer_mode()
623 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_uhs2_set_transfer_mode()
629 sdhci_writew(host, mode, SDHCI_UHS2_TRANS_MODE); in sdhci_uhs2_set_transfer_mode()
634 static void __sdhci_uhs2_send_command(struct sdhci_host *host, struct mmc_command *cmd) in __sdhci_uhs2_send_command() argument
640 sdhci_writel(host, in __sdhci_uhs2_send_command()
652 sdhci_writel(host, *(__force u32 *)(cmd->uhs2_cmd->payload + j), in __sdhci_uhs2_send_command()
658 sdhci_writel(host, 0, SDHCI_UHS2_CMD_PACKET + i); in __sdhci_uhs2_send_command()
663 sdhci_readb(host, SDHCI_UHS2_CMD_PACKET + i)); in __sdhci_uhs2_send_command()
683 sdhci_writew(host, cmd_reg, SDHCI_UHS2_CMD); in __sdhci_uhs2_send_command()
686 static bool sdhci_uhs2_send_command(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_send_command() argument
691 WARN_ON(host->cmd); in sdhci_uhs2_send_command()
701 if (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) 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()
709 __sdhci_uhs2_set_timeout(host); in sdhci_uhs2_send_command()
713 sdhci_uhs2_prepare_data(host, cmd); in sdhci_uhs2_send_command()
715 sdhci_uhs2_set_transfer_mode(host, cmd); 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()
724 sdhci_mod_timer(host, cmd->mrq, timeout); in sdhci_uhs2_send_command()
726 __sdhci_uhs2_send_command(host, cmd); in sdhci_uhs2_send_command()
731 static bool sdhci_uhs2_send_command_retry(struct sdhci_host *host, in sdhci_uhs2_send_command_retry() argument
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()
741 while (!sdhci_uhs2_send_command(host, cmd)) { in sdhci_uhs2_send_command_retry()
744 mmc_hostname(host->mmc)); in sdhci_uhs2_send_command_retry()
745 sdhci_dumpregs(host); 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()
762 if (sdhci_present_error(host, cmd, present)) 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()
772 static void __sdhci_uhs2_finish_command(struct sdhci_host *host) in __sdhci_uhs2_finish_command() argument
774 struct mmc_command *cmd = host->cmd; in __sdhci_uhs2_finish_command()
780 if (host->mmc->uhs2_sd_tran) { in __sdhci_uhs2_finish_command()
781 resp = sdhci_readb(host, SDHCI_UHS2_RESPONSE + 2); in __sdhci_uhs2_finish_command()
785 mmc_hostname(host->mmc), error_code); in __sdhci_uhs2_finish_command()
797 cmd->uhs2_cmd->uhs2_resp[i] = sdhci_readb(host, SDHCI_UHS2_RESPONSE + i); in __sdhci_uhs2_finish_command()
807 sdhci_readl(host, SDHCI_UHS2_RESPONSE); in __sdhci_uhs2_finish_command()
810 (sdhci_readb(host, in __sdhci_uhs2_finish_command()
812 (sdhci_readb(host, in __sdhci_uhs2_finish_command()
815 (sdhci_readb(host, in __sdhci_uhs2_finish_command()
818 sdhci_readb(host, SDHCI_UHS2_RESPONSE + i + 3); in __sdhci_uhs2_finish_command()
823 static void sdhci_uhs2_finish_command(struct sdhci_host *host) in sdhci_uhs2_finish_command() argument
825 struct mmc_command *cmd = host->cmd; in sdhci_uhs2_finish_command()
827 __sdhci_uhs2_finish_command(host); in sdhci_uhs2_finish_command()
829 host->cmd = NULL; in sdhci_uhs2_finish_command()
832 mmc_command_done(host->mmc, cmd->mrq); in sdhci_uhs2_finish_command()
835 * The host can send and interrupt when the busy state has 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()
856 sdhci_uhs2_finish_data(host); in sdhci_uhs2_finish_command()
859 __sdhci_finish_mrq(host, cmd->mrq); in sdhci_uhs2_finish_command()
864 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_request() local
882 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_request()
884 if (sdhci_present_error(host, mrq->cmd, present)) in sdhci_uhs2_request()
889 if (!sdhci_uhs2_send_command_retry(host, cmd, flags)) in sdhci_uhs2_request()
892 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request()
897 sdhci_finish_mrq(host, mrq); in sdhci_uhs2_request()
898 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request()
907 static bool sdhci_uhs2_needs_reset(struct sdhci_host *host, struct mmc_request *mrq) in sdhci_uhs2_needs_reset() argument
909 return sdhci_needs_reset(host, mrq) || in sdhci_uhs2_needs_reset()
910 (!(host->flags & SDHCI_DEVICE_DEAD) && mrq->data && mrq->data->error); in sdhci_uhs2_needs_reset()
913 static bool sdhci_uhs2_request_done(struct sdhci_host *host) in sdhci_uhs2_request_done() argument
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()
938 sdhci_request_done_dma(host, mrq); in sdhci_uhs2_request_done()
944 if (sdhci_uhs2_needs_reset(host, mrq)) { 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()
957 sdhci_uhs2_reset_cmd_data(host); in sdhci_uhs2_request_done()
959 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_SD); 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()
977 struct sdhci_host *host = container_of(work, struct sdhci_host, in sdhci_uhs2_complete_work() local
980 if (!mmc_card_uhs2(host->mmc)) { in sdhci_uhs2_complete_work()
985 while (!sdhci_uhs2_request_done(host)) in sdhci_uhs2_complete_work()
995 static void __sdhci_uhs2_irq(struct sdhci_host *host, u32 uhs2mask) in __sdhci_uhs2_irq() argument
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()
1005 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1007 sdhci_dumpregs(host); 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()
1018 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1020 sdhci_dumpregs(host); 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()
1032 sdhci_readb(host, SDHCI_ADMA_ERROR)); 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()
1040 sdhci_uhs2_finish_data(host); in __sdhci_uhs2_irq()
1042 sdhci_finish_mrq(host, cmd->mrq); in __sdhci_uhs2_irq()
1046 u32 sdhci_uhs2_irq(struct sdhci_host *host, u32 intmask) in sdhci_uhs2_irq() argument
1050 if (!mmc_card_uhs2(host->mmc)) in sdhci_uhs2_irq()
1054 uhs2mask = sdhci_readl(host, SDHCI_UHS2_INT_STATUS); in sdhci_uhs2_irq()
1059 sdhci_writel(host, uhs2mask & SDHCI_UHS2_INT_ERROR_MASK, in sdhci_uhs2_irq()
1063 __sdhci_uhs2_irq(host, uhs2mask); in sdhci_uhs2_irq()
1073 sdhci_writel(host, intmask & SDHCI_INT_CMD_MASK, SDHCI_INT_STATUS); in sdhci_uhs2_irq()
1077 sdhci_uhs2_finish_command(host); in sdhci_uhs2_irq()
1085 sdhci_writel(host, mask, SDHCI_INT_STATUS); in sdhci_uhs2_irq()
1094 struct sdhci_host *host = dev_id; in sdhci_uhs2_thread_irq() local
1099 if (!mmc_card_uhs2(host->mmc)) in sdhci_uhs2_thread_irq()
1102 while (!sdhci_uhs2_request_done(host)) 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()
1111 if (cmd && !sdhci_uhs2_send_command_retry(host, cmd, flags)) 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()
1132 static int sdhci_uhs2_host_ops_init(struct sdhci_host *host) in sdhci_uhs2_host_ops_init() argument
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()
1157 static void __sdhci_uhs2_add_host_v4(struct sdhci_host *host, u32 caps1) in __sdhci_uhs2_add_host_v4() argument
1162 mmc = host->mmc; in __sdhci_uhs2_add_host_v4()
1168 max_current_caps2 = sdhci_readl(host, SDHCI_MAX_CURRENT_1); in __sdhci_uhs2_add_host_v4()
1189 static void __sdhci_uhs2_remove_host(struct sdhci_host *host, int dead) in __sdhci_uhs2_remove_host() argument
1191 if (!mmc_card_uhs2(host->mmc)) in __sdhci_uhs2_remove_host()
1195 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_FULL); in __sdhci_uhs2_remove_host()
1198 int sdhci_uhs2_add_host(struct sdhci_host *host) in sdhci_uhs2_add_host() argument
1200 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_add_host()
1203 ret = sdhci_setup_host(host); in sdhci_uhs2_add_host()
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()
1211 /* host doesn't want to enable UHS2 support */ in sdhci_uhs2_add_host()
1216 sdhci_uhs2_host_ops_init(host); 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()
1224 ret = __sdhci_add_host(host); in sdhci_uhs2_add_host()
1231 if (host->version >= SDHCI_SPEC_400) in sdhci_uhs2_add_host()
1232 __sdhci_uhs2_remove_host(host, 0); in sdhci_uhs2_add_host()
1234 sdhci_cleanup_host(host); in sdhci_uhs2_add_host()
1240 void sdhci_uhs2_remove_host(struct sdhci_host *host, int dead) in sdhci_uhs2_remove_host() argument
1242 __sdhci_uhs2_remove_host(host, dead); in sdhci_uhs2_remove_host()
1244 sdhci_remove_host(host, dead); in sdhci_uhs2_remove_host()