Lines Matching refs:host
56 static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable);
57 static int sdhci_pre_dma_transfer(struct sdhci_host *host,
59 static int sdhci_do_get_cd(struct sdhci_host *host);
62 static int sdhci_runtime_pm_get(struct sdhci_host *host);
63 static int sdhci_runtime_pm_put(struct sdhci_host *host);
64 static void sdhci_runtime_pm_bus_on(struct sdhci_host *host);
65 static void sdhci_runtime_pm_bus_off(struct sdhci_host *host);
67 static inline int sdhci_runtime_pm_get(struct sdhci_host *host) in sdhci_runtime_pm_get() argument
71 static inline int sdhci_runtime_pm_put(struct sdhci_host *host) in sdhci_runtime_pm_put() argument
75 static void sdhci_runtime_pm_bus_on(struct sdhci_host *host) in sdhci_runtime_pm_bus_on() argument
78 static void sdhci_runtime_pm_bus_off(struct sdhci_host *host) in sdhci_runtime_pm_bus_off() argument
83 static void sdhci_dumpregs(struct sdhci_host *host) in sdhci_dumpregs() argument
86 mmc_hostname(host->mmc)); in sdhci_dumpregs()
89 sdhci_readl(host, SDHCI_DMA_ADDRESS), in sdhci_dumpregs()
90 sdhci_readw(host, SDHCI_HOST_VERSION)); in sdhci_dumpregs()
92 sdhci_readw(host, SDHCI_BLOCK_SIZE), in sdhci_dumpregs()
93 sdhci_readw(host, SDHCI_BLOCK_COUNT)); in sdhci_dumpregs()
95 sdhci_readl(host, SDHCI_ARGUMENT), in sdhci_dumpregs()
96 sdhci_readw(host, SDHCI_TRANSFER_MODE)); in sdhci_dumpregs()
98 sdhci_readl(host, SDHCI_PRESENT_STATE), in sdhci_dumpregs()
99 sdhci_readb(host, SDHCI_HOST_CONTROL)); in sdhci_dumpregs()
101 sdhci_readb(host, SDHCI_POWER_CONTROL), in sdhci_dumpregs()
102 sdhci_readb(host, SDHCI_BLOCK_GAP_CONTROL)); in sdhci_dumpregs()
104 sdhci_readb(host, SDHCI_WAKE_UP_CONTROL), in sdhci_dumpregs()
105 sdhci_readw(host, SDHCI_CLOCK_CONTROL)); in sdhci_dumpregs()
107 sdhci_readb(host, SDHCI_TIMEOUT_CONTROL), in sdhci_dumpregs()
108 sdhci_readl(host, SDHCI_INT_STATUS)); in sdhci_dumpregs()
110 sdhci_readl(host, SDHCI_INT_ENABLE), in sdhci_dumpregs()
111 sdhci_readl(host, SDHCI_SIGNAL_ENABLE)); in sdhci_dumpregs()
113 sdhci_readw(host, SDHCI_ACMD12_ERR), in sdhci_dumpregs()
114 sdhci_readw(host, SDHCI_SLOT_INT_STATUS)); in sdhci_dumpregs()
116 sdhci_readl(host, SDHCI_CAPABILITIES), in sdhci_dumpregs()
117 sdhci_readl(host, SDHCI_CAPABILITIES_1)); in sdhci_dumpregs()
119 sdhci_readw(host, SDHCI_COMMAND), in sdhci_dumpregs()
120 sdhci_readl(host, SDHCI_MAX_CURRENT)); in sdhci_dumpregs()
122 sdhci_readw(host, SDHCI_HOST_CONTROL2)); in sdhci_dumpregs()
124 if (host->flags & SDHCI_USE_ADMA) { in sdhci_dumpregs()
125 if (host->flags & SDHCI_USE_64_BIT_DMA) in sdhci_dumpregs()
127 readl(host->ioaddr + SDHCI_ADMA_ERROR), in sdhci_dumpregs()
128 readl(host->ioaddr + SDHCI_ADMA_ADDRESS_HI), in sdhci_dumpregs()
129 readl(host->ioaddr + SDHCI_ADMA_ADDRESS)); in sdhci_dumpregs()
132 readl(host->ioaddr + SDHCI_ADMA_ERROR), in sdhci_dumpregs()
133 readl(host->ioaddr + SDHCI_ADMA_ADDRESS)); in sdhci_dumpregs()
145 static void sdhci_set_card_detection(struct sdhci_host *host, bool enable) in sdhci_set_card_detection() argument
149 if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || in sdhci_set_card_detection()
150 (host->mmc->caps & MMC_CAP_NONREMOVABLE)) in sdhci_set_card_detection()
154 present = sdhci_readl(host, SDHCI_PRESENT_STATE) & in sdhci_set_card_detection()
157 host->ier |= present ? SDHCI_INT_CARD_REMOVE : in sdhci_set_card_detection()
160 host->ier &= ~(SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT); in sdhci_set_card_detection()
163 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_set_card_detection()
164 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_set_card_detection()
167 static void sdhci_enable_card_detection(struct sdhci_host *host) in sdhci_enable_card_detection() argument
169 sdhci_set_card_detection(host, true); in sdhci_enable_card_detection()
172 static void sdhci_disable_card_detection(struct sdhci_host *host) in sdhci_disable_card_detection() argument
174 sdhci_set_card_detection(host, false); in sdhci_disable_card_detection()
177 void sdhci_reset(struct sdhci_host *host, u8 mask) in sdhci_reset() argument
181 sdhci_writeb(host, mask, SDHCI_SOFTWARE_RESET); in sdhci_reset()
184 host->clock = 0; in sdhci_reset()
186 if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) in sdhci_reset()
187 sdhci_runtime_pm_bus_off(host); in sdhci_reset()
194 while (sdhci_readb(host, SDHCI_SOFTWARE_RESET) & mask) { in sdhci_reset()
197 mmc_hostname(host->mmc), (int)mask); in sdhci_reset()
198 sdhci_dumpregs(host); in sdhci_reset()
207 static void sdhci_do_reset(struct sdhci_host *host, u8 mask) in sdhci_do_reset() argument
209 if (host->quirks & SDHCI_QUIRK_NO_CARD_NO_RESET) { in sdhci_do_reset()
210 if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & in sdhci_do_reset()
215 host->ops->reset(host, mask); in sdhci_do_reset()
218 if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { in sdhci_do_reset()
219 if (host->ops->enable_dma) in sdhci_do_reset()
220 host->ops->enable_dma(host); in sdhci_do_reset()
224 host->preset_enabled = false; in sdhci_do_reset()
230 static void sdhci_init(struct sdhci_host *host, int soft) in sdhci_init() argument
233 sdhci_do_reset(host, SDHCI_RESET_CMD|SDHCI_RESET_DATA); in sdhci_init()
235 sdhci_do_reset(host, SDHCI_RESET_ALL); in sdhci_init()
237 host->ier = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT | in sdhci_init()
243 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_init()
244 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_init()
248 host->clock = 0; in sdhci_init()
249 sdhci_set_ios(host->mmc, &host->mmc->ios); in sdhci_init()
253 static void sdhci_reinit(struct sdhci_host *host) in sdhci_reinit() argument
255 sdhci_init(host, 0); in sdhci_reinit()
261 if (host->flags & SDHCI_USING_RETUNING_TIMER) { in sdhci_reinit()
262 host->flags &= ~SDHCI_USING_RETUNING_TIMER; in sdhci_reinit()
264 del_timer_sync(&host->tuning_timer); in sdhci_reinit()
265 host->flags &= ~SDHCI_NEEDS_RETUNING; in sdhci_reinit()
267 sdhci_enable_card_detection(host); in sdhci_reinit()
270 static void sdhci_activate_led(struct sdhci_host *host) in sdhci_activate_led() argument
274 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); in sdhci_activate_led()
276 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_activate_led()
279 static void sdhci_deactivate_led(struct sdhci_host *host) in sdhci_deactivate_led() argument
283 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); in sdhci_deactivate_led()
285 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_deactivate_led()
292 struct sdhci_host *host = container_of(led, struct sdhci_host, led); in sdhci_led_control() local
295 spin_lock_irqsave(&host->lock, flags); in sdhci_led_control()
297 if (host->runtime_suspended) in sdhci_led_control()
301 sdhci_deactivate_led(host); in sdhci_led_control()
303 sdhci_activate_led(host); in sdhci_led_control()
305 spin_unlock_irqrestore(&host->lock, flags); in sdhci_led_control()
315 static void sdhci_read_block_pio(struct sdhci_host *host) in sdhci_read_block_pio() argument
324 blksize = host->data->blksz; in sdhci_read_block_pio()
330 if (!sg_miter_next(&host->sg_miter)) in sdhci_read_block_pio()
333 len = min(host->sg_miter.length, blksize); in sdhci_read_block_pio()
336 host->sg_miter.consumed = len; in sdhci_read_block_pio()
338 buf = host->sg_miter.addr; in sdhci_read_block_pio()
342 scratch = sdhci_readl(host, SDHCI_BUFFER); in sdhci_read_block_pio()
355 sg_miter_stop(&host->sg_miter); in sdhci_read_block_pio()
360 static void sdhci_write_block_pio(struct sdhci_host *host) in sdhci_write_block_pio() argument
369 blksize = host->data->blksz; in sdhci_write_block_pio()
376 if (!sg_miter_next(&host->sg_miter)) in sdhci_write_block_pio()
379 len = min(host->sg_miter.length, blksize); in sdhci_write_block_pio()
382 host->sg_miter.consumed = len; in sdhci_write_block_pio()
384 buf = host->sg_miter.addr; in sdhci_write_block_pio()
394 sdhci_writel(host, scratch, SDHCI_BUFFER); in sdhci_write_block_pio()
401 sg_miter_stop(&host->sg_miter); in sdhci_write_block_pio()
406 static void sdhci_transfer_pio(struct sdhci_host *host) in sdhci_transfer_pio() argument
410 BUG_ON(!host->data); in sdhci_transfer_pio()
412 if (host->blocks == 0) in sdhci_transfer_pio()
415 if (host->data->flags & MMC_DATA_READ) in sdhci_transfer_pio()
425 if ((host->quirks & SDHCI_QUIRK_BROKEN_SMALL_PIO) && in sdhci_transfer_pio()
426 (host->data->blocks == 1)) in sdhci_transfer_pio()
429 while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) { in sdhci_transfer_pio()
430 if (host->quirks & SDHCI_QUIRK_PIO_NEEDS_DELAY) in sdhci_transfer_pio()
433 if (host->data->flags & MMC_DATA_READ) in sdhci_transfer_pio()
434 sdhci_read_block_pio(host); in sdhci_transfer_pio()
436 sdhci_write_block_pio(host); in sdhci_transfer_pio()
438 host->blocks--; in sdhci_transfer_pio()
439 if (host->blocks == 0) in sdhci_transfer_pio()
458 static void sdhci_adma_write_desc(struct sdhci_host *host, void *desc, in sdhci_adma_write_desc() argument
468 if (host->flags & SDHCI_USE_64_BIT_DMA) in sdhci_adma_write_desc()
480 static int sdhci_adma_table_pre(struct sdhci_host *host, in sdhci_adma_table_pre() argument
506 host->align_addr = dma_map_single(mmc_dev(host->mmc), in sdhci_adma_table_pre()
507 host->align_buffer, host->align_buffer_sz, direction); in sdhci_adma_table_pre()
508 if (dma_mapping_error(mmc_dev(host->mmc), host->align_addr)) in sdhci_adma_table_pre()
510 BUG_ON(host->align_addr & host->align_mask); in sdhci_adma_table_pre()
512 host->sg_count = sdhci_pre_dma_transfer(host, data); in sdhci_adma_table_pre()
513 if (host->sg_count < 0) in sdhci_adma_table_pre()
516 desc = host->adma_table; in sdhci_adma_table_pre()
517 align = host->align_buffer; in sdhci_adma_table_pre()
519 align_addr = host->align_addr; in sdhci_adma_table_pre()
521 for_each_sg(data->sg, sg, host->sg_count, i) { in sdhci_adma_table_pre()
532 offset = (host->align_sz - (addr & host->align_mask)) & in sdhci_adma_table_pre()
533 host->align_mask; in sdhci_adma_table_pre()
542 sdhci_adma_write_desc(host, desc, align_addr, offset, in sdhci_adma_table_pre()
547 align += host->align_sz; in sdhci_adma_table_pre()
548 align_addr += host->align_sz; in sdhci_adma_table_pre()
550 desc += host->desc_sz; in sdhci_adma_table_pre()
560 sdhci_adma_write_desc(host, desc, addr, len, in sdhci_adma_table_pre()
562 desc += host->desc_sz; in sdhci_adma_table_pre()
569 WARN_ON((desc - host->adma_table) >= host->adma_table_sz); in sdhci_adma_table_pre()
572 if (host->quirks & SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC) { in sdhci_adma_table_pre()
576 if (desc != host->adma_table) { in sdhci_adma_table_pre()
577 desc -= host->desc_sz; in sdhci_adma_table_pre()
586 sdhci_adma_write_desc(host, desc, 0, 0, ADMA2_NOP_END_VALID); in sdhci_adma_table_pre()
593 dma_sync_single_for_device(mmc_dev(host->mmc), in sdhci_adma_table_pre()
594 host->align_addr, host->align_buffer_sz, direction); in sdhci_adma_table_pre()
600 dma_unmap_single(mmc_dev(host->mmc), host->align_addr, in sdhci_adma_table_pre()
601 host->align_buffer_sz, direction); in sdhci_adma_table_pre()
606 static void sdhci_adma_table_post(struct sdhci_host *host, in sdhci_adma_table_post() argument
623 dma_unmap_single(mmc_dev(host->mmc), host->align_addr, in sdhci_adma_table_post()
624 host->align_buffer_sz, direction); in sdhci_adma_table_post()
628 for_each_sg(data->sg, sg, host->sg_count, i) in sdhci_adma_table_post()
629 if (sg_dma_address(sg) & host->align_mask) { in sdhci_adma_table_post()
635 dma_sync_sg_for_cpu(mmc_dev(host->mmc), data->sg, in sdhci_adma_table_post()
638 align = host->align_buffer; in sdhci_adma_table_post()
640 for_each_sg(data->sg, sg, host->sg_count, i) { in sdhci_adma_table_post()
641 if (sg_dma_address(sg) & host->align_mask) { in sdhci_adma_table_post()
642 size = host->align_sz - in sdhci_adma_table_post()
643 (sg_dma_address(sg) & host->align_mask); in sdhci_adma_table_post()
649 align += host->align_sz; in sdhci_adma_table_post()
655 dma_unmap_sg(mmc_dev(host->mmc), data->sg, in sdhci_adma_table_post()
661 static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_calc_timeout() argument
673 if (host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL) in sdhci_calc_timeout()
685 if (host->clock && data->timeout_clks) { in sdhci_calc_timeout()
694 if (do_div(val, host->clock)) in sdhci_calc_timeout()
711 current_timeout = (1 << 13) * 1000 / host->timeout_clk; in sdhci_calc_timeout()
721 mmc_hostname(host->mmc), count, cmd->opcode); in sdhci_calc_timeout()
728 static void sdhci_set_transfer_irqs(struct sdhci_host *host) in sdhci_set_transfer_irqs() argument
733 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_set_transfer_irqs()
734 host->ier = (host->ier & ~pio_irqs) | dma_irqs; in sdhci_set_transfer_irqs()
736 host->ier = (host->ier & ~dma_irqs) | pio_irqs; in sdhci_set_transfer_irqs()
738 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_set_transfer_irqs()
739 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_set_transfer_irqs()
742 static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_set_timeout() argument
746 if (host->ops->set_timeout) { in sdhci_set_timeout()
747 host->ops->set_timeout(host, cmd); in sdhci_set_timeout()
749 count = sdhci_calc_timeout(host, cmd); in sdhci_set_timeout()
750 sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); in sdhci_set_timeout()
754 static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_prepare_data() argument
760 WARN_ON(host->data); in sdhci_prepare_data()
763 sdhci_set_timeout(host, cmd); in sdhci_prepare_data()
770 BUG_ON(data->blksz > host->mmc->max_blk_size); in sdhci_prepare_data()
773 host->data = data; in sdhci_prepare_data()
774 host->data_early = 0; in sdhci_prepare_data()
775 host->data->bytes_xfered = 0; in sdhci_prepare_data()
777 if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) in sdhci_prepare_data()
778 host->flags |= SDHCI_REQ_USE_DMA; in sdhci_prepare_data()
784 if (host->flags & SDHCI_REQ_USE_DMA) { in sdhci_prepare_data()
789 if (host->flags & SDHCI_USE_ADMA) { in sdhci_prepare_data()
790 if (host->quirks & SDHCI_QUIRK_32BIT_ADMA_SIZE) in sdhci_prepare_data()
793 if (host->quirks & SDHCI_QUIRK_32BIT_DMA_SIZE) in sdhci_prepare_data()
803 host->flags &= ~SDHCI_REQ_USE_DMA; in sdhci_prepare_data()
814 if (host->flags & SDHCI_REQ_USE_DMA) { in sdhci_prepare_data()
819 if (host->flags & SDHCI_USE_ADMA) { in sdhci_prepare_data()
825 if (host->quirks & SDHCI_QUIRK_32BIT_ADMA_SIZE) in sdhci_prepare_data()
828 if (host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR) in sdhci_prepare_data()
837 host->flags &= ~SDHCI_REQ_USE_DMA; in sdhci_prepare_data()
844 if (host->flags & SDHCI_REQ_USE_DMA) { in sdhci_prepare_data()
845 if (host->flags & SDHCI_USE_ADMA) { in sdhci_prepare_data()
846 ret = sdhci_adma_table_pre(host, data); in sdhci_prepare_data()
853 host->flags &= ~SDHCI_REQ_USE_DMA; in sdhci_prepare_data()
855 sdhci_writel(host, host->adma_addr, in sdhci_prepare_data()
857 if (host->flags & SDHCI_USE_64_BIT_DMA) in sdhci_prepare_data()
858 sdhci_writel(host, in sdhci_prepare_data()
859 (u64)host->adma_addr >> 32, in sdhci_prepare_data()
865 sg_cnt = sdhci_pre_dma_transfer(host, data); in sdhci_prepare_data()
872 host->flags &= ~SDHCI_REQ_USE_DMA; in sdhci_prepare_data()
875 sdhci_writel(host, sg_dma_address(data->sg), in sdhci_prepare_data()
886 if (host->version >= SDHCI_SPEC_200) { in sdhci_prepare_data()
887 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); in sdhci_prepare_data()
889 if ((host->flags & SDHCI_REQ_USE_DMA) && in sdhci_prepare_data()
890 (host->flags & SDHCI_USE_ADMA)) { in sdhci_prepare_data()
891 if (host->flags & SDHCI_USE_64_BIT_DMA) in sdhci_prepare_data()
898 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_prepare_data()
901 if (!(host->flags & SDHCI_REQ_USE_DMA)) { in sdhci_prepare_data()
905 if (host->data->flags & MMC_DATA_READ) in sdhci_prepare_data()
909 sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags); in sdhci_prepare_data()
910 host->blocks = data->blocks; in sdhci_prepare_data()
913 sdhci_set_transfer_irqs(host); in sdhci_prepare_data()
916 sdhci_writew(host, SDHCI_MAKE_BLKSZ(SDHCI_DEFAULT_BOUNDARY_ARG, in sdhci_prepare_data()
918 sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT); in sdhci_prepare_data()
921 static void sdhci_set_transfer_mode(struct sdhci_host *host, in sdhci_set_transfer_mode() argument
928 if (host->quirks2 & in sdhci_set_transfer_mode()
930 sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE); in sdhci_set_transfer_mode()
933 mode = sdhci_readw(host, SDHCI_TRANSFER_MODE); in sdhci_set_transfer_mode()
934 sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 | in sdhci_set_transfer_mode()
940 WARN_ON(!host->data); in sdhci_set_transfer_mode()
942 if (!(host->quirks2 & SDHCI_QUIRK2_SUPPORT_SINGLE)) in sdhci_set_transfer_mode()
951 if (!host->mrq->sbc && (host->flags & SDHCI_AUTO_CMD12) && in sdhci_set_transfer_mode()
954 else if (host->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23)) { in sdhci_set_transfer_mode()
956 sdhci_writel(host, host->mrq->sbc->arg, SDHCI_ARGUMENT2); in sdhci_set_transfer_mode()
962 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_set_transfer_mode()
965 sdhci_writew(host, mode, SDHCI_TRANSFER_MODE); in sdhci_set_transfer_mode()
968 static void sdhci_finish_data(struct sdhci_host *host) in sdhci_finish_data() argument
972 BUG_ON(!host->data); in sdhci_finish_data()
974 data = host->data; in sdhci_finish_data()
975 host->data = NULL; in sdhci_finish_data()
977 if (host->flags & SDHCI_REQ_USE_DMA) { in sdhci_finish_data()
978 if (host->flags & SDHCI_USE_ADMA) in sdhci_finish_data()
979 sdhci_adma_table_post(host, data); in sdhci_finish_data()
982 dma_unmap_sg(mmc_dev(host->mmc), in sdhci_finish_data()
1010 !host->mrq->sbc)) { in sdhci_finish_data()
1017 sdhci_do_reset(host, SDHCI_RESET_CMD); in sdhci_finish_data()
1018 sdhci_do_reset(host, SDHCI_RESET_DATA); in sdhci_finish_data()
1021 sdhci_send_command(host, data->stop); in sdhci_finish_data()
1023 tasklet_schedule(&host->finish_tasklet); in sdhci_finish_data()
1026 void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) in sdhci_send_command() argument
1032 WARN_ON(host->cmd); in sdhci_send_command()
1043 if (host->mrq->data && (cmd == host->mrq->data->stop)) in sdhci_send_command()
1046 while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) { in sdhci_send_command()
1049 "inhibit bit(s).\n", mmc_hostname(host->mmc)); in sdhci_send_command()
1050 sdhci_dumpregs(host); in sdhci_send_command()
1052 tasklet_schedule(&host->finish_tasklet); in sdhci_send_command()
1064 mod_timer(&host->timer, timeout); in sdhci_send_command()
1066 host->cmd = cmd; in sdhci_send_command()
1067 host->busy_handle = 0; in sdhci_send_command()
1069 sdhci_prepare_data(host, cmd); in sdhci_send_command()
1071 sdhci_writel(host, cmd->arg, SDHCI_ARGUMENT); in sdhci_send_command()
1073 sdhci_set_transfer_mode(host, cmd); in sdhci_send_command()
1077 mmc_hostname(host->mmc)); in sdhci_send_command()
1079 tasklet_schedule(&host->finish_tasklet); in sdhci_send_command()
1102 sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND); in sdhci_send_command()
1106 static void sdhci_finish_command(struct sdhci_host *host) in sdhci_finish_command() argument
1110 BUG_ON(host->cmd == NULL); in sdhci_finish_command()
1112 if (host->cmd->flags & MMC_RSP_PRESENT) { in sdhci_finish_command()
1113 if (host->cmd->flags & MMC_RSP_136) { in sdhci_finish_command()
1116 host->cmd->resp[i] = sdhci_readl(host, in sdhci_finish_command()
1119 host->cmd->resp[i] |= in sdhci_finish_command()
1120 sdhci_readb(host, in sdhci_finish_command()
1124 host->cmd->resp[0] = sdhci_readl(host, SDHCI_RESPONSE); in sdhci_finish_command()
1128 host->cmd->error = 0; in sdhci_finish_command()
1131 if (host->cmd == host->mrq->sbc) { in sdhci_finish_command()
1132 host->cmd = NULL; in sdhci_finish_command()
1133 sdhci_send_command(host, host->mrq->cmd); in sdhci_finish_command()
1137 if (host->data && host->data_early) in sdhci_finish_command()
1138 sdhci_finish_data(host); in sdhci_finish_command()
1140 if (!host->cmd->data) in sdhci_finish_command()
1141 tasklet_schedule(&host->finish_tasklet); in sdhci_finish_command()
1143 host->cmd = NULL; in sdhci_finish_command()
1147 static u16 sdhci_get_preset_value(struct sdhci_host *host) in sdhci_get_preset_value() argument
1151 switch (host->timing) { in sdhci_get_preset_value()
1153 preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12); in sdhci_get_preset_value()
1156 preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR25); in sdhci_get_preset_value()
1159 preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR50); in sdhci_get_preset_value()
1163 preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR104); in sdhci_get_preset_value()
1167 preset = sdhci_readw(host, SDHCI_PRESET_FOR_DDR50); in sdhci_get_preset_value()
1170 preset = sdhci_readw(host, SDHCI_PRESET_FOR_HS400); in sdhci_get_preset_value()
1174 mmc_hostname(host->mmc)); in sdhci_get_preset_value()
1175 preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12); in sdhci_get_preset_value()
1181 void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) in sdhci_set_clock() argument
1188 host->mmc->actual_clock = 0; in sdhci_set_clock()
1190 sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); in sdhci_set_clock()
1195 if (host->version >= SDHCI_SPEC_300) { in sdhci_set_clock()
1196 if (host->preset_enabled) { in sdhci_set_clock()
1199 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_set_clock()
1200 pre_val = sdhci_get_preset_value(host); in sdhci_set_clock()
1203 if (host->clk_mul && in sdhci_set_clock()
1207 clk_mul = host->clk_mul; in sdhci_set_clock()
1218 if (host->clk_mul) { in sdhci_set_clock()
1220 if ((host->max_clk * host->clk_mul / div) in sdhci_set_clock()
1230 clk_mul = host->clk_mul; in sdhci_set_clock()
1234 if (host->max_clk <= clock) in sdhci_set_clock()
1239 if ((host->max_clk / div) <= clock) in sdhci_set_clock()
1249 if ((host->max_clk / div) <= clock) in sdhci_set_clock()
1258 host->mmc->actual_clock = (host->max_clk * clk_mul) / real_div; in sdhci_set_clock()
1263 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_set_clock()
1267 while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) in sdhci_set_clock()
1271 "stabilised.\n", mmc_hostname(host->mmc)); in sdhci_set_clock()
1272 sdhci_dumpregs(host); in sdhci_set_clock()
1280 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_set_clock()
1284 static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, in sdhci_set_power() argument
1287 struct mmc_host *mmc = host->mmc; in sdhci_set_power()
1291 spin_unlock_irq(&host->lock); in sdhci_set_power()
1293 spin_lock_irq(&host->lock); in sdhci_set_power()
1296 sdhci_writeb(host, SDHCI_POWER_ON, SDHCI_POWER_CONTROL); in sdhci_set_power()
1298 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); in sdhci_set_power()
1321 if (host->pwr == pwr) in sdhci_set_power()
1324 host->pwr = pwr; in sdhci_set_power()
1327 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); in sdhci_set_power()
1328 if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) in sdhci_set_power()
1329 sdhci_runtime_pm_bus_off(host); in sdhci_set_power()
1336 if (!(host->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE)) in sdhci_set_power()
1337 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); in sdhci_set_power()
1344 if (host->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER) in sdhci_set_power()
1345 sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); in sdhci_set_power()
1349 sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); in sdhci_set_power()
1351 if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) in sdhci_set_power()
1352 sdhci_runtime_pm_bus_on(host); in sdhci_set_power()
1358 if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER) in sdhci_set_power()
1371 struct sdhci_host *host; in sdhci_request() local
1376 host = mmc_priv(mmc); in sdhci_request()
1378 sdhci_runtime_pm_get(host); in sdhci_request()
1381 present = sdhci_do_get_cd(host); in sdhci_request()
1383 spin_lock_irqsave(&host->lock, flags); in sdhci_request()
1385 WARN_ON(host->mrq != NULL); in sdhci_request()
1388 sdhci_activate_led(host); in sdhci_request()
1395 if (!mrq->sbc && (host->flags & SDHCI_AUTO_CMD12)) { in sdhci_request()
1402 host->mrq = mrq; in sdhci_request()
1404 if (!present || host->flags & SDHCI_DEVICE_DEAD) { in sdhci_request()
1405 host->mrq->cmd->error = -ENOMEDIUM; in sdhci_request()
1406 tasklet_schedule(&host->finish_tasklet); in sdhci_request()
1410 present_state = sdhci_readl(host, SDHCI_PRESENT_STATE); in sdhci_request()
1416 if ((host->flags & SDHCI_NEEDS_RETUNING) && in sdhci_request()
1430 host->mrq = NULL; in sdhci_request()
1432 spin_unlock_irqrestore(&host->lock, flags); in sdhci_request()
1434 spin_lock_irqsave(&host->lock, flags); in sdhci_request()
1437 host->mrq = mrq; in sdhci_request()
1441 if (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23)) in sdhci_request()
1442 sdhci_send_command(host, mrq->sbc); in sdhci_request()
1444 sdhci_send_command(host, mrq->cmd); in sdhci_request()
1448 spin_unlock_irqrestore(&host->lock, flags); in sdhci_request()
1451 void sdhci_set_bus_width(struct sdhci_host *host, int width) in sdhci_set_bus_width() argument
1455 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); in sdhci_set_bus_width()
1458 if (host->version >= SDHCI_SPEC_300) in sdhci_set_bus_width()
1461 if (host->version >= SDHCI_SPEC_300) in sdhci_set_bus_width()
1468 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_set_bus_width()
1472 void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing) in sdhci_set_uhs_signaling() argument
1476 ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_set_uhs_signaling()
1493 sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); in sdhci_set_uhs_signaling()
1497 static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) in sdhci_do_set_ios() argument
1501 struct mmc_host *mmc = host->mmc; in sdhci_do_set_ios()
1503 spin_lock_irqsave(&host->lock, flags); in sdhci_do_set_ios()
1505 if (host->flags & SDHCI_DEVICE_DEAD) { in sdhci_do_set_ios()
1506 spin_unlock_irqrestore(&host->lock, flags); in sdhci_do_set_ios()
1518 sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); in sdhci_do_set_ios()
1519 sdhci_reinit(host); in sdhci_do_set_ios()
1522 if (host->version >= SDHCI_SPEC_300 && in sdhci_do_set_ios()
1524 !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN)) in sdhci_do_set_ios()
1525 sdhci_enable_preset_value(host, false); in sdhci_do_set_ios()
1527 if (!ios->clock || ios->clock != host->clock) { in sdhci_do_set_ios()
1528 host->ops->set_clock(host, ios->clock); in sdhci_do_set_ios()
1529 host->clock = ios->clock; in sdhci_do_set_ios()
1531 if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK && in sdhci_do_set_ios()
1532 host->clock) { in sdhci_do_set_ios()
1533 host->timeout_clk = host->mmc->actual_clock ? in sdhci_do_set_ios()
1534 host->mmc->actual_clock / 1000 : in sdhci_do_set_ios()
1535 host->clock / 1000; in sdhci_do_set_ios()
1536 host->mmc->max_busy_timeout = in sdhci_do_set_ios()
1537 host->ops->get_max_timeout_count ? in sdhci_do_set_ios()
1538 host->ops->get_max_timeout_count(host) : in sdhci_do_set_ios()
1540 host->mmc->max_busy_timeout /= host->timeout_clk; in sdhci_do_set_ios()
1544 sdhci_set_power(host, ios->power_mode, ios->vdd); in sdhci_do_set_ios()
1546 if (host->ops->platform_send_init_74_clocks) in sdhci_do_set_ios()
1547 host->ops->platform_send_init_74_clocks(host, ios->power_mode); in sdhci_do_set_ios()
1549 host->ops->set_bus_width(host, ios->bus_width); in sdhci_do_set_ios()
1551 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); in sdhci_do_set_ios()
1555 && !(host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)) in sdhci_do_set_ios()
1560 if (host->version >= SDHCI_SPEC_300) { in sdhci_do_set_ios()
1573 if (!host->preset_enabled) { in sdhci_do_set_ios()
1574 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_do_set_ios()
1579 ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_do_set_ios()
1586 sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); in sdhci_do_set_ios()
1596 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_do_set_ios()
1598 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_do_set_ios()
1600 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_do_set_ios()
1603 host->ops->set_clock(host, host->clock); in sdhci_do_set_ios()
1607 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); in sdhci_do_set_ios()
1609 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); in sdhci_do_set_ios()
1611 host->ops->set_uhs_signaling(host, ios->timing); in sdhci_do_set_ios()
1612 host->timing = ios->timing; in sdhci_do_set_ios()
1614 if (!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN) && in sdhci_do_set_ios()
1623 sdhci_enable_preset_value(host, true); in sdhci_do_set_ios()
1624 preset = sdhci_get_preset_value(host); in sdhci_do_set_ios()
1630 host->ops->set_clock(host, host->clock); in sdhci_do_set_ios()
1632 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); in sdhci_do_set_ios()
1639 if (host->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS) in sdhci_do_set_ios()
1640 sdhci_do_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA); in sdhci_do_set_ios()
1643 spin_unlock_irqrestore(&host->lock, flags); in sdhci_do_set_ios()
1648 struct sdhci_host *host = mmc_priv(mmc); in sdhci_set_ios() local
1650 sdhci_runtime_pm_get(host); in sdhci_set_ios()
1651 sdhci_do_set_ios(host, ios); in sdhci_set_ios()
1652 sdhci_runtime_pm_put(host); in sdhci_set_ios()
1655 static int sdhci_do_get_cd(struct sdhci_host *host) in sdhci_do_get_cd() argument
1657 int gpio_cd = mmc_gpio_get_cd(host->mmc); in sdhci_do_get_cd()
1659 if (host->flags & SDHCI_DEVICE_DEAD) in sdhci_do_get_cd()
1663 if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || in sdhci_do_get_cd()
1664 (host->mmc->caps & MMC_CAP_NONREMOVABLE)) in sdhci_do_get_cd()
1672 return !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT); in sdhci_do_get_cd()
1677 struct sdhci_host *host = mmc_priv(mmc); in sdhci_get_cd() local
1680 sdhci_runtime_pm_get(host); in sdhci_get_cd()
1681 ret = sdhci_do_get_cd(host); in sdhci_get_cd()
1682 sdhci_runtime_pm_put(host); in sdhci_get_cd()
1686 static int sdhci_check_ro(struct sdhci_host *host) in sdhci_check_ro() argument
1691 spin_lock_irqsave(&host->lock, flags); in sdhci_check_ro()
1693 if (host->flags & SDHCI_DEVICE_DEAD) in sdhci_check_ro()
1695 else if (host->ops->get_ro) in sdhci_check_ro()
1696 is_readonly = host->ops->get_ro(host); in sdhci_check_ro()
1698 is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE) in sdhci_check_ro()
1701 spin_unlock_irqrestore(&host->lock, flags); in sdhci_check_ro()
1704 return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ? in sdhci_check_ro()
1710 static int sdhci_do_get_ro(struct sdhci_host *host) in sdhci_do_get_ro() argument
1714 if (!(host->quirks & SDHCI_QUIRK_UNSTABLE_RO_DETECT)) in sdhci_do_get_ro()
1715 return sdhci_check_ro(host); in sdhci_do_get_ro()
1719 if (sdhci_check_ro(host)) { in sdhci_do_get_ro()
1730 struct sdhci_host *host = mmc_priv(mmc); in sdhci_hw_reset() local
1732 if (host->ops && host->ops->hw_reset) in sdhci_hw_reset()
1733 host->ops->hw_reset(host); in sdhci_hw_reset()
1738 struct sdhci_host *host = mmc_priv(mmc); in sdhci_get_ro() local
1741 sdhci_runtime_pm_get(host); in sdhci_get_ro()
1742 ret = sdhci_do_get_ro(host); in sdhci_get_ro()
1743 sdhci_runtime_pm_put(host); in sdhci_get_ro()
1747 static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable) in sdhci_enable_sdio_irq_nolock() argument
1749 if (!(host->flags & SDHCI_DEVICE_DEAD)) { in sdhci_enable_sdio_irq_nolock()
1751 host->ier |= SDHCI_INT_CARD_INT; in sdhci_enable_sdio_irq_nolock()
1753 host->ier &= ~SDHCI_INT_CARD_INT; in sdhci_enable_sdio_irq_nolock()
1755 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_enable_sdio_irq_nolock()
1756 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_enable_sdio_irq_nolock()
1763 struct sdhci_host *host = mmc_priv(mmc); in sdhci_enable_sdio_irq() local
1766 sdhci_runtime_pm_get(host); in sdhci_enable_sdio_irq()
1768 spin_lock_irqsave(&host->lock, flags); in sdhci_enable_sdio_irq()
1770 host->flags |= SDHCI_SDIO_IRQ_ENABLED; in sdhci_enable_sdio_irq()
1772 host->flags &= ~SDHCI_SDIO_IRQ_ENABLED; in sdhci_enable_sdio_irq()
1774 sdhci_enable_sdio_irq_nolock(host, enable); in sdhci_enable_sdio_irq()
1775 spin_unlock_irqrestore(&host->lock, flags); in sdhci_enable_sdio_irq()
1777 sdhci_runtime_pm_put(host); in sdhci_enable_sdio_irq()
1780 static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host, in sdhci_do_start_signal_voltage_switch() argument
1783 struct mmc_host *mmc = host->mmc; in sdhci_do_start_signal_voltage_switch()
1791 if (host->version < SDHCI_SPEC_300) in sdhci_do_start_signal_voltage_switch()
1794 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_do_start_signal_voltage_switch()
1800 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); in sdhci_do_start_signal_voltage_switch()
1815 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_do_start_signal_voltage_switch()
1839 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); in sdhci_do_start_signal_voltage_switch()
1842 if (host->ops->voltage_switch) in sdhci_do_start_signal_voltage_switch()
1843 host->ops->voltage_switch(host); in sdhci_do_start_signal_voltage_switch()
1846 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_do_start_signal_voltage_switch()
1874 struct sdhci_host *host = mmc_priv(mmc); in sdhci_start_signal_voltage_switch() local
1877 if (host->version < SDHCI_SPEC_300) in sdhci_start_signal_voltage_switch()
1879 sdhci_runtime_pm_get(host); in sdhci_start_signal_voltage_switch()
1880 err = sdhci_do_start_signal_voltage_switch(host, ios); in sdhci_start_signal_voltage_switch()
1881 sdhci_runtime_pm_put(host); in sdhci_start_signal_voltage_switch()
1887 struct sdhci_host *host = mmc_priv(mmc); in sdhci_card_busy() local
1890 sdhci_runtime_pm_get(host); in sdhci_card_busy()
1892 present_state = sdhci_readl(host, SDHCI_PRESENT_STATE); in sdhci_card_busy()
1893 sdhci_runtime_pm_put(host); in sdhci_card_busy()
1900 struct sdhci_host *host = mmc_priv(mmc); in sdhci_prepare_hs400_tuning() local
1903 spin_lock_irqsave(&host->lock, flags); in sdhci_prepare_hs400_tuning()
1904 host->flags |= SDHCI_HS400_TUNING; in sdhci_prepare_hs400_tuning()
1905 spin_unlock_irqrestore(&host->lock, flags); in sdhci_prepare_hs400_tuning()
1912 struct sdhci_host *host = mmc_priv(mmc); in sdhci_execute_tuning() local
1920 sdhci_runtime_pm_get(host); in sdhci_execute_tuning()
1921 spin_lock_irqsave(&host->lock, flags); in sdhci_execute_tuning()
1923 hs400_tuning = host->flags & SDHCI_HS400_TUNING; in sdhci_execute_tuning()
1924 host->flags &= ~SDHCI_HS400_TUNING; in sdhci_execute_tuning()
1926 if (host->tuning_mode == SDHCI_TUNING_MODE_1) in sdhci_execute_tuning()
1927 tuning_count = host->tuning_count; in sdhci_execute_tuning()
1936 switch (host->timing) { in sdhci_execute_tuning()
1955 if (host->flags & SDHCI_SDR50_NEEDS_TUNING || in sdhci_execute_tuning()
1956 host->flags & SDHCI_SDR104_NEEDS_TUNING) in sdhci_execute_tuning()
1964 if (host->ops->platform_execute_tuning) { in sdhci_execute_tuning()
1965 spin_unlock_irqrestore(&host->lock, flags); in sdhci_execute_tuning()
1966 err = host->ops->platform_execute_tuning(host, opcode); in sdhci_execute_tuning()
1967 sdhci_runtime_pm_put(host); in sdhci_execute_tuning()
1971 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_execute_tuning()
1973 if (host->quirks2 & SDHCI_QUIRK2_TUNING_WORK_AROUND) in sdhci_execute_tuning()
1975 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); in sdhci_execute_tuning()
1987 sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_INT_ENABLE); in sdhci_execute_tuning()
1988 sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_SIGNAL_ENABLE); in sdhci_execute_tuning()
2009 host->mrq = &mrq; in sdhci_execute_tuning()
2018 sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, 128), in sdhci_execute_tuning()
2021 sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, 64), in sdhci_execute_tuning()
2024 sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, 64), in sdhci_execute_tuning()
2034 sdhci_writew(host, SDHCI_TRNS_READ, SDHCI_TRANSFER_MODE); in sdhci_execute_tuning()
2036 sdhci_send_command(host, &cmd); in sdhci_execute_tuning()
2038 host->cmd = NULL; in sdhci_execute_tuning()
2039 host->mrq = NULL; in sdhci_execute_tuning()
2041 spin_unlock_irqrestore(&host->lock, flags); in sdhci_execute_tuning()
2043 wait_event_interruptible_timeout(host->buf_ready_int, in sdhci_execute_tuning()
2044 (host->tuning_done == 1), in sdhci_execute_tuning()
2046 spin_lock_irqsave(&host->lock, flags); in sdhci_execute_tuning()
2048 if (!host->tuning_done) { in sdhci_execute_tuning()
2053 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_execute_tuning()
2056 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); in sdhci_execute_tuning()
2062 host->tuning_done = 0; in sdhci_execute_tuning()
2064 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_execute_tuning()
2077 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); in sdhci_execute_tuning()
2087 host->flags &= ~SDHCI_NEEDS_RETUNING; in sdhci_execute_tuning()
2090 host->flags |= SDHCI_USING_RETUNING_TIMER; in sdhci_execute_tuning()
2091 mod_timer(&host->tuning_timer, jiffies + tuning_count * HZ); in sdhci_execute_tuning()
2102 if (err && (host->flags & SDHCI_USING_RETUNING_TIMER)) in sdhci_execute_tuning()
2105 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_execute_tuning()
2106 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_execute_tuning()
2108 spin_unlock_irqrestore(&host->lock, flags); in sdhci_execute_tuning()
2109 sdhci_runtime_pm_put(host); in sdhci_execute_tuning()
2115 static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable) in sdhci_enable_preset_value() argument
2118 if (host->version < SDHCI_SPEC_300) in sdhci_enable_preset_value()
2125 if (host->preset_enabled != enable) { in sdhci_enable_preset_value()
2126 u16 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); in sdhci_enable_preset_value()
2133 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); in sdhci_enable_preset_value()
2136 host->flags |= SDHCI_PV_ENABLED; in sdhci_enable_preset_value()
2138 host->flags &= ~SDHCI_PV_ENABLED; in sdhci_enable_preset_value()
2140 host->preset_enabled = enable; in sdhci_enable_preset_value()
2147 struct sdhci_host *host = mmc_priv(mmc); in sdhci_post_req() local
2150 if (host->flags & SDHCI_REQ_USE_DMA) { in sdhci_post_req()
2153 dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, in sdhci_post_req()
2160 static int sdhci_pre_dma_transfer(struct sdhci_host *host, in sdhci_pre_dma_transfer() argument
2172 sg_count = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len, in sdhci_pre_dma_transfer()
2188 struct sdhci_host *host = mmc_priv(mmc); in sdhci_pre_req() local
2192 if (host->flags & SDHCI_REQ_USE_DMA) in sdhci_pre_req()
2193 sdhci_pre_dma_transfer(host, mrq->data); in sdhci_pre_req()
2198 struct sdhci_host *host = mmc_priv(mmc); in sdhci_card_event() local
2203 if (host->ops->card_event) in sdhci_card_event()
2204 host->ops->card_event(host); in sdhci_card_event()
2206 present = sdhci_do_get_cd(host); in sdhci_card_event()
2208 spin_lock_irqsave(&host->lock, flags); in sdhci_card_event()
2211 if (host->mrq && !present) { in sdhci_card_event()
2213 mmc_hostname(host->mmc)); in sdhci_card_event()
2215 mmc_hostname(host->mmc)); in sdhci_card_event()
2217 sdhci_do_reset(host, SDHCI_RESET_CMD); in sdhci_card_event()
2218 sdhci_do_reset(host, SDHCI_RESET_DATA); in sdhci_card_event()
2220 host->mrq->cmd->error = -ENOMEDIUM; in sdhci_card_event()
2221 tasklet_schedule(&host->finish_tasklet); in sdhci_card_event()
2224 spin_unlock_irqrestore(&host->lock, flags); in sdhci_card_event()
2251 struct sdhci_host *host; in sdhci_tasklet_finish() local
2255 host = (struct sdhci_host*)param; in sdhci_tasklet_finish()
2257 spin_lock_irqsave(&host->lock, flags); in sdhci_tasklet_finish()
2263 if (!host->mrq) { in sdhci_tasklet_finish()
2264 spin_unlock_irqrestore(&host->lock, flags); in sdhci_tasklet_finish()
2268 del_timer(&host->timer); in sdhci_tasklet_finish()
2270 mrq = host->mrq; in sdhci_tasklet_finish()
2276 if (!(host->flags & SDHCI_DEVICE_DEAD) && in sdhci_tasklet_finish()
2281 (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) { in sdhci_tasklet_finish()
2284 if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) in sdhci_tasklet_finish()
2286 host->ops->set_clock(host, host->clock); in sdhci_tasklet_finish()
2290 sdhci_do_reset(host, SDHCI_RESET_CMD); in sdhci_tasklet_finish()
2291 sdhci_do_reset(host, SDHCI_RESET_DATA); in sdhci_tasklet_finish()
2294 host->mrq = NULL; in sdhci_tasklet_finish()
2295 host->cmd = NULL; in sdhci_tasklet_finish()
2296 host->data = NULL; in sdhci_tasklet_finish()
2299 sdhci_deactivate_led(host); in sdhci_tasklet_finish()
2303 spin_unlock_irqrestore(&host->lock, flags); in sdhci_tasklet_finish()
2305 mmc_request_done(host->mmc, mrq); in sdhci_tasklet_finish()
2306 sdhci_runtime_pm_put(host); in sdhci_tasklet_finish()
2311 struct sdhci_host *host; in sdhci_timeout_timer() local
2314 host = (struct sdhci_host*)data; in sdhci_timeout_timer()
2316 spin_lock_irqsave(&host->lock, flags); in sdhci_timeout_timer()
2318 if (host->mrq) { in sdhci_timeout_timer()
2320 "interrupt.\n", mmc_hostname(host->mmc)); in sdhci_timeout_timer()
2321 sdhci_dumpregs(host); in sdhci_timeout_timer()
2323 if (host->data) { in sdhci_timeout_timer()
2324 host->data->error = -ETIMEDOUT; in sdhci_timeout_timer()
2325 sdhci_finish_data(host); in sdhci_timeout_timer()
2327 if (host->cmd) in sdhci_timeout_timer()
2328 host->cmd->error = -ETIMEDOUT; in sdhci_timeout_timer()
2330 host->mrq->cmd->error = -ETIMEDOUT; in sdhci_timeout_timer()
2332 tasklet_schedule(&host->finish_tasklet); in sdhci_timeout_timer()
2337 spin_unlock_irqrestore(&host->lock, flags); in sdhci_timeout_timer()
2342 struct sdhci_host *host; in sdhci_tuning_timer() local
2345 host = (struct sdhci_host *)data; in sdhci_tuning_timer()
2347 spin_lock_irqsave(&host->lock, flags); in sdhci_tuning_timer()
2349 host->flags |= SDHCI_NEEDS_RETUNING; in sdhci_tuning_timer()
2351 spin_unlock_irqrestore(&host->lock, flags); in sdhci_tuning_timer()
2360 static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *mask) in sdhci_cmd_irq() argument
2364 if (!host->cmd) { in sdhci_cmd_irq()
2367 mmc_hostname(host->mmc), (unsigned)intmask); in sdhci_cmd_irq()
2368 sdhci_dumpregs(host); in sdhci_cmd_irq()
2373 host->cmd->error = -ETIMEDOUT; in sdhci_cmd_irq()
2376 host->cmd->error = -EILSEQ; in sdhci_cmd_irq()
2378 if (host->cmd->error) { in sdhci_cmd_irq()
2379 tasklet_schedule(&host->finish_tasklet); in sdhci_cmd_irq()
2394 if (host->cmd->flags & MMC_RSP_BUSY) { in sdhci_cmd_irq()
2395 if (host->cmd->data) in sdhci_cmd_irq()
2398 else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ) in sdhci_cmd_irq()
2399 && !host->busy_handle) { in sdhci_cmd_irq()
2401 host->busy_handle = 1; in sdhci_cmd_irq()
2407 } else if ((host->quirks2 & SDHCI_QUIRK2_STOP_WITH_TC) && in sdhci_cmd_irq()
2408 host->cmd->opcode == MMC_STOP_TRANSMISSION && !host->data) { in sdhci_cmd_irq()
2413 sdhci_finish_command(host); in sdhci_cmd_irq()
2417 static void sdhci_adma_show_error(struct sdhci_host *host) in sdhci_adma_show_error() argument
2419 const char *name = mmc_hostname(host->mmc); in sdhci_adma_show_error()
2420 void *desc = host->adma_table; in sdhci_adma_show_error()
2422 sdhci_dumpregs(host); in sdhci_adma_show_error()
2427 if (host->flags & SDHCI_USE_64_BIT_DMA) in sdhci_adma_show_error()
2439 desc += host->desc_sz; in sdhci_adma_show_error()
2446 static void sdhci_adma_show_error(struct sdhci_host *host) { } in sdhci_adma_show_error() argument
2449 static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) in sdhci_data_irq() argument
2456 command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)); in sdhci_data_irq()
2459 host->tuning_done = 1; in sdhci_data_irq()
2460 wake_up(&host->buf_ready_int); in sdhci_data_irq()
2465 if (!host->data) { in sdhci_data_irq()
2471 if (host->cmd && (host->cmd->flags & MMC_RSP_BUSY)) { in sdhci_data_irq()
2473 host->cmd->error = -ETIMEDOUT; in sdhci_data_irq()
2474 tasklet_schedule(&host->finish_tasklet); in sdhci_data_irq()
2483 if (host->busy_handle) in sdhci_data_irq()
2484 sdhci_finish_command(host); in sdhci_data_irq()
2486 host->busy_handle = 1; in sdhci_data_irq()
2493 mmc_hostname(host->mmc), (unsigned)intmask); in sdhci_data_irq()
2494 sdhci_dumpregs(host); in sdhci_data_irq()
2500 host->data->error = -ETIMEDOUT; in sdhci_data_irq()
2502 host->data->error = -EILSEQ; in sdhci_data_irq()
2504 SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)) in sdhci_data_irq()
2506 host->data->error = -EILSEQ; in sdhci_data_irq()
2508 pr_err("%s: ADMA error\n", mmc_hostname(host->mmc)); in sdhci_data_irq()
2509 sdhci_adma_show_error(host); in sdhci_data_irq()
2510 host->data->error = -EIO; in sdhci_data_irq()
2511 if (host->ops->adma_workaround) in sdhci_data_irq()
2512 host->ops->adma_workaround(host, intmask); in sdhci_data_irq()
2515 if (host->data->error) in sdhci_data_irq()
2516 sdhci_finish_data(host); in sdhci_data_irq()
2519 sdhci_transfer_pio(host); in sdhci_data_irq()
2532 dmastart = sg_dma_address(host->data->sg); in sdhci_data_irq()
2533 dmanow = dmastart + host->data->bytes_xfered; in sdhci_data_irq()
2540 host->data->bytes_xfered = dmanow - dmastart; in sdhci_data_irq()
2543 mmc_hostname(host->mmc), dmastart, in sdhci_data_irq()
2544 host->data->bytes_xfered, dmanow); in sdhci_data_irq()
2545 sdhci_writel(host, dmanow, SDHCI_DMA_ADDRESS); in sdhci_data_irq()
2549 if (host->cmd) { in sdhci_data_irq()
2555 host->data_early = 1; in sdhci_data_irq()
2557 sdhci_finish_data(host); in sdhci_data_irq()
2566 struct sdhci_host *host = dev_id; in sdhci_irq() local
2570 spin_lock(&host->lock); in sdhci_irq()
2572 if (host->runtime_suspended && !sdhci_sdio_irq_enabled(host)) { in sdhci_irq()
2573 spin_unlock(&host->lock); in sdhci_irq()
2577 intmask = sdhci_readl(host, SDHCI_INT_STATUS); in sdhci_irq()
2587 sdhci_writel(host, mask, SDHCI_INT_STATUS); in sdhci_irq()
2590 mmc_hostname(host->mmc), intmask); in sdhci_irq()
2593 u32 present = sdhci_readl(host, SDHCI_PRESENT_STATE) & in sdhci_irq()
2607 host->ier &= ~(SDHCI_INT_CARD_INSERT | in sdhci_irq()
2609 host->ier |= present ? SDHCI_INT_CARD_REMOVE : in sdhci_irq()
2611 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_irq()
2612 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_irq()
2614 sdhci_writel(host, intmask & (SDHCI_INT_CARD_INSERT | in sdhci_irq()
2617 host->thread_isr |= intmask & (SDHCI_INT_CARD_INSERT | in sdhci_irq()
2623 sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK, in sdhci_irq()
2627 sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK); in sdhci_irq()
2631 mmc_hostname(host->mmc)); in sdhci_irq()
2634 sdhci_enable_sdio_irq_nolock(host, false); in sdhci_irq()
2635 host->thread_isr |= SDHCI_INT_CARD_INT; in sdhci_irq()
2646 sdhci_writel(host, intmask, SDHCI_INT_STATUS); in sdhci_irq()
2652 intmask = sdhci_readl(host, SDHCI_INT_STATUS); in sdhci_irq()
2655 spin_unlock(&host->lock); in sdhci_irq()
2659 mmc_hostname(host->mmc), unexpected); in sdhci_irq()
2660 sdhci_dumpregs(host); in sdhci_irq()
2668 struct sdhci_host *host = dev_id; in sdhci_thread_irq() local
2672 spin_lock_irqsave(&host->lock, flags); in sdhci_thread_irq()
2673 isr = host->thread_isr; in sdhci_thread_irq()
2674 host->thread_isr = 0; in sdhci_thread_irq()
2675 spin_unlock_irqrestore(&host->lock, flags); in sdhci_thread_irq()
2678 sdhci_card_event(host->mmc); in sdhci_thread_irq()
2679 mmc_detect_change(host->mmc, msecs_to_jiffies(200)); in sdhci_thread_irq()
2683 sdio_run_irqs(host->mmc); in sdhci_thread_irq()
2685 spin_lock_irqsave(&host->lock, flags); in sdhci_thread_irq()
2686 if (host->flags & SDHCI_SDIO_IRQ_ENABLED) in sdhci_thread_irq()
2687 sdhci_enable_sdio_irq_nolock(host, true); in sdhci_thread_irq()
2688 spin_unlock_irqrestore(&host->lock, flags); in sdhci_thread_irq()
2701 void sdhci_enable_irq_wakeups(struct sdhci_host *host) in sdhci_enable_irq_wakeups() argument
2707 val = sdhci_readb(host, SDHCI_WAKE_UP_CONTROL); in sdhci_enable_irq_wakeups()
2710 if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) in sdhci_enable_irq_wakeups()
2712 sdhci_writeb(host, val, SDHCI_WAKE_UP_CONTROL); in sdhci_enable_irq_wakeups()
2716 static void sdhci_disable_irq_wakeups(struct sdhci_host *host) in sdhci_disable_irq_wakeups() argument
2722 val = sdhci_readb(host, SDHCI_WAKE_UP_CONTROL); in sdhci_disable_irq_wakeups()
2724 sdhci_writeb(host, val, SDHCI_WAKE_UP_CONTROL); in sdhci_disable_irq_wakeups()
2727 int sdhci_suspend_host(struct sdhci_host *host) in sdhci_suspend_host() argument
2729 sdhci_disable_card_detection(host); in sdhci_suspend_host()
2732 if (host->flags & SDHCI_USING_RETUNING_TIMER) { in sdhci_suspend_host()
2733 del_timer_sync(&host->tuning_timer); in sdhci_suspend_host()
2734 host->flags &= ~SDHCI_NEEDS_RETUNING; in sdhci_suspend_host()
2737 if (!device_may_wakeup(mmc_dev(host->mmc))) { in sdhci_suspend_host()
2738 host->ier = 0; in sdhci_suspend_host()
2739 sdhci_writel(host, 0, SDHCI_INT_ENABLE); in sdhci_suspend_host()
2740 sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); in sdhci_suspend_host()
2741 free_irq(host->irq, host); in sdhci_suspend_host()
2743 sdhci_enable_irq_wakeups(host); in sdhci_suspend_host()
2744 enable_irq_wake(host->irq); in sdhci_suspend_host()
2751 int sdhci_resume_host(struct sdhci_host *host) in sdhci_resume_host() argument
2755 if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { in sdhci_resume_host()
2756 if (host->ops->enable_dma) in sdhci_resume_host()
2757 host->ops->enable_dma(host); in sdhci_resume_host()
2760 if (!device_may_wakeup(mmc_dev(host->mmc))) { in sdhci_resume_host()
2761 ret = request_threaded_irq(host->irq, sdhci_irq, in sdhci_resume_host()
2763 mmc_hostname(host->mmc), host); in sdhci_resume_host()
2767 sdhci_disable_irq_wakeups(host); in sdhci_resume_host()
2768 disable_irq_wake(host->irq); in sdhci_resume_host()
2771 if ((host->mmc->pm_flags & MMC_PM_KEEP_POWER) && in sdhci_resume_host()
2772 (host->quirks2 & SDHCI_QUIRK2_HOST_OFF_CARD_ON)) { in sdhci_resume_host()
2774 sdhci_init(host, 0); in sdhci_resume_host()
2775 host->pwr = 0; in sdhci_resume_host()
2776 host->clock = 0; in sdhci_resume_host()
2777 sdhci_do_set_ios(host, &host->mmc->ios); in sdhci_resume_host()
2779 sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER)); in sdhci_resume_host()
2783 sdhci_enable_card_detection(host); in sdhci_resume_host()
2786 if (host->flags & SDHCI_USING_RETUNING_TIMER) in sdhci_resume_host()
2787 host->flags |= SDHCI_NEEDS_RETUNING; in sdhci_resume_host()
2794 static int sdhci_runtime_pm_get(struct sdhci_host *host) in sdhci_runtime_pm_get() argument
2796 return pm_runtime_get_sync(host->mmc->parent); in sdhci_runtime_pm_get()
2799 static int sdhci_runtime_pm_put(struct sdhci_host *host) in sdhci_runtime_pm_put() argument
2801 pm_runtime_mark_last_busy(host->mmc->parent); in sdhci_runtime_pm_put()
2802 return pm_runtime_put_autosuspend(host->mmc->parent); in sdhci_runtime_pm_put()
2805 static void sdhci_runtime_pm_bus_on(struct sdhci_host *host) in sdhci_runtime_pm_bus_on() argument
2807 if (host->bus_on) in sdhci_runtime_pm_bus_on()
2809 host->bus_on = true; in sdhci_runtime_pm_bus_on()
2810 pm_runtime_get_noresume(host->mmc->parent); in sdhci_runtime_pm_bus_on()
2813 static void sdhci_runtime_pm_bus_off(struct sdhci_host *host) in sdhci_runtime_pm_bus_off() argument
2815 if (!host->bus_on) in sdhci_runtime_pm_bus_off()
2817 host->bus_on = false; in sdhci_runtime_pm_bus_off()
2818 pm_runtime_put_noidle(host->mmc->parent); in sdhci_runtime_pm_bus_off()
2821 int sdhci_runtime_suspend_host(struct sdhci_host *host) in sdhci_runtime_suspend_host() argument
2826 if (host->flags & SDHCI_USING_RETUNING_TIMER) { in sdhci_runtime_suspend_host()
2827 del_timer_sync(&host->tuning_timer); in sdhci_runtime_suspend_host()
2828 host->flags &= ~SDHCI_NEEDS_RETUNING; in sdhci_runtime_suspend_host()
2831 spin_lock_irqsave(&host->lock, flags); in sdhci_runtime_suspend_host()
2832 host->ier &= SDHCI_INT_CARD_INT; in sdhci_runtime_suspend_host()
2833 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_runtime_suspend_host()
2834 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_runtime_suspend_host()
2835 spin_unlock_irqrestore(&host->lock, flags); in sdhci_runtime_suspend_host()
2837 synchronize_hardirq(host->irq); in sdhci_runtime_suspend_host()
2839 spin_lock_irqsave(&host->lock, flags); in sdhci_runtime_suspend_host()
2840 host->runtime_suspended = true; in sdhci_runtime_suspend_host()
2841 spin_unlock_irqrestore(&host->lock, flags); in sdhci_runtime_suspend_host()
2847 int sdhci_runtime_resume_host(struct sdhci_host *host) in sdhci_runtime_resume_host() argument
2850 int host_flags = host->flags; in sdhci_runtime_resume_host()
2853 if (host->ops->enable_dma) in sdhci_runtime_resume_host()
2854 host->ops->enable_dma(host); in sdhci_runtime_resume_host()
2857 sdhci_init(host, 0); in sdhci_runtime_resume_host()
2860 host->pwr = 0; in sdhci_runtime_resume_host()
2861 host->clock = 0; in sdhci_runtime_resume_host()
2862 sdhci_do_start_signal_voltage_switch(host, &host->mmc->ios); in sdhci_runtime_resume_host()
2863 sdhci_do_set_ios(host, &host->mmc->ios); in sdhci_runtime_resume_host()
2866 !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN)) { in sdhci_runtime_resume_host()
2867 spin_lock_irqsave(&host->lock, flags); in sdhci_runtime_resume_host()
2868 sdhci_enable_preset_value(host, true); in sdhci_runtime_resume_host()
2869 spin_unlock_irqrestore(&host->lock, flags); in sdhci_runtime_resume_host()
2873 if (host->flags & SDHCI_USING_RETUNING_TIMER) in sdhci_runtime_resume_host()
2874 host->flags |= SDHCI_NEEDS_RETUNING; in sdhci_runtime_resume_host()
2876 spin_lock_irqsave(&host->lock, flags); in sdhci_runtime_resume_host()
2878 host->runtime_suspended = false; in sdhci_runtime_resume_host()
2881 if (host->flags & SDHCI_SDIO_IRQ_ENABLED) in sdhci_runtime_resume_host()
2882 sdhci_enable_sdio_irq_nolock(host, true); in sdhci_runtime_resume_host()
2885 sdhci_enable_card_detection(host); in sdhci_runtime_resume_host()
2887 spin_unlock_irqrestore(&host->lock, flags); in sdhci_runtime_resume_host()
2905 struct sdhci_host *host; in sdhci_alloc_host() local
2913 host = mmc_priv(mmc); in sdhci_alloc_host()
2914 host->mmc = mmc; in sdhci_alloc_host()
2916 return host; in sdhci_alloc_host()
2921 int sdhci_add_host(struct sdhci_host *host) in sdhci_add_host() argument
2930 WARN_ON(host == NULL); in sdhci_add_host()
2931 if (host == NULL) in sdhci_add_host()
2934 mmc = host->mmc; in sdhci_add_host()
2937 host->quirks = debug_quirks; in sdhci_add_host()
2939 host->quirks2 = debug_quirks2; in sdhci_add_host()
2941 override_timeout_clk = host->timeout_clk; in sdhci_add_host()
2943 sdhci_do_reset(host, SDHCI_RESET_ALL); in sdhci_add_host()
2945 host->version = sdhci_readw(host, SDHCI_HOST_VERSION); in sdhci_add_host()
2946 host->version = (host->version & SDHCI_SPEC_VER_MASK) in sdhci_add_host()
2948 if (host->version > SDHCI_SPEC_300) { in sdhci_add_host()
2951 host->version); in sdhci_add_host()
2954 caps[0] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? host->caps : in sdhci_add_host()
2955 sdhci_readl(host, SDHCI_CAPABILITIES); in sdhci_add_host()
2957 if (host->version >= SDHCI_SPEC_300) in sdhci_add_host()
2958 caps[1] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? in sdhci_add_host()
2959 host->caps1 : in sdhci_add_host()
2960 sdhci_readl(host, SDHCI_CAPABILITIES_1); in sdhci_add_host()
2962 if (host->quirks & SDHCI_QUIRK_FORCE_DMA) in sdhci_add_host()
2963 host->flags |= SDHCI_USE_SDMA; in sdhci_add_host()
2967 host->flags |= SDHCI_USE_SDMA; in sdhci_add_host()
2969 if ((host->quirks & SDHCI_QUIRK_BROKEN_DMA) && in sdhci_add_host()
2970 (host->flags & SDHCI_USE_SDMA)) { in sdhci_add_host()
2972 host->flags &= ~SDHCI_USE_SDMA; in sdhci_add_host()
2975 if ((host->version >= SDHCI_SPEC_200) && in sdhci_add_host()
2977 host->flags |= SDHCI_USE_ADMA; in sdhci_add_host()
2979 if ((host->quirks & SDHCI_QUIRK_BROKEN_ADMA) && in sdhci_add_host()
2980 (host->flags & SDHCI_USE_ADMA)) { in sdhci_add_host()
2982 host->flags &= ~SDHCI_USE_ADMA; in sdhci_add_host()
2992 if (sdhci_readl(host, SDHCI_CAPABILITIES) & SDHCI_CAN_64BIT) in sdhci_add_host()
2993 host->flags |= SDHCI_USE_64_BIT_DMA; in sdhci_add_host()
2995 if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { in sdhci_add_host()
2996 if (host->ops->enable_dma) { in sdhci_add_host()
2997 if (host->ops->enable_dma(host)) { in sdhci_add_host()
3000 host->flags &= in sdhci_add_host()
3007 if (host->flags & SDHCI_USE_64_BIT_DMA) in sdhci_add_host()
3008 host->flags &= ~SDHCI_USE_SDMA; in sdhci_add_host()
3010 if (host->flags & SDHCI_USE_ADMA) { in sdhci_add_host()
3017 if (host->flags & SDHCI_USE_64_BIT_DMA) { in sdhci_add_host()
3018 host->adma_table_sz = (SDHCI_MAX_SEGS * 2 + 1) * in sdhci_add_host()
3020 host->align_buffer_sz = SDHCI_MAX_SEGS * in sdhci_add_host()
3022 host->desc_sz = SDHCI_ADMA2_64_DESC_SZ; in sdhci_add_host()
3023 host->align_sz = SDHCI_ADMA2_64_ALIGN; in sdhci_add_host()
3024 host->align_mask = SDHCI_ADMA2_64_ALIGN - 1; in sdhci_add_host()
3026 host->adma_table_sz = (SDHCI_MAX_SEGS * 2 + 1) * in sdhci_add_host()
3028 host->align_buffer_sz = SDHCI_MAX_SEGS * in sdhci_add_host()
3030 host->desc_sz = SDHCI_ADMA2_32_DESC_SZ; in sdhci_add_host()
3031 host->align_sz = SDHCI_ADMA2_32_ALIGN; in sdhci_add_host()
3032 host->align_mask = SDHCI_ADMA2_32_ALIGN - 1; in sdhci_add_host()
3034 host->adma_table = dma_alloc_coherent(mmc_dev(mmc), in sdhci_add_host()
3035 host->adma_table_sz, in sdhci_add_host()
3036 &host->adma_addr, in sdhci_add_host()
3038 host->align_buffer = kmalloc(host->align_buffer_sz, GFP_KERNEL); in sdhci_add_host()
3039 if (!host->adma_table || !host->align_buffer) { in sdhci_add_host()
3040 if (host->adma_table) in sdhci_add_host()
3042 host->adma_table_sz, in sdhci_add_host()
3043 host->adma_table, in sdhci_add_host()
3044 host->adma_addr); in sdhci_add_host()
3045 kfree(host->align_buffer); in sdhci_add_host()
3048 host->flags &= ~SDHCI_USE_ADMA; in sdhci_add_host()
3049 host->adma_table = NULL; in sdhci_add_host()
3050 host->align_buffer = NULL; in sdhci_add_host()
3051 } else if (host->adma_addr & host->align_mask) { in sdhci_add_host()
3054 host->flags &= ~SDHCI_USE_ADMA; in sdhci_add_host()
3055 dma_free_coherent(mmc_dev(mmc), host->adma_table_sz, in sdhci_add_host()
3056 host->adma_table, host->adma_addr); in sdhci_add_host()
3057 kfree(host->align_buffer); in sdhci_add_host()
3058 host->adma_table = NULL; in sdhci_add_host()
3059 host->align_buffer = NULL; in sdhci_add_host()
3068 if (!(host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA))) { in sdhci_add_host()
3069 host->dma_mask = DMA_BIT_MASK(64); in sdhci_add_host()
3070 mmc_dev(mmc)->dma_mask = &host->dma_mask; in sdhci_add_host()
3073 if (host->version >= SDHCI_SPEC_300) in sdhci_add_host()
3074 host->max_clk = (caps[0] & SDHCI_CLOCK_V3_BASE_MASK) in sdhci_add_host()
3077 host->max_clk = (caps[0] & SDHCI_CLOCK_BASE_MASK) in sdhci_add_host()
3080 host->max_clk *= 1000000; in sdhci_add_host()
3081 if (host->max_clk == 0 || host->quirks & in sdhci_add_host()
3083 if (!host->ops->get_max_clock) { in sdhci_add_host()
3088 host->max_clk = host->ops->get_max_clock(host); in sdhci_add_host()
3095 host->clk_mul = (caps[1] & SDHCI_CLOCK_MUL_MASK) >> in sdhci_add_host()
3104 if (host->clk_mul) in sdhci_add_host()
3105 host->clk_mul += 1; in sdhci_add_host()
3111 mmc->f_max = host->max_clk; in sdhci_add_host()
3112 if (host->ops->get_min_clock) in sdhci_add_host()
3113 mmc->f_min = host->ops->get_min_clock(host); in sdhci_add_host()
3114 else if (host->version >= SDHCI_SPEC_300) { in sdhci_add_host()
3115 if (host->clk_mul) { in sdhci_add_host()
3116 mmc->f_min = (host->max_clk * host->clk_mul) / 1024; in sdhci_add_host()
3117 mmc->f_max = host->max_clk * host->clk_mul; in sdhci_add_host()
3119 mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; in sdhci_add_host()
3121 mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; in sdhci_add_host()
3123 if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) { in sdhci_add_host()
3124 host->timeout_clk = (caps[0] & SDHCI_TIMEOUT_CLK_MASK) >> in sdhci_add_host()
3126 if (host->timeout_clk == 0) { in sdhci_add_host()
3127 if (host->ops->get_timeout_clock) { in sdhci_add_host()
3128 host->timeout_clk = in sdhci_add_host()
3129 host->ops->get_timeout_clock(host); in sdhci_add_host()
3138 host->timeout_clk *= 1000; in sdhci_add_host()
3141 host->timeout_clk = override_timeout_clk; in sdhci_add_host()
3143 mmc->max_busy_timeout = host->ops->get_max_timeout_count ? in sdhci_add_host()
3144 host->ops->get_max_timeout_count(host) : 1 << 27; in sdhci_add_host()
3145 mmc->max_busy_timeout /= host->timeout_clk; in sdhci_add_host()
3151 if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) in sdhci_add_host()
3152 host->flags |= SDHCI_AUTO_CMD12; in sdhci_add_host()
3155 if ((host->version >= SDHCI_SPEC_300) && in sdhci_add_host()
3156 ((host->flags & SDHCI_USE_ADMA) || in sdhci_add_host()
3157 !(host->flags & SDHCI_USE_SDMA)) && in sdhci_add_host()
3158 !(host->quirks2 & SDHCI_QUIRK2_ACMD23_BROKEN)) { in sdhci_add_host()
3159 host->flags |= SDHCI_AUTO_CMD23; in sdhci_add_host()
3172 if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) in sdhci_add_host()
3175 if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23) in sdhci_add_host()
3181 if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) && in sdhci_add_host()
3204 if (host->quirks2 & SDHCI_QUIRK2_NO_1_8_V) in sdhci_add_host()
3219 if (!(host->quirks2 & SDHCI_QUIRK2_BROKEN_HS200)) in sdhci_add_host()
3224 if (host->quirks2 & SDHCI_QUIRK2_CAPS_BIT63_FOR_HS400 && in sdhci_add_host()
3235 !(host->quirks2 & SDHCI_QUIRK2_BROKEN_DDR50)) in sdhci_add_host()
3240 host->flags |= SDHCI_SDR50_NEEDS_TUNING; in sdhci_add_host()
3244 host->flags |= SDHCI_SDR104_NEEDS_TUNING; in sdhci_add_host()
3255 host->tuning_count = (caps[1] & SDHCI_RETUNING_TIMER_COUNT_MASK) >> in sdhci_add_host()
3262 if (host->tuning_count) in sdhci_add_host()
3263 host->tuning_count = 1 << (host->tuning_count - 1); in sdhci_add_host()
3266 host->tuning_mode = (caps[1] & SDHCI_RETUNING_MODE_MASK) >> in sdhci_add_host()
3278 max_current_caps = sdhci_readl(host, SDHCI_MAX_CURRENT); in sdhci_add_host()
3321 if (host->ocr_mask) in sdhci_add_host()
3322 ocr_avail = host->ocr_mask; in sdhci_add_host()
3330 if (host->ocr_avail_sdio) in sdhci_add_host()
3331 mmc->ocr_avail_sdio &= host->ocr_avail_sdio; in sdhci_add_host()
3333 if (host->ocr_avail_sd) in sdhci_add_host()
3334 mmc->ocr_avail_sd &= host->ocr_avail_sd; in sdhci_add_host()
3338 if (host->ocr_avail_mmc) in sdhci_add_host()
3339 mmc->ocr_avail_mmc &= host->ocr_avail_mmc; in sdhci_add_host()
3347 spin_lock_init(&host->lock); in sdhci_add_host()
3353 if (host->flags & SDHCI_USE_ADMA) in sdhci_add_host()
3355 else if (host->flags & SDHCI_USE_SDMA) in sdhci_add_host()
3372 if (host->flags & SDHCI_USE_ADMA) { in sdhci_add_host()
3373 if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC) in sdhci_add_host()
3385 if (host->quirks & SDHCI_QUIRK_FORCE_BLK_SZ_2048) { in sdhci_add_host()
3402 mmc->max_blk_count = (host->quirks & SDHCI_QUIRK_NO_MULTIBLOCK) ? 1 : 65535; in sdhci_add_host()
3407 tasklet_init(&host->finish_tasklet, in sdhci_add_host()
3408 sdhci_tasklet_finish, (unsigned long)host); in sdhci_add_host()
3410 setup_timer(&host->timer, sdhci_timeout_timer, (unsigned long)host); in sdhci_add_host()
3412 init_waitqueue_head(&host->buf_ready_int); in sdhci_add_host()
3414 if (host->version >= SDHCI_SPEC_300) { in sdhci_add_host()
3416 init_timer(&host->tuning_timer); in sdhci_add_host()
3417 host->tuning_timer.data = (unsigned long)host; in sdhci_add_host()
3418 host->tuning_timer.function = sdhci_tuning_timer; in sdhci_add_host()
3421 sdhci_init(host, 0); in sdhci_add_host()
3423 ret = request_threaded_irq(host->irq, sdhci_irq, sdhci_thread_irq, in sdhci_add_host()
3424 IRQF_SHARED, mmc_hostname(mmc), host); in sdhci_add_host()
3427 mmc_hostname(mmc), host->irq, ret); in sdhci_add_host()
3432 sdhci_dumpregs(host); in sdhci_add_host()
3436 snprintf(host->led_name, sizeof(host->led_name), in sdhci_add_host()
3438 host->led.name = host->led_name; in sdhci_add_host()
3439 host->led.brightness = LED_OFF; in sdhci_add_host()
3440 host->led.default_trigger = mmc_hostname(mmc); in sdhci_add_host()
3441 host->led.brightness_set = sdhci_led_control; in sdhci_add_host()
3443 ret = led_classdev_register(mmc_dev(mmc), &host->led); in sdhci_add_host()
3456 mmc_hostname(mmc), host->hw_name, dev_name(mmc_dev(mmc)), in sdhci_add_host()
3457 (host->flags & SDHCI_USE_ADMA) ? in sdhci_add_host()
3458 (host->flags & SDHCI_USE_64_BIT_DMA) ? "ADMA 64-bit" : "ADMA" : in sdhci_add_host()
3459 (host->flags & SDHCI_USE_SDMA) ? "DMA" : "PIO"); in sdhci_add_host()
3461 sdhci_enable_card_detection(host); in sdhci_add_host()
3467 sdhci_do_reset(host, SDHCI_RESET_ALL); in sdhci_add_host()
3468 sdhci_writel(host, 0, SDHCI_INT_ENABLE); in sdhci_add_host()
3469 sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); in sdhci_add_host()
3470 free_irq(host->irq, host); in sdhci_add_host()
3473 tasklet_kill(&host->finish_tasklet); in sdhci_add_host()
3480 void sdhci_remove_host(struct sdhci_host *host, int dead) in sdhci_remove_host() argument
3482 struct mmc_host *mmc = host->mmc; in sdhci_remove_host()
3486 spin_lock_irqsave(&host->lock, flags); in sdhci_remove_host()
3488 host->flags |= SDHCI_DEVICE_DEAD; in sdhci_remove_host()
3490 if (host->mrq) { in sdhci_remove_host()
3494 host->mrq->cmd->error = -ENOMEDIUM; in sdhci_remove_host()
3495 tasklet_schedule(&host->finish_tasklet); in sdhci_remove_host()
3498 spin_unlock_irqrestore(&host->lock, flags); in sdhci_remove_host()
3501 sdhci_disable_card_detection(host); in sdhci_remove_host()
3506 led_classdev_unregister(&host->led); in sdhci_remove_host()
3510 sdhci_do_reset(host, SDHCI_RESET_ALL); in sdhci_remove_host()
3512 sdhci_writel(host, 0, SDHCI_INT_ENABLE); in sdhci_remove_host()
3513 sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); in sdhci_remove_host()
3514 free_irq(host->irq, host); in sdhci_remove_host()
3516 del_timer_sync(&host->timer); in sdhci_remove_host()
3518 tasklet_kill(&host->finish_tasklet); in sdhci_remove_host()
3523 if (host->adma_table) in sdhci_remove_host()
3524 dma_free_coherent(mmc_dev(mmc), host->adma_table_sz, in sdhci_remove_host()
3525 host->adma_table, host->adma_addr); in sdhci_remove_host()
3526 kfree(host->align_buffer); in sdhci_remove_host()
3528 host->adma_table = NULL; in sdhci_remove_host()
3529 host->align_buffer = NULL; in sdhci_remove_host()
3534 void sdhci_free_host(struct sdhci_host *host) in sdhci_free_host() argument
3536 mmc_free_host(host->mmc); in sdhci_free_host()