• Home
  • Raw
  • Download

Lines Matching refs:pc

124 	struct mtk_cqdma_pchan *pc;  member
146 struct mtk_cqdma_pchan **pc; member
169 static u32 mtk_dma_read(struct mtk_cqdma_pchan *pc, u32 reg) in mtk_dma_read() argument
171 return readl(pc->base + reg); in mtk_dma_read()
174 static void mtk_dma_write(struct mtk_cqdma_pchan *pc, u32 reg, u32 val) in mtk_dma_write() argument
176 writel_relaxed(val, pc->base + reg); in mtk_dma_write()
179 static void mtk_dma_rmw(struct mtk_cqdma_pchan *pc, u32 reg, in mtk_dma_rmw() argument
184 val = mtk_dma_read(pc, reg); in mtk_dma_rmw()
187 mtk_dma_write(pc, reg, val); in mtk_dma_rmw()
190 static void mtk_dma_set(struct mtk_cqdma_pchan *pc, u32 reg, u32 val) in mtk_dma_set() argument
192 mtk_dma_rmw(pc, reg, 0, val); in mtk_dma_set()
195 static void mtk_dma_clr(struct mtk_cqdma_pchan *pc, u32 reg, u32 val) in mtk_dma_clr() argument
197 mtk_dma_rmw(pc, reg, val, 0); in mtk_dma_clr()
205 static int mtk_cqdma_poll_engine_done(struct mtk_cqdma_pchan *pc, bool atomic) in mtk_cqdma_poll_engine_done() argument
210 return readl_poll_timeout(pc->base + MTK_CQDMA_EN, in mtk_cqdma_poll_engine_done()
216 return readl_poll_timeout_atomic(pc->base + MTK_CQDMA_EN, in mtk_cqdma_poll_engine_done()
223 static int mtk_cqdma_hard_reset(struct mtk_cqdma_pchan *pc) in mtk_cqdma_hard_reset() argument
225 mtk_dma_set(pc, MTK_CQDMA_RESET, MTK_CQDMA_HARD_RST_BIT); in mtk_cqdma_hard_reset()
226 mtk_dma_clr(pc, MTK_CQDMA_RESET, MTK_CQDMA_HARD_RST_BIT); in mtk_cqdma_hard_reset()
228 return mtk_cqdma_poll_engine_done(pc, true); in mtk_cqdma_hard_reset()
231 static void mtk_cqdma_start(struct mtk_cqdma_pchan *pc, in mtk_cqdma_start() argument
235 if (mtk_cqdma_poll_engine_done(pc, true) < 0) in mtk_cqdma_start()
239 mtk_dma_set(pc, MTK_CQDMA_RESET, MTK_CQDMA_WARM_RST_BIT); in mtk_cqdma_start()
240 if (mtk_cqdma_poll_engine_done(pc, true) < 0) in mtk_cqdma_start()
244 mtk_dma_set(pc, MTK_CQDMA_SRC, cvd->src & MTK_CQDMA_ADDR_LIMIT); in mtk_cqdma_start()
246 mtk_dma_set(pc, MTK_CQDMA_SRC2, cvd->src >> MTK_CQDMA_ADDR2_SHFIT); in mtk_cqdma_start()
248 mtk_dma_set(pc, MTK_CQDMA_SRC2, 0); in mtk_cqdma_start()
252 mtk_dma_set(pc, MTK_CQDMA_DST, cvd->dest & MTK_CQDMA_ADDR_LIMIT); in mtk_cqdma_start()
254 mtk_dma_set(pc, MTK_CQDMA_DST2, cvd->dest >> MTK_CQDMA_ADDR2_SHFIT); in mtk_cqdma_start()
256 mtk_dma_set(pc, MTK_CQDMA_DST2, 0); in mtk_cqdma_start()
260 mtk_dma_set(pc, MTK_CQDMA_LEN1, cvd->len); in mtk_cqdma_start()
263 mtk_dma_set(pc, MTK_CQDMA_EN, MTK_CQDMA_EN_BIT); in mtk_cqdma_start()
269 struct mtk_cqdma_pchan *pc = cvc->pc; in mtk_cqdma_issue_vchan_pending() local
274 lockdep_assert_held(&pc->lock); in mtk_cqdma_issue_vchan_pending()
278 if (list_empty(&pc->queue)) in mtk_cqdma_issue_vchan_pending()
284 list_add_tail(&cvd->node, &pc->queue); in mtk_cqdma_issue_vchan_pending()
288 mtk_cqdma_start(pc, cvd); in mtk_cqdma_issue_vchan_pending()
303 list_for_each_entry(cvd, &cvc->pc->queue, node) in mtk_cqdma_is_vchan_active()
314 *mtk_cqdma_consume_work_queue(struct mtk_cqdma_pchan *pc) in mtk_cqdma_consume_work_queue() argument
320 cvd = list_first_entry_or_null(&pc->queue, in mtk_cqdma_consume_work_queue()
351 cvd = list_first_entry_or_null(&pc->queue, in mtk_cqdma_consume_work_queue()
354 mtk_cqdma_start(pc, cvd); in mtk_cqdma_consume_work_queue()
361 struct mtk_cqdma_pchan *pc = from_tasklet(pc, t, tasklet); in mtk_cqdma_tasklet_cb() local
365 spin_lock_irqsave(&pc->lock, flags); in mtk_cqdma_tasklet_cb()
367 cvd = mtk_cqdma_consume_work_queue(pc); in mtk_cqdma_tasklet_cb()
368 spin_unlock_irqrestore(&pc->lock, flags); in mtk_cqdma_tasklet_cb()
383 enable_irq(pc->irq); in mtk_cqdma_tasklet_cb()
395 spin_lock(&cqdma->pc[i]->lock); in mtk_cqdma_irq()
396 if (mtk_dma_read(cqdma->pc[i], in mtk_cqdma_irq()
399 mtk_dma_clr(cqdma->pc[i], MTK_CQDMA_INT_FLAG, in mtk_cqdma_irq()
405 spin_unlock(&cqdma->pc[i]->lock); in mtk_cqdma_irq()
409 disable_irq_nosync(cqdma->pc[i]->irq); in mtk_cqdma_irq()
412 tasklet_schedule(&cqdma->pc[i]->tasklet); in mtk_cqdma_irq()
426 spin_lock_irqsave(&cvc->pc->lock, flags); in mtk_cqdma_find_active_desc()
427 list_for_each_entry(vd, &cvc->pc->queue, node) in mtk_cqdma_find_active_desc()
429 spin_unlock_irqrestore(&cvc->pc->lock, flags); in mtk_cqdma_find_active_desc()
432 spin_unlock_irqrestore(&cvc->pc->lock, flags); in mtk_cqdma_find_active_desc()
477 spin_lock_irqsave(&cvc->pc->lock, pc_flags); in mtk_cqdma_issue_pending()
484 spin_unlock_irqrestore(&cvc->pc->lock, pc_flags); in mtk_cqdma_issue_pending()
579 spin_lock_irqsave(&cvc->pc->lock, pc_flags); in mtk_cqdma_free_active_desc()
589 spin_unlock_irqrestore(&cvc->pc->lock, pc_flags); in mtk_cqdma_free_active_desc()
617 struct mtk_cqdma_pchan *pc = NULL; in mtk_cqdma_alloc_chan_resources() local
623 refcnt = refcount_read(&cqdma->pc[i]->refcnt); in mtk_cqdma_alloc_chan_resources()
625 pc = cqdma->pc[i]; in mtk_cqdma_alloc_chan_resources()
630 if (!pc) in mtk_cqdma_alloc_chan_resources()
633 spin_lock_irqsave(&pc->lock, flags); in mtk_cqdma_alloc_chan_resources()
635 if (!refcount_read(&pc->refcnt)) { in mtk_cqdma_alloc_chan_resources()
637 mtk_cqdma_hard_reset(pc); in mtk_cqdma_alloc_chan_resources()
640 mtk_dma_set(pc, MTK_CQDMA_INT_EN, MTK_CQDMA_INT_EN_BIT); in mtk_cqdma_alloc_chan_resources()
646 refcount_set(&pc->refcnt, 1); in mtk_cqdma_alloc_chan_resources()
648 refcount_inc(&pc->refcnt); in mtk_cqdma_alloc_chan_resources()
651 spin_unlock_irqrestore(&pc->lock, flags); in mtk_cqdma_alloc_chan_resources()
653 vc->pc = pc; in mtk_cqdma_alloc_chan_resources()
666 spin_lock_irqsave(&cvc->pc->lock, flags); in mtk_cqdma_free_chan_resources()
669 if (refcount_dec_and_test(&cvc->pc->refcnt)) { in mtk_cqdma_free_chan_resources()
671 mtk_dma_set(cvc->pc, MTK_CQDMA_FLUSH, MTK_CQDMA_FLUSH_BIT); in mtk_cqdma_free_chan_resources()
674 if (mtk_cqdma_poll_engine_done(cvc->pc, true) < 0) in mtk_cqdma_free_chan_resources()
678 mtk_dma_clr(cvc->pc, MTK_CQDMA_FLUSH, MTK_CQDMA_FLUSH_BIT); in mtk_cqdma_free_chan_resources()
679 mtk_dma_clr(cvc->pc, MTK_CQDMA_INT_FLAG, in mtk_cqdma_free_chan_resources()
683 mtk_dma_clr(cvc->pc, MTK_CQDMA_INT_EN, MTK_CQDMA_INT_EN_BIT); in mtk_cqdma_free_chan_resources()
686 spin_unlock_irqrestore(&cvc->pc->lock, flags); in mtk_cqdma_free_chan_resources()
708 spin_lock_irqsave(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_init()
709 if (mtk_cqdma_hard_reset(cqdma->pc[i]) < 0) { in mtk_cqdma_hw_init()
711 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_init()
718 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_init()
731 spin_lock_irqsave(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_deinit()
732 if (mtk_cqdma_hard_reset(cqdma->pc[i]) < 0) in mtk_cqdma_hw_deinit()
734 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_deinit()
807 cqdma->pc = devm_kcalloc(&pdev->dev, cqdma->dma_channels, in mtk_cqdma_probe()
808 sizeof(*cqdma->pc), GFP_KERNEL); in mtk_cqdma_probe()
809 if (!cqdma->pc) in mtk_cqdma_probe()
814 cqdma->pc[i] = devm_kcalloc(&pdev->dev, 1, in mtk_cqdma_probe()
815 sizeof(**cqdma->pc), GFP_KERNEL); in mtk_cqdma_probe()
816 if (!cqdma->pc[i]) in mtk_cqdma_probe()
819 INIT_LIST_HEAD(&cqdma->pc[i]->queue); in mtk_cqdma_probe()
820 spin_lock_init(&cqdma->pc[i]->lock); in mtk_cqdma_probe()
821 refcount_set(&cqdma->pc[i]->refcnt, 0); in mtk_cqdma_probe()
822 cqdma->pc[i]->base = devm_platform_ioremap_resource(pdev, i); in mtk_cqdma_probe()
823 if (IS_ERR(cqdma->pc[i]->base)) in mtk_cqdma_probe()
824 return PTR_ERR(cqdma->pc[i]->base); in mtk_cqdma_probe()
833 cqdma->pc[i]->irq = res->start; in mtk_cqdma_probe()
835 err = devm_request_irq(&pdev->dev, cqdma->pc[i]->irq, in mtk_cqdma_probe()
881 tasklet_setup(&cqdma->pc[i]->tasklet, mtk_cqdma_tasklet_cb); in mtk_cqdma_probe()
910 spin_lock_irqsave(&cqdma->pc[i]->lock, flags); in mtk_cqdma_remove()
911 mtk_dma_clr(cqdma->pc[i], MTK_CQDMA_INT_EN, in mtk_cqdma_remove()
913 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_remove()
916 synchronize_irq(cqdma->pc[i]->irq); in mtk_cqdma_remove()
918 tasklet_kill(&cqdma->pc[i]->tasklet); in mtk_cqdma_remove()