Lines Matching refs:acdev
225 static void cf_dumpregs(struct arasan_cf_dev *acdev) in cf_dumpregs() argument
227 struct device *dev = acdev->host->dev; in cf_dumpregs()
230 dev_dbg(dev, ": CFI_STS: %x", readl(acdev->vbase + CFI_STS)); in cf_dumpregs()
231 dev_dbg(dev, ": IRQ_STS: %x", readl(acdev->vbase + IRQ_STS)); in cf_dumpregs()
232 dev_dbg(dev, ": IRQ_EN: %x", readl(acdev->vbase + IRQ_EN)); in cf_dumpregs()
233 dev_dbg(dev, ": OP_MODE: %x", readl(acdev->vbase + OP_MODE)); in cf_dumpregs()
234 dev_dbg(dev, ": CLK_CFG: %x", readl(acdev->vbase + CLK_CFG)); in cf_dumpregs()
235 dev_dbg(dev, ": TM_CFG: %x", readl(acdev->vbase + TM_CFG)); in cf_dumpregs()
236 dev_dbg(dev, ": XFER_CTR: %x", readl(acdev->vbase + XFER_CTR)); in cf_dumpregs()
237 dev_dbg(dev, ": GIRQ_STS: %x", readl(acdev->vbase + GIRQ_STS)); in cf_dumpregs()
238 dev_dbg(dev, ": GIRQ_STS_EN: %x", readl(acdev->vbase + GIRQ_STS_EN)); in cf_dumpregs()
239 dev_dbg(dev, ": GIRQ_SGN_EN: %x", readl(acdev->vbase + GIRQ_SGN_EN)); in cf_dumpregs()
244 static void cf_ginterrupt_enable(struct arasan_cf_dev *acdev, bool enable) in cf_ginterrupt_enable() argument
247 writel(enable, acdev->vbase + GIRQ_STS_EN); in cf_ginterrupt_enable()
248 writel(enable, acdev->vbase + GIRQ_SGN_EN); in cf_ginterrupt_enable()
253 cf_interrupt_enable(struct arasan_cf_dev *acdev, u32 mask, bool enable) in cf_interrupt_enable() argument
255 u32 val = readl(acdev->vbase + IRQ_EN); in cf_interrupt_enable()
258 writel(mask, acdev->vbase + IRQ_STS); in cf_interrupt_enable()
259 writel(val | mask, acdev->vbase + IRQ_EN); in cf_interrupt_enable()
261 writel(val & ~mask, acdev->vbase + IRQ_EN); in cf_interrupt_enable()
264 static inline void cf_card_reset(struct arasan_cf_dev *acdev) in cf_card_reset() argument
266 u32 val = readl(acdev->vbase + OP_MODE); in cf_card_reset()
268 writel(val | CARD_RESET, acdev->vbase + OP_MODE); in cf_card_reset()
270 writel(val & ~CARD_RESET, acdev->vbase + OP_MODE); in cf_card_reset()
273 static inline void cf_ctrl_reset(struct arasan_cf_dev *acdev) in cf_ctrl_reset() argument
275 writel(readl(acdev->vbase + OP_MODE) & ~CFHOST_ENB, in cf_ctrl_reset()
276 acdev->vbase + OP_MODE); in cf_ctrl_reset()
277 writel(readl(acdev->vbase + OP_MODE) | CFHOST_ENB, in cf_ctrl_reset()
278 acdev->vbase + OP_MODE); in cf_ctrl_reset()
281 static void cf_card_detect(struct arasan_cf_dev *acdev, bool hotplugged) in cf_card_detect() argument
283 struct ata_port *ap = acdev->host->ports[0]; in cf_card_detect()
285 u32 val = readl(acdev->vbase + CFI_STS); in cf_card_detect()
289 if (acdev->card_present) in cf_card_detect()
291 acdev->card_present = 1; in cf_card_detect()
292 cf_card_reset(acdev); in cf_card_detect()
294 if (!acdev->card_present) in cf_card_detect()
296 acdev->card_present = 0; in cf_card_detect()
305 static int cf_init(struct arasan_cf_dev *acdev) in cf_init() argument
307 struct arasan_cf_pdata *pdata = dev_get_platdata(acdev->host->dev); in cf_init()
312 ret = clk_prepare_enable(acdev->clk); in cf_init()
314 dev_dbg(acdev->host->dev, "clock enable failed"); in cf_init()
318 ret = clk_set_rate(acdev->clk, 166000000); in cf_init()
320 dev_warn(acdev->host->dev, "clock set rate failed"); in cf_init()
321 clk_disable_unprepare(acdev->clk); in cf_init()
325 spin_lock_irqsave(&acdev->host->lock, flags); in cf_init()
332 writel(if_clk, acdev->vbase + CLK_CFG); in cf_init()
334 writel(TRUE_IDE_MODE | CFHOST_ENB, acdev->vbase + OP_MODE); in cf_init()
335 cf_interrupt_enable(acdev, CARD_DETECT_IRQ, 1); in cf_init()
336 cf_ginterrupt_enable(acdev, 1); in cf_init()
337 spin_unlock_irqrestore(&acdev->host->lock, flags); in cf_init()
342 static void cf_exit(struct arasan_cf_dev *acdev) in cf_exit() argument
346 spin_lock_irqsave(&acdev->host->lock, flags); in cf_exit()
347 cf_ginterrupt_enable(acdev, 0); in cf_exit()
348 cf_interrupt_enable(acdev, TRUE_IDE_IRQS, 0); in cf_exit()
349 cf_card_reset(acdev); in cf_exit()
350 writel(readl(acdev->vbase + OP_MODE) & ~CFHOST_ENB, in cf_exit()
351 acdev->vbase + OP_MODE); in cf_exit()
352 spin_unlock_irqrestore(&acdev->host->lock, flags); in cf_exit()
353 clk_disable_unprepare(acdev->clk); in cf_exit()
358 struct arasan_cf_dev *acdev = dev; in dma_callback() local
360 complete(&acdev->dma_completion); in dma_callback()
363 static inline void dma_complete(struct arasan_cf_dev *acdev) in dma_complete() argument
365 struct ata_queued_cmd *qc = acdev->qc; in dma_complete()
368 acdev->qc = NULL; in dma_complete()
369 ata_sff_interrupt(acdev->irq, acdev->host); in dma_complete()
371 spin_lock_irqsave(&acdev->host->lock, flags); in dma_complete()
374 spin_unlock_irqrestore(&acdev->host->lock, flags); in dma_complete()
377 static inline int wait4buf(struct arasan_cf_dev *acdev) in wait4buf() argument
379 if (!wait_for_completion_timeout(&acdev->cf_completion, TIMEOUT)) { in wait4buf()
380 u32 rw = acdev->qc->tf.flags & ATA_TFLAG_WRITE; in wait4buf()
382 dev_err(acdev->host->dev, "%s TimeOut", rw ? "write" : "read"); in wait4buf()
387 if (acdev->dma_status & ATA_DMA_ERR) in wait4buf()
394 dma_xfer(struct arasan_cf_dev *acdev, dma_addr_t src, dma_addr_t dest, u32 len) in dma_xfer() argument
397 struct dma_chan *chan = acdev->dma_chan; in dma_xfer()
404 dev_err(acdev->host->dev, "device_prep_dma_memcpy failed\n"); in dma_xfer()
409 tx->callback_param = acdev; in dma_xfer()
414 dev_err(acdev->host->dev, "dma_submit_error\n"); in dma_xfer()
421 if (!wait_for_completion_timeout(&acdev->dma_completion, TIMEOUT)) { in dma_xfer()
423 dev_err(acdev->host->dev, "wait_for_completion_timeout\n"); in dma_xfer()
430 static int sg_xfer(struct arasan_cf_dev *acdev, struct scatterlist *sg) in sg_xfer() argument
434 u32 write = acdev->qc->tf.flags & ATA_TFLAG_WRITE; in sg_xfer()
441 dest = acdev->pbase + EXT_WRITE_PORT; in sg_xfer()
444 src = acdev->pbase + EXT_READ_PORT; in sg_xfer()
456 spin_lock_irqsave(&acdev->host->lock, flags); in sg_xfer()
457 xfer_ctr = readl(acdev->vbase + XFER_CTR) & in sg_xfer()
460 acdev->vbase + XFER_CTR); in sg_xfer()
461 spin_unlock_irqrestore(&acdev->host->lock, flags); in sg_xfer()
467 ret = wait4buf(acdev); in sg_xfer()
474 ret = dma_xfer(acdev, src, dest, dma_len); in sg_xfer()
476 dev_err(acdev->host->dev, "dma failed"); in sg_xfer()
490 ret = wait4buf(acdev); in sg_xfer()
498 spin_lock_irqsave(&acdev->host->lock, flags); in sg_xfer()
499 writel(readl(acdev->vbase + XFER_CTR) & ~XFER_START, in sg_xfer()
500 acdev->vbase + XFER_CTR); in sg_xfer()
501 spin_unlock_irqrestore(&acdev->host->lock, flags); in sg_xfer()
519 struct arasan_cf_dev *acdev = container_of(work, struct arasan_cf_dev, in data_xfer() local
521 struct ata_queued_cmd *qc = acdev->qc; in data_xfer()
529 acdev->dma_chan = dma_request_chan(acdev->host->dev, "data"); in data_xfer()
530 if (IS_ERR(acdev->dma_chan)) { in data_xfer()
531 dev_err(acdev->host->dev, "Unable to get dma_chan\n"); in data_xfer()
532 acdev->dma_chan = NULL; in data_xfer()
537 ret = sg_xfer(acdev, sg); in data_xfer()
542 dma_release_channel(acdev->dma_chan); in data_xfer()
543 acdev->dma_chan = NULL; in data_xfer()
549 spin_lock_irqsave(&acdev->host->lock, flags); in data_xfer()
551 spin_unlock_irqrestore(&acdev->host->lock, flags); in data_xfer()
553 ata_sff_queue_delayed_work(&acdev->dwork, 1); in data_xfer()
560 cf_dumpregs(acdev); in data_xfer()
563 spin_lock_irqsave(&acdev->host->lock, flags); in data_xfer()
568 cf_ctrl_reset(acdev); in data_xfer()
569 spin_unlock_irqrestore(&acdev->host->lock, flags); in data_xfer()
571 dma_complete(acdev); in data_xfer()
576 struct arasan_cf_dev *acdev = container_of(work, struct arasan_cf_dev, in delayed_finish() local
578 struct ata_queued_cmd *qc = acdev->qc; in delayed_finish()
582 spin_lock_irqsave(&acdev->host->lock, flags); in delayed_finish()
584 spin_unlock_irqrestore(&acdev->host->lock, flags); in delayed_finish()
587 ata_sff_queue_delayed_work(&acdev->dwork, 1); in delayed_finish()
589 dma_complete(acdev); in delayed_finish()
594 struct arasan_cf_dev *acdev = ((struct ata_host *)dev)->private_data; in arasan_cf_interrupt() local
598 irqsts = readl(acdev->vbase + GIRQ_STS); in arasan_cf_interrupt()
602 spin_lock_irqsave(&acdev->host->lock, flags); in arasan_cf_interrupt()
603 irqsts = readl(acdev->vbase + IRQ_STS); in arasan_cf_interrupt()
604 writel(irqsts, acdev->vbase + IRQ_STS); /* clear irqs */ in arasan_cf_interrupt()
605 writel(GIRQ_CF, acdev->vbase + GIRQ_STS); /* clear girqs */ in arasan_cf_interrupt()
611 cf_card_detect(acdev, 1); in arasan_cf_interrupt()
612 spin_unlock_irqrestore(&acdev->host->lock, flags); in arasan_cf_interrupt()
617 acdev->dma_status = ATA_DMA_ERR; in arasan_cf_interrupt()
618 writel(readl(acdev->vbase + XFER_CTR) & ~XFER_START, in arasan_cf_interrupt()
619 acdev->vbase + XFER_CTR); in arasan_cf_interrupt()
620 spin_unlock_irqrestore(&acdev->host->lock, flags); in arasan_cf_interrupt()
621 complete(&acdev->cf_completion); in arasan_cf_interrupt()
622 dev_err(acdev->host->dev, "pio xfer err irq\n"); in arasan_cf_interrupt()
626 spin_unlock_irqrestore(&acdev->host->lock, flags); in arasan_cf_interrupt()
629 complete(&acdev->cf_completion); in arasan_cf_interrupt()
634 struct ata_queued_cmd *qc = acdev->qc; in arasan_cf_interrupt()
638 complete(&acdev->cf_completion); in arasan_cf_interrupt()
646 struct arasan_cf_dev *acdev = ap->host->private_data; in arasan_cf_freeze() local
649 writel(readl(acdev->vbase + XFER_CTR) & ~XFER_START, in arasan_cf_freeze()
650 acdev->vbase + XFER_CTR); in arasan_cf_freeze()
651 cf_ctrl_reset(acdev); in arasan_cf_freeze()
652 acdev->dma_status = ATA_DMA_ERR; in arasan_cf_freeze()
660 struct arasan_cf_dev *acdev = ap->host->private_data; in arasan_cf_error_handler() local
667 cancel_work_sync(&acdev->work); in arasan_cf_error_handler()
668 cancel_delayed_work_sync(&acdev->dwork); in arasan_cf_error_handler()
672 static void arasan_cf_dma_start(struct arasan_cf_dev *acdev) in arasan_cf_dma_start() argument
674 struct ata_queued_cmd *qc = acdev->qc; in arasan_cf_dma_start()
677 u32 xfer_ctr = readl(acdev->vbase + XFER_CTR) & ~XFER_DIR_MASK; in arasan_cf_dma_start()
681 writel(xfer_ctr, acdev->vbase + XFER_CTR); in arasan_cf_dma_start()
684 ata_sff_queue_work(&acdev->work); in arasan_cf_dma_start()
690 struct arasan_cf_dev *acdev = ap->host->private_data; in arasan_cf_qc_issue() local
707 acdev->dma_status = 0; in arasan_cf_qc_issue()
708 acdev->qc = qc; in arasan_cf_qc_issue()
709 arasan_cf_dma_start(acdev); in arasan_cf_qc_issue()
723 struct arasan_cf_dev *acdev = ap->host->private_data; in arasan_cf_set_piomode() local
734 spin_lock_irqsave(&acdev->host->lock, flags); in arasan_cf_set_piomode()
735 val = readl(acdev->vbase + OP_MODE) & in arasan_cf_set_piomode()
737 writel(val, acdev->vbase + OP_MODE); in arasan_cf_set_piomode()
738 val = readl(acdev->vbase + TM_CFG) & ~TRUEIDE_PIO_TIMING_MASK; in arasan_cf_set_piomode()
740 writel(val, acdev->vbase + TM_CFG); in arasan_cf_set_piomode()
742 cf_interrupt_enable(acdev, BUF_AVAIL_IRQ | XFER_DONE_IRQ, 0); in arasan_cf_set_piomode()
743 cf_interrupt_enable(acdev, PIO_XFER_ERR_IRQ, 1); in arasan_cf_set_piomode()
744 spin_unlock_irqrestore(&acdev->host->lock, flags); in arasan_cf_set_piomode()
749 struct arasan_cf_dev *acdev = ap->host->private_data; in arasan_cf_set_dmamode() local
753 spin_lock_irqsave(&acdev->host->lock, flags); in arasan_cf_set_dmamode()
754 opmode = readl(acdev->vbase + OP_MODE) & in arasan_cf_set_dmamode()
756 tmcfg = readl(acdev->vbase + TM_CFG); in arasan_cf_set_dmamode()
769 spin_unlock_irqrestore(&acdev->host->lock, flags); in arasan_cf_set_dmamode()
773 writel(opmode, acdev->vbase + OP_MODE); in arasan_cf_set_dmamode()
774 writel(tmcfg, acdev->vbase + TM_CFG); in arasan_cf_set_dmamode()
775 writel(DMA_XFER_MODE, acdev->vbase + XFER_CTR); in arasan_cf_set_dmamode()
777 cf_interrupt_enable(acdev, PIO_XFER_ERR_IRQ, 0); in arasan_cf_set_dmamode()
778 cf_interrupt_enable(acdev, BUF_AVAIL_IRQ | XFER_DONE_IRQ, 1); in arasan_cf_set_dmamode()
779 spin_unlock_irqrestore(&acdev->host->lock, flags); in arasan_cf_set_dmamode()
793 struct arasan_cf_dev *acdev; in arasan_cf_probe() local
812 acdev = devm_kzalloc(&pdev->dev, sizeof(*acdev), GFP_KERNEL); in arasan_cf_probe()
813 if (!acdev) in arasan_cf_probe()
822 acdev->irq = platform_get_irq(pdev, 0); in arasan_cf_probe()
823 if (acdev->irq) in arasan_cf_probe()
828 acdev->pbase = res->start; in arasan_cf_probe()
829 acdev->vbase = devm_ioremap(&pdev->dev, res->start, in arasan_cf_probe()
831 if (!acdev->vbase) { in arasan_cf_probe()
836 acdev->clk = devm_clk_get(&pdev->dev, NULL); in arasan_cf_probe()
837 if (IS_ERR(acdev->clk)) { in arasan_cf_probe()
839 return PTR_ERR(acdev->clk); in arasan_cf_probe()
850 host->private_data = acdev; in arasan_cf_probe()
851 acdev->host = host; in arasan_cf_probe()
857 init_completion(&acdev->cf_completion); in arasan_cf_probe()
858 init_completion(&acdev->dma_completion); in arasan_cf_probe()
859 INIT_WORK(&acdev->work, data_xfer); in arasan_cf_probe()
860 INIT_DELAYED_WORK(&acdev->dwork, delayed_finish); in arasan_cf_probe()
861 dma_cap_set(DMA_MEMCPY, acdev->mask); in arasan_cf_probe()
876 ap->ioaddr.cmd_addr = acdev->vbase + ATA_DATA_PORT; in arasan_cf_probe()
877 ap->ioaddr.data_addr = acdev->vbase + ATA_DATA_PORT; in arasan_cf_probe()
878 ap->ioaddr.error_addr = acdev->vbase + ATA_ERR_FTR; in arasan_cf_probe()
879 ap->ioaddr.feature_addr = acdev->vbase + ATA_ERR_FTR; in arasan_cf_probe()
880 ap->ioaddr.nsect_addr = acdev->vbase + ATA_SC; in arasan_cf_probe()
881 ap->ioaddr.lbal_addr = acdev->vbase + ATA_SN; in arasan_cf_probe()
882 ap->ioaddr.lbam_addr = acdev->vbase + ATA_CL; in arasan_cf_probe()
883 ap->ioaddr.lbah_addr = acdev->vbase + ATA_CH; in arasan_cf_probe()
884 ap->ioaddr.device_addr = acdev->vbase + ATA_SH; in arasan_cf_probe()
885 ap->ioaddr.status_addr = acdev->vbase + ATA_STS_CMD; in arasan_cf_probe()
886 ap->ioaddr.command_addr = acdev->vbase + ATA_STS_CMD; in arasan_cf_probe()
887 ap->ioaddr.altstatus_addr = acdev->vbase + ATA_ASTS_DCTR; in arasan_cf_probe()
888 ap->ioaddr.ctl_addr = acdev->vbase + ATA_ASTS_DCTR; in arasan_cf_probe()
891 (unsigned long long) res->start, acdev->vbase); in arasan_cf_probe()
893 ret = cf_init(acdev); in arasan_cf_probe()
897 cf_card_detect(acdev, 0); in arasan_cf_probe()
899 ret = ata_host_activate(host, acdev->irq, irq_handler, 0, in arasan_cf_probe()
904 cf_exit(acdev); in arasan_cf_probe()
912 struct arasan_cf_dev *acdev = host->ports[0]->private_data; in arasan_cf_remove() local
915 cf_exit(acdev); in arasan_cf_remove()
924 struct arasan_cf_dev *acdev = host->ports[0]->private_data; in arasan_cf_suspend() local
926 if (acdev->dma_chan) in arasan_cf_suspend()
927 dmaengine_terminate_all(acdev->dma_chan); in arasan_cf_suspend()
929 cf_exit(acdev); in arasan_cf_suspend()
936 struct arasan_cf_dev *acdev = host->ports[0]->private_data; in arasan_cf_resume() local
938 cf_init(acdev); in arasan_cf_resume()