Lines Matching refs:mc
86 /* mc->vc.lock must be held by caller */
88 uniphier_mdmac_next_desc(struct uniphier_mdmac_chan *mc)
92 vd = vchan_next_desc(&mc->vc);
94 mc->md = NULL;
100 mc->md = to_uniphier_mdmac_desc(vd);
102 return mc->md;
105 /* mc->vc.lock must be held by caller */
106 static void uniphier_mdmac_handle(struct uniphier_mdmac_chan *mc,
109 struct uniphier_mdmac_device *mdev = mc->mdev;
130 writel(src_mode, mc->reg_ch_base + UNIPHIER_MDMAC_CH_SRC_MODE);
131 writel(dest_mode, mc->reg_ch_base + UNIPHIER_MDMAC_CH_DEST_MODE);
132 writel(src_addr, mc->reg_ch_base + UNIPHIER_MDMAC_CH_SRC_ADDR);
133 writel(dest_addr, mc->reg_ch_base + UNIPHIER_MDMAC_CH_DEST_ADDR);
134 writel(chunk_size, mc->reg_ch_base + UNIPHIER_MDMAC_CH_SIZE);
137 writel(irq_flag, mc->reg_ch_base + UNIPHIER_MDMAC_CH_IRQ_REQ);
139 writel(irq_flag, mc->reg_ch_base + UNIPHIER_MDMAC_CH_IRQ_EN);
141 writel(BIT(mc->chan_id), mdev->reg_base + UNIPHIER_MDMAC_CMD);
144 /* mc->vc.lock must be held by caller */
145 static void uniphier_mdmac_start(struct uniphier_mdmac_chan *mc)
149 md = uniphier_mdmac_next_desc(mc);
151 uniphier_mdmac_handle(mc, md);
154 /* mc->vc.lock must be held by caller */
155 static int uniphier_mdmac_abort(struct uniphier_mdmac_chan *mc)
157 struct uniphier_mdmac_device *mdev = mc->mdev;
162 writel(irq_flag, mc->reg_ch_base + UNIPHIER_MDMAC_CH_IRQ_REQ);
164 writel(UNIPHIER_MDMAC_CMD_ABORT | BIT(mc->chan_id),
171 return readl_poll_timeout(mc->reg_ch_base + UNIPHIER_MDMAC_CH_IRQ_REQ,
177 struct uniphier_mdmac_chan *mc = dev_id;
182 spin_lock(&mc->vc.lock);
184 irq_stat = readl(mc->reg_ch_base + UNIPHIER_MDMAC_CH_IRQ_DET);
196 writel(irq_stat, mc->reg_ch_base + UNIPHIER_MDMAC_CH_IRQ_REQ);
201 * check mc->md. If it is NULL, we are aborting.
203 md = mc->md;
211 md = uniphier_mdmac_next_desc(mc);
216 uniphier_mdmac_handle(mc, md);
219 spin_unlock(&mc->vc.lock);
255 struct uniphier_mdmac_chan *mc = to_uniphier_mdmac_chan(vc);
262 if (mc->md) {
263 vchan_terminate_vdesc(&mc->md->vd);
264 mc->md = NULL;
265 ret = uniphier_mdmac_abort(mc);
287 struct uniphier_mdmac_chan *mc;
302 mc = to_uniphier_mdmac_chan(vc);
304 if (mc->md && mc->md->vd.tx.cookie == cookie) {
306 txstate->residue = readl(mc->reg_ch_base +
308 md = mc->md;
331 struct uniphier_mdmac_chan *mc = to_uniphier_mdmac_chan(vc);
336 if (vchan_issue_pending(vc) && !mc->md)
337 uniphier_mdmac_start(mc);
352 struct uniphier_mdmac_chan *mc = &mdev->channels[chan_id];
366 IRQF_SHARED, irq_name, mc);
370 mc->mdev = mdev;
371 mc->reg_ch_base = mdev->reg_base + UNIPHIER_MDMAC_CH_OFFSET +
373 mc->chan_id = chan_id;
374 mc->vc.desc_free = uniphier_mdmac_desc_free;
375 vchan_init(&mc->vc, &mdev->ddev);