Lines Matching refs:adchan

231 	struct admac_chan *adchan = to_admac_chan(tx->chan);  in admac_tx_submit()  local
235 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_submit()
237 list_add_tail(&adtx->node, &adchan->submitted); in admac_tx_submit()
238 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_submit()
255 struct admac_chan *adchan = container_of(chan, struct admac_chan, chan); in admac_prep_dma_cyclic() local
258 if (direction != admac_chan_direction(adchan->no)) in admac_prep_dma_cyclic()
375 struct admac_chan *adchan = to_admac_chan(chan); in admac_tx_status() local
376 struct admac_data *ad = adchan->host; in admac_tx_status()
387 spin_lock_irqsave(&adchan->lock, flags); in admac_tx_status()
388 adtx = adchan->current_tx; in admac_tx_status()
392 residue = admac_cyclic_read_residue(ad, adchan->no, adtx); in admac_tx_status()
396 list_for_each_entry(adtx, &adchan->issued, node) { in admac_tx_status()
403 spin_unlock_irqrestore(&adchan->lock, flags); in admac_tx_status()
409 static void admac_start_chan(struct admac_chan *adchan) in admac_start_chan() argument
411 struct admac_data *ad = adchan->host; in admac_start_chan()
412 u32 startbit = 1 << (adchan->no / 2); in admac_start_chan()
415 ad->base + REG_CHAN_INTSTATUS(adchan->no, ad->irq_index)); in admac_start_chan()
417 ad->base + REG_CHAN_INTMASK(adchan->no, ad->irq_index)); in admac_start_chan()
419 switch (admac_chan_direction(adchan->no)) { in admac_start_chan()
429 dev_dbg(adchan->host->dev, "ch%d start\n", adchan->no); in admac_start_chan()
432 static void admac_stop_chan(struct admac_chan *adchan) in admac_stop_chan() argument
434 struct admac_data *ad = adchan->host; in admac_stop_chan()
435 u32 stopbit = 1 << (adchan->no / 2); in admac_stop_chan()
437 switch (admac_chan_direction(adchan->no)) { in admac_stop_chan()
447 dev_dbg(adchan->host->dev, "ch%d stop\n", adchan->no); in admac_stop_chan()
450 static void admac_reset_rings(struct admac_chan *adchan) in admac_reset_rings() argument
452 struct admac_data *ad = adchan->host; in admac_reset_rings()
455 ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
456 writel_relaxed(0, ad->base + REG_CHAN_CTL(adchan->no)); in admac_reset_rings()
459 static void admac_start_current_tx(struct admac_chan *adchan) in admac_start_current_tx() argument
461 struct admac_data *ad = adchan->host; in admac_start_current_tx()
462 int ch = adchan->no; in admac_start_current_tx()
464 admac_reset_rings(adchan); in admac_start_current_tx()
467 admac_cyclic_write_one_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
468 admac_start_chan(adchan); in admac_start_current_tx()
469 admac_cyclic_write_desc(ad, ch, adchan->current_tx); in admac_start_current_tx()
474 struct admac_chan *adchan = to_admac_chan(chan); in admac_issue_pending() local
478 spin_lock_irqsave(&adchan->lock, flags); in admac_issue_pending()
479 list_splice_tail_init(&adchan->submitted, &adchan->issued); in admac_issue_pending()
480 if (!list_empty(&adchan->issued) && !adchan->current_tx) { in admac_issue_pending()
481 tx = list_first_entry(&adchan->issued, struct admac_tx, node); in admac_issue_pending()
484 adchan->current_tx = tx; in admac_issue_pending()
485 adchan->nperiod_acks = 0; in admac_issue_pending()
486 admac_start_current_tx(adchan); in admac_issue_pending()
488 spin_unlock_irqrestore(&adchan->lock, flags); in admac_issue_pending()
493 struct admac_chan *adchan = to_admac_chan(chan); in admac_pause() local
495 admac_stop_chan(adchan); in admac_pause()
502 struct admac_chan *adchan = to_admac_chan(chan); in admac_resume() local
504 admac_start_chan(adchan); in admac_resume()
511 struct admac_chan *adchan = to_admac_chan(chan); in admac_terminate_all() local
514 spin_lock_irqsave(&adchan->lock, flags); in admac_terminate_all()
515 admac_stop_chan(adchan); in admac_terminate_all()
516 admac_reset_rings(adchan); in admac_terminate_all()
518 if (adchan->current_tx) { in admac_terminate_all()
519 list_add_tail(&adchan->current_tx->node, &adchan->to_free); in admac_terminate_all()
520 adchan->current_tx = NULL; in admac_terminate_all()
526 list_splice_tail_init(&adchan->submitted, &adchan->to_free); in admac_terminate_all()
527 list_splice_tail_init(&adchan->issued, &adchan->to_free); in admac_terminate_all()
528 spin_unlock_irqrestore(&adchan->lock, flags); in admac_terminate_all()
535 struct admac_chan *adchan = to_admac_chan(chan); in admac_synchronize() local
540 spin_lock_irqsave(&adchan->lock, flags); in admac_synchronize()
541 list_splice_tail_init(&adchan->to_free, &head); in admac_synchronize()
542 spin_unlock_irqrestore(&adchan->lock, flags); in admac_synchronize()
544 tasklet_kill(&adchan->tasklet); in admac_synchronize()
554 struct admac_chan *adchan = to_admac_chan(chan); in admac_alloc_chan_resources() local
555 struct admac_data *ad = adchan->host; in admac_alloc_chan_resources()
558 dma_cookie_init(&adchan->chan); in admac_alloc_chan_resources()
559 ret = admac_alloc_sram_carveout(ad, admac_chan_direction(adchan->no), in admac_alloc_chan_resources()
560 &adchan->carveout); in admac_alloc_chan_resources()
564 writel_relaxed(adchan->carveout, in admac_alloc_chan_resources()
565 ad->base + REG_CHAN_SRAM_CARVEOUT(adchan->no)); in admac_alloc_chan_resources()
571 struct admac_chan *adchan = to_admac_chan(chan); in admac_free_chan_resources() local
575 admac_free_sram_carveout(adchan->host, admac_chan_direction(adchan->no), in admac_free_chan_resources()
576 adchan->carveout); in admac_free_chan_resources()
645 struct admac_chan *adchan = &ad->channels[channo]; in admac_handle_status_desc_done() local
652 spin_lock_irqsave(&adchan->lock, flags); in admac_handle_status_desc_done()
655 if (adchan->current_tx) { in admac_handle_status_desc_done()
656 struct admac_tx *tx = adchan->current_tx; in admac_handle_status_desc_done()
658 adchan->nperiod_acks += nreports; in admac_handle_status_desc_done()
663 tasklet_schedule(&adchan->tasklet); in admac_handle_status_desc_done()
665 spin_unlock_irqrestore(&adchan->lock, flags); in admac_handle_status_desc_done()
715 struct admac_chan *adchan = from_tasklet(adchan, t, tasklet); in admac_chan_tasklet() local
721 spin_lock_irq(&adchan->lock); in admac_chan_tasklet()
722 adtx = adchan->current_tx; in admac_chan_tasklet()
723 nacks = adchan->nperiod_acks; in admac_chan_tasklet()
724 adchan->nperiod_acks = 0; in admac_chan_tasklet()
725 spin_unlock_irq(&adchan->lock); in admac_chan_tasklet()
741 struct admac_chan *adchan = to_admac_chan(chan); in admac_device_config() local
742 struct admac_data *ad = adchan->host; in admac_device_config()
743 bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV; in admac_device_config()
745 u32 bus_width = readl_relaxed(ad->base + REG_BUS_WIDTH(adchan->no)) & in admac_device_config()
785 writel_relaxed(bus_width, ad->base + REG_BUS_WIDTH(adchan->no)); in admac_device_config()
796 ad->base + REG_CHAN_FIFOCTL(adchan->no)); in admac_device_config()
877 struct admac_chan *adchan = &ad->channels[i]; in admac_probe() local
879 adchan->host = ad; in admac_probe()
880 adchan->no = i; in admac_probe()
881 adchan->chan.device = &ad->dma; in admac_probe()
882 spin_lock_init(&adchan->lock); in admac_probe()
883 INIT_LIST_HEAD(&adchan->submitted); in admac_probe()
884 INIT_LIST_HEAD(&adchan->issued); in admac_probe()
885 INIT_LIST_HEAD(&adchan->to_free); in admac_probe()
886 list_add_tail(&adchan->chan.device_node, &dma->channels); in admac_probe()
887 tasklet_setup(&adchan->tasklet, admac_chan_tasklet); in admac_probe()