Lines Matching refs:d40d

659 static int d40_pool_lli_alloc(struct d40_chan *d40c, struct d40_desc *d40d,
672 base = d40d->lli_pool.pre_alloc_lli;
673 d40d->lli_pool.size = sizeof(d40d->lli_pool.pre_alloc_lli);
674 d40d->lli_pool.base = NULL;
676 d40d->lli_pool.size = lli_len * 2 * align;
678 base = kmalloc(d40d->lli_pool.size + align, GFP_NOWAIT);
679 d40d->lli_pool.base = base;
681 if (d40d->lli_pool.base == NULL)
686 d40d->lli_log.src = PTR_ALIGN(base, align);
687 d40d->lli_log.dst = d40d->lli_log.src + lli_len;
689 d40d->lli_pool.dma_addr = 0;
691 d40d->lli_phy.src = PTR_ALIGN(base, align);
692 d40d->lli_phy.dst = d40d->lli_phy.src + lli_len;
694 d40d->lli_pool.dma_addr = dma_map_single(d40c->base->dev,
695 d40d->lli_phy.src,
696 d40d->lli_pool.size,
700 d40d->lli_pool.dma_addr)) {
701 kfree(d40d->lli_pool.base);
702 d40d->lli_pool.base = NULL;
703 d40d->lli_pool.dma_addr = 0;
711 static void d40_pool_lli_free(struct d40_chan *d40c, struct d40_desc *d40d)
713 if (d40d->lli_pool.dma_addr)
714 dma_unmap_single(d40c->base->dev, d40d->lli_pool.dma_addr,
715 d40d->lli_pool.size, DMA_TO_DEVICE);
717 kfree(d40d->lli_pool.base);
718 d40d->lli_pool.base = NULL;
719 d40d->lli_pool.size = 0;
720 d40d->lli_log.src = NULL;
721 d40d->lli_log.dst = NULL;
722 d40d->lli_phy.src = NULL;
723 d40d->lli_phy.dst = NULL;
727 struct d40_desc *d40d)
743 d40c->base->lcla_pool.alloc_map[idx] = d40d;
744 d40d->lcla_alloc++;
756 struct d40_desc *d40d)
770 if (d40c->base->lcla_pool.alloc_map[idx] == d40d) {
772 d40d->lcla_alloc--;
773 if (d40d->lcla_alloc == 0) {
786 static void d40_desc_remove(struct d40_desc *d40d)
788 list_del(&d40d->node);
818 static void d40_desc_free(struct d40_chan *d40c, struct d40_desc *d40d)
821 d40_pool_lli_free(d40c, d40d);
822 d40_lcla_free_all(d40c, d40d);
823 kmem_cache_free(d40c->base->desc_slab, d40d);
965 static void d40_desc_load(struct d40_chan *d40c, struct d40_desc *d40d)
968 d40_phy_lli_load(d40c, d40d);
969 d40d->lli_current = d40d->lli_len;
971 d40_log_lli_to_lcxa(d40c, d40d);
1135 struct d40_desc *d40d;
1139 while ((d40d = d40_first_done(d40c))) {
1140 d40_desc_remove(d40d);
1141 d40_desc_free(d40c, d40d);
1145 while ((d40d = d40_first_active_get(d40c))) {
1146 d40_desc_remove(d40d);
1147 d40_desc_free(d40c, d40d);
1151 while ((d40d = d40_first_queued(d40c))) {
1152 d40_desc_remove(d40d);
1153 d40_desc_free(d40c, d40d);
1157 while ((d40d = d40_first_pending(d40c))) {
1158 d40_desc_remove(d40d);
1159 d40_desc_free(d40c, d40d);
1164 list_for_each_entry_safe(d40d, _d, &d40c->client, node) {
1165 d40_desc_remove(d40d);
1166 d40_desc_free(d40c, d40d);
1171 list_for_each_entry_safe(d40d, _d,
1173 d40_desc_remove(d40d);
1174 d40_desc_free(d40c, d40d);
1495 struct d40_desc *d40d = container_of(tx, struct d40_desc, txd);
1501 d40_desc_queue(d40c, d40d);
1514 struct d40_desc *d40d;
1518 d40d = d40_first_queued(d40c);
1520 if (d40d != NULL) {
1527 d40_desc_remove(d40d);
1530 d40_desc_submit(d40c, d40d);
1533 d40_desc_load(d40c, d40d);
1542 return d40d;
1548 struct d40_desc *d40d;
1551 d40d = d40_first_active_get(d40c);
1553 if (d40d == NULL)
1556 if (d40d->cyclic) {
1563 if (d40d->lli_current < d40d->lli_len
1566 d40_lcla_free_all(d40c, d40d);
1567 d40_desc_load(d40c, d40d);
1570 if (d40d->lli_current == d40d->lli_len)
1571 d40d->lli_current = 0;
1574 d40_lcla_free_all(d40c, d40d);
1576 if (d40d->lli_current < d40d->lli_len) {
1577 d40_desc_load(d40c, d40d);
1590 d40_desc_remove(d40d);
1591 d40_desc_done(d40c, d40d);
1602 struct d40_desc *d40d;
1610 d40d = d40_first_done(d40c);
1611 if (d40d == NULL) {
1613 d40d = d40_first_active_get(d40c);
1614 if (d40d == NULL || !d40d->cyclic)
1618 if (!d40d->cyclic)
1619 dma_cookie_complete(&d40d->txd);
1631 callback_active = !!(d40d->txd.flags & DMA_PREP_INTERRUPT);
1632 dmaengine_desc_get_callback(&d40d->txd, &cb);
1634 if (!d40d->cyclic) {
1635 if (async_tx_test_ack(&d40d->txd)) {
1636 d40_desc_remove(d40d);
1637 d40_desc_free(d40c, d40d);
1638 } else if (!d40d->is_in_client_list) {
1639 d40_desc_remove(d40d);
1640 d40_lcla_free_all(d40c, d40d);
1641 list_add_tail(&d40d->node, &d40c->client);
1642 d40d->is_in_client_list = true;