Lines Matching full:mmc
16 #include <linux/mmc/mmc.h>
17 #include <linux/mmc/host.h>
18 #include <linux/mmc/card.h>
55 return cq_host->trans_desc_len * cq_host->mmc->max_segs * tag; in get_trans_desc_offset()
84 if (tag == DCMD_SLOT && (cq_host->mmc->caps2 & MMC_CAP2_CQE_DCMD)) { in setup_trans_desc()
111 pr_err("%s: " DRV_NAME ": " f, mmc_hostname(mmc), ## x)
115 struct mmc_host *mmc = cq_host->mmc; in cqhci_dumpregs() local
154 cq_host->ops->dumpregs(mmc); in cqhci_dumpregs()
208 cq_host->data_size = get_trans_desc_offset(cq_host, cq_host->mmc->cqe_qdepth); in cqhci_host_alloc_tdl()
211 mmc_hostname(cq_host->mmc), cq_host->desc_size, cq_host->data_size, in cqhci_host_alloc_tdl()
220 cq_host->desc_base = dmam_alloc_coherent(mmc_dev(cq_host->mmc), in cqhci_host_alloc_tdl()
227 cq_host->trans_desc_base = dmam_alloc_coherent(mmc_dev(cq_host->mmc), in cqhci_host_alloc_tdl()
232 dmam_free_coherent(mmc_dev(cq_host->mmc), cq_host->desc_size, in cqhci_host_alloc_tdl()
241 mmc_hostname(cq_host->mmc), cq_host->desc_base, cq_host->trans_desc_base, in cqhci_host_alloc_tdl()
253 struct mmc_host *mmc = cq_host->mmc; in __cqhci_enable() local
266 if (mmc->caps2 & MMC_CAP2_CQE_DCMD) in __cqhci_enable()
272 if (mmc->caps2 & MMC_CAP2_CRYPTO) in __cqhci_enable()
293 mmc->cqe_on = true; in __cqhci_enable()
296 cq_host->ops->enable(mmc); in __cqhci_enable()
314 cq_host->mmc->cqe_on = false; in __cqhci_disable()
319 int cqhci_deactivate(struct mmc_host *mmc) in cqhci_deactivate() argument
321 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_deactivate()
330 int cqhci_resume(struct mmc_host *mmc) in cqhci_resume() argument
337 static int cqhci_enable(struct mmc_host *mmc, struct mmc_card *card) in cqhci_enable() argument
339 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_enable()
353 mmc_hostname(mmc), err); in cqhci_enable()
375 static void cqhci_off(struct mmc_host *mmc) in cqhci_off() argument
377 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_off()
381 if (!cq_host->enabled || !mmc->cqe_on || cq_host->recovery_halt) in cqhci_off()
385 cq_host->ops->disable(mmc, false); in cqhci_off()
392 pr_err("%s: cqhci: CQE stuck on\n", mmc_hostname(mmc)); in cqhci_off()
394 pr_debug("%s: cqhci: CQE off\n", mmc_hostname(mmc)); in cqhci_off()
397 cq_host->ops->post_disable(mmc); in cqhci_off()
399 mmc->cqe_on = false; in cqhci_off()
402 static void cqhci_disable(struct mmc_host *mmc) in cqhci_disable() argument
404 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_disable()
409 cqhci_off(mmc); in cqhci_disable()
413 dmam_free_coherent(mmc_dev(mmc), cq_host->data_size, in cqhci_disable()
417 dmam_free_coherent(mmc_dev(mmc), cq_host->desc_size, in cqhci_disable()
542 static void cqhci_prep_dcmd_desc(struct mmc_host *mmc, in cqhci_prep_dcmd_desc() argument
550 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_prep_dcmd_desc()
576 cq_host->ops->update_dcmd_desc(mmc, mrq, &data); in cqhci_prep_dcmd_desc()
580 mmc_hostname(mmc), mrq->cmd->opcode, timing, resp_type); in cqhci_prep_dcmd_desc()
602 static int cqhci_request(struct mmc_host *mmc, struct mmc_request *mrq) in cqhci_request() argument
606 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_request()
610 pr_err("%s: cqhci: not enabled\n", mmc_hostname(mmc)); in cqhci_request()
618 if (!mmc->cqe_on) { in cqhci_request()
620 cq_host->ops->pre_enable(mmc); in cqhci_request()
623 mmc->cqe_on = true; in cqhci_request()
624 pr_debug("%s: cqhci: CQE on\n", mmc_hostname(mmc)); in cqhci_request()
627 mmc_hostname(mmc)); in cqhci_request()
630 cq_host->ops->enable(mmc); in cqhci_request()
639 mmc_hostname(mmc), err); in cqhci_request()
643 cqhci_prep_dcmd_desc(mmc, mrq); in cqhci_request()
662 mmc_hostname(mmc), tag); in cqhci_request()
667 cqhci_post_req(mmc, mrq); in cqhci_request()
672 static void cqhci_recovery_needed(struct mmc_host *mmc, struct mmc_request *mrq, in cqhci_recovery_needed() argument
675 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_recovery_needed()
679 pr_debug("%s: cqhci: recovery needed\n", mmc_hostname(mmc)); in cqhci_recovery_needed()
700 static void cqhci_error_irq(struct mmc_host *mmc, u32 status, int cmd_error, in cqhci_error_irq() argument
703 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_error_irq()
714 mmc_hostname(mmc), status, cmd_error, data_error, terri); in cqhci_error_irq()
722 mmc_hostname(mmc), status, cmd_error, data_error, in cqhci_error_irq()
732 cqhci_recovery_needed(mmc, slot->mrq, true); in cqhci_error_irq()
741 cqhci_recovery_needed(mmc, slot->mrq, true); in cqhci_error_irq()
757 mmc_hostname(mmc), status, tdpe); in cqhci_error_irq()
765 cqhci_recovery_needed(mmc, slot->mrq, true); in cqhci_error_irq()
779 cqhci_recovery_needed(mmc, slot->mrq, true); in cqhci_error_irq()
788 static void cqhci_finish_mrq(struct mmc_host *mmc, unsigned int tag) in cqhci_finish_mrq() argument
790 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_finish_mrq()
797 mmc_hostname(mmc), tag); in cqhci_finish_mrq()
819 mmc_cqe_request_done(mmc, mrq); in cqhci_finish_mrq()
822 irqreturn_t cqhci_irq(struct mmc_host *mmc, u32 intmask, int cmd_error, in cqhci_irq() argument
827 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_irq()
832 pr_debug("%s: cqhci: IRQ status: 0x%08x\n", mmc_hostname(mmc), status); in cqhci_irq()
837 mmc_debugfs_err_stats_inc(mmc, MMC_ERR_CMDQ_RED); in cqhci_irq()
839 mmc_debugfs_err_stats_inc(mmc, MMC_ERR_CMDQ_GCE); in cqhci_irq()
841 mmc_debugfs_err_stats_inc(mmc, MMC_ERR_CMDQ_ICCE); in cqhci_irq()
842 cqhci_error_irq(mmc, status, cmd_error, data_error); in cqhci_irq()
850 mmc_hostname(mmc), comp_status); in cqhci_irq()
857 mmc_hostname(mmc), tag); in cqhci_irq()
858 cqhci_finish_mrq(mmc, tag); in cqhci_irq()
893 static int cqhci_wait_for_idle(struct mmc_host *mmc) in cqhci_wait_for_idle() argument
895 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_wait_for_idle()
903 static bool cqhci_timeout(struct mmc_host *mmc, struct mmc_request *mrq, in cqhci_timeout() argument
906 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_timeout()
916 cqhci_recovery_needed(mmc, mrq, false); in cqhci_timeout()
923 mmc_hostname(mmc), tag, cq_host->qcnt); in cqhci_timeout()
935 static bool cqhci_clear_all_tasks(struct mmc_host *mmc, unsigned int timeout) in cqhci_clear_all_tasks() argument
937 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_clear_all_tasks()
956 mmc_hostname(mmc)); in cqhci_clear_all_tasks()
961 static bool cqhci_halt(struct mmc_host *mmc, unsigned int timeout) in cqhci_halt() argument
963 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_halt()
984 pr_warn("%s: cqhci: Failed to halt\n", mmc_hostname(mmc)); in cqhci_halt()
997 static void cqhci_recovery_start(struct mmc_host *mmc) in cqhci_recovery_start() argument
999 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_recovery_start()
1001 pr_debug("%s: cqhci: %s\n", mmc_hostname(mmc), __func__); in cqhci_recovery_start()
1005 cqhci_halt(mmc, CQHCI_START_HALT_TIMEOUT); in cqhci_recovery_start()
1008 cq_host->ops->disable(mmc, true); in cqhci_recovery_start()
1010 mmc->cqe_on = false; in cqhci_recovery_start()
1049 mmc_cqe_request_done(cq_host->mmc, mrq); in cqhci_recover_mrq()
1070 static void cqhci_recovery_finish(struct mmc_host *mmc) in cqhci_recovery_finish() argument
1072 struct cqhci_host *cq_host = mmc->cqe_private; in cqhci_recovery_finish()
1077 pr_debug("%s: cqhci: %s\n", mmc_hostname(mmc), __func__); in cqhci_recovery_finish()
1081 ok = cqhci_halt(mmc, CQHCI_FINISH_HALT_TIMEOUT); in cqhci_recovery_finish()
1089 if (!cqhci_clear_all_tasks(mmc, CQHCI_CLEAR_TIMEOUT)) in cqhci_recovery_finish()
1101 cqhci_halt(mmc, CQHCI_FINISH_HALT_TIMEOUT); in cqhci_recovery_finish()
1104 cqhci_clear_all_tasks(mmc, CQHCI_CLEAR_TIMEOUT); in cqhci_recovery_finish()
1113 mmc->cqe_on = false; in cqhci_recovery_finish()
1123 pr_debug("%s: cqhci: recovery done\n", mmc_hostname(mmc)); in cqhci_recovery_finish()
1179 int cqhci_init(struct cqhci_host *cq_host, struct mmc_host *mmc, in cqhci_init() argument
1185 cq_host->mmc = mmc; in cqhci_init()
1186 cq_host->mmc->cqe_private = cq_host; in cqhci_init()
1191 mmc->cqe_ops = &cqhci_cqe_ops; in cqhci_init()
1193 mmc->cqe_qdepth = NUM_SLOTS; in cqhci_init()
1194 if (mmc->caps2 & MMC_CAP2_CQE_DCMD) in cqhci_init()
1195 mmc->cqe_qdepth -= 1; in cqhci_init()
1197 cq_host->slot = devm_kcalloc(mmc_dev(mmc), cq_host->num_slots, in cqhci_init()
1207 mmc_hostname(mmc)); in cqhci_init()
1217 mmc_hostname(mmc), cqhci_ver_major(cq_host), in cqhci_init()
1224 mmc_hostname(mmc), cqhci_ver_major(cq_host), in cqhci_init()