jzchan 176 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan) jzchan 178 drivers/dma/dma-jz4780.c return container_of(jzchan->vchan.chan.device, struct jz4780_dma_dev, jzchan 230 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan, unsigned int count, jzchan 242 drivers/dma/dma-jz4780.c desc->desc = dma_pool_alloc(jzchan->desc_pool, GFP_NOWAIT, jzchan 257 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(vdesc->tx.chan); jzchan 259 drivers/dma/dma-jz4780.c dma_pool_free(jzchan->desc_pool, desc->desc, desc->desc_phys); jzchan 263 drivers/dma/dma-jz4780.c static uint32_t jz4780_dma_transfer_size(struct jz4780_dma_chan *jzchan, jzchan 266 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 301 drivers/dma/dma-jz4780.c static int jz4780_dma_setup_hwdesc(struct jz4780_dma_chan *jzchan, jzchan 305 drivers/dma/dma-jz4780.c struct dma_slave_config *config = &jzchan->config; jzchan 331 drivers/dma/dma-jz4780.c tsz = jz4780_dma_transfer_size(jzchan, addr | len | (width * maxburst), jzchan 332 drivers/dma/dma-jz4780.c &jzchan->transfer_shift); jzchan 349 drivers/dma/dma-jz4780.c desc->dtc = len >> jzchan->transfer_shift; jzchan 358 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 359 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 364 drivers/dma/dma-jz4780.c desc = jz4780_dma_desc_alloc(jzchan, sg_len, DMA_SLAVE); jzchan 369 drivers/dma/dma-jz4780.c err = jz4780_dma_setup_hwdesc(jzchan, &desc->desc[i], jzchan 374 drivers/dma/dma-jz4780.c jz4780_dma_desc_free(&jzchan->desc->vdesc); jzchan 395 drivers/dma/dma-jz4780.c return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags); jzchan 403 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 413 drivers/dma/dma-jz4780.c desc = jz4780_dma_desc_alloc(jzchan, periods, DMA_CYCLIC); jzchan 418 drivers/dma/dma-jz4780.c err = jz4780_dma_setup_hwdesc(jzchan, &desc->desc[i], buf_addr, jzchan 421 drivers/dma/dma-jz4780.c jz4780_dma_desc_free(&jzchan->desc->vdesc); jzchan 447 drivers/dma/dma-jz4780.c return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags); jzchan 454 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 458 drivers/dma/dma-jz4780.c desc = jz4780_dma_desc_alloc(jzchan, 1, DMA_MEMCPY); jzchan 462 drivers/dma/dma-jz4780.c tsz = jz4780_dma_transfer_size(jzchan, dest | src | len, jzchan 463 drivers/dma/dma-jz4780.c &jzchan->transfer_shift); jzchan 465 drivers/dma/dma-jz4780.c jzchan->transfer_type = JZ_DMA_DRT_AUTO; jzchan 473 drivers/dma/dma-jz4780.c desc->desc[0].dtc = len >> jzchan->transfer_shift; jzchan 475 drivers/dma/dma-jz4780.c return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags); jzchan 478 drivers/dma/dma-jz4780.c static void jz4780_dma_begin(struct jz4780_dma_chan *jzchan) jzchan 480 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 485 drivers/dma/dma-jz4780.c if (!jzchan->desc) { jzchan 486 drivers/dma/dma-jz4780.c vdesc = vchan_next_desc(&jzchan->vchan); jzchan 492 drivers/dma/dma-jz4780.c jzchan->desc = to_jz4780_dma_desc(vdesc); jzchan 493 drivers/dma/dma-jz4780.c jzchan->curr_hwdesc = 0; jzchan 495 drivers/dma/dma-jz4780.c if (jzchan->desc->type == DMA_CYCLIC && vdesc->tx.callback) { jzchan 510 drivers/dma/dma-jz4780.c for (i = 0; i < jzchan->desc->count; i++) jzchan 511 drivers/dma/dma-jz4780.c jzchan->desc->desc[i].dcm &= ~JZ_DMA_DCM_LINK; jzchan 519 drivers/dma/dma-jz4780.c jzchan->curr_hwdesc = jzchan 520 drivers/dma/dma-jz4780.c (jzchan->curr_hwdesc + 1) % jzchan->desc->count; jzchan 524 drivers/dma/dma-jz4780.c jz4780_dma_chan_enable(jzdma, jzchan->id); jzchan 527 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0); jzchan 530 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DRT, jzchan 531 drivers/dma/dma-jz4780.c jzchan->transfer_type); jzchan 539 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DTC, jzchan 540 drivers/dma/dma-jz4780.c jzchan->desc->desc[jzchan->curr_hwdesc].dtc); jzchan 543 drivers/dma/dma-jz4780.c desc_phys = jzchan->desc->desc_phys + jzchan 544 drivers/dma/dma-jz4780.c (jzchan->curr_hwdesc * sizeof(*jzchan->desc->desc)); jzchan 545 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DDA, desc_phys); jzchan 546 drivers/dma/dma-jz4780.c jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DDRS, BIT(jzchan->id)); jzchan 549 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, jzchan 555 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 558 drivers/dma/dma-jz4780.c spin_lock_irqsave(&jzchan->vchan.lock, flags); jzchan 560 drivers/dma/dma-jz4780.c if (vchan_issue_pending(&jzchan->vchan) && !jzchan->desc) jzchan 561 drivers/dma/dma-jz4780.c jz4780_dma_begin(jzchan); jzchan 563 drivers/dma/dma-jz4780.c spin_unlock_irqrestore(&jzchan->vchan.lock, flags); jzchan 568 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 569 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 573 drivers/dma/dma-jz4780.c spin_lock_irqsave(&jzchan->vchan.lock, flags); jzchan 576 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0); jzchan 577 drivers/dma/dma-jz4780.c if (jzchan->desc) { jzchan 578 drivers/dma/dma-jz4780.c vchan_terminate_vdesc(&jzchan->desc->vdesc); jzchan 579 drivers/dma/dma-jz4780.c jzchan->desc = NULL; jzchan 582 drivers/dma/dma-jz4780.c jz4780_dma_chan_disable(jzdma, jzchan->id); jzchan 584 drivers/dma/dma-jz4780.c vchan_get_all_descriptors(&jzchan->vchan, &head); jzchan 586 drivers/dma/dma-jz4780.c spin_unlock_irqrestore(&jzchan->vchan.lock, flags); jzchan 588 drivers/dma/dma-jz4780.c vchan_dma_desc_free_list(&jzchan->vchan, &head); jzchan 594 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 595 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 597 drivers/dma/dma-jz4780.c vchan_synchronize(&jzchan->vchan); jzchan 598 drivers/dma/dma-jz4780.c jz4780_dma_chan_disable(jzdma, jzchan->id); jzchan 604 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 611 drivers/dma/dma-jz4780.c memcpy(&jzchan->config, config, sizeof(jzchan->config)); jzchan 616 drivers/dma/dma-jz4780.c static size_t jz4780_dma_desc_residue(struct jz4780_dma_chan *jzchan, jzchan 619 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 627 drivers/dma/dma-jz4780.c count += jz4780_dma_chn_readl(jzdma, jzchan->id, jzchan 630 drivers/dma/dma-jz4780.c return count << jzchan->transfer_shift; jzchan 636 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 646 drivers/dma/dma-jz4780.c spin_lock_irqsave(&jzchan->vchan.lock, flags); jzchan 648 drivers/dma/dma-jz4780.c vdesc = vchan_find_desc(&jzchan->vchan, cookie); jzchan 651 drivers/dma/dma-jz4780.c residue = jz4780_dma_desc_residue(jzchan, jzchan 653 drivers/dma/dma-jz4780.c } else if (cookie == jzchan->desc->vdesc.tx.cookie) { jzchan 654 drivers/dma/dma-jz4780.c residue = jz4780_dma_desc_residue(jzchan, jzchan->desc, jzchan 655 drivers/dma/dma-jz4780.c jzchan->curr_hwdesc + 1); jzchan 659 drivers/dma/dma-jz4780.c if (vdesc && jzchan->desc && vdesc == &jzchan->desc->vdesc jzchan 660 drivers/dma/dma-jz4780.c && jzchan->desc->status & (JZ_DMA_DCS_AR | JZ_DMA_DCS_HLT)) jzchan 663 drivers/dma/dma-jz4780.c spin_unlock_irqrestore(&jzchan->vchan.lock, flags); jzchan 668 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan) jzchan 671 drivers/dma/dma-jz4780.c struct jz4780_dma_desc *desc = jzchan->desc; jzchan 675 drivers/dma/dma-jz4780.c spin_lock(&jzchan->vchan.lock); jzchan 677 drivers/dma/dma-jz4780.c dcs = jz4780_dma_chn_readl(jzdma, jzchan->id, JZ_DMA_REG_DCS); jzchan 678 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0); jzchan 681 drivers/dma/dma-jz4780.c dev_warn(&jzchan->vchan.chan.dev->device, jzchan 686 drivers/dma/dma-jz4780.c dev_warn(&jzchan->vchan.chan.dev->device, jzchan 690 drivers/dma/dma-jz4780.c if (jzchan->desc) { jzchan 691 drivers/dma/dma-jz4780.c jzchan->desc->status = dcs; jzchan 694 drivers/dma/dma-jz4780.c if (jzchan->desc->type == DMA_CYCLIC) { jzchan 695 drivers/dma/dma-jz4780.c vchan_cyclic_callback(&jzchan->desc->vdesc); jzchan 697 drivers/dma/dma-jz4780.c jz4780_dma_begin(jzchan); jzchan 700 drivers/dma/dma-jz4780.c (jzchan->curr_hwdesc + 1 == desc->count)) { jzchan 702 drivers/dma/dma-jz4780.c jzchan->desc = NULL; jzchan 705 drivers/dma/dma-jz4780.c jz4780_dma_begin(jzchan); jzchan 709 drivers/dma/dma-jz4780.c jz4780_dma_chn_writel(jzdma, jzchan->id, jzchan 715 drivers/dma/dma-jz4780.c dev_err(&jzchan->vchan.chan.dev->device, jzchan 719 drivers/dma/dma-jz4780.c spin_unlock(&jzchan->vchan.lock); jzchan 752 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 754 drivers/dma/dma-jz4780.c jzchan->desc_pool = dma_pool_create(dev_name(&chan->dev->device), jzchan 758 drivers/dma/dma-jz4780.c if (!jzchan->desc_pool) { jzchan 769 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 771 drivers/dma/dma-jz4780.c vchan_free_chan_resources(&jzchan->vchan); jzchan 772 drivers/dma/dma-jz4780.c dma_pool_destroy(jzchan->desc_pool); jzchan 773 drivers/dma/dma-jz4780.c jzchan->desc_pool = NULL; jzchan 778 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); jzchan 779 drivers/dma/dma-jz4780.c struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); jzchan 784 drivers/dma/dma-jz4780.c if (data->channel != jzchan->id) jzchan 786 drivers/dma/dma-jz4780.c } else if (jzdma->chan_reserved & BIT(jzchan->id)) { jzchan 790 drivers/dma/dma-jz4780.c jzchan->transfer_type = data->transfer_type; jzchan 839 drivers/dma/dma-jz4780.c struct jz4780_dma_chan *jzchan; jzchan 951 drivers/dma/dma-jz4780.c jzchan = &jzdma->chan[i]; jzchan 952 drivers/dma/dma-jz4780.c jzchan->id = i; jzchan 954 drivers/dma/dma-jz4780.c vchan_init(&jzchan->vchan, dd); jzchan 955 drivers/dma/dma-jz4780.c jzchan->vchan.desc_free = jz4780_dma_desc_free;