Lines Matching +full:mmc +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
3 * WM8505/WM8650 SD/MMC Host Controller
14 #include <linux/dma-mapping.h>
26 #include <linux/mmc/host.h>
27 #include <linux/mmc/mmc.h>
28 #include <linux/mmc/sd.h>
33 #define DRIVER_NAME "wmt-sdhc"
36 /* MMC/SD controller registers */
122 /* MMC/SD DMA Controller Registers */
186 struct mmc_host *mmc; member
213 u32 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_set_sd_power()
215 if (enable ^ priv->power_inverted) in wmt_set_sd_power()
220 writeb(reg_tmp, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_set_sd_power()
223 static void wmt_mci_read_response(struct mmc_host *mmc) in wmt_mci_read_response() argument
230 priv = mmc_priv(mmc); in wmt_mci_read_response()
236 tmp_resp = readb(priv->sdmmc_base + SDMMC_RSP); in wmt_mci_read_response()
238 tmp_resp = readb(priv->sdmmc_base + SDMMC_RSP + in wmt_mci_read_response()
242 priv->cmd->resp[idx1] = cpu_to_be32(response); in wmt_mci_read_response()
250 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_start_command()
251 writeb(reg_tmp | CTLR_CMD_START, priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_start_command()
254 static int wmt_mci_send_command(struct mmc_host *mmc, u8 command, u8 cmdtype, in wmt_mci_send_command() argument
260 priv = mmc_priv(mmc); in wmt_mci_send_command()
263 writeb(command, priv->sdmmc_base + SDMMC_CMD); in wmt_mci_send_command()
264 writel(arg, priv->sdmmc_base + SDMMC_ARG); in wmt_mci_send_command()
265 writeb(rsptype, priv->sdmmc_base + SDMMC_RSPTYPE); in wmt_mci_send_command()
268 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
269 writeb(reg_tmp | CTLR_FIFO_RESET, priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
271 /* ensure clock enabled - VT3465 */ in wmt_mci_send_command()
275 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_send_command()
276 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_send_command()
277 writeb(0xFF, priv->sdmmc_base + SDMMC_STS2); in wmt_mci_send_command()
278 writeb(0xFF, priv->sdmmc_base + SDMMC_STS3); in wmt_mci_send_command()
281 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
283 priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
290 writel(DMA_ISR_INT_STS, priv->sdmmc_base + SDDMA_ISR); in wmt_mci_disable_dma()
291 writel(0, priv->sdmmc_base + SDDMA_IER); in wmt_mci_disable_dma()
297 req = priv->req; in wmt_complete_data_request()
299 req->data->bytes_xfered = req->data->blksz * req->data->blocks; in wmt_complete_data_request()
302 if (req->data->flags & MMC_DATA_WRITE) in wmt_complete_data_request()
303 dma_unmap_sg(mmc_dev(priv->mmc), req->data->sg, in wmt_complete_data_request()
304 req->data->sg_len, DMA_TO_DEVICE); in wmt_complete_data_request()
306 dma_unmap_sg(mmc_dev(priv->mmc), req->data->sg, in wmt_complete_data_request()
307 req->data->sg_len, DMA_FROM_DEVICE); in wmt_complete_data_request()
310 if ((req->cmd->error) || (req->data->error)) in wmt_complete_data_request()
311 mmc_request_done(priv->mmc, req); in wmt_complete_data_request()
313 wmt_mci_read_response(priv->mmc); in wmt_complete_data_request()
314 if (!req->data->stop) { in wmt_complete_data_request()
315 /* single-block read/write requests end here */ in wmt_complete_data_request()
316 mmc_request_done(priv->mmc, req); in wmt_complete_data_request()
319 * we change the priv->cmd variable so the response is in wmt_complete_data_request()
323 priv->comp_cmd = &priv->cmdcomp; in wmt_complete_data_request()
324 init_completion(priv->comp_cmd); in wmt_complete_data_request()
325 priv->cmd = req->data->stop; in wmt_complete_data_request()
326 wmt_mci_send_command(priv->mmc, req->data->stop->opcode, in wmt_complete_data_request()
327 7, req->data->stop->arg, 9); in wmt_complete_data_request()
341 status = readl(priv->sdmmc_base + SDDMA_CCR) & 0x0F; in wmt_mci_dma_isr()
344 dev_err(priv->dev, "DMA Error: Status = %d\n", status); in wmt_mci_dma_isr()
345 priv->req->data->error = -ETIMEDOUT; in wmt_mci_dma_isr()
346 complete(priv->comp_dma); in wmt_mci_dma_isr()
350 priv->req->data->error = 0; in wmt_mci_dma_isr()
354 complete(priv->comp_dma); in wmt_mci_dma_isr()
356 if (priv->comp_cmd) { in wmt_mci_dma_isr()
357 if (completion_done(priv->comp_cmd)) { in wmt_mci_dma_isr()
381 status0 = readb(priv->sdmmc_base + SDMMC_STS0); in wmt_mci_regular_isr()
382 status1 = readb(priv->sdmmc_base + SDMMC_STS1); in wmt_mci_regular_isr()
383 status2 = readb(priv->sdmmc_base + SDMMC_STS2); in wmt_mci_regular_isr()
386 reg_tmp = readb(priv->sdmmc_base + SDMMC_INTMASK0); in wmt_mci_regular_isr()
388 mmc_detect_change(priv->mmc, 0); in wmt_mci_regular_isr()
389 if (priv->cmd) in wmt_mci_regular_isr()
390 priv->cmd->error = -ETIMEDOUT; in wmt_mci_regular_isr()
391 if (priv->comp_cmd) in wmt_mci_regular_isr()
392 complete(priv->comp_cmd); in wmt_mci_regular_isr()
393 if (priv->comp_dma) { in wmt_mci_regular_isr()
395 complete(priv->comp_dma); in wmt_mci_regular_isr()
397 writeb(STS0_DEVICE_INS, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_regular_isr()
401 if ((!priv->req->data) || in wmt_mci_regular_isr()
402 ((priv->req->data->stop) && (priv->cmd == priv->req->data->stop))) { in wmt_mci_regular_isr()
403 /* handle non-data & stop_transmission requests */ in wmt_mci_regular_isr()
405 priv->cmd->error = 0; in wmt_mci_regular_isr()
409 priv->cmd->error = -ETIMEDOUT; in wmt_mci_regular_isr()
414 priv->comp_cmd = NULL; in wmt_mci_regular_isr()
416 if (!priv->cmd->error) in wmt_mci_regular_isr()
417 wmt_mci_read_response(priv->mmc); in wmt_mci_regular_isr()
419 priv->cmd = NULL; in wmt_mci_regular_isr()
421 mmc_request_done(priv->mmc, priv->req); in wmt_mci_regular_isr()
426 if (priv->cmd) in wmt_mci_regular_isr()
427 priv->cmd->error = 0; in wmt_mci_regular_isr()
428 if (priv->comp_cmd) in wmt_mci_regular_isr()
429 complete(priv->comp_cmd); in wmt_mci_regular_isr()
434 if (priv->cmd) in wmt_mci_regular_isr()
435 priv->cmd->error = -ETIMEDOUT; in wmt_mci_regular_isr()
436 if (priv->comp_cmd) in wmt_mci_regular_isr()
437 complete(priv->comp_cmd); in wmt_mci_regular_isr()
438 if (priv->comp_dma) { in wmt_mci_regular_isr()
440 complete(priv->comp_dma); in wmt_mci_regular_isr()
444 if (priv->comp_dma) { in wmt_mci_regular_isr()
450 if (completion_done(priv->comp_dma)) in wmt_mci_regular_isr()
455 writeb(status0, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_regular_isr()
456 writeb(status1, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_regular_isr()
457 writeb(status2, priv->sdmmc_base + SDMMC_STS2); in wmt_mci_regular_isr()
462 static void wmt_reset_hardware(struct mmc_host *mmc) in wmt_reset_hardware() argument
467 priv = mmc_priv(mmc); in wmt_reset_hardware()
470 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_reset_hardware()
471 writeb(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_reset_hardware()
474 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_reset_hardware()
475 writeb(reg_tmp | CTLR_FIFO_RESET, priv->sdmmc_base + SDMMC_CTLR); in wmt_reset_hardware()
478 writew(BLKL_INT_ENABLE | BLKL_GPI_CD, priv->sdmmc_base + SDMMC_BLKLEN); in wmt_reset_hardware()
481 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_reset_hardware()
482 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_reset_hardware()
485 writeb(INT0_CD_INT_EN | INT0_DI_INT_EN, priv->sdmmc_base + in wmt_reset_hardware()
488 INT1_CMD_RES_TOUT_INT_EN, priv->sdmmc_base + SDMMC_INTMASK1); in wmt_reset_hardware()
491 writew(8191, priv->sdmmc_base + SDMMC_DMATIMEOUT); in wmt_reset_hardware()
494 reg_tmp = readb(priv->sdmmc_base + SDMMC_STS2); in wmt_reset_hardware()
495 writeb(reg_tmp | STS2_DIS_FORCECLK, priv->sdmmc_base + SDMMC_STS2); in wmt_reset_hardware()
498 clk_set_rate(priv->clk_sdmmc, 400000); in wmt_reset_hardware()
501 static int wmt_dma_init(struct mmc_host *mmc) in wmt_dma_init() argument
505 priv = mmc_priv(mmc); in wmt_dma_init()
507 writel(DMA_GCR_SOFT_RESET, priv->sdmmc_base + SDDMA_GCR); in wmt_dma_init()
508 writel(DMA_GCR_DMA_EN, priv->sdmmc_base + SDDMA_GCR); in wmt_dma_init()
509 if ((readl(priv->sdmmc_base + SDDMA_GCR) & DMA_GCR_DMA_EN) != 0) in wmt_dma_init()
518 desc->flags = 0x40000000 | req_count; in wmt_dma_init_descriptor()
520 desc->flags |= 0x80000000; in wmt_dma_init_descriptor()
521 desc->data_buffer_addr = buffer_addr; in wmt_dma_init_descriptor()
522 desc->branch_addr = branch_addr; in wmt_dma_init_descriptor()
525 static void wmt_dma_config(struct mmc_host *mmc, u32 descaddr, u8 dir) in wmt_dma_config() argument
530 priv = mmc_priv(mmc); in wmt_dma_config()
533 writel(DMA_IER_INT_EN, priv->sdmmc_base + SDDMA_IER); in wmt_dma_config()
536 writel(descaddr, priv->sdmmc_base + SDDMA_DESPR); in wmt_dma_config()
538 writel(0x00, priv->sdmmc_base + SDDMA_CCR); in wmt_dma_config()
541 reg_tmp = readl(priv->sdmmc_base + SDDMA_CCR); in wmt_dma_config()
542 writel(reg_tmp & DMA_CCR_IF_TO_PERIPHERAL, priv->sdmmc_base + in wmt_dma_config()
545 reg_tmp = readl(priv->sdmmc_base + SDDMA_CCR); in wmt_dma_config()
546 writel(reg_tmp | DMA_CCR_PERIPHERAL_TO_IF, priv->sdmmc_base + in wmt_dma_config()
555 reg_tmp = readl(priv->sdmmc_base + SDDMA_CCR); in wmt_dma_start()
556 writel(reg_tmp | DMA_CCR_RUN, priv->sdmmc_base + SDDMA_CCR); in wmt_dma_start()
559 static void wmt_mci_request(struct mmc_host *mmc, struct mmc_request *req) in wmt_mci_request() argument
576 priv = mmc_priv(mmc); in wmt_mci_request()
577 priv->req = req; in wmt_mci_request()
581 * This is required on multi-block requests to pass the pointer to the in wmt_mci_request()
584 priv->cmd = req->cmd; in wmt_mci_request()
586 command = req->cmd->opcode; in wmt_mci_request()
587 arg = req->cmd->arg; in wmt_mci_request()
588 rsptype = mmc_resp_type(req->cmd); in wmt_mci_request()
591 /* rsptype=7 only valid for SPI commands - should be =2 for SD */ in wmt_mci_request()
598 if (!req->data) { in wmt_mci_request()
599 wmt_mci_send_command(mmc, command, cmdtype, arg, rsptype); in wmt_mci_request()
603 if (req->data) { in wmt_mci_request()
604 priv->comp_cmd = &priv->cmdcomp; in wmt_mci_request()
605 init_completion(priv->comp_cmd); in wmt_mci_request()
607 wmt_dma_init(mmc); in wmt_mci_request()
610 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_request()
611 writew((reg_tmp & 0xF800) | (req->data->blksz - 1), in wmt_mci_request()
612 priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_request()
615 writew(req->data->blocks, priv->sdmmc_base + SDMMC_BLKCNT); in wmt_mci_request()
617 desc = (struct wmt_dma_descriptor *)priv->dma_desc_buffer; in wmt_mci_request()
619 if (req->data->flags & MMC_DATA_WRITE) { in wmt_mci_request()
620 sg_cnt = dma_map_sg(mmc_dev(mmc), req->data->sg, in wmt_mci_request()
621 req->data->sg_len, DMA_TO_DEVICE); in wmt_mci_request()
623 if (req->data->blocks > 1) in wmt_mci_request()
626 sg_cnt = dma_map_sg(mmc_dev(mmc), req->data->sg, in wmt_mci_request()
627 req->data->sg_len, DMA_FROM_DEVICE); in wmt_mci_request()
629 if (req->data->blocks > 1) in wmt_mci_request()
633 dma_address = priv->dma_desc_device_addr + 16; in wmt_mci_request()
636 for_each_sg(req->data->sg, sg, sg_cnt, i) { in wmt_mci_request()
639 wmt_dma_init_descriptor(desc, req->data->blksz, in wmt_mci_request()
644 offset += req->data->blksz; in wmt_mci_request()
646 if (desc_cnt == req->data->blocks) in wmt_mci_request()
650 desc--; in wmt_mci_request()
651 desc->flags |= 0x80000000; in wmt_mci_request()
653 if (req->data->flags & MMC_DATA_WRITE) in wmt_mci_request()
654 wmt_dma_config(mmc, priv->dma_desc_device_addr, in wmt_mci_request()
657 wmt_dma_config(mmc, priv->dma_desc_device_addr, in wmt_mci_request()
660 wmt_mci_send_command(mmc, command, cmdtype, arg, rsptype); in wmt_mci_request()
662 priv->comp_dma = &priv->datacomp; in wmt_mci_request()
663 init_completion(priv->comp_dma); in wmt_mci_request()
670 static void wmt_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) in wmt_mci_set_ios() argument
675 priv = mmc_priv(mmc); in wmt_mci_set_ios()
677 if (ios->power_mode == MMC_POWER_UP) { in wmt_mci_set_ios()
678 wmt_reset_hardware(mmc); in wmt_mci_set_ios()
682 if (ios->power_mode == MMC_POWER_OFF) in wmt_mci_set_ios()
685 if (ios->clock != 0) in wmt_mci_set_ios()
686 clk_set_rate(priv->clk_sdmmc, ios->clock); in wmt_mci_set_ios()
688 busmode = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_set_ios()
689 extctrl = readb(priv->sdmmc_base + SDMMC_EXTCTRL); in wmt_mci_set_ios()
694 switch (ios->bus_width) { in wmt_mci_set_ios()
706 writeb(busmode, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_set_ios()
707 writeb(extctrl, priv->sdmmc_base + SDMMC_EXTCTRL); in wmt_mci_set_ios()
710 static int wmt_mci_get_ro(struct mmc_host *mmc) in wmt_mci_get_ro() argument
712 struct wmt_mci_priv *priv = mmc_priv(mmc); in wmt_mci_get_ro()
714 return !(readb(priv->sdmmc_base + SDMMC_STS0) & STS0_WRITE_PROTECT); in wmt_mci_get_ro()
717 static int wmt_mci_get_cd(struct mmc_host *mmc) in wmt_mci_get_cd() argument
719 struct wmt_mci_priv *priv = mmc_priv(mmc); in wmt_mci_get_cd()
720 u32 cd = (readb(priv->sdmmc_base + SDMMC_STS0) & STS0_CD_GPI) >> 3; in wmt_mci_get_cd()
722 return !(cd ^ priv->cd_inverted); in wmt_mci_get_cd()
745 { .compatible = "wm,wm8505-sdhc", .data = &wm8505_caps },
751 struct mmc_host *mmc; in wmt_mci_probe() local
753 struct device_node *np = pdev->dev.of_node; in wmt_mci_probe()
755 of_match_device(wmt_mci_dt_ids, &pdev->dev); in wmt_mci_probe()
760 if (!of_id || !of_id->data) { in wmt_mci_probe()
761 dev_err(&pdev->dev, "Controller capabilities data missing\n"); in wmt_mci_probe()
762 return -EFAULT; in wmt_mci_probe()
765 wmt_caps = of_id->data; in wmt_mci_probe()
768 dev_err(&pdev->dev, "Missing SDMMC description in devicetree\n"); in wmt_mci_probe()
769 return -EFAULT; in wmt_mci_probe()
776 dev_err(&pdev->dev, "Getting IRQs failed!\n"); in wmt_mci_probe()
777 ret = -ENXIO; in wmt_mci_probe()
781 mmc = mmc_alloc_host(sizeof(struct wmt_mci_priv), &pdev->dev); in wmt_mci_probe()
782 if (!mmc) { in wmt_mci_probe()
783 dev_err(&pdev->dev, "Failed to allocate mmc_host\n"); in wmt_mci_probe()
784 ret = -ENOMEM; in wmt_mci_probe()
788 mmc->ops = &wmt_mci_ops; in wmt_mci_probe()
789 mmc->f_min = wmt_caps->f_min; in wmt_mci_probe()
790 mmc->f_max = wmt_caps->f_max; in wmt_mci_probe()
791 mmc->ocr_avail = wmt_caps->ocr_avail; in wmt_mci_probe()
792 mmc->caps = wmt_caps->caps; in wmt_mci_probe()
794 mmc->max_seg_size = wmt_caps->max_seg_size; in wmt_mci_probe()
795 mmc->max_segs = wmt_caps->max_segs; in wmt_mci_probe()
796 mmc->max_blk_size = wmt_caps->max_blk_size; in wmt_mci_probe()
798 mmc->max_req_size = (16*512*mmc->max_segs); in wmt_mci_probe()
799 mmc->max_blk_count = mmc->max_req_size / 512; in wmt_mci_probe()
801 priv = mmc_priv(mmc); in wmt_mci_probe()
802 priv->mmc = mmc; in wmt_mci_probe()
803 priv->dev = &pdev->dev; in wmt_mci_probe()
805 priv->power_inverted = 0; in wmt_mci_probe()
806 priv->cd_inverted = 0; in wmt_mci_probe()
808 if (of_get_property(np, "sdon-inverted", NULL)) in wmt_mci_probe()
809 priv->power_inverted = 1; in wmt_mci_probe()
810 if (of_get_property(np, "cd-inverted", NULL)) in wmt_mci_probe()
811 priv->cd_inverted = 1; in wmt_mci_probe()
813 priv->sdmmc_base = of_iomap(np, 0); in wmt_mci_probe()
814 if (!priv->sdmmc_base) { in wmt_mci_probe()
815 dev_err(&pdev->dev, "Failed to map IO space\n"); in wmt_mci_probe()
816 ret = -ENOMEM; in wmt_mci_probe()
820 priv->irq_regular = regular_irq; in wmt_mci_probe()
821 priv->irq_dma = dma_irq; in wmt_mci_probe()
825 dev_err(&pdev->dev, "Register regular IRQ fail\n"); in wmt_mci_probe()
831 dev_err(&pdev->dev, "Register DMA IRQ fail\n"); in wmt_mci_probe()
836 priv->dma_desc_buffer = dma_alloc_coherent(&pdev->dev, in wmt_mci_probe()
837 mmc->max_blk_count * 16, in wmt_mci_probe()
838 &priv->dma_desc_device_addr, in wmt_mci_probe()
840 if (!priv->dma_desc_buffer) { in wmt_mci_probe()
841 dev_err(&pdev->dev, "DMA alloc fail\n"); in wmt_mci_probe()
842 ret = -EPERM; in wmt_mci_probe()
846 platform_set_drvdata(pdev, mmc); in wmt_mci_probe()
848 priv->clk_sdmmc = of_clk_get(np, 0); in wmt_mci_probe()
849 if (IS_ERR(priv->clk_sdmmc)) { in wmt_mci_probe()
850 dev_err(&pdev->dev, "Error getting clock\n"); in wmt_mci_probe()
851 ret = PTR_ERR(priv->clk_sdmmc); in wmt_mci_probe()
855 ret = clk_prepare_enable(priv->clk_sdmmc); in wmt_mci_probe()
860 wmt_reset_hardware(mmc); in wmt_mci_probe()
862 mmc_add_host(mmc); in wmt_mci_probe()
864 dev_info(&pdev->dev, "WMT SDHC Controller initialized\n"); in wmt_mci_probe()
868 clk_put(priv->clk_sdmmc); in wmt_mci_probe()
874 iounmap(priv->sdmmc_base); in wmt_mci_probe()
876 mmc_free_host(mmc); in wmt_mci_probe()
883 struct mmc_host *mmc; in wmt_mci_remove() local
888 mmc = platform_get_drvdata(pdev); in wmt_mci_remove()
889 priv = mmc_priv(mmc); in wmt_mci_remove()
892 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_remove()
893 writel(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_remove()
894 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_remove()
895 writew(reg_tmp & ~(0xA000), priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_remove()
896 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_remove()
897 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_remove()
900 dma_free_coherent(&pdev->dev, priv->mmc->max_blk_count * 16, in wmt_mci_remove()
901 priv->dma_desc_buffer, priv->dma_desc_device_addr); in wmt_mci_remove()
903 mmc_remove_host(mmc); in wmt_mci_remove()
905 free_irq(priv->irq_regular, priv); in wmt_mci_remove()
906 free_irq(priv->irq_dma, priv); in wmt_mci_remove()
908 iounmap(priv->sdmmc_base); in wmt_mci_remove()
910 clk_disable_unprepare(priv->clk_sdmmc); in wmt_mci_remove()
911 clk_put(priv->clk_sdmmc); in wmt_mci_remove()
914 release_mem_region(res->start, resource_size(res)); in wmt_mci_remove()
916 mmc_free_host(mmc); in wmt_mci_remove()
918 dev_info(&pdev->dev, "WMT MCI device removed\n"); in wmt_mci_remove()
927 struct mmc_host *mmc = dev_get_drvdata(dev); in wmt_mci_suspend() local
930 if (!mmc) in wmt_mci_suspend()
933 priv = mmc_priv(mmc); in wmt_mci_suspend()
934 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_suspend()
935 writeb(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + in wmt_mci_suspend()
938 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_suspend()
939 writew(reg_tmp & 0x5FFF, priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_suspend()
941 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_suspend()
942 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_suspend()
944 clk_disable(priv->clk_sdmmc); in wmt_mci_suspend()
951 struct mmc_host *mmc = dev_get_drvdata(dev); in wmt_mci_resume() local
954 if (mmc) { in wmt_mci_resume()
955 priv = mmc_priv(mmc); in wmt_mci_resume()
956 clk_enable(priv->clk_sdmmc); in wmt_mci_resume()
958 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_resume()
959 writeb(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + in wmt_mci_resume()
962 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_resume()
964 priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_resume()
966 reg_tmp = readb(priv->sdmmc_base + SDMMC_INTMASK0); in wmt_mci_resume()
967 writeb(reg_tmp | INT0_DI_INT_EN, priv->sdmmc_base + in wmt_mci_resume()
1001 MODULE_DESCRIPTION("Wondermedia MMC/SD Driver");