Lines Matching refs:adchan
229 struct admac_chan *adchan = to_admac_chan(tx->chan); in admac_tx_submit() local
233 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_submit()
235 list_add_tail(&adtx->node, &adchan->submitted); in admac_tx_submit()
236 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_submit()
253 struct admac_chan *adchan = container_of(chan, struct admac_chan, chan); in admac_prep_dma_cyclic() local
256 if (direction != admac_chan_direction(adchan->no)) in admac_prep_dma_cyclic()
373 struct admac_chan *adchan = to_admac_chan(chan); in admac_tx_status() local
374 struct admac_data *ad = adchan->host; in admac_tx_status()
385 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_status()
386 adtx = adchan->current_tx; in admac_tx_status()
390 residue = admac_cyclic_read_residue(ad, adchan->no, adtx); in admac_tx_status()
394 list_for_each_entry(adtx, &adchan->issued, node) { in admac_tx_status()
401 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_status()
407 static void admac_start_chan(struct admac_chan *adchan) in admac_start_chan() argument
409 struct admac_data *ad = adchan->host; in admac_start_chan()
410 u32 startbit = 1 << (adchan->no / 2); in admac_start_chan()
413 ad->base + REG_CHAN_INTSTATUS(adchan->no, ad->irq_index)); in admac_start_chan()
415 ad->base + REG_CHAN_INTMASK(adchan->no, ad->irq_index)); in admac_start_chan()
417 switch (admac_chan_direction(adchan->no)) { in admac_start_chan()
427 dev_dbg(adchan->host->dev, "ch%d start\n", adchan->no); in admac_start_chan()
430 static void admac_stop_chan(struct admac_chan *adchan) in admac_stop_chan() argument
432 struct admac_data *ad = adchan->host; in admac_stop_chan()
433 u32 stopbit = 1 << (adchan->no / 2); in admac_stop_chan()
435 switch (admac_chan_direction(adchan->no)) { in admac_stop_chan()
445 dev_dbg(adchan->host->dev, "ch%d stop\n", adchan->no); in admac_stop_chan()
448 static void admac_reset_rings(struct admac_chan *adchan) in admac_reset_rings() argument
450 struct admac_data *ad = adchan->host; in admac_reset_rings()
453 ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
454 writel_relaxed(0, ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
457 static void admac_start_current_tx(struct admac_chan *adchan) in admac_start_current_tx() argument
459 struct admac_data *ad = adchan->host; in admac_start_current_tx()
460 int ch = adchan->no; in admac_start_current_tx()
462 admac_reset_rings(adchan); in admac_start_current_tx()
465 admac_cyclic_write_one_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
466 admac_start_chan(adchan); in admac_start_current_tx()
467 admac_cyclic_write_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
472 struct admac_chan *adchan = to_admac_chan(chan); in admac_issue_pending() local
476 spin_lock_irqsave(&adchan->lock, flags); in admac_issue_pending()
477 list_splice_tail_init(&adchan->submitted, &adchan->issued); in admac_issue_pending()
478 if (!list_empty(&adchan->issued) && !adchan->current_tx) { in admac_issue_pending()
479 tx = list_first_entry(&adchan->issued, struct admac_tx, node); in admac_issue_pending()
482 adchan->current_tx = tx; in admac_issue_pending()
483 adchan->nperiod_acks = 0; in admac_issue_pending()
484 admac_start_current_tx(adchan); in admac_issue_pending()
486 spin_unlock_irqrestore(&adchan->lock, flags); in admac_issue_pending()
491 struct admac_chan *adchan = to_admac_chan(chan); in admac_pause() local
493 admac_stop_chan(adchan); in admac_pause()
500 struct admac_chan *adchan = to_admac_chan(chan); in admac_resume() local
502 admac_start_chan(adchan); in admac_resume()
509 struct admac_chan *adchan = to_admac_chan(chan); in admac_terminate_all() local
512 spin_lock_irqsave(&adchan->lock, flags); in admac_terminate_all()
513 admac_stop_chan(adchan); in admac_terminate_all()
514 admac_reset_rings(adchan); in admac_terminate_all()
516 if (adchan->current_tx) { in admac_terminate_all()
517 list_add_tail(&adchan->current_tx->node, &adchan->to_free); in admac_terminate_all()
518 adchan->current_tx = NULL; in admac_terminate_all()
524 list_splice_tail_init(&adchan->submitted, &adchan->to_free); in admac_terminate_all()
525 list_splice_tail_init(&adchan->issued, &adchan->to_free); in admac_terminate_all()
526 spin_unlock_irqrestore(&adchan->lock, flags); in admac_terminate_all()
533 struct admac_chan *adchan = to_admac_chan(chan); in admac_synchronize() local
538 spin_lock_irqsave(&adchan->lock, flags); in admac_synchronize()
539 list_splice_tail_init(&adchan->to_free, &head); in admac_synchronize()
540 spin_unlock_irqrestore(&adchan->lock, flags); in admac_synchronize()
542 tasklet_kill(&adchan->tasklet); in admac_synchronize()
552 struct admac_chan *adchan = to_admac_chan(chan); in admac_alloc_chan_resources() local
553 struct admac_data *ad = adchan->host; in admac_alloc_chan_resources()
556 dma_cookie_init(&adchan->chan); in admac_alloc_chan_resources()
557 ret = admac_alloc_sram_carveout(ad, admac_chan_direction(adchan->no), in admac_alloc_chan_resources()
558 &adchan->carveout); in admac_alloc_chan_resources()
562 writel_relaxed(adchan->carveout, in admac_alloc_chan_resources()
563 ad->base + REG_CHAN_SRAM_CARVEOUT(adchan->no)); in admac_alloc_chan_resources()
569 struct admac_chan *adchan = to_admac_chan(chan); in admac_free_chan_resources() local
573 admac_free_sram_carveout(adchan->host, admac_chan_direction(adchan->no), in admac_free_chan_resources()
574 adchan->carveout); in admac_free_chan_resources()
643 struct admac_chan *adchan = &ad->channels[channo]; in admac_handle_status_desc_done() local
650 spin_lock_irqsave(&adchan->lock, flags); in admac_handle_status_desc_done()
653 if (adchan->current_tx) { in admac_handle_status_desc_done()
654 struct admac_tx *tx = adchan->current_tx; in admac_handle_status_desc_done()
656 adchan->nperiod_acks += nreports; in admac_handle_status_desc_done()
661 tasklet_schedule(&adchan->tasklet); in admac_handle_status_desc_done()
663 spin_unlock_irqrestore(&adchan->lock, flags); in admac_handle_status_desc_done()
713 struct admac_chan *adchan = from_tasklet(adchan, t, tasklet); in admac_chan_tasklet() local
719 spin_lock_irq(&adchan->lock); in admac_chan_tasklet()
720 adtx = adchan->current_tx; in admac_chan_tasklet()
721 nacks = adchan->nperiod_acks; in admac_chan_tasklet()
722 adchan->nperiod_acks = 0; in admac_chan_tasklet()
723 spin_unlock_irq(&adchan->lock); in admac_chan_tasklet()
739 struct admac_chan *adchan = to_admac_chan(chan); in admac_device_config() local
740 struct admac_data *ad = adchan->host; in admac_device_config()
741 bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV; in admac_device_config()
782 writel_relaxed(bus_width, ad->base + REG_BUS_WIDTH(adchan->no)); in admac_device_config()
793 ad->base + REG_CHAN_FIFOCTL(adchan->no)); in admac_device_config()
874 struct admac_chan *adchan = &ad->channels[i]; in admac_probe() local
876 adchan->host = ad; in admac_probe()
877 adchan->no = i; in admac_probe()
878 adchan->chan.device = &ad->dma; in admac_probe()
879 spin_lock_init(&adchan->lock); in admac_probe()
880 INIT_LIST_HEAD(&adchan->submitted); in admac_probe()
881 INIT_LIST_HEAD(&adchan->issued); in admac_probe()
882 INIT_LIST_HEAD(&adchan->to_free); in admac_probe()
883 list_add_tail(&adchan->chan.device_node, &dma->channels); in admac_probe()
884 tasklet_setup(&adchan->tasklet, admac_chan_tasklet); in admac_probe()