Lines Matching refs:priv
214 static void wmt_set_sd_power(struct wmt_mci_priv *priv, int enable) in wmt_set_sd_power() argument
216 u32 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_set_sd_power()
218 if (enable ^ priv->power_inverted) in wmt_set_sd_power()
223 writeb(reg_tmp, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_set_sd_power()
228 struct wmt_mci_priv *priv; in wmt_mci_read_response() local
233 priv = mmc_priv(mmc); in wmt_mci_read_response()
239 tmp_resp = readb(priv->sdmmc_base + SDMMC_RSP); in wmt_mci_read_response()
241 tmp_resp = readb(priv->sdmmc_base + SDMMC_RSP + in wmt_mci_read_response()
245 priv->cmd->resp[idx1] = cpu_to_be32(response); in wmt_mci_read_response()
249 static void wmt_mci_start_command(struct wmt_mci_priv *priv) in wmt_mci_start_command() argument
253 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_start_command()
254 writeb(reg_tmp | CTLR_CMD_START, priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_start_command()
260 struct wmt_mci_priv *priv; in wmt_mci_send_command() local
263 priv = mmc_priv(mmc); in wmt_mci_send_command()
266 writeb(command, priv->sdmmc_base + SDMMC_CMD); in wmt_mci_send_command()
267 writel(arg, priv->sdmmc_base + SDMMC_ARG); in wmt_mci_send_command()
268 writeb(rsptype, priv->sdmmc_base + SDMMC_RSPTYPE); in wmt_mci_send_command()
271 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
272 writeb(reg_tmp | CTLR_FIFO_RESET, priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
275 wmt_set_sd_power(priv, WMT_SD_POWER_ON); in wmt_mci_send_command()
278 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_send_command()
279 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_send_command()
280 writeb(0xFF, priv->sdmmc_base + SDMMC_STS2); in wmt_mci_send_command()
281 writeb(0xFF, priv->sdmmc_base + SDMMC_STS3); in wmt_mci_send_command()
284 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
286 priv->sdmmc_base + SDMMC_CTLR); in wmt_mci_send_command()
291 static void wmt_mci_disable_dma(struct wmt_mci_priv *priv) in wmt_mci_disable_dma() argument
293 writel(DMA_ISR_INT_STS, priv->sdmmc_base + SDDMA_ISR); in wmt_mci_disable_dma()
294 writel(0, priv->sdmmc_base + SDDMA_IER); in wmt_mci_disable_dma()
297 static void wmt_complete_data_request(struct wmt_mci_priv *priv) in wmt_complete_data_request() argument
300 req = priv->req; in wmt_complete_data_request()
306 dma_unmap_sg(mmc_dev(priv->mmc), req->data->sg, in wmt_complete_data_request()
309 dma_unmap_sg(mmc_dev(priv->mmc), req->data->sg, in wmt_complete_data_request()
314 mmc_request_done(priv->mmc, req); in wmt_complete_data_request()
316 wmt_mci_read_response(priv->mmc); in wmt_complete_data_request()
319 mmc_request_done(priv->mmc, req); in wmt_complete_data_request()
326 priv->comp_cmd = &priv->cmdcomp; in wmt_complete_data_request()
327 init_completion(priv->comp_cmd); in wmt_complete_data_request()
328 priv->cmd = req->data->stop; in wmt_complete_data_request()
329 wmt_mci_send_command(priv->mmc, req->data->stop->opcode, in wmt_complete_data_request()
331 wmt_mci_start_command(priv); in wmt_complete_data_request()
338 struct wmt_mci_priv *priv; in wmt_mci_dma_isr() local
342 priv = (struct wmt_mci_priv *)data; in wmt_mci_dma_isr()
344 status = readl(priv->sdmmc_base + SDDMA_CCR) & 0x0F; in wmt_mci_dma_isr()
347 dev_err(priv->dev, "DMA Error: Status = %d\n", status); in wmt_mci_dma_isr()
348 priv->req->data->error = -ETIMEDOUT; in wmt_mci_dma_isr()
349 complete(priv->comp_dma); in wmt_mci_dma_isr()
353 priv->req->data->error = 0; in wmt_mci_dma_isr()
355 wmt_mci_disable_dma(priv); in wmt_mci_dma_isr()
357 complete(priv->comp_dma); in wmt_mci_dma_isr()
359 if (priv->comp_cmd) { in wmt_mci_dma_isr()
360 if (completion_done(priv->comp_cmd)) { in wmt_mci_dma_isr()
366 wmt_complete_data_request(priv); in wmt_mci_dma_isr()
375 struct wmt_mci_priv *priv; in wmt_mci_regular_isr() local
382 priv = (struct wmt_mci_priv *)data; in wmt_mci_regular_isr()
384 status0 = readb(priv->sdmmc_base + SDMMC_STS0); in wmt_mci_regular_isr()
385 status1 = readb(priv->sdmmc_base + SDMMC_STS1); in wmt_mci_regular_isr()
386 status2 = readb(priv->sdmmc_base + SDMMC_STS2); in wmt_mci_regular_isr()
389 reg_tmp = readb(priv->sdmmc_base + SDMMC_INTMASK0); in wmt_mci_regular_isr()
391 mmc_detect_change(priv->mmc, 0); in wmt_mci_regular_isr()
392 if (priv->cmd) in wmt_mci_regular_isr()
393 priv->cmd->error = -ETIMEDOUT; in wmt_mci_regular_isr()
394 if (priv->comp_cmd) in wmt_mci_regular_isr()
395 complete(priv->comp_cmd); in wmt_mci_regular_isr()
396 if (priv->comp_dma) { in wmt_mci_regular_isr()
397 wmt_mci_disable_dma(priv); in wmt_mci_regular_isr()
398 complete(priv->comp_dma); in wmt_mci_regular_isr()
400 writeb(STS0_DEVICE_INS, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_regular_isr()
404 if ((!priv->req->data) || in wmt_mci_regular_isr()
405 ((priv->req->data->stop) && (priv->cmd == priv->req->data->stop))) { in wmt_mci_regular_isr()
408 priv->cmd->error = 0; in wmt_mci_regular_isr()
412 priv->cmd->error = -ETIMEDOUT; in wmt_mci_regular_isr()
417 priv->comp_cmd = NULL; in wmt_mci_regular_isr()
419 if (!priv->cmd->error) in wmt_mci_regular_isr()
420 wmt_mci_read_response(priv->mmc); in wmt_mci_regular_isr()
422 priv->cmd = NULL; in wmt_mci_regular_isr()
424 mmc_request_done(priv->mmc, priv->req); in wmt_mci_regular_isr()
429 if (priv->cmd) in wmt_mci_regular_isr()
430 priv->cmd->error = 0; in wmt_mci_regular_isr()
431 if (priv->comp_cmd) in wmt_mci_regular_isr()
432 complete(priv->comp_cmd); in wmt_mci_regular_isr()
437 if (priv->cmd) in wmt_mci_regular_isr()
438 priv->cmd->error = -ETIMEDOUT; in wmt_mci_regular_isr()
439 if (priv->comp_cmd) in wmt_mci_regular_isr()
440 complete(priv->comp_cmd); in wmt_mci_regular_isr()
441 if (priv->comp_dma) { in wmt_mci_regular_isr()
442 wmt_mci_disable_dma(priv); in wmt_mci_regular_isr()
443 complete(priv->comp_dma); in wmt_mci_regular_isr()
447 if (priv->comp_dma) { in wmt_mci_regular_isr()
453 if (completion_done(priv->comp_dma)) in wmt_mci_regular_isr()
454 wmt_complete_data_request(priv); in wmt_mci_regular_isr()
458 writeb(status0, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_regular_isr()
459 writeb(status1, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_regular_isr()
460 writeb(status2, priv->sdmmc_base + SDMMC_STS2); in wmt_mci_regular_isr()
467 struct wmt_mci_priv *priv; in wmt_reset_hardware() local
470 priv = mmc_priv(mmc); in wmt_reset_hardware()
473 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_reset_hardware()
474 writeb(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_reset_hardware()
477 reg_tmp = readb(priv->sdmmc_base + SDMMC_CTLR); in wmt_reset_hardware()
478 writeb(reg_tmp | CTLR_FIFO_RESET, priv->sdmmc_base + SDMMC_CTLR); in wmt_reset_hardware()
481 writew(BLKL_INT_ENABLE | BLKL_GPI_CD, priv->sdmmc_base + SDMMC_BLKLEN); in wmt_reset_hardware()
484 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_reset_hardware()
485 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_reset_hardware()
488 writeb(INT0_CD_INT_EN | INT0_DI_INT_EN, priv->sdmmc_base + in wmt_reset_hardware()
491 INT1_CMD_RES_TOUT_INT_EN, priv->sdmmc_base + SDMMC_INTMASK1); in wmt_reset_hardware()
494 writew(8191, priv->sdmmc_base + SDMMC_DMATIMEOUT); in wmt_reset_hardware()
497 reg_tmp = readb(priv->sdmmc_base + SDMMC_STS2); in wmt_reset_hardware()
498 writeb(reg_tmp | STS2_DIS_FORCECLK, priv->sdmmc_base + SDMMC_STS2); in wmt_reset_hardware()
501 clk_set_rate(priv->clk_sdmmc, 400000); in wmt_reset_hardware()
506 struct wmt_mci_priv *priv; in wmt_dma_init() local
508 priv = mmc_priv(mmc); in wmt_dma_init()
510 writel(DMA_GCR_SOFT_RESET, priv->sdmmc_base + SDDMA_GCR); in wmt_dma_init()
511 writel(DMA_GCR_DMA_EN, priv->sdmmc_base + SDDMA_GCR); in wmt_dma_init()
512 if ((readl(priv->sdmmc_base + SDDMA_GCR) & DMA_GCR_DMA_EN) != 0) in wmt_dma_init()
530 struct wmt_mci_priv *priv; in wmt_dma_config() local
533 priv = mmc_priv(mmc); in wmt_dma_config()
536 writel(DMA_IER_INT_EN, priv->sdmmc_base + SDDMA_IER); in wmt_dma_config()
539 writel(descaddr, priv->sdmmc_base + SDDMA_DESPR); in wmt_dma_config()
541 writel(0x00, priv->sdmmc_base + SDDMA_CCR); in wmt_dma_config()
544 reg_tmp = readl(priv->sdmmc_base + SDDMA_CCR); in wmt_dma_config()
545 writel(reg_tmp & DMA_CCR_IF_TO_PERIPHERAL, priv->sdmmc_base + in wmt_dma_config()
548 reg_tmp = readl(priv->sdmmc_base + SDDMA_CCR); in wmt_dma_config()
549 writel(reg_tmp | DMA_CCR_PERIPHERAL_TO_IF, priv->sdmmc_base + in wmt_dma_config()
554 static void wmt_dma_start(struct wmt_mci_priv *priv) in wmt_dma_start() argument
558 reg_tmp = readl(priv->sdmmc_base + SDDMA_CCR); in wmt_dma_start()
559 writel(reg_tmp | DMA_CCR_RUN, priv->sdmmc_base + SDDMA_CCR); in wmt_dma_start()
564 struct wmt_mci_priv *priv; in wmt_mci_request() local
579 priv = mmc_priv(mmc); in wmt_mci_request()
580 priv->req = req; in wmt_mci_request()
587 priv->cmd = req->cmd; in wmt_mci_request()
603 wmt_mci_start_command(priv); in wmt_mci_request()
607 priv->comp_cmd = &priv->cmdcomp; in wmt_mci_request()
608 init_completion(priv->comp_cmd); in wmt_mci_request()
613 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_request()
615 priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_request()
618 writew(req->data->blocks, priv->sdmmc_base + SDMMC_BLKCNT); in wmt_mci_request()
620 desc = (struct wmt_dma_descriptor *)priv->dma_desc_buffer; in wmt_mci_request()
636 dma_address = priv->dma_desc_device_addr + 16; in wmt_mci_request()
657 wmt_dma_config(mmc, priv->dma_desc_device_addr, in wmt_mci_request()
660 wmt_dma_config(mmc, priv->dma_desc_device_addr, in wmt_mci_request()
665 priv->comp_dma = &priv->datacomp; in wmt_mci_request()
666 init_completion(priv->comp_dma); in wmt_mci_request()
668 wmt_dma_start(priv); in wmt_mci_request()
669 wmt_mci_start_command(priv); in wmt_mci_request()
675 struct wmt_mci_priv *priv; in wmt_mci_set_ios() local
678 priv = mmc_priv(mmc); in wmt_mci_set_ios()
683 wmt_set_sd_power(priv, WMT_SD_POWER_ON); in wmt_mci_set_ios()
686 wmt_set_sd_power(priv, WMT_SD_POWER_OFF); in wmt_mci_set_ios()
689 clk_set_rate(priv->clk_sdmmc, ios->clock); in wmt_mci_set_ios()
691 busmode = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_set_ios()
692 extctrl = readb(priv->sdmmc_base + SDMMC_EXTCTRL); in wmt_mci_set_ios()
709 writeb(busmode, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_set_ios()
710 writeb(extctrl, priv->sdmmc_base + SDMMC_EXTCTRL); in wmt_mci_set_ios()
715 struct wmt_mci_priv *priv = mmc_priv(mmc); in wmt_mci_get_ro() local
717 return !(readb(priv->sdmmc_base + SDMMC_STS0) & STS0_WRITE_PROTECT); in wmt_mci_get_ro()
722 struct wmt_mci_priv *priv = mmc_priv(mmc); in wmt_mci_get_cd() local
723 u32 cd = (readb(priv->sdmmc_base + SDMMC_STS0) & STS0_CD_GPI) >> 3; in wmt_mci_get_cd()
725 return !(cd ^ priv->cd_inverted); in wmt_mci_get_cd()
755 struct wmt_mci_priv *priv; in wmt_mci_probe() local
804 priv = mmc_priv(mmc); in wmt_mci_probe()
805 priv->mmc = mmc; in wmt_mci_probe()
806 priv->dev = &pdev->dev; in wmt_mci_probe()
808 priv->power_inverted = 0; in wmt_mci_probe()
809 priv->cd_inverted = 0; in wmt_mci_probe()
812 priv->power_inverted = 1; in wmt_mci_probe()
814 priv->cd_inverted = 1; in wmt_mci_probe()
816 priv->sdmmc_base = of_iomap(np, 0); in wmt_mci_probe()
817 if (!priv->sdmmc_base) { in wmt_mci_probe()
823 priv->irq_regular = regular_irq; in wmt_mci_probe()
824 priv->irq_dma = dma_irq; in wmt_mci_probe()
826 ret = request_irq(regular_irq, wmt_mci_regular_isr, 0, "sdmmc", priv); in wmt_mci_probe()
832 ret = request_irq(dma_irq, wmt_mci_dma_isr, 0, "sdmmc", priv); in wmt_mci_probe()
839 priv->dma_desc_buffer = dma_alloc_coherent(&pdev->dev, in wmt_mci_probe()
841 &priv->dma_desc_device_addr, in wmt_mci_probe()
843 if (!priv->dma_desc_buffer) { in wmt_mci_probe()
851 priv->clk_sdmmc = of_clk_get(np, 0); in wmt_mci_probe()
852 if (IS_ERR(priv->clk_sdmmc)) { in wmt_mci_probe()
854 ret = PTR_ERR(priv->clk_sdmmc); in wmt_mci_probe()
858 clk_prepare_enable(priv->clk_sdmmc); in wmt_mci_probe()
869 free_irq(dma_irq, priv); in wmt_mci_probe()
871 free_irq(regular_irq, priv); in wmt_mci_probe()
873 iounmap(priv->sdmmc_base); in wmt_mci_probe()
883 struct wmt_mci_priv *priv; in wmt_mci_remove() local
888 priv = mmc_priv(mmc); in wmt_mci_remove()
891 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_remove()
892 writel(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_remove()
893 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_remove()
894 writew(reg_tmp & ~(0xA000), priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_remove()
895 writeb(0xFF, priv->sdmmc_base + SDMMC_STS0); in wmt_mci_remove()
896 writeb(0xFF, priv->sdmmc_base + SDMMC_STS1); in wmt_mci_remove()
899 dma_free_coherent(&pdev->dev, priv->mmc->max_blk_count * 16, in wmt_mci_remove()
900 priv->dma_desc_buffer, priv->dma_desc_device_addr); in wmt_mci_remove()
904 free_irq(priv->irq_regular, priv); in wmt_mci_remove()
905 free_irq(priv->irq_dma, priv); in wmt_mci_remove()
907 iounmap(priv->sdmmc_base); in wmt_mci_remove()
909 clk_disable_unprepare(priv->clk_sdmmc); in wmt_mci_remove()
910 clk_put(priv->clk_sdmmc); in wmt_mci_remove()
928 struct wmt_mci_priv *priv; in wmt_mci_suspend() local
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()
953 struct wmt_mci_priv *priv; in wmt_mci_resume() local
956 priv = mmc_priv(mmc); in wmt_mci_resume()
957 clk_enable(priv->clk_sdmmc); in wmt_mci_resume()
959 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); in wmt_mci_resume()
960 writeb(reg_tmp | BM_SOFT_RESET, priv->sdmmc_base + in wmt_mci_resume()
963 reg_tmp = readw(priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_resume()
965 priv->sdmmc_base + SDMMC_BLKLEN); in wmt_mci_resume()
967 reg_tmp = readb(priv->sdmmc_base + SDMMC_INTMASK0); in wmt_mci_resume()
968 writeb(reg_tmp | INT0_DI_INT_EN, priv->sdmmc_base + in wmt_mci_resume()