idma64c 59 drivers/dma/idma64.c static void idma64_chan_init(struct idma64 *idma64, struct idma64_chan *idma64c) idma64c 67 drivers/dma/idma64.c channel_writel(idma64c, CFG_LO, cfglo); idma64c 68 drivers/dma/idma64.c channel_writel(idma64c, CFG_HI, cfghi); idma64c 71 drivers/dma/idma64.c channel_set_bit(idma64, MASK(XFER), idma64c->mask); idma64c 72 drivers/dma/idma64.c channel_set_bit(idma64, MASK(ERROR), idma64c->mask); idma64c 84 drivers/dma/idma64.c static void idma64_chan_stop(struct idma64 *idma64, struct idma64_chan *idma64c) idma64c 86 drivers/dma/idma64.c channel_clear_bit(idma64, CH_EN, idma64c->mask); idma64c 89 drivers/dma/idma64.c static void idma64_chan_start(struct idma64 *idma64, struct idma64_chan *idma64c) idma64c 91 drivers/dma/idma64.c struct idma64_desc *desc = idma64c->desc; idma64c 94 drivers/dma/idma64.c channel_writeq(idma64c, SAR, 0); idma64c 95 drivers/dma/idma64.c channel_writeq(idma64c, DAR, 0); idma64c 97 drivers/dma/idma64.c channel_writel(idma64c, CTL_HI, IDMA64C_CTLH_BLOCK_TS(~0UL)); idma64c 98 drivers/dma/idma64.c channel_writel(idma64c, CTL_LO, IDMA64C_CTLL_LLP_S_EN | IDMA64C_CTLL_LLP_D_EN); idma64c 100 drivers/dma/idma64.c channel_writeq(idma64c, LLP, hw->llp); idma64c 102 drivers/dma/idma64.c channel_set_bit(idma64, CH_EN, idma64c->mask); idma64c 105 drivers/dma/idma64.c static void idma64_stop_transfer(struct idma64_chan *idma64c) idma64c 107 drivers/dma/idma64.c struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); idma64c 109 drivers/dma/idma64.c idma64_chan_stop(idma64, idma64c); idma64c 112 drivers/dma/idma64.c static void idma64_start_transfer(struct idma64_chan *idma64c) idma64c 114 drivers/dma/idma64.c struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); idma64c 118 drivers/dma/idma64.c vdesc = vchan_next_desc(&idma64c->vchan); idma64c 120 drivers/dma/idma64.c idma64c->desc = NULL; idma64c 125 drivers/dma/idma64.c idma64c->desc = to_idma64_desc(vdesc); idma64c 128 drivers/dma/idma64.c idma64_chan_init(idma64, idma64c); idma64c 131 drivers/dma/idma64.c idma64_chan_start(idma64, idma64c); idma64c 139 drivers/dma/idma64.c struct idma64_chan *idma64c = &idma64->chan[c]; idma64c 142 drivers/dma/idma64.c spin_lock(&idma64c->vchan.lock); idma64c 143 drivers/dma/idma64.c desc = idma64c->desc; idma64c 146 drivers/dma/idma64.c dma_writel(idma64, CLEAR(ERROR), idma64c->mask); idma64c 149 drivers/dma/idma64.c dma_writel(idma64, CLEAR(XFER), idma64c->mask); idma64c 152 drivers/dma/idma64.c idma64_start_transfer(idma64c); idma64c 156 drivers/dma/idma64.c if (idma64c->desc == NULL || desc->status == DMA_ERROR) idma64c 157 drivers/dma/idma64.c idma64_stop_transfer(idma64c); idma64c 159 drivers/dma/idma64.c spin_unlock(&idma64c->vchan.lock); idma64c 204 drivers/dma/idma64.c static void idma64_desc_free(struct idma64_chan *idma64c, idma64c 214 drivers/dma/idma64.c dma_pool_free(idma64c->pool, hw->lli, hw->llp); idma64c 224 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(vdesc->tx.chan); idma64c 226 drivers/dma/idma64.c idma64_desc_free(idma64c, to_idma64_desc(vdesc)); idma64c 268 drivers/dma/idma64.c static void idma64_desc_fill(struct idma64_chan *idma64c, idma64c 271 drivers/dma/idma64.c struct dma_slave_config *config = &idma64c->config; idma64c 297 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 310 drivers/dma/idma64.c hw->lli = dma_pool_alloc(idma64c->pool, GFP_NOWAIT, &hw->llp); idma64c 313 drivers/dma/idma64.c idma64_desc_free(idma64c, desc); idma64c 325 drivers/dma/idma64.c idma64_desc_fill(idma64c, desc); idma64c 326 drivers/dma/idma64.c return vchan_tx_prep(&idma64c->vchan, &desc->vdesc, flags); idma64c 331 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 334 drivers/dma/idma64.c spin_lock_irqsave(&idma64c->vchan.lock, flags); idma64c 335 drivers/dma/idma64.c if (vchan_issue_pending(&idma64c->vchan) && !idma64c->desc) idma64c 336 drivers/dma/idma64.c idma64_start_transfer(idma64c); idma64c 337 drivers/dma/idma64.c spin_unlock_irqrestore(&idma64c->vchan.lock, flags); idma64c 340 drivers/dma/idma64.c static size_t idma64_active_desc_size(struct idma64_chan *idma64c) idma64c 342 drivers/dma/idma64.c struct idma64_desc *desc = idma64c->desc; idma64c 345 drivers/dma/idma64.c u64 llp = channel_readq(idma64c, LLP); idma64c 346 drivers/dma/idma64.c u32 ctlhi = channel_readl(idma64c, CTL_HI); idma64c 368 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 378 drivers/dma/idma64.c spin_lock_irqsave(&idma64c->vchan.lock, flags); idma64c 379 drivers/dma/idma64.c vdesc = vchan_find_desc(&idma64c->vchan, cookie); idma64c 380 drivers/dma/idma64.c if (idma64c->desc && cookie == idma64c->desc->vdesc.tx.cookie) { idma64c 381 drivers/dma/idma64.c bytes = idma64_active_desc_size(idma64c); idma64c 383 drivers/dma/idma64.c status = idma64c->desc->status; idma64c 388 drivers/dma/idma64.c spin_unlock_irqrestore(&idma64c->vchan.lock, flags); idma64c 404 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 406 drivers/dma/idma64.c memcpy(&idma64c->config, config, sizeof(idma64c->config)); idma64c 408 drivers/dma/idma64.c convert_burst(&idma64c->config.src_maxburst); idma64c 409 drivers/dma/idma64.c convert_burst(&idma64c->config.dst_maxburst); idma64c 414 drivers/dma/idma64.c static void idma64_chan_deactivate(struct idma64_chan *idma64c, bool drain) idma64c 419 drivers/dma/idma64.c cfglo = channel_readl(idma64c, CFG_LO); idma64c 425 drivers/dma/idma64.c channel_writel(idma64c, CFG_LO, cfglo | IDMA64C_CFGL_CH_SUSP); idma64c 428 drivers/dma/idma64.c cfglo = channel_readl(idma64c, CFG_LO); idma64c 432 drivers/dma/idma64.c static void idma64_chan_activate(struct idma64_chan *idma64c) idma64c 436 drivers/dma/idma64.c cfglo = channel_readl(idma64c, CFG_LO); idma64c 437 drivers/dma/idma64.c channel_writel(idma64c, CFG_LO, cfglo & ~IDMA64C_CFGL_CH_SUSP); idma64c 442 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 445 drivers/dma/idma64.c spin_lock_irqsave(&idma64c->vchan.lock, flags); idma64c 446 drivers/dma/idma64.c if (idma64c->desc && idma64c->desc->status == DMA_IN_PROGRESS) { idma64c 447 drivers/dma/idma64.c idma64_chan_deactivate(idma64c, false); idma64c 448 drivers/dma/idma64.c idma64c->desc->status = DMA_PAUSED; idma64c 450 drivers/dma/idma64.c spin_unlock_irqrestore(&idma64c->vchan.lock, flags); idma64c 457 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 460 drivers/dma/idma64.c spin_lock_irqsave(&idma64c->vchan.lock, flags); idma64c 461 drivers/dma/idma64.c if (idma64c->desc && idma64c->desc->status == DMA_PAUSED) { idma64c 462 drivers/dma/idma64.c idma64c->desc->status = DMA_IN_PROGRESS; idma64c 463 drivers/dma/idma64.c idma64_chan_activate(idma64c); idma64c 465 drivers/dma/idma64.c spin_unlock_irqrestore(&idma64c->vchan.lock, flags); idma64c 472 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 476 drivers/dma/idma64.c spin_lock_irqsave(&idma64c->vchan.lock, flags); idma64c 477 drivers/dma/idma64.c idma64_chan_deactivate(idma64c, true); idma64c 478 drivers/dma/idma64.c idma64_stop_transfer(idma64c); idma64c 479 drivers/dma/idma64.c if (idma64c->desc) { idma64c 480 drivers/dma/idma64.c idma64_vdesc_free(&idma64c->desc->vdesc); idma64c 481 drivers/dma/idma64.c idma64c->desc = NULL; idma64c 483 drivers/dma/idma64.c vchan_get_all_descriptors(&idma64c->vchan, &head); idma64c 484 drivers/dma/idma64.c spin_unlock_irqrestore(&idma64c->vchan.lock, flags); idma64c 486 drivers/dma/idma64.c vchan_dma_desc_free_list(&idma64c->vchan, &head); idma64c 492 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 494 drivers/dma/idma64.c vchan_synchronize(&idma64c->vchan); idma64c 499 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 502 drivers/dma/idma64.c idma64c->pool = dma_pool_create(dev_name(chan2dev(chan)), idma64c 505 drivers/dma/idma64.c if (!idma64c->pool) { idma64c 515 drivers/dma/idma64.c struct idma64_chan *idma64c = to_idma64_chan(chan); idma64c 518 drivers/dma/idma64.c dma_pool_destroy(idma64c->pool); idma64c 519 drivers/dma/idma64.c idma64c->pool = NULL; idma64c 560 drivers/dma/idma64.c struct idma64_chan *idma64c = &idma64->chan[i]; idma64c 562 drivers/dma/idma64.c idma64c->vchan.desc_free = idma64_vdesc_free; idma64c 563 drivers/dma/idma64.c vchan_init(&idma64c->vchan, &idma64->dma); idma64c 565 drivers/dma/idma64.c idma64c->regs = idma64->regs + i * IDMA64_CH_LENGTH; idma64c 566 drivers/dma/idma64.c idma64c->mask = BIT(i); idma64c 617 drivers/dma/idma64.c struct idma64_chan *idma64c = &idma64->chan[i]; idma64c 619 drivers/dma/idma64.c tasklet_kill(&idma64c->vchan.task); idma64c 151 drivers/dma/idma64.h static inline u32 idma64c_readl(struct idma64_chan *idma64c, int offset) idma64c 153 drivers/dma/idma64.h return readl(idma64c->regs + offset); idma64c 156 drivers/dma/idma64.h static inline void idma64c_writel(struct idma64_chan *idma64c, int offset, idma64c 159 drivers/dma/idma64.h writel(value, idma64c->regs + offset); idma64c 162 drivers/dma/idma64.h #define channel_readl(idma64c, reg) \ idma64c 163 drivers/dma/idma64.h idma64c_readl(idma64c, IDMA64_CH_##reg) idma64c 164 drivers/dma/idma64.h #define channel_writel(idma64c, reg, value) \ idma64c 165 drivers/dma/idma64.h idma64c_writel(idma64c, IDMA64_CH_##reg, (value)) idma64c 167 drivers/dma/idma64.h static inline u64 idma64c_readq(struct idma64_chan *idma64c, int offset) idma64c 169 drivers/dma/idma64.h return lo_hi_readq(idma64c->regs + offset); idma64c 172 drivers/dma/idma64.h static inline void idma64c_writeq(struct idma64_chan *idma64c, int offset, idma64c 175 drivers/dma/idma64.h lo_hi_writeq(value, idma64c->regs + offset); idma64c 178 drivers/dma/idma64.h #define channel_readq(idma64c, reg) \ idma64c 179 drivers/dma/idma64.h idma64c_readq(idma64c, IDMA64_CH_##reg) idma64c 180 drivers/dma/idma64.h #define channel_writeq(idma64c, reg, value) \ idma64c 181 drivers/dma/idma64.h idma64c_writeq(idma64c, IDMA64_CH_##reg, (value))