Lines Matching refs:sh_chan
152 struct sh_dmae_chan *sh_chan = shdev->chan[i];
153 if (sh_chan)
154 channel_clear(sh_chan);
175 static bool dmae_is_busy(struct sh_dmae_chan *sh_chan)
177 u32 chcr = chcr_read(sh_chan);
185 static unsigned int calc_xmit_shift(struct sh_dmae_chan *sh_chan, u32 chcr)
187 struct sh_dmae_device *shdev = to_sh_dev(sh_chan);
198 static u32 log2size_to_chcr(struct sh_dmae_chan *sh_chan, int l2size)
200 struct sh_dmae_device *shdev = to_sh_dev(sh_chan);
215 static void dmae_set_reg(struct sh_dmae_chan *sh_chan, struct sh_dmae_regs *hw)
217 sh_dmae_writel(sh_chan, hw->sar, SAR);
218 sh_dmae_writel(sh_chan, hw->dar, DAR);
219 sh_dmae_writel(sh_chan, hw->tcr >> sh_chan->xmit_shift, TCR);
222 static void dmae_start(struct sh_dmae_chan *sh_chan)
224 struct sh_dmae_device *shdev = to_sh_dev(sh_chan);
225 u32 chcr = chcr_read(sh_chan);
228 sh_dmae_writel(sh_chan, 0xFFFFFFFF, TEND);
231 chcr_write(sh_chan, chcr & ~CHCR_TE);
234 static void dmae_init(struct sh_dmae_chan *sh_chan)
239 u32 chcr = DM_INC | SM_INC | RS_AUTO | log2size_to_chcr(sh_chan,
241 sh_chan->xmit_shift = calc_xmit_shift(sh_chan, chcr);
242 chcr_write(sh_chan, chcr);
245 static int dmae_set_chcr(struct sh_dmae_chan *sh_chan, u32 val)
248 if (dmae_is_busy(sh_chan))
251 sh_chan->xmit_shift = calc_xmit_shift(sh_chan, val);
252 chcr_write(sh_chan, val);
257 static int dmae_set_dmars(struct sh_dmae_chan *sh_chan, u16 val)
259 struct sh_dmae_device *shdev = to_sh_dev(sh_chan);
261 const struct sh_dmae_channel *chan_pdata = &pdata->channel[sh_chan->shdma_chan.id];
265 if (dmae_is_busy(sh_chan))
285 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
289 dev_dbg(sh_chan->shdma_chan.dev, "Queue #%d to %d: %u@%x -> %x\n",
290 sdesc->async_tx.cookie, sh_chan->shdma_chan.id,
293 dmae_set_reg(sh_chan, &sh_desc->hw);
294 dmae_start(sh_chan);
299 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
301 return dmae_is_busy(sh_chan);
307 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
312 sh_chan->config;
314 dmae_set_dmars(sh_chan, cfg->mid_rid);
315 dmae_set_chcr(sh_chan, cfg->chcr);
317 dmae_init(sh_chan);
326 struct sh_dmae_chan *sh_chan, int match)
328 struct sh_dmae_device *shdev = to_sh_dev(sh_chan);
333 if (!sh_chan->shdma_chan.dev->of_node) {
343 sh_chan->shdma_chan.slave_id = i;
354 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
356 const struct sh_dmae_slave_config *cfg = dmae_find_slave(sh_chan, slave_id);
361 sh_chan->config = cfg;
362 sh_chan->slave_addr = slave_addr ? : cfg->addr;
368 static void dmae_halt(struct sh_dmae_chan *sh_chan)
370 struct sh_dmae_device *shdev = to_sh_dev(sh_chan);
371 u32 chcr = chcr_read(sh_chan);
374 chcr_write(sh_chan, chcr);
396 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
398 dmae_halt(sh_chan);
403 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
406 if (!(chcr_read(sh_chan) & CHCR_TE))
410 dmae_halt(sh_chan);
418 struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
423 (sh_dmae_readl(sh_chan, TCR) << sh_chan->xmit_shift);
456 struct sh_dmae_chan *sh_chan = container_of(schan,
460 u32 sar_buf = sh_dmae_readl(sh_chan, SAR);
461 u32 dar_buf = sh_dmae_readl(sh_chan, DAR);
523 struct sh_dmae_chan *sh_chan;
527 sh_chan = devm_kzalloc(sdev->dma_dev.dev, sizeof(struct sh_dmae_chan),
529 if (!sh_chan)
532 schan = &sh_chan->shdma_chan;
537 sh_chan->base = shdev->chan_reg + chan_pdata->offset;
541 snprintf(sh_chan->dev_id, sizeof(sh_chan->dev_id),
544 snprintf(sh_chan->dev_id, sizeof(sh_chan->dev_id),
547 err = shdma_request_irq(schan, irq, flags, sh_chan->dev_id);
555 shdev->chan[id] = sh_chan;
612 struct sh_dmae_chan *sh_chan = shdev->chan[i];
614 if (!sh_chan->shdma_chan.desc_num)
617 if (sh_chan->shdma_chan.slave_id >= 0) {
618 const struct sh_dmae_slave_config *cfg = sh_chan->config;
619 dmae_set_dmars(sh_chan, cfg->mid_rid);
620 dmae_set_chcr(sh_chan, cfg->chcr);
622 dmae_init(sh_chan);
638 struct sh_dmae_chan *sh_chan = container_of(schan,
642 * Implicit BUG_ON(!sh_chan->config)
646 return sh_chan->slave_addr;