Lines Matching refs:adchan
148 struct admac_chan *adchan = to_admac_chan(tx->chan); in admac_tx_submit() local
152 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_submit()
154 list_add_tail(&adtx->node, &adchan->submitted); in admac_tx_submit()
155 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_submit()
172 struct admac_chan *adchan = container_of(chan, struct admac_chan, chan); in admac_prep_dma_cyclic() local
175 if (direction != admac_chan_direction(adchan->no)) in admac_prep_dma_cyclic()
292 struct admac_chan *adchan = to_admac_chan(chan); in admac_tx_status() local
293 struct admac_data *ad = adchan->host; in admac_tx_status()
304 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_status()
305 adtx = adchan->current_tx; in admac_tx_status()
309 residue = admac_cyclic_read_residue(ad, adchan->no, adtx); in admac_tx_status()
313 list_for_each_entry(adtx, &adchan->issued, node) { in admac_tx_status()
320 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_status()
326 static void admac_start_chan(struct admac_chan *adchan) in admac_start_chan() argument
328 struct admac_data *ad = adchan->host; in admac_start_chan()
329 u32 startbit = 1 << (adchan->no / 2); in admac_start_chan()
332 ad->base + REG_CHAN_INTSTATUS(adchan->no, ad->irq_index)); in admac_start_chan()
334 ad->base + REG_CHAN_INTMASK(adchan->no, ad->irq_index)); in admac_start_chan()
336 switch (admac_chan_direction(adchan->no)) { in admac_start_chan()
346 dev_dbg(adchan->host->dev, "ch%d start\n", adchan->no); in admac_start_chan()
349 static void admac_stop_chan(struct admac_chan *adchan) in admac_stop_chan() argument
351 struct admac_data *ad = adchan->host; in admac_stop_chan()
352 u32 stopbit = 1 << (adchan->no / 2); in admac_stop_chan()
354 switch (admac_chan_direction(adchan->no)) { in admac_stop_chan()
364 dev_dbg(adchan->host->dev, "ch%d stop\n", adchan->no); in admac_stop_chan()
367 static void admac_reset_rings(struct admac_chan *adchan) in admac_reset_rings() argument
369 struct admac_data *ad = adchan->host; in admac_reset_rings()
372 ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
373 writel_relaxed(0, ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
376 static void admac_start_current_tx(struct admac_chan *adchan) in admac_start_current_tx() argument
378 struct admac_data *ad = adchan->host; in admac_start_current_tx()
379 int ch = adchan->no; in admac_start_current_tx()
381 admac_reset_rings(adchan); in admac_start_current_tx()
384 admac_cyclic_write_one_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
385 admac_start_chan(adchan); in admac_start_current_tx()
386 admac_cyclic_write_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
391 struct admac_chan *adchan = to_admac_chan(chan); in admac_issue_pending() local
395 spin_lock_irqsave(&adchan->lock, flags); in admac_issue_pending()
396 list_splice_tail_init(&adchan->submitted, &adchan->issued); in admac_issue_pending()
397 if (!list_empty(&adchan->issued) && !adchan->current_tx) { in admac_issue_pending()
398 tx = list_first_entry(&adchan->issued, struct admac_tx, node); in admac_issue_pending()
401 adchan->current_tx = tx; in admac_issue_pending()
402 adchan->nperiod_acks = 0; in admac_issue_pending()
403 admac_start_current_tx(adchan); in admac_issue_pending()
405 spin_unlock_irqrestore(&adchan->lock, flags); in admac_issue_pending()
410 struct admac_chan *adchan = to_admac_chan(chan); in admac_pause() local
412 admac_stop_chan(adchan); in admac_pause()
419 struct admac_chan *adchan = to_admac_chan(chan); in admac_resume() local
421 admac_start_chan(adchan); in admac_resume()
428 struct admac_chan *adchan = to_admac_chan(chan); in admac_terminate_all() local
431 spin_lock_irqsave(&adchan->lock, flags); in admac_terminate_all()
432 admac_stop_chan(adchan); in admac_terminate_all()
433 admac_reset_rings(adchan); in admac_terminate_all()
435 adchan->current_tx = NULL; in admac_terminate_all()
440 list_splice_tail_init(&adchan->submitted, &adchan->to_free); in admac_terminate_all()
441 list_splice_tail_init(&adchan->issued, &adchan->to_free); in admac_terminate_all()
442 spin_unlock_irqrestore(&adchan->lock, flags); in admac_terminate_all()
449 struct admac_chan *adchan = to_admac_chan(chan); in admac_synchronize() local
454 spin_lock_irqsave(&adchan->lock, flags); in admac_synchronize()
455 list_splice_tail_init(&adchan->to_free, &head); in admac_synchronize()
456 spin_unlock_irqrestore(&adchan->lock, flags); in admac_synchronize()
458 tasklet_kill(&adchan->tasklet); in admac_synchronize()
468 struct admac_chan *adchan = to_admac_chan(chan); in admac_alloc_chan_resources() local
470 dma_cookie_init(&adchan->chan); in admac_alloc_chan_resources()
546 struct admac_chan *adchan = &ad->channels[channo]; in admac_handle_status_desc_done() local
553 spin_lock_irqsave(&adchan->lock, flags); in admac_handle_status_desc_done()
556 if (adchan->current_tx) { in admac_handle_status_desc_done()
557 struct admac_tx *tx = adchan->current_tx; in admac_handle_status_desc_done()
559 adchan->nperiod_acks += nreports; in admac_handle_status_desc_done()
564 tasklet_schedule(&adchan->tasklet); in admac_handle_status_desc_done()
566 spin_unlock_irqrestore(&adchan->lock, flags); in admac_handle_status_desc_done()
609 struct admac_chan *adchan = from_tasklet(adchan, t, tasklet); in admac_chan_tasklet() local
615 spin_lock_irq(&adchan->lock); in admac_chan_tasklet()
616 adtx = adchan->current_tx; in admac_chan_tasklet()
617 nacks = adchan->nperiod_acks; in admac_chan_tasklet()
618 adchan->nperiod_acks = 0; in admac_chan_tasklet()
619 spin_unlock_irq(&adchan->lock); in admac_chan_tasklet()
635 struct admac_chan *adchan = to_admac_chan(chan); in admac_device_config() local
636 struct admac_data *ad = adchan->host; in admac_device_config()
637 bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV; in admac_device_config()
678 writel_relaxed(bus_width, ad->base + REG_BUS_WIDTH(adchan->no)); in admac_device_config()
689 ad->base + REG_CHAN_FIFOCTL(adchan->no)); in admac_device_config()
766 struct admac_chan *adchan = &ad->channels[i]; in admac_probe() local
768 adchan->host = ad; in admac_probe()
769 adchan->no = i; in admac_probe()
770 adchan->chan.device = &ad->dma; in admac_probe()
771 spin_lock_init(&adchan->lock); in admac_probe()
772 INIT_LIST_HEAD(&adchan->submitted); in admac_probe()
773 INIT_LIST_HEAD(&adchan->issued); in admac_probe()
774 INIT_LIST_HEAD(&adchan->to_free); in admac_probe()
775 list_add_tail(&adchan->chan.device_node, &dma->channels); in admac_probe()
776 tasklet_setup(&adchan->tasklet, admac_chan_tasklet); in admac_probe()