Lines Matching refs:d40d
628 static int d40_pool_lli_alloc(struct d40_chan *d40c, struct d40_desc *d40d, in d40_pool_lli_alloc() argument
641 base = d40d->lli_pool.pre_alloc_lli; in d40_pool_lli_alloc()
642 d40d->lli_pool.size = sizeof(d40d->lli_pool.pre_alloc_lli); in d40_pool_lli_alloc()
643 d40d->lli_pool.base = NULL; in d40_pool_lli_alloc()
645 d40d->lli_pool.size = lli_len * 2 * align; in d40_pool_lli_alloc()
647 base = kmalloc(d40d->lli_pool.size + align, GFP_NOWAIT); in d40_pool_lli_alloc()
648 d40d->lli_pool.base = base; in d40_pool_lli_alloc()
650 if (d40d->lli_pool.base == NULL) in d40_pool_lli_alloc()
655 d40d->lli_log.src = PTR_ALIGN(base, align); in d40_pool_lli_alloc()
656 d40d->lli_log.dst = d40d->lli_log.src + lli_len; in d40_pool_lli_alloc()
658 d40d->lli_pool.dma_addr = 0; in d40_pool_lli_alloc()
660 d40d->lli_phy.src = PTR_ALIGN(base, align); in d40_pool_lli_alloc()
661 d40d->lli_phy.dst = d40d->lli_phy.src + lli_len; in d40_pool_lli_alloc()
663 d40d->lli_pool.dma_addr = dma_map_single(d40c->base->dev, in d40_pool_lli_alloc()
664 d40d->lli_phy.src, in d40_pool_lli_alloc()
665 d40d->lli_pool.size, in d40_pool_lli_alloc()
669 d40d->lli_pool.dma_addr)) { in d40_pool_lli_alloc()
670 kfree(d40d->lli_pool.base); in d40_pool_lli_alloc()
671 d40d->lli_pool.base = NULL; in d40_pool_lli_alloc()
672 d40d->lli_pool.dma_addr = 0; in d40_pool_lli_alloc()
680 static void d40_pool_lli_free(struct d40_chan *d40c, struct d40_desc *d40d) in d40_pool_lli_free() argument
682 if (d40d->lli_pool.dma_addr) in d40_pool_lli_free()
683 dma_unmap_single(d40c->base->dev, d40d->lli_pool.dma_addr, in d40_pool_lli_free()
684 d40d->lli_pool.size, DMA_TO_DEVICE); in d40_pool_lli_free()
686 kfree(d40d->lli_pool.base); in d40_pool_lli_free()
687 d40d->lli_pool.base = NULL; in d40_pool_lli_free()
688 d40d->lli_pool.size = 0; in d40_pool_lli_free()
689 d40d->lli_log.src = NULL; in d40_pool_lli_free()
690 d40d->lli_log.dst = NULL; in d40_pool_lli_free()
691 d40d->lli_phy.src = NULL; in d40_pool_lli_free()
692 d40d->lli_phy.dst = NULL; in d40_pool_lli_free()
696 struct d40_desc *d40d) in d40_lcla_alloc_one() argument
712 d40c->base->lcla_pool.alloc_map[idx] = d40d; in d40_lcla_alloc_one()
713 d40d->lcla_alloc++; in d40_lcla_alloc_one()
725 struct d40_desc *d40d) in d40_lcla_free_all() argument
739 if (d40c->base->lcla_pool.alloc_map[idx] == d40d) { in d40_lcla_free_all()
741 d40d->lcla_alloc--; in d40_lcla_free_all()
742 if (d40d->lcla_alloc == 0) { in d40_lcla_free_all()
755 static void d40_desc_remove(struct d40_desc *d40d) in d40_desc_remove() argument
757 list_del(&d40d->node); in d40_desc_remove()
787 static void d40_desc_free(struct d40_chan *d40c, struct d40_desc *d40d) in d40_desc_free() argument
790 d40_pool_lli_free(d40c, d40d); in d40_desc_free()
791 d40_lcla_free_all(d40c, d40d); in d40_desc_free()
792 kmem_cache_free(d40c->base->desc_slab, d40d); in d40_desc_free()
934 static void d40_desc_load(struct d40_chan *d40c, struct d40_desc *d40d) in d40_desc_load() argument
937 d40_phy_lli_load(d40c, d40d); in d40_desc_load()
938 d40d->lli_current = d40d->lli_len; in d40_desc_load()
940 d40_log_lli_to_lcxa(d40c, d40d); in d40_desc_load()
1104 struct d40_desc *d40d; in d40_term_all() local
1108 while ((d40d = d40_first_done(d40c))) { in d40_term_all()
1109 d40_desc_remove(d40d); in d40_term_all()
1110 d40_desc_free(d40c, d40d); in d40_term_all()
1114 while ((d40d = d40_first_active_get(d40c))) { in d40_term_all()
1115 d40_desc_remove(d40d); in d40_term_all()
1116 d40_desc_free(d40c, d40d); in d40_term_all()
1120 while ((d40d = d40_first_queued(d40c))) { in d40_term_all()
1121 d40_desc_remove(d40d); in d40_term_all()
1122 d40_desc_free(d40c, d40d); in d40_term_all()
1126 while ((d40d = d40_first_pending(d40c))) { in d40_term_all()
1127 d40_desc_remove(d40d); in d40_term_all()
1128 d40_desc_free(d40c, d40d); in d40_term_all()
1133 list_for_each_entry_safe(d40d, _d, &d40c->client, node) { in d40_term_all()
1134 d40_desc_remove(d40d); in d40_term_all()
1135 d40_desc_free(d40c, d40d); in d40_term_all()
1140 list_for_each_entry_safe(d40d, _d, in d40_term_all()
1142 d40_desc_remove(d40d); in d40_term_all()
1143 d40_desc_free(d40c, d40d); in d40_term_all()
1464 struct d40_desc *d40d = container_of(tx, struct d40_desc, txd); in d40_tx_submit() local
1470 d40_desc_queue(d40c, d40d); in d40_tx_submit()
1483 struct d40_desc *d40d; in d40_queue_start() local
1487 d40d = d40_first_queued(d40c); in d40_queue_start()
1489 if (d40d != NULL) { in d40_queue_start()
1496 d40_desc_remove(d40d); in d40_queue_start()
1499 d40_desc_submit(d40c, d40d); in d40_queue_start()
1502 d40_desc_load(d40c, d40d); in d40_queue_start()
1511 return d40d; in d40_queue_start()
1517 struct d40_desc *d40d; in dma_tc_handle() local
1520 d40d = d40_first_active_get(d40c); in dma_tc_handle()
1522 if (d40d == NULL) in dma_tc_handle()
1525 if (d40d->cyclic) { in dma_tc_handle()
1532 if (d40d->lli_current < d40d->lli_len in dma_tc_handle()
1535 d40_lcla_free_all(d40c, d40d); in dma_tc_handle()
1536 d40_desc_load(d40c, d40d); in dma_tc_handle()
1539 if (d40d->lli_current == d40d->lli_len) in dma_tc_handle()
1540 d40d->lli_current = 0; in dma_tc_handle()
1543 d40_lcla_free_all(d40c, d40d); in dma_tc_handle()
1545 if (d40d->lli_current < d40d->lli_len) { in dma_tc_handle()
1546 d40_desc_load(d40c, d40d); in dma_tc_handle()
1559 d40_desc_remove(d40d); in dma_tc_handle()
1560 d40_desc_done(d40c, d40d); in dma_tc_handle()
1571 struct d40_desc *d40d; in dma_tasklet() local
1579 d40d = d40_first_done(d40c); in dma_tasklet()
1580 if (d40d == NULL) { in dma_tasklet()
1582 d40d = d40_first_active_get(d40c); in dma_tasklet()
1583 if (d40d == NULL || !d40d->cyclic) in dma_tasklet()
1587 if (!d40d->cyclic) in dma_tasklet()
1588 dma_cookie_complete(&d40d->txd); in dma_tasklet()
1600 callback_active = !!(d40d->txd.flags & DMA_PREP_INTERRUPT); in dma_tasklet()
1601 dmaengine_desc_get_callback(&d40d->txd, &cb); in dma_tasklet()
1603 if (!d40d->cyclic) { in dma_tasklet()
1604 if (async_tx_test_ack(&d40d->txd)) { in dma_tasklet()
1605 d40_desc_remove(d40d); in dma_tasklet()
1606 d40_desc_free(d40c, d40d); in dma_tasklet()
1607 } else if (!d40d->is_in_client_list) { in dma_tasklet()
1608 d40_desc_remove(d40d); in dma_tasklet()
1609 d40_lcla_free_all(d40c, d40d); in dma_tasklet()
1610 list_add_tail(&d40d->node, &d40c->client); in dma_tasklet()
1611 d40d->is_in_client_list = true; in dma_tasklet()