Lines Matching refs:host

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()
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
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()
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 host->ops->set_clock(host, ios->clock); in __sdhci_uhs2_set_ios()
299 host->clock = ios->clock; in __sdhci_uhs2_set_ios()
304 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_set_ios() local
317 if (host->flags & SDHCI_DEVICE_DEAD) { in sdhci_uhs2_set_ios()
332 static int sdhci_uhs2_interface_detect(struct sdhci_host *host) in sdhci_uhs2_interface_detect() argument
338 host, SDHCI_PRESENT_STATE)) { in sdhci_uhs2_interface_detect()
339 pr_debug("%s: not detect UHS2 interface in 100ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
340 sdhci_dbg_dumpregs(host, "UHS2 interface detect timeout in 100ms"); in sdhci_uhs2_interface_detect()
345 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_ALL_MASK, SDHCI_UHS2_INT_ERROR_MASK); in sdhci_uhs2_interface_detect()
348 100, UHS2_LANE_SYNC_TIMEOUT_150MS, true, host, SDHCI_PRESENT_STATE)) { in sdhci_uhs2_interface_detect()
349 pr_debug("%s: UHS2 Lane sync fail in 150ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
350 sdhci_dbg_dumpregs(host, "UHS2 Lane sync fail in 150ms"); in sdhci_uhs2_interface_detect()
355 mmc_hostname(host->mmc)); in sdhci_uhs2_interface_detect()
359 static int sdhci_uhs2_init(struct sdhci_host *host) in sdhci_uhs2_init() argument
365 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_init()
367 caps_ptr = sdhci_readw(host, SDHCI_UHS2_CAPS_PTR); in sdhci_uhs2_init()
373 caps_gen = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_OFFSET); in sdhci_uhs2_init()
374 caps_phy = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_PHY_OFFSET); in sdhci_uhs2_init()
375 caps_tran[0] = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_TRAN_OFFSET); in sdhci_uhs2_init()
376 caps_tran[1] = sdhci_readl(host, caps_ptr + SDHCI_UHS2_CAPS_TRAN_1_OFFSET); in sdhci_uhs2_init()
413 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_do_detect_init() local
417 if (host->ops->uhs2_pre_detect_init) in sdhci_uhs2_do_detect_init()
418 host->ops->uhs2_pre_detect_init(host); in sdhci_uhs2_do_detect_init()
420 if (sdhci_uhs2_interface_detect(host)) { in sdhci_uhs2_do_detect_init()
421 pr_debug("%s: cannot detect UHS2 interface.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_do_detect_init()
425 if (sdhci_uhs2_init(host)) { in sdhci_uhs2_do_detect_init()
426 pr_debug("%s: UHS2 init fail.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_do_detect_init()
431 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_SD); in sdhci_uhs2_do_detect_init()
432 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_ALL_MASK, SDHCI_UHS2_INT_ERROR_MASK); in sdhci_uhs2_do_detect_init()
437 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_uhs2_do_detect_init()
438 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_uhs2_do_detect_init()
445 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_disable_clk() local
446 u16 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_disable_clk()
449 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_disable_clk()
456 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_enable_clk() local
457 u16 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_enable_clk()
462 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_uhs2_enable_clk()
465 10, timeout_us, true, host, SDHCI_CLOCK_CONTROL)) { in sdhci_uhs2_enable_clk()
466 pr_err("%s: Internal clock never stabilised.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_enable_clk()
467 sdhci_dumpregs(host); in sdhci_uhs2_enable_clk()
473 static void sdhci_uhs2_set_config(struct sdhci_host *host) in sdhci_uhs2_set_config() argument
476 u16 sdhci_uhs2_set_ptr = sdhci_readw(host, SDHCI_UHS2_SETTINGS_PTR); in sdhci_uhs2_set_config()
483 value = FIELD_PREP(SDHCI_UHS2_GEN_SETTINGS_N_LANES_MASK, host->mmc->uhs2_caps.n_lanes_set); in sdhci_uhs2_set_config()
484 sdhci_writel(host, value, sdhci_uhs2_gen_set_reg); in sdhci_uhs2_set_config()
487 value = FIELD_PREP(SDHCI_UHS2_PHY_N_LSS_DIR_MASK, host->mmc->uhs2_caps.n_lss_dir_set) | in sdhci_uhs2_set_config()
488 FIELD_PREP(SDHCI_UHS2_PHY_N_LSS_SYN_MASK, host->mmc->uhs2_caps.n_lss_sync_set); in sdhci_uhs2_set_config()
489 if (host->mmc->ios.timing == MMC_TIMING_UHS2_SPEED_B || in sdhci_uhs2_set_config()
490 host->mmc->ios.timing == MMC_TIMING_UHS2_SPEED_B_HD) in sdhci_uhs2_set_config()
492 sdhci_writel(host, value, sdhci_uhs2_phy_set_reg); in sdhci_uhs2_set_config()
495 value = FIELD_PREP(SDHCI_UHS2_TRAN_RETRY_CNT_MASK, host->mmc->uhs2_caps.max_retry_set) | in sdhci_uhs2_set_config()
496 FIELD_PREP(SDHCI_UHS2_TRAN_N_FCU_MASK, host->mmc->uhs2_caps.n_fcu_set); in sdhci_uhs2_set_config()
497 sdhci_writel(host, value, sdhci_uhs2_tran_set_reg); in sdhci_uhs2_set_config()
498 sdhci_writel(host, host->mmc->uhs2_caps.n_data_gap_set, sdhci_uhs2_tran_set_1_reg); in sdhci_uhs2_set_config()
501 static int sdhci_uhs2_check_dormant(struct sdhci_host *host) in sdhci_uhs2_check_dormant() argument
506 100, UHS2_CHECK_DORMANT_TIMEOUT_100MS, true, host, in sdhci_uhs2_check_dormant()
508 pr_debug("%s: UHS2 IN_DORMANT fail in 100ms.\n", mmc_hostname(host->mmc)); in sdhci_uhs2_check_dormant()
509 sdhci_dbg_dumpregs(host, "UHS2 IN_DORMANT fail in 100ms"); in sdhci_uhs2_check_dormant()
517 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_control() local
528 sdhci_uhs2_set_config(host); in sdhci_uhs2_control()
531 sdhci_uhs2_clear_set_irqs(host, 0, SDHCI_INT_CARD_INT); in sdhci_uhs2_control()
534 sdhci_uhs2_clear_set_irqs(host, SDHCI_INT_CARD_INT, 0); in sdhci_uhs2_control()
537 err = sdhci_uhs2_check_dormant(host); in sdhci_uhs2_control()
550 mmc_hostname(host->mmc), op); in sdhci_uhs2_control()
564 static void sdhci_uhs2_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_prepare_data() argument
568 sdhci_initialize_data(host, data); in sdhci_uhs2_prepare_data()
570 sdhci_prepare_dma(host, data); in sdhci_uhs2_prepare_data()
572 sdhci_writew(host, data->blksz, SDHCI_UHS2_BLOCK_SIZE); in sdhci_uhs2_prepare_data()
573 sdhci_writew(host, data->blocks, SDHCI_UHS2_BLOCK_COUNT); in sdhci_uhs2_prepare_data()
576 static void sdhci_uhs2_finish_data(struct sdhci_host *host) in sdhci_uhs2_finish_data() argument
578 struct mmc_data *data = host->data; in sdhci_uhs2_finish_data()
580 __sdhci_finish_data_common(host, true); in sdhci_uhs2_finish_data()
582 __sdhci_finish_mrq(host, data->mrq); in sdhci_uhs2_finish_data()
585 static void sdhci_uhs2_set_transfer_mode(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_set_transfer_mode() argument
595 mode = sdhci_readw(host, SDHCI_UHS2_TRANS_MODE); in sdhci_uhs2_set_transfer_mode()
606 sdhci_writew(host, mode, SDHCI_UHS2_TRANS_MODE); in sdhci_uhs2_set_transfer_mode()
610 WARN_ON(!host->data); in sdhci_uhs2_set_transfer_mode()
624 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_uhs2_set_transfer_mode()
630 sdhci_writew(host, mode, SDHCI_UHS2_TRANS_MODE); in sdhci_uhs2_set_transfer_mode()
635 static void __sdhci_uhs2_send_command(struct sdhci_host *host, struct mmc_command *cmd) in __sdhci_uhs2_send_command() argument
641 sdhci_writel(host, in __sdhci_uhs2_send_command()
653 sdhci_writel(host, *(__force u32 *)(cmd->uhs2_cmd->payload + j), in __sdhci_uhs2_send_command()
659 sdhci_writel(host, 0, SDHCI_UHS2_CMD_PACKET + i); in __sdhci_uhs2_send_command()
664 sdhci_readb(host, SDHCI_UHS2_CMD_PACKET + i)); in __sdhci_uhs2_send_command()
684 sdhci_writew(host, cmd_reg, SDHCI_UHS2_CMD); in __sdhci_uhs2_send_command()
687 static bool sdhci_uhs2_send_command(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_uhs2_send_command() argument
692 WARN_ON(host->cmd); in sdhci_uhs2_send_command()
702 if (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) in sdhci_uhs2_send_command()
705 host->cmd = cmd; in sdhci_uhs2_send_command()
706 host->data_timeout = 0; in sdhci_uhs2_send_command()
708 WARN_ON(host->data_cmd); in sdhci_uhs2_send_command()
709 host->data_cmd = cmd; in sdhci_uhs2_send_command()
710 __sdhci_uhs2_set_timeout(host); in sdhci_uhs2_send_command()
714 sdhci_uhs2_prepare_data(host, cmd); in sdhci_uhs2_send_command()
716 sdhci_uhs2_set_transfer_mode(host, cmd); in sdhci_uhs2_send_command()
719 if (host->data_timeout) in sdhci_uhs2_send_command()
720 timeout += nsecs_to_jiffies(host->data_timeout); in sdhci_uhs2_send_command()
725 sdhci_mod_timer(host, cmd->mrq, timeout); in sdhci_uhs2_send_command()
727 __sdhci_uhs2_send_command(host, cmd); in sdhci_uhs2_send_command()
732 static bool sdhci_uhs2_send_command_retry(struct sdhci_host *host, in sdhci_uhs2_send_command_retry() argument
735 __releases(host->lock) in sdhci_uhs2_send_command_retry()
736 __acquires(host->lock) in sdhci_uhs2_send_command_retry()
738 struct mmc_command *deferred_cmd = host->deferred_cmd; in sdhci_uhs2_send_command_retry()
742 while (!sdhci_uhs2_send_command(host, cmd)) { in sdhci_uhs2_send_command_retry()
745 mmc_hostname(host->mmc)); in sdhci_uhs2_send_command_retry()
746 sdhci_dumpregs(host); in sdhci_uhs2_send_command_retry()
751 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_send_command_retry()
755 present = host->mmc->ops->get_cd(host->mmc); in sdhci_uhs2_send_command_retry()
757 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_send_command_retry()
760 if (cmd == deferred_cmd && cmd != host->deferred_cmd) in sdhci_uhs2_send_command_retry()
763 if (sdhci_present_error(host, cmd, present)) in sdhci_uhs2_send_command_retry()
767 if (cmd == host->deferred_cmd) in sdhci_uhs2_send_command_retry()
768 host->deferred_cmd = NULL; in sdhci_uhs2_send_command_retry()
773 static void __sdhci_uhs2_finish_command(struct sdhci_host *host) in __sdhci_uhs2_finish_command() argument
775 struct mmc_command *cmd = host->cmd; in __sdhci_uhs2_finish_command()
781 if (host->mmc->uhs2_sd_tran) { in __sdhci_uhs2_finish_command()
782 resp = sdhci_readb(host, SDHCI_UHS2_RESPONSE + 2); in __sdhci_uhs2_finish_command()
786 mmc_hostname(host->mmc), error_code); in __sdhci_uhs2_finish_command()
798 cmd->uhs2_cmd->uhs2_resp[i] = sdhci_readb(host, SDHCI_UHS2_RESPONSE + i); in __sdhci_uhs2_finish_command()
808 sdhci_readl(host, SDHCI_UHS2_RESPONSE); in __sdhci_uhs2_finish_command()
811 (sdhci_readb(host, in __sdhci_uhs2_finish_command()
813 (sdhci_readb(host, in __sdhci_uhs2_finish_command()
816 (sdhci_readb(host, in __sdhci_uhs2_finish_command()
819 sdhci_readb(host, SDHCI_UHS2_RESPONSE + i + 3); in __sdhci_uhs2_finish_command()
824 static void sdhci_uhs2_finish_command(struct sdhci_host *host) in sdhci_uhs2_finish_command() argument
826 struct mmc_command *cmd = host->cmd; in sdhci_uhs2_finish_command()
828 __sdhci_uhs2_finish_command(host); in sdhci_uhs2_finish_command()
830 host->cmd = NULL; in sdhci_uhs2_finish_command()
833 mmc_command_done(host->mmc, cmd->mrq); in sdhci_uhs2_finish_command()
848 } else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ) && in sdhci_uhs2_finish_command()
849 cmd == host->data_cmd) { in sdhci_uhs2_finish_command()
856 if (host->data && host->data_early) in sdhci_uhs2_finish_command()
857 sdhci_uhs2_finish_data(host); in sdhci_uhs2_finish_command()
860 __sdhci_finish_mrq(host, cmd->mrq); in sdhci_uhs2_finish_command()
865 struct sdhci_host *host = mmc_priv(mmc); in sdhci_uhs2_request() local
883 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_request()
885 if (sdhci_present_error(host, mrq->cmd, present)) in sdhci_uhs2_request()
890 if (!sdhci_uhs2_send_command_retry(host, cmd, flags)) in sdhci_uhs2_request()
893 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request()
898 sdhci_finish_mrq(host, mrq); in sdhci_uhs2_request()
899 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request()
908 static bool sdhci_uhs2_needs_reset(struct sdhci_host *host, struct mmc_request *mrq) in sdhci_uhs2_needs_reset() argument
910 return sdhci_needs_reset(host, mrq) || in sdhci_uhs2_needs_reset()
911 (!(host->flags & SDHCI_DEVICE_DEAD) && mrq->data && mrq->data->error); in sdhci_uhs2_needs_reset()
914 static bool sdhci_uhs2_request_done(struct sdhci_host *host) in sdhci_uhs2_request_done() argument
920 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_request_done()
923 mrq = host->mrqs_done[i]; in sdhci_uhs2_request_done()
929 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request_done()
938 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_uhs2_request_done()
939 sdhci_request_done_dma(host, mrq); in sdhci_uhs2_request_done()
945 if (sdhci_uhs2_needs_reset(host, mrq)) { in sdhci_uhs2_request_done()
952 if (host->cmd || host->data_cmd) { in sdhci_uhs2_request_done()
953 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request_done()
958 sdhci_uhs2_reset_cmd_data(host); in sdhci_uhs2_request_done()
960 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_SD); in sdhci_uhs2_request_done()
961 host->pending_reset = false; in sdhci_uhs2_request_done()
964 host->mrqs_done[i] = NULL; in sdhci_uhs2_request_done()
966 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_request_done()
968 if (host->ops->request_done) in sdhci_uhs2_request_done()
969 host->ops->request_done(host, mrq); in sdhci_uhs2_request_done()
971 mmc_request_done(host->mmc, mrq); in sdhci_uhs2_request_done()
978 struct sdhci_host *host = container_of(work, struct sdhci_host, in sdhci_uhs2_complete_work() local
981 if (!mmc_card_uhs2(host->mmc)) { in sdhci_uhs2_complete_work()
986 while (!sdhci_uhs2_request_done(host)) in sdhci_uhs2_complete_work()
996 static void __sdhci_uhs2_irq(struct sdhci_host *host, u32 uhs2mask) in __sdhci_uhs2_irq() argument
998 struct mmc_command *cmd = host->cmd; in __sdhci_uhs2_irq()
1001 mmc_hostname(host->mmc), uhs2mask); in __sdhci_uhs2_irq()
1004 if (!host->cmd) { in __sdhci_uhs2_irq()
1006 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1008 sdhci_dumpregs(host); in __sdhci_uhs2_irq()
1011 host->cmd->error = -EILSEQ; in __sdhci_uhs2_irq()
1013 host->cmd->error = -ETIMEDOUT; in __sdhci_uhs2_irq()
1017 if (!host->data) { in __sdhci_uhs2_irq()
1019 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1021 sdhci_dumpregs(host); in __sdhci_uhs2_irq()
1027 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1029 host->data->error = -ETIMEDOUT; in __sdhci_uhs2_irq()
1032 mmc_hostname(host->mmc), in __sdhci_uhs2_irq()
1033 sdhci_readb(host, SDHCI_ADMA_ERROR)); in __sdhci_uhs2_irq()
1034 host->data->error = -EIO; in __sdhci_uhs2_irq()
1036 host->data->error = -EILSEQ; in __sdhci_uhs2_irq()
1040 if (host->data && host->data->error) in __sdhci_uhs2_irq()
1041 sdhci_uhs2_finish_data(host); in __sdhci_uhs2_irq()
1043 sdhci_finish_mrq(host, cmd->mrq); in __sdhci_uhs2_irq()
1047 u32 sdhci_uhs2_irq(struct sdhci_host *host, u32 intmask) in sdhci_uhs2_irq() argument
1051 if (!mmc_card_uhs2(host->mmc)) in sdhci_uhs2_irq()
1055 uhs2mask = sdhci_readl(host, SDHCI_UHS2_INT_STATUS); in sdhci_uhs2_irq()
1060 sdhci_writel(host, uhs2mask & SDHCI_UHS2_INT_ERROR_MASK, in sdhci_uhs2_irq()
1064 __sdhci_uhs2_irq(host, uhs2mask); in sdhci_uhs2_irq()
1074 sdhci_writel(host, intmask & SDHCI_INT_CMD_MASK, SDHCI_INT_STATUS); in sdhci_uhs2_irq()
1078 sdhci_uhs2_finish_command(host); in sdhci_uhs2_irq()
1086 sdhci_writel(host, mask, SDHCI_INT_STATUS); in sdhci_uhs2_irq()
1095 struct sdhci_host *host = dev_id; in sdhci_uhs2_thread_irq() local
1100 if (!mmc_card_uhs2(host->mmc)) in sdhci_uhs2_thread_irq()
1103 while (!sdhci_uhs2_request_done(host)) in sdhci_uhs2_thread_irq()
1106 spin_lock_irqsave(&host->lock, flags); in sdhci_uhs2_thread_irq()
1108 isr = host->thread_isr; in sdhci_uhs2_thread_irq()
1109 host->thread_isr = 0; in sdhci_uhs2_thread_irq()
1111 cmd = host->deferred_cmd; in sdhci_uhs2_thread_irq()
1112 if (cmd && !sdhci_uhs2_send_command_retry(host, cmd, flags)) in sdhci_uhs2_thread_irq()
1113 sdhci_finish_mrq(host, cmd->mrq); in sdhci_uhs2_thread_irq()
1115 spin_unlock_irqrestore(&host->lock, flags); in sdhci_uhs2_thread_irq()
1118 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_thread_irq()
1133 static int sdhci_uhs2_host_ops_init(struct sdhci_host *host) in sdhci_uhs2_host_ops_init() argument
1135 host->mmc_host_ops.uhs2_control = sdhci_uhs2_control; in sdhci_uhs2_host_ops_init()
1136 host->mmc_host_ops.request = sdhci_uhs2_request; in sdhci_uhs2_host_ops_init()
1158 static void __sdhci_uhs2_add_host_v4(struct sdhci_host *host, u32 caps1) in __sdhci_uhs2_add_host_v4() argument
1163 mmc = host->mmc; in __sdhci_uhs2_add_host_v4()
1169 max_current_caps2 = sdhci_readl(host, SDHCI_MAX_CURRENT_1); in __sdhci_uhs2_add_host_v4()
1190 static void __sdhci_uhs2_remove_host(struct sdhci_host *host, int dead) in __sdhci_uhs2_remove_host() argument
1192 if (!mmc_card_uhs2(host->mmc)) in __sdhci_uhs2_remove_host()
1196 sdhci_uhs2_reset(host, SDHCI_UHS2_SW_RESET_FULL); in __sdhci_uhs2_remove_host()
1199 int sdhci_uhs2_add_host(struct sdhci_host *host) in sdhci_uhs2_add_host() argument
1201 struct mmc_host *mmc = host->mmc; in sdhci_uhs2_add_host()
1204 ret = sdhci_setup_host(host); in sdhci_uhs2_add_host()
1208 if (host->version >= SDHCI_SPEC_400) in sdhci_uhs2_add_host()
1209 __sdhci_uhs2_add_host_v4(host, host->caps1); in sdhci_uhs2_add_host()
1211 if ((mmc->caps2 & MMC_CAP2_SD_UHS2) && !host->v4_mode) in sdhci_uhs2_add_host()
1217 sdhci_uhs2_host_ops_init(host); in sdhci_uhs2_add_host()
1219 host->complete_work_fn = sdhci_uhs2_complete_work; in sdhci_uhs2_add_host()
1220 host->thread_irq_fn = sdhci_uhs2_thread_irq; in sdhci_uhs2_add_host()
1223 host->quirks |= SDHCI_QUIRK_NO_LED; in sdhci_uhs2_add_host()
1225 ret = __sdhci_add_host(host); in sdhci_uhs2_add_host()
1232 if (host->version >= SDHCI_SPEC_400) in sdhci_uhs2_add_host()
1233 __sdhci_uhs2_remove_host(host, 0); in sdhci_uhs2_add_host()
1235 sdhci_cleanup_host(host); in sdhci_uhs2_add_host()
1241 void sdhci_uhs2_remove_host(struct sdhci_host *host, int dead) in sdhci_uhs2_remove_host() argument
1243 __sdhci_uhs2_remove_host(host, dead); in sdhci_uhs2_remove_host()
1245 sdhci_remove_host(host, dead); in sdhci_uhs2_remove_host()