Lines Matching full:mmc
3 * linux/drivers/mmc/host/mxcmmc.c - Freescale i.MX MMCI driver
25 #include <linux/mmc/host.h>
26 #include <linux/mmc/card.h>
35 #include <linux/mmc/slot-gpio.h>
39 #include <linux/platform_data/mmc-mxcmmc.h>
43 #define DRIVER_NAME "mxc-mmc"
120 struct mmc_host *mmc; member
161 .compatible = "fsl,imx21-mmc",
164 .compatible = "fsl,imx31-mmc",
221 if (!IS_ERR(host->mmc->supply.vmmc)) { in mxcmci_set_power()
223 mmc_regulator_set_ocr(host->mmc, in mxcmci_set_power()
224 host->mmc->supply.vmmc, vdd); in mxcmci_set_power()
226 mmc_regulator_set_ocr(host->mmc, in mxcmci_set_power()
227 host->mmc->supply.vmmc, 0); in mxcmci_set_power()
231 host->pdata->setpower(mmc_dev(host->mmc), vdd); in mxcmci_set_power()
243 dev_dbg(mmc_dev(host->mmc), "mxcmci_softreset\n"); in mxcmci_softreset()
359 dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); in mxcmci_dma_callback()
387 dev_err(mmc_dev(host->mmc), "unhandled response type 0x%x\n", in mxcmci_start_cmd()
433 mmc_request_done(host->mmc, req); in mxcmci_finish_request()
448 dev_dbg(mmc_dev(host->mmc), "request failed. status: 0x%08x\n", in mxcmci_finish_data()
451 dev_err(mmc_dev(host->mmc), "%s: -EILSEQ\n", __func__); in mxcmci_finish_data()
456 dev_err(mmc_dev(host->mmc), in mxcmci_finish_data()
460 dev_err(mmc_dev(host->mmc), in mxcmci_finish_data()
465 dev_err(mmc_dev(host->mmc), in mxcmci_finish_data()
469 dev_err(mmc_dev(host->mmc), "%s: -EIO\n", __func__); in mxcmci_finish_data()
493 dev_dbg(mmc_dev(host->mmc), "CMD TIMEOUT\n"); in mxcmci_read_response()
496 dev_dbg(mmc_dev(host->mmc), "cmd crc error\n"); in mxcmci_read_response()
722 dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); in mxcmci_irq()
733 mmc_signal_sdio_irq(host->mmc); in mxcmci_irq()
746 mmc_detect_change(host->mmc, msecs_to_jiffies(200)); in mxcmci_irq()
751 static void mxcmci_request(struct mmc_host *mmc, struct mmc_request *req) in mxcmci_request() argument
753 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_request()
815 dev_dbg(mmc_dev(host->mmc), "scaler: %d divider: %d in: %d out: %d\n", in mxcmci_set_clk_rate()
819 static int mxcmci_setup_dma(struct mmc_host *mmc) in mxcmci_setup_dma() argument
821 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_setup_dma()
835 static void mxcmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) in mxcmci_set_ios() argument
837 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_set_ios()
851 ret = mxcmci_setup_dma(mmc); in mxcmci_set_ios()
853 dev_err(mmc_dev(host->mmc), in mxcmci_set_ios()
886 struct mmc_host *mmc = data; in mxcmci_detect_irq() local
888 dev_dbg(mmc_dev(mmc), "%s\n", __func__); in mxcmci_detect_irq()
890 mmc_detect_change(mmc, msecs_to_jiffies(250)); in mxcmci_detect_irq()
894 static int mxcmci_get_ro(struct mmc_host *mmc) in mxcmci_get_ro() argument
896 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_get_ro()
899 return !!host->pdata->get_ro(mmc_dev(mmc)); in mxcmci_get_ro()
902 * context or gpio is invalid), then let the mmc core decide in mxcmci_get_ro()
905 return mmc_gpio_get_ro(mmc); in mxcmci_get_ro()
908 static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) in mxcmci_enable_sdio_irq() argument
910 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_enable_sdio_irq()
964 dev_err(mmc_dev(host->mmc), in mxcmci_watchdog()
968 dev_err(mmc_dev(host->mmc), in mxcmci_watchdog()
981 mmc_request_done(host->mmc, req); in mxcmci_watchdog()
994 struct mmc_host *mmc; in mxcmci_probe() local
1008 mmc = mmc_alloc_host(sizeof(*host), &pdev->dev); in mxcmci_probe()
1009 if (!mmc) in mxcmci_probe()
1012 host = mmc_priv(mmc); in mxcmci_probe()
1022 ret = mmc_of_parse(mmc); in mxcmci_probe()
1025 mmc->ops = &mxcmci_ops; in mxcmci_probe()
1029 mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ; in mxcmci_probe()
1031 mmc->caps |= MMC_CAP_SDIO_IRQ; in mxcmci_probe()
1033 /* MMC core transfer sizes tunable parameters */ in mxcmci_probe()
1034 mmc->max_blk_size = 2048; in mxcmci_probe()
1035 mmc->max_blk_count = 65535; in mxcmci_probe()
1036 mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; in mxcmci_probe()
1037 mmc->max_seg_size = mmc->max_req_size; in mxcmci_probe()
1043 mmc->max_segs = 64; in mxcmci_probe()
1045 host->mmc = mmc; in mxcmci_probe()
1052 dat3_card_detect = mmc_card_is_removable(mmc) && in mxcmci_probe()
1055 ret = mmc_regulator_get_supply(mmc); in mxcmci_probe()
1059 if (!mmc->ocr_avail) { in mxcmci_probe()
1061 mmc->ocr_avail = pdata->ocr_avail; in mxcmci_probe()
1063 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; in mxcmci_probe()
1097 dev_err(mmc_dev(host->mmc), "wrong rev.no. 0x%08x. aborting.\n", in mxcmci_probe()
1102 mmc->f_min = clk_get_rate(host->clk_per) >> 16; in mxcmci_probe()
1103 mmc->f_max = clk_get_rate(host->clk_per) >> 1; in mxcmci_probe()
1134 mmc->max_seg_size = dma_get_max_seg_size( in mxcmci_probe()
1137 dev_info(mmc_dev(host->mmc), "dma not available. Using PIO\n"); in mxcmci_probe()
1146 platform_set_drvdata(pdev, mmc); in mxcmci_probe()
1150 host->mmc); in mxcmci_probe()
1157 ret = mmc_add_host(mmc); in mxcmci_probe()
1173 mmc_free_host(mmc); in mxcmci_probe()
1180 struct mmc_host *mmc = platform_get_drvdata(pdev); in mxcmci_remove() local
1181 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_remove()
1183 mmc_remove_host(mmc); in mxcmci_remove()
1186 host->pdata->exit(&pdev->dev, mmc); in mxcmci_remove()
1194 mmc_free_host(mmc); in mxcmci_remove()
1199 struct mmc_host *mmc = dev_get_drvdata(dev); in mxcmci_suspend() local
1200 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_suspend()
1209 struct mmc_host *mmc = dev_get_drvdata(dev); in mxcmci_resume() local
1210 struct mxcmci_host *host = mmc_priv(mmc); in mxcmci_resume()
1242 MODULE_ALIAS("platform:mxc-mmc");