Lines Matching refs:adchan
233 struct admac_chan *adchan = to_admac_chan(tx->chan); in admac_tx_submit() local
237 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_submit()
239 list_add_tail(&adtx->node, &adchan->submitted); in admac_tx_submit()
240 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_submit()
257 struct admac_chan *adchan = container_of(chan, struct admac_chan, chan); in admac_prep_dma_cyclic() local
260 if (direction != admac_chan_direction(adchan->no)) in admac_prep_dma_cyclic()
377 struct admac_chan *adchan = to_admac_chan(chan); in admac_tx_status() local
378 struct admac_data *ad = adchan->host; in admac_tx_status()
389 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_status()
390 adtx = adchan->current_tx; in admac_tx_status()
394 residue = admac_cyclic_read_residue(ad, adchan->no, adtx); in admac_tx_status()
398 list_for_each_entry(adtx, &adchan->issued, node) { in admac_tx_status()
405 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_status()
411 static void admac_start_chan(struct admac_chan *adchan) in admac_start_chan() argument
413 struct admac_data *ad = adchan->host; in admac_start_chan()
414 u32 startbit = 1 << (adchan->no / 2); in admac_start_chan()
417 ad->base + REG_CHAN_INTSTATUS(adchan->no, ad->irq_index)); in admac_start_chan()
419 ad->base + REG_CHAN_INTMASK(adchan->no, ad->irq_index)); in admac_start_chan()
421 switch (admac_chan_direction(adchan->no)) { in admac_start_chan()
431 dev_dbg(adchan->host->dev, "ch%d start\n", adchan->no); in admac_start_chan()
434 static void admac_stop_chan(struct admac_chan *adchan) in admac_stop_chan() argument
436 struct admac_data *ad = adchan->host; in admac_stop_chan()
437 u32 stopbit = 1 << (adchan->no / 2); in admac_stop_chan()
439 switch (admac_chan_direction(adchan->no)) { in admac_stop_chan()
449 dev_dbg(adchan->host->dev, "ch%d stop\n", adchan->no); in admac_stop_chan()
452 static void admac_reset_rings(struct admac_chan *adchan) in admac_reset_rings() argument
454 struct admac_data *ad = adchan->host; in admac_reset_rings()
457 ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
458 writel_relaxed(0, ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
461 static void admac_start_current_tx(struct admac_chan *adchan) in admac_start_current_tx() argument
463 struct admac_data *ad = adchan->host; in admac_start_current_tx()
464 int ch = adchan->no; in admac_start_current_tx()
466 admac_reset_rings(adchan); in admac_start_current_tx()
469 admac_cyclic_write_one_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
470 admac_start_chan(adchan); in admac_start_current_tx()
471 admac_cyclic_write_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
476 struct admac_chan *adchan = to_admac_chan(chan); in admac_issue_pending() local
480 spin_lock_irqsave(&adchan->lock, flags); in admac_issue_pending()
481 list_splice_tail_init(&adchan->submitted, &adchan->issued); in admac_issue_pending()
482 if (!list_empty(&adchan->issued) && !adchan->current_tx) { in admac_issue_pending()
483 tx = list_first_entry(&adchan->issued, struct admac_tx, node); in admac_issue_pending()
486 adchan->current_tx = tx; in admac_issue_pending()
487 adchan->nperiod_acks = 0; in admac_issue_pending()
488 admac_start_current_tx(adchan); in admac_issue_pending()
490 spin_unlock_irqrestore(&adchan->lock, flags); in admac_issue_pending()
495 struct admac_chan *adchan = to_admac_chan(chan); in admac_pause() local
497 admac_stop_chan(adchan); in admac_pause()
504 struct admac_chan *adchan = to_admac_chan(chan); in admac_resume() local
506 admac_start_chan(adchan); in admac_resume()
513 struct admac_chan *adchan = to_admac_chan(chan); in admac_terminate_all() local
516 spin_lock_irqsave(&adchan->lock, flags); in admac_terminate_all()
517 admac_stop_chan(adchan); in admac_terminate_all()
518 admac_reset_rings(adchan); in admac_terminate_all()
520 if (adchan->current_tx) { in admac_terminate_all()
521 list_add_tail(&adchan->current_tx->node, &adchan->to_free); in admac_terminate_all()
522 adchan->current_tx = NULL; in admac_terminate_all()
528 list_splice_tail_init(&adchan->submitted, &adchan->to_free); in admac_terminate_all()
529 list_splice_tail_init(&adchan->issued, &adchan->to_free); in admac_terminate_all()
530 spin_unlock_irqrestore(&adchan->lock, flags); in admac_terminate_all()
537 struct admac_chan *adchan = to_admac_chan(chan); in admac_synchronize() local
542 spin_lock_irqsave(&adchan->lock, flags); in admac_synchronize()
543 list_splice_tail_init(&adchan->to_free, &head); in admac_synchronize()
544 spin_unlock_irqrestore(&adchan->lock, flags); in admac_synchronize()
546 tasklet_kill(&adchan->tasklet); in admac_synchronize()
556 struct admac_chan *adchan = to_admac_chan(chan); in admac_alloc_chan_resources() local
557 struct admac_data *ad = adchan->host; in admac_alloc_chan_resources()
560 dma_cookie_init(&adchan->chan); in admac_alloc_chan_resources()
561 ret = admac_alloc_sram_carveout(ad, admac_chan_direction(adchan->no), in admac_alloc_chan_resources()
562 &adchan->carveout); in admac_alloc_chan_resources()
566 writel_relaxed(adchan->carveout, in admac_alloc_chan_resources()
567 ad->base + REG_CHAN_SRAM_CARVEOUT(adchan->no)); in admac_alloc_chan_resources()
573 struct admac_chan *adchan = to_admac_chan(chan); in admac_free_chan_resources() local
577 admac_free_sram_carveout(adchan->host, admac_chan_direction(adchan->no), in admac_free_chan_resources()
578 adchan->carveout); in admac_free_chan_resources()
647 struct admac_chan *adchan = &ad->channels[channo]; in admac_handle_status_desc_done() local
654 spin_lock_irqsave(&adchan->lock, flags); in admac_handle_status_desc_done()
657 if (adchan->current_tx) { in admac_handle_status_desc_done()
658 struct admac_tx *tx = adchan->current_tx; in admac_handle_status_desc_done()
660 adchan->nperiod_acks += nreports; in admac_handle_status_desc_done()
665 tasklet_schedule(&adchan->tasklet); in admac_handle_status_desc_done()
667 spin_unlock_irqrestore(&adchan->lock, flags); in admac_handle_status_desc_done()
717 struct admac_chan *adchan = from_tasklet(adchan, t, tasklet); in admac_chan_tasklet() local
723 spin_lock_irq(&adchan->lock); in admac_chan_tasklet()
724 adtx = adchan->current_tx; in admac_chan_tasklet()
725 nacks = adchan->nperiod_acks; in admac_chan_tasklet()
726 adchan->nperiod_acks = 0; in admac_chan_tasklet()
727 spin_unlock_irq(&adchan->lock); in admac_chan_tasklet()
743 struct admac_chan *adchan = to_admac_chan(chan); in admac_device_config() local
744 struct admac_data *ad = adchan->host; in admac_device_config()
745 bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV; in admac_device_config()
747 u32 bus_width = readl_relaxed(ad->base + REG_BUS_WIDTH(adchan->no)) & in admac_device_config()
787 writel_relaxed(bus_width, ad->base + REG_BUS_WIDTH(adchan->no)); in admac_device_config()
798 ad->base + REG_CHAN_FIFOCTL(adchan->no)); in admac_device_config()
879 struct admac_chan *adchan = &ad->channels[i]; in admac_probe() local
881 adchan->host = ad; in admac_probe()
882 adchan->no = i; in admac_probe()
883 adchan->chan.device = &ad->dma; in admac_probe()
884 spin_lock_init(&adchan->lock); in admac_probe()
885 INIT_LIST_HEAD(&adchan->submitted); in admac_probe()
886 INIT_LIST_HEAD(&adchan->issued); in admac_probe()
887 INIT_LIST_HEAD(&adchan->to_free); in admac_probe()
888 list_add_tail(&adchan->chan.device_node, &dma->channels); in admac_probe()
889 tasklet_setup(&adchan->tasklet, admac_chan_tasklet); in admac_probe()