Lines Matching refs:host

217 	struct mmci_host *host = mmc_priv(mmc);  in mmci_card_busy()  local
221 spin_lock_irqsave(&host->lock, flags); in mmci_card_busy()
222 if (readl(host->base + MMCISTATUS) & host->variant->busy_detect_flag) in mmci_card_busy()
224 spin_unlock_irqrestore(&host->lock, flags); in mmci_card_busy()
232 static int mmci_validate_data(struct mmci_host *host, in mmci_validate_data() argument
239 dev_err(mmc_dev(host->mmc), in mmci_validate_data()
247 static void mmci_reg_delay(struct mmci_host *host) in mmci_reg_delay() argument
256 if (host->cclk < 25000000) in mmci_reg_delay()
265 static void mmci_write_clkreg(struct mmci_host *host, u32 clk) in mmci_write_clkreg() argument
267 if (host->clk_reg != clk) { in mmci_write_clkreg()
268 host->clk_reg = clk; in mmci_write_clkreg()
269 writel(clk, host->base + MMCICLOCK); in mmci_write_clkreg()
276 static void mmci_write_pwrreg(struct mmci_host *host, u32 pwr) in mmci_write_pwrreg() argument
278 if (host->pwr_reg != pwr) { in mmci_write_pwrreg()
279 host->pwr_reg = pwr; in mmci_write_pwrreg()
280 writel(pwr, host->base + MMCIPOWER); in mmci_write_pwrreg()
287 static void mmci_write_datactrlreg(struct mmci_host *host, u32 datactrl) in mmci_write_datactrlreg() argument
290 datactrl |= host->datactrl_reg & host->variant->busy_dpsm_flag; in mmci_write_datactrlreg()
292 if (host->datactrl_reg != datactrl) { in mmci_write_datactrlreg()
293 host->datactrl_reg = datactrl; in mmci_write_datactrlreg()
294 writel(datactrl, host->base + MMCIDATACTRL); in mmci_write_datactrlreg()
301 static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired) in mmci_set_clkreg() argument
303 struct variant_data *variant = host->variant; in mmci_set_clkreg()
307 host->cclk = 0; in mmci_set_clkreg()
311 host->cclk = host->mclk; in mmci_set_clkreg()
312 } else if (desired >= host->mclk) { in mmci_set_clkreg()
316 host->cclk = host->mclk; in mmci_set_clkreg()
324 clk = DIV_ROUND_UP(host->mclk, desired) - 2; in mmci_set_clkreg()
327 host->cclk = host->mclk / (clk + 2); in mmci_set_clkreg()
333 clk = host->mclk / (2 * desired) - 1; in mmci_set_clkreg()
336 host->cclk = host->mclk / (2 * (clk + 1)); in mmci_set_clkreg()
346 host->mmc->actual_clock = host->cclk; in mmci_set_clkreg()
348 if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_4) in mmci_set_clkreg()
350 if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_8) in mmci_set_clkreg()
353 if (host->mmc->ios.timing == MMC_TIMING_UHS_DDR50 || in mmci_set_clkreg()
354 host->mmc->ios.timing == MMC_TIMING_MMC_DDR52) in mmci_set_clkreg()
357 mmci_write_clkreg(host, clk); in mmci_set_clkreg()
361 mmci_request_end(struct mmci_host *host, struct mmc_request *mrq) in mmci_request_end() argument
363 writel(0, host->base + MMCICOMMAND); in mmci_request_end()
365 BUG_ON(host->data); in mmci_request_end()
367 host->mrq = NULL; in mmci_request_end()
368 host->cmd = NULL; in mmci_request_end()
370 mmc_request_done(host->mmc, mrq); in mmci_request_end()
373 static void mmci_set_mask1(struct mmci_host *host, unsigned int mask) in mmci_set_mask1() argument
375 void __iomem *base = host->base; in mmci_set_mask1()
376 struct variant_data *variant = host->variant; in mmci_set_mask1()
378 if (host->singleirq) { in mmci_set_mask1()
390 host->mask1_reg = mask; in mmci_set_mask1()
393 static void mmci_stop_data(struct mmci_host *host) in mmci_stop_data() argument
395 mmci_write_datactrlreg(host, 0); in mmci_stop_data()
396 mmci_set_mask1(host, 0); in mmci_stop_data()
397 host->data = NULL; in mmci_stop_data()
400 static void mmci_init_sg(struct mmci_host *host, struct mmc_data *data) in mmci_init_sg() argument
409 sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags); in mmci_init_sg()
418 static void mmci_dma_setup(struct mmci_host *host) in mmci_dma_setup() argument
422 host->dma_rx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "rx"); in mmci_dma_setup()
423 host->dma_tx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "tx"); in mmci_dma_setup()
426 host->next_data.cookie = 1; in mmci_dma_setup()
433 if (host->dma_rx_channel && !host->dma_tx_channel) in mmci_dma_setup()
434 host->dma_tx_channel = host->dma_rx_channel; in mmci_dma_setup()
436 if (host->dma_rx_channel) in mmci_dma_setup()
437 rxname = dma_chan_name(host->dma_rx_channel); in mmci_dma_setup()
441 if (host->dma_tx_channel) in mmci_dma_setup()
442 txname = dma_chan_name(host->dma_tx_channel); in mmci_dma_setup()
446 dev_info(mmc_dev(host->mmc), "DMA channels RX %s, TX %s\n", in mmci_dma_setup()
453 if (host->dma_tx_channel) { in mmci_dma_setup()
454 struct device *dev = host->dma_tx_channel->device->dev; in mmci_dma_setup()
457 if (max_seg_size < host->mmc->max_seg_size) in mmci_dma_setup()
458 host->mmc->max_seg_size = max_seg_size; in mmci_dma_setup()
460 if (host->dma_rx_channel) { in mmci_dma_setup()
461 struct device *dev = host->dma_rx_channel->device->dev; in mmci_dma_setup()
464 if (max_seg_size < host->mmc->max_seg_size) in mmci_dma_setup()
465 host->mmc->max_seg_size = max_seg_size; in mmci_dma_setup()
468 if (host->ops && host->ops->dma_setup) in mmci_dma_setup()
469 host->ops->dma_setup(host); in mmci_dma_setup()
476 static inline void mmci_dma_release(struct mmci_host *host) in mmci_dma_release() argument
478 if (host->dma_rx_channel) in mmci_dma_release()
479 dma_release_channel(host->dma_rx_channel); in mmci_dma_release()
480 if (host->dma_tx_channel) in mmci_dma_release()
481 dma_release_channel(host->dma_tx_channel); in mmci_dma_release()
482 host->dma_rx_channel = host->dma_tx_channel = NULL; in mmci_dma_release()
485 static void mmci_dma_data_error(struct mmci_host *host) in mmci_dma_data_error() argument
487 dev_err(mmc_dev(host->mmc), "error during DMA transfer!\n"); in mmci_dma_data_error()
488 dmaengine_terminate_all(host->dma_current); in mmci_dma_data_error()
489 host->dma_in_progress = false; in mmci_dma_data_error()
490 host->dma_current = NULL; in mmci_dma_data_error()
491 host->dma_desc_current = NULL; in mmci_dma_data_error()
492 host->data->host_cookie = 0; in mmci_dma_data_error()
495 static void mmci_dma_unmap(struct mmci_host *host, struct mmc_data *data) in mmci_dma_unmap() argument
500 chan = host->dma_rx_channel; in mmci_dma_unmap()
502 chan = host->dma_tx_channel; in mmci_dma_unmap()
508 static void mmci_dma_finalize(struct mmci_host *host, struct mmc_data *data) in mmci_dma_finalize() argument
515 status = readl(host->base + MMCISTATUS); in mmci_dma_finalize()
528 mmci_dma_data_error(host); in mmci_dma_finalize()
534 mmci_dma_unmap(host, data); in mmci_dma_finalize()
541 dev_err(mmc_dev(host->mmc), "buggy DMA detected. Taking evasive action.\n"); in mmci_dma_finalize()
542 mmci_dma_release(host); in mmci_dma_finalize()
545 host->dma_in_progress = false; in mmci_dma_finalize()
546 host->dma_current = NULL; in mmci_dma_finalize()
547 host->dma_desc_current = NULL; in mmci_dma_finalize()
551 static int __mmci_dma_prep_data(struct mmci_host *host, struct mmc_data *data, in __mmci_dma_prep_data() argument
555 struct variant_data *variant = host->variant; in __mmci_dma_prep_data()
557 .src_addr = host->phybase + MMCIFIFO, in __mmci_dma_prep_data()
558 .dst_addr = host->phybase + MMCIFIFO, in __mmci_dma_prep_data()
573 chan = host->dma_rx_channel; in __mmci_dma_prep_data()
576 chan = host->dma_tx_channel; in __mmci_dma_prep_data()
593 if (host->variant->qcom_dml) in __mmci_dma_prep_data()
613 static inline int mmci_dma_prep_data(struct mmci_host *host, in mmci_dma_prep_data() argument
617 if (host->dma_current && host->dma_desc_current) in mmci_dma_prep_data()
621 return __mmci_dma_prep_data(host, data, &host->dma_current, in mmci_dma_prep_data()
622 &host->dma_desc_current); in mmci_dma_prep_data()
625 static inline int mmci_dma_prep_next(struct mmci_host *host, in mmci_dma_prep_next() argument
628 struct mmci_host_next *nd = &host->next_data; in mmci_dma_prep_next()
629 return __mmci_dma_prep_data(host, data, &nd->dma_chan, &nd->dma_desc); in mmci_dma_prep_next()
632 static int mmci_dma_start_data(struct mmci_host *host, unsigned int datactrl) in mmci_dma_start_data() argument
635 struct mmc_data *data = host->data; in mmci_dma_start_data()
637 ret = mmci_dma_prep_data(host, host->data); in mmci_dma_start_data()
642 dev_vdbg(mmc_dev(host->mmc), in mmci_dma_start_data()
645 host->dma_in_progress = true; in mmci_dma_start_data()
646 dmaengine_submit(host->dma_desc_current); in mmci_dma_start_data()
647 dma_async_issue_pending(host->dma_current); in mmci_dma_start_data()
649 if (host->variant->qcom_dml) in mmci_dma_start_data()
650 dml_start_xfer(host, data); in mmci_dma_start_data()
655 mmci_write_datactrlreg(host, datactrl); in mmci_dma_start_data()
662 writel(readl(host->base + MMCIMASK0) | MCI_DATAENDMASK, in mmci_dma_start_data()
663 host->base + MMCIMASK0); in mmci_dma_start_data()
667 static void mmci_get_next_data(struct mmci_host *host, struct mmc_data *data) in mmci_get_next_data() argument
669 struct mmci_host_next *next = &host->next_data; in mmci_get_next_data()
674 host->dma_desc_current = next->dma_desc; in mmci_get_next_data()
675 host->dma_current = next->dma_chan; in mmci_get_next_data()
682 struct mmci_host *host = mmc_priv(mmc); in mmci_pre_request() local
684 struct mmci_host_next *nd = &host->next_data; in mmci_pre_request()
691 if (mmci_validate_data(host, data)) in mmci_pre_request()
694 if (!mmci_dma_prep_next(host, data)) in mmci_pre_request()
701 struct mmci_host *host = mmc_priv(mmc); in mmci_post_request() local
707 mmci_dma_unmap(host, data); in mmci_post_request()
710 struct mmci_host_next *next = &host->next_data; in mmci_post_request()
713 chan = host->dma_rx_channel; in mmci_post_request()
715 chan = host->dma_tx_channel; in mmci_post_request()
718 if (host->dma_desc_current == next->dma_desc) in mmci_post_request()
719 host->dma_desc_current = NULL; in mmci_post_request()
721 if (host->dma_current == next->dma_chan) { in mmci_post_request()
722 host->dma_in_progress = false; in mmci_post_request()
723 host->dma_current = NULL; in mmci_post_request()
734 static void mmci_get_next_data(struct mmci_host *host, struct mmc_data *data) in mmci_get_next_data() argument
737 static inline void mmci_dma_setup(struct mmci_host *host) in mmci_dma_setup() argument
741 static inline void mmci_dma_release(struct mmci_host *host) in mmci_dma_release() argument
745 static inline void mmci_dma_unmap(struct mmci_host *host, struct mmc_data *data) in mmci_dma_unmap() argument
749 static inline void mmci_dma_finalize(struct mmci_host *host, in mmci_dma_finalize() argument
754 static inline void mmci_dma_data_error(struct mmci_host *host) in mmci_dma_data_error() argument
758 static inline int mmci_dma_start_data(struct mmci_host *host, unsigned int datactrl) in mmci_dma_start_data() argument
768 static void mmci_start_data(struct mmci_host *host, struct mmc_data *data) in mmci_start_data() argument
770 struct variant_data *variant = host->variant; in mmci_start_data()
776 dev_dbg(mmc_dev(host->mmc), "blksz %04x blks %04x flags %08x\n", in mmci_start_data()
779 host->data = data; in mmci_start_data()
780 host->size = data->blksz * data->blocks; in mmci_start_data()
783 clks = (unsigned long long)data->timeout_ns * host->cclk; in mmci_start_data()
788 base = host->base; in mmci_start_data()
790 writel(host->size, base + MMCIDATALENGTH); in mmci_start_data()
805 if (host->mmc->card && mmc_card_sdio(host->mmc->card)) { in mmci_start_data()
817 (host->size < 8 || in mmci_start_data()
818 (host->size <= 8 && host->mclk > 50000000))) in mmci_start_data()
819 clk = host->clk_reg & ~variant->clkreg_enable; in mmci_start_data()
821 clk = host->clk_reg | variant->clkreg_enable; in mmci_start_data()
823 mmci_write_clkreg(host, clk); in mmci_start_data()
826 if (host->mmc->ios.timing == MMC_TIMING_UHS_DDR50 || in mmci_start_data()
827 host->mmc->ios.timing == MMC_TIMING_MMC_DDR52) in mmci_start_data()
834 if (!mmci_dma_start_data(host, datactrl)) in mmci_start_data()
838 mmci_init_sg(host, data); in mmci_start_data()
848 if (host->size < variant->fifohalfsize) in mmci_start_data()
858 mmci_write_datactrlreg(host, datactrl); in mmci_start_data()
860 mmci_set_mask1(host, irqmask); in mmci_start_data()
864 mmci_start_command(struct mmci_host *host, struct mmc_command *cmd, u32 c) in mmci_start_command() argument
866 void __iomem *base = host->base; in mmci_start_command()
868 dev_dbg(mmc_dev(host->mmc), "op %02x arg %08x flags %08x\n", in mmci_start_command()
873 mmci_reg_delay(host); in mmci_start_command()
886 c |= host->variant->data_cmd_enable; in mmci_start_command()
888 host->cmd = cmd; in mmci_start_command()
895 mmci_data_irq(struct mmci_host *host, struct mmc_data *data, in mmci_data_irq() argument
904 host->variant->start_err | in mmci_data_irq()
909 if (dma_inprogress(host)) { in mmci_data_irq()
910 mmci_dma_data_error(host); in mmci_data_irq()
911 mmci_dma_unmap(host, data); in mmci_data_irq()
921 remain = readl(host->base + MMCIDATACNT); in mmci_data_irq()
924 dev_dbg(mmc_dev(host->mmc), "MCI ERROR IRQ, status 0x%08x at 0x%08x\n", in mmci_data_irq()
937 if (success > host->variant->fifosize) in mmci_data_irq()
938 success -= host->variant->fifosize; in mmci_data_irq()
947 dev_err(mmc_dev(host->mmc), "stray MCI_DATABLOCKEND interrupt\n"); in mmci_data_irq()
950 if (dma_inprogress(host)) in mmci_data_irq()
951 mmci_dma_finalize(host, data); in mmci_data_irq()
952 mmci_stop_data(host); in mmci_data_irq()
958 if (!data->stop || host->mrq->sbc) { in mmci_data_irq()
959 mmci_request_end(host, data->mrq); in mmci_data_irq()
961 mmci_start_command(host, data->stop, 0); in mmci_data_irq()
967 mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd, in mmci_cmd_irq() argument
970 void __iomem *base = host->base; in mmci_cmd_irq()
976 sbc = (cmd == host->mrq->sbc); in mmci_cmd_irq()
983 if (!((status|host->busy_status) & in mmci_cmd_irq()
990 if (host->variant->busy_detect) { in mmci_cmd_irq()
994 if (host->busy_status && in mmci_cmd_irq()
995 (status & host->variant->busy_detect_flag)) in mmci_cmd_irq()
1004 if (!host->busy_status && busy_resp && in mmci_cmd_irq()
1006 (readl(base + MMCISTATUS) & host->variant->busy_detect_flag)) { in mmci_cmd_irq()
1009 writel(host->variant->busy_detect_mask, in mmci_cmd_irq()
1010 host->base + MMCICLEAR); in mmci_cmd_irq()
1014 host->variant->busy_detect_mask, in mmci_cmd_irq()
1020 host->busy_status = in mmci_cmd_irq()
1030 if (host->busy_status) { in mmci_cmd_irq()
1032 writel(host->variant->busy_detect_mask, in mmci_cmd_irq()
1033 host->base + MMCICLEAR); in mmci_cmd_irq()
1036 ~host->variant->busy_detect_mask, in mmci_cmd_irq()
1038 host->busy_status = 0; in mmci_cmd_irq()
1042 host->cmd = NULL; in mmci_cmd_irq()
1056 if (host->data) { in mmci_cmd_irq()
1058 if (dma_inprogress(host)) { in mmci_cmd_irq()
1059 mmci_dma_data_error(host); in mmci_cmd_irq()
1060 mmci_dma_unmap(host, host->data); in mmci_cmd_irq()
1062 mmci_stop_data(host); in mmci_cmd_irq()
1064 mmci_request_end(host, host->mrq); in mmci_cmd_irq()
1066 mmci_start_command(host, host->mrq->cmd, 0); in mmci_cmd_irq()
1068 mmci_start_data(host, cmd->data); in mmci_cmd_irq()
1072 static int mmci_get_rx_fifocnt(struct mmci_host *host, u32 status, int remain) in mmci_get_rx_fifocnt() argument
1074 return remain - (readl(host->base + MMCIFIFOCNT) << 2); in mmci_get_rx_fifocnt()
1077 static int mmci_qcom_get_rx_fifocnt(struct mmci_host *host, u32 status, int r) in mmci_qcom_get_rx_fifocnt() argument
1084 return host->variant->fifohalfsize; in mmci_qcom_get_rx_fifocnt()
1091 static int mmci_pio_read(struct mmci_host *host, char *buffer, unsigned int remain) in mmci_pio_read() argument
1093 void __iomem *base = host->base; in mmci_pio_read()
1095 u32 status = readl(host->base + MMCISTATUS); in mmci_pio_read()
1096 int host_remain = host->size; in mmci_pio_read()
1099 int count = host->get_rx_fifocnt(host, status, host_remain); in mmci_pio_read()
1139 static int mmci_pio_write(struct mmci_host *host, char *buffer, unsigned int remain, u32 status) in mmci_pio_write() argument
1141 struct variant_data *variant = host->variant; in mmci_pio_write()
1142 void __iomem *base = host->base; in mmci_pio_write()
1179 struct mmci_host *host = dev_id; in mmci_pio_irq() local
1180 struct sg_mapping_iter *sg_miter = &host->sg_miter; in mmci_pio_irq()
1181 struct variant_data *variant = host->variant; in mmci_pio_irq()
1182 void __iomem *base = host->base; in mmci_pio_irq()
1187 dev_dbg(mmc_dev(host->mmc), "irq1 (pio) %08x\n", status); in mmci_pio_irq()
1211 len = mmci_pio_read(host, buffer, remain); in mmci_pio_irq()
1213 len = mmci_pio_write(host, buffer, remain, status); in mmci_pio_irq()
1217 host->size -= len; in mmci_pio_irq()
1232 if (status & MCI_RXACTIVE && host->size < variant->fifohalfsize) in mmci_pio_irq()
1233 mmci_set_mask1(host, MCI_RXDATAAVLBLMASK); in mmci_pio_irq()
1241 if (host->size == 0) { in mmci_pio_irq()
1242 mmci_set_mask1(host, 0); in mmci_pio_irq()
1254 struct mmci_host *host = dev_id; in mmci_irq() local
1258 spin_lock(&host->lock); in mmci_irq()
1261 status = readl(host->base + MMCISTATUS); in mmci_irq()
1263 if (host->singleirq) { in mmci_irq()
1264 if (status & host->mask1_reg) in mmci_irq()
1280 status &= readl(host->base + MMCIMASK0); in mmci_irq()
1281 if (host->variant->busy_detect) in mmci_irq()
1282 writel(status & ~host->variant->busy_detect_mask, in mmci_irq()
1283 host->base + MMCICLEAR); in mmci_irq()
1285 writel(status, host->base + MMCICLEAR); in mmci_irq()
1287 dev_dbg(mmc_dev(host->mmc), "irq0 (data+cmd) %08x\n", status); in mmci_irq()
1289 if (host->variant->reversed_irq_handling) { in mmci_irq()
1290 mmci_data_irq(host, host->data, status); in mmci_irq()
1291 mmci_cmd_irq(host, host->cmd, status); in mmci_irq()
1293 mmci_cmd_irq(host, host->cmd, status); in mmci_irq()
1294 mmci_data_irq(host, host->data, status); in mmci_irq()
1300 if (host->variant->busy_detect && host->busy_status) in mmci_irq()
1301 status &= ~host->variant->busy_detect_flag; in mmci_irq()
1306 spin_unlock(&host->lock); in mmci_irq()
1313 struct mmci_host *host = mmc_priv(mmc); in mmci_request() local
1316 WARN_ON(host->mrq != NULL); in mmci_request()
1318 mrq->cmd->error = mmci_validate_data(host, mrq->data); in mmci_request()
1324 spin_lock_irqsave(&host->lock, flags); in mmci_request()
1326 host->mrq = mrq; in mmci_request()
1329 mmci_get_next_data(host, mrq->data); in mmci_request()
1332 mmci_start_data(host, mrq->data); in mmci_request()
1335 mmci_start_command(host, mrq->sbc, 0); in mmci_request()
1337 mmci_start_command(host, mrq->cmd, 0); in mmci_request()
1339 spin_unlock_irqrestore(&host->lock, flags); in mmci_request()
1344 struct mmci_host *host = mmc_priv(mmc); in mmci_set_ios() local
1345 struct variant_data *variant = host->variant; in mmci_set_ios()
1350 if (host->plat->ios_handler && in mmci_set_ios()
1351 host->plat->ios_handler(mmc_dev(mmc), ios)) in mmci_set_ios()
1359 if (!IS_ERR(mmc->supply.vqmmc) && host->vqmmc_enabled) { in mmci_set_ios()
1361 host->vqmmc_enabled = false; in mmci_set_ios()
1378 if (!IS_ERR(mmc->supply.vqmmc) && !host->vqmmc_enabled) { in mmci_set_ios()
1384 host->vqmmc_enabled = true; in mmci_set_ios()
1397 pwr |= host->pwr_reg_add; in mmci_set_ios()
1416 pinctrl_select_state(host->pinctrl, host->pins_opendrain); in mmci_set_ios()
1418 pinctrl_select_state(host->pinctrl, host->pins_default); in mmci_set_ios()
1428 if (host->variant->explicit_mclk_control && in mmci_set_ios()
1429 ios->clock != host->clock_cache) { in mmci_set_ios()
1430 ret = clk_set_rate(host->clk, ios->clock); in mmci_set_ios()
1432 dev_err(mmc_dev(host->mmc), in mmci_set_ios()
1435 host->mclk = clk_get_rate(host->clk); in mmci_set_ios()
1437 host->clock_cache = ios->clock; in mmci_set_ios()
1439 spin_lock_irqsave(&host->lock, flags); in mmci_set_ios()
1441 mmci_set_clkreg(host, ios->clock); in mmci_set_ios()
1442 mmci_write_pwrreg(host, pwr); in mmci_set_ios()
1443 mmci_reg_delay(host); in mmci_set_ios()
1445 spin_unlock_irqrestore(&host->lock, flags); in mmci_set_ios()
1450 struct mmci_host *host = mmc_priv(mmc); in mmci_get_cd() local
1451 struct mmci_platform_data *plat = host->plat; in mmci_get_cd()
1458 status = plat->status(mmc_dev(host->mmc)); in mmci_get_cd()
1503 struct mmci_host *host = mmc_priv(mmc); in mmci_of_parse() local
1510 host->pwr_reg_add |= MCI_ST_DATA0DIREN; in mmci_of_parse()
1512 host->pwr_reg_add |= MCI_ST_DATA2DIREN; in mmci_of_parse()
1514 host->pwr_reg_add |= MCI_ST_DATA31DIREN; in mmci_of_parse()
1516 host->pwr_reg_add |= MCI_ST_DATA74DIREN; in mmci_of_parse()
1518 host->pwr_reg_add |= MCI_ST_CMDDIREN; in mmci_of_parse()
1520 host->pwr_reg_add |= MCI_ST_FBCLKEN; in mmci_of_parse()
1536 struct mmci_host *host; in mmci_probe() local
1560 host = mmc_priv(mmc); in mmci_probe()
1561 host->mmc = mmc; in mmci_probe()
1568 host->pinctrl = devm_pinctrl_get(&dev->dev); in mmci_probe()
1569 if (IS_ERR(host->pinctrl)) { in mmci_probe()
1571 ret = PTR_ERR(host->pinctrl); in mmci_probe()
1575 host->pins_default = pinctrl_lookup_state(host->pinctrl, in mmci_probe()
1577 if (IS_ERR(host->pins_default)) { in mmci_probe()
1579 ret = PTR_ERR(host->pins_default); in mmci_probe()
1583 host->pins_opendrain = pinctrl_lookup_state(host->pinctrl, in mmci_probe()
1585 if (IS_ERR(host->pins_opendrain)) { in mmci_probe()
1587 ret = PTR_ERR(host->pins_opendrain); in mmci_probe()
1592 host->hw_designer = amba_manf(dev); in mmci_probe()
1593 host->hw_revision = amba_rev(dev); in mmci_probe()
1594 dev_dbg(mmc_dev(mmc), "designer ID = 0x%02x\n", host->hw_designer); in mmci_probe()
1595 dev_dbg(mmc_dev(mmc), "revision = 0x%01x\n", host->hw_revision); in mmci_probe()
1597 host->clk = devm_clk_get(&dev->dev, NULL); in mmci_probe()
1598 if (IS_ERR(host->clk)) { in mmci_probe()
1599 ret = PTR_ERR(host->clk); in mmci_probe()
1603 ret = clk_prepare_enable(host->clk); in mmci_probe()
1608 host->get_rx_fifocnt = mmci_qcom_get_rx_fifocnt; in mmci_probe()
1610 host->get_rx_fifocnt = mmci_get_rx_fifocnt; in mmci_probe()
1612 host->plat = plat; in mmci_probe()
1613 host->variant = variant; in mmci_probe()
1614 host->mclk = clk_get_rate(host->clk); in mmci_probe()
1620 if (host->mclk > variant->f_max) { in mmci_probe()
1621 ret = clk_set_rate(host->clk, variant->f_max); in mmci_probe()
1624 host->mclk = clk_get_rate(host->clk); in mmci_probe()
1626 host->mclk); in mmci_probe()
1629 host->phybase = dev->res.start; in mmci_probe()
1630 host->base = devm_ioremap_resource(&dev->dev, &dev->res); in mmci_probe()
1631 if (IS_ERR(host->base)) { in mmci_probe()
1632 ret = PTR_ERR(host->base); in mmci_probe()
1637 variant->init(host); in mmci_probe()
1646 mmc->f_min = DIV_ROUND_UP(host->mclk, 257); in mmci_probe()
1648 mmc->f_min = clk_round_rate(host->clk, 100000); in mmci_probe()
1650 mmc->f_min = DIV_ROUND_UP(host->mclk, 512); in mmci_probe()
1660 min(host->mclk, mmc->f_max); in mmci_probe()
1663 fmax : min(host->mclk, fmax); in mmci_probe()
1698 mmci_write_datactrlreg(host, in mmci_probe()
1699 host->variant->busy_dpsm_flag); in mmci_probe()
1738 spin_lock_init(&host->lock); in mmci_probe()
1740 writel(0, host->base + MMCIMASK0); in mmci_probe()
1743 writel(0, host->base + MMCIMASK1); in mmci_probe()
1745 writel(0xfff, host->base + MMCICLEAR); in mmci_probe()
1779 DRIVER_NAME " (cmd)", host); in mmci_probe()
1784 host->singleirq = true; in mmci_probe()
1787 IRQF_SHARED, DRIVER_NAME " (pio)", host); in mmci_probe()
1792 writel(MCI_IRQENABLE, host->base + MMCIMASK0); in mmci_probe()
1801 mmci_dma_setup(host); in mmci_probe()
1812 clk_disable_unprepare(host->clk); in mmci_probe()
1823 struct mmci_host *host = mmc_priv(mmc); in mmci_remove() local
1824 struct variant_data *variant = host->variant; in mmci_remove()
1834 writel(0, host->base + MMCIMASK0); in mmci_remove()
1837 writel(0, host->base + MMCIMASK1); in mmci_remove()
1839 writel(0, host->base + MMCICOMMAND); in mmci_remove()
1840 writel(0, host->base + MMCIDATACTRL); in mmci_remove()
1842 mmci_dma_release(host); in mmci_remove()
1843 clk_disable_unprepare(host->clk); in mmci_remove()
1851 static void mmci_save(struct mmci_host *host) in mmci_save() argument
1855 spin_lock_irqsave(&host->lock, flags); in mmci_save()
1857 writel(0, host->base + MMCIMASK0); in mmci_save()
1858 if (host->variant->pwrreg_nopower) { in mmci_save()
1859 writel(0, host->base + MMCIDATACTRL); in mmci_save()
1860 writel(0, host->base + MMCIPOWER); in mmci_save()
1861 writel(0, host->base + MMCICLOCK); in mmci_save()
1863 mmci_reg_delay(host); in mmci_save()
1865 spin_unlock_irqrestore(&host->lock, flags); in mmci_save()
1868 static void mmci_restore(struct mmci_host *host) in mmci_restore() argument
1872 spin_lock_irqsave(&host->lock, flags); in mmci_restore()
1874 if (host->variant->pwrreg_nopower) { in mmci_restore()
1875 writel(host->clk_reg, host->base + MMCICLOCK); in mmci_restore()
1876 writel(host->datactrl_reg, host->base + MMCIDATACTRL); in mmci_restore()
1877 writel(host->pwr_reg, host->base + MMCIPOWER); in mmci_restore()
1879 writel(MCI_IRQENABLE, host->base + MMCIMASK0); in mmci_restore()
1880 mmci_reg_delay(host); in mmci_restore()
1882 spin_unlock_irqrestore(&host->lock, flags); in mmci_restore()
1891 struct mmci_host *host = mmc_priv(mmc); in mmci_runtime_suspend() local
1893 mmci_save(host); in mmci_runtime_suspend()
1894 clk_disable_unprepare(host->clk); in mmci_runtime_suspend()
1906 struct mmci_host *host = mmc_priv(mmc); in mmci_runtime_resume() local
1907 clk_prepare_enable(host->clk); in mmci_runtime_resume()
1908 mmci_restore(host); in mmci_runtime_resume()