• Home
  • Raw
  • Download

Lines Matching refs:dma

135 	struct ddb_dma *dma = io->dma;  in ddb_set_dma_table()  local
139 if (!dma) in ddb_set_dma_table()
141 for (i = 0; i < dma->num; i++) { in ddb_set_dma_table()
142 mem = dma->pbuf[i]; in ddb_set_dma_table()
143 ddbwritel(dev, mem & 0xffffffff, dma->bufregs + i * 8); in ddb_set_dma_table()
144 ddbwritel(dev, mem >> 32, dma->bufregs + i * 8 + 4); in ddb_set_dma_table()
146 dma->bufval = ((dma->div & 0x0f) << 16) | in ddb_set_dma_table()
147 ((dma->num & 0x1f) << 11) | in ddb_set_dma_table()
148 ((dma->size >> 7) & 0x7ff); in ddb_set_dma_table()
194 if (port->output->dma->running) { in ddb_unredirect()
210 oredi->dma, iredo->dma); in ddb_unredirect()
253 if (port->output->dma->running || input->dma->running) { in ddb_redirect()
269 ddb_redirect_dma(input->port->dev, input->dma, port->output->dma); in ddb_redirect()
278 static void dma_free(struct pci_dev *pdev, struct ddb_dma *dma, int dir) in dma_free() argument
282 if (!dma) in dma_free()
284 for (i = 0; i < dma->num; i++) { in dma_free()
285 if (dma->vbuf[i]) { in dma_free()
287 dma_unmap_single(&pdev->dev, dma->pbuf[i], in dma_free()
288 dma->size, in dma_free()
291 kfree(dma->vbuf[i]); in dma_free()
292 dma->vbuf[i] = NULL; in dma_free()
294 dma_free_coherent(&pdev->dev, dma->size, in dma_free()
295 dma->vbuf[i], dma->pbuf[i]); in dma_free()
298 dma->vbuf[i] = NULL; in dma_free()
303 static int dma_alloc(struct pci_dev *pdev, struct ddb_dma *dma, int dir) in dma_alloc() argument
307 if (!dma) in dma_alloc()
309 for (i = 0; i < dma->num; i++) { in dma_alloc()
311 dma->vbuf[i] = kmalloc(dma->size, __GFP_RETRY_MAYFAIL); in dma_alloc()
312 if (!dma->vbuf[i]) in dma_alloc()
314 dma->pbuf[i] = dma_map_single(&pdev->dev, in dma_alloc()
315 dma->vbuf[i], in dma_alloc()
316 dma->size, in dma_alloc()
319 if (dma_mapping_error(&pdev->dev, dma->pbuf[i])) { in dma_alloc()
320 kfree(dma->vbuf[i]); in dma_alloc()
321 dma->vbuf[i] = NULL; in dma_alloc()
325 dma->vbuf[i] = dma_alloc_coherent(&pdev->dev, in dma_alloc()
326 dma->size, in dma_alloc()
327 &dma->pbuf[i], in dma_alloc()
329 if (!dma->vbuf[i]) in dma_alloc()
345 if (port->input[0]->dma) in ddb_buffers_alloc()
346 if (dma_alloc(dev->pdev, port->input[0]->dma, 0) in ddb_buffers_alloc()
349 if (port->input[1]->dma) in ddb_buffers_alloc()
350 if (dma_alloc(dev->pdev, port->input[1]->dma, 0) in ddb_buffers_alloc()
356 if (port->input[0]->dma) in ddb_buffers_alloc()
357 if (dma_alloc(dev->pdev, port->input[0]->dma, 0) in ddb_buffers_alloc()
360 if (port->output->dma) in ddb_buffers_alloc()
361 if (dma_alloc(dev->pdev, port->output->dma, 1) in ddb_buffers_alloc()
381 if (port->input[0] && port->input[0]->dma) in ddb_buffers_free()
382 dma_free(dev->pdev, port->input[0]->dma, 0); in ddb_buffers_free()
383 if (port->input[1] && port->input[1]->dma) in ddb_buffers_free()
384 dma_free(dev->pdev, port->input[1]->dma, 0); in ddb_buffers_free()
385 if (port->output && port->output->dma) in ddb_buffers_free()
386 dma_free(dev->pdev, port->output->dma, 1); in ddb_buffers_free()
462 spin_lock_irq(&output->dma->lock); in ddb_output_start()
463 output->dma->cbuf = 0; in ddb_output_start()
464 output->dma->coff = 0; in ddb_output_start()
465 output->dma->stat = 0; in ddb_output_start()
466 ddbwritel(dev, 0, DMA_BUFFER_CONTROL(output->dma)); in ddb_output_start()
479 ddbwritel(dev, output->dma->bufval, in ddb_output_start()
480 DMA_BUFFER_SIZE(output->dma)); in ddb_output_start()
481 ddbwritel(dev, 0, DMA_BUFFER_ACK(output->dma)); in ddb_output_start()
483 ddbwritel(dev, 7, DMA_BUFFER_CONTROL(output->dma)); in ddb_output_start()
487 output->dma->running = 1; in ddb_output_start()
488 spin_unlock_irq(&output->dma->lock); in ddb_output_start()
495 spin_lock_irq(&output->dma->lock); in ddb_output_stop()
499 ddbwritel(dev, 0, DMA_BUFFER_CONTROL(output->dma)); in ddb_output_stop()
500 output->dma->running = 0; in ddb_output_stop()
501 spin_unlock_irq(&output->dma->lock); in ddb_output_stop()
509 spin_lock_irq(&input->dma->lock); in ddb_input_stop()
513 ddbwritel(dev, 0, DMA_BUFFER_CONTROL(input->dma)); in ddb_input_stop()
514 input->dma->running = 0; in ddb_input_stop()
515 spin_unlock_irq(&input->dma->lock); in ddb_input_stop()
522 spin_lock_irq(&input->dma->lock); in ddb_input_start()
523 input->dma->cbuf = 0; in ddb_input_start()
524 input->dma->coff = 0; in ddb_input_start()
525 input->dma->stat = 0; in ddb_input_start()
526 ddbwritel(dev, 0, DMA_BUFFER_CONTROL(input->dma)); in ddb_input_start()
532 ddbwritel(dev, input->dma->bufval, in ddb_input_start()
533 DMA_BUFFER_SIZE(input->dma)); in ddb_input_start()
534 ddbwritel(dev, 0, DMA_BUFFER_ACK(input->dma)); in ddb_input_start()
536 ddbwritel(dev, 3, DMA_BUFFER_CONTROL(input->dma)); in ddb_input_start()
543 input->dma->running = 1; in ddb_input_start()
544 spin_unlock_irq(&input->dma->lock); in ddb_input_start()
581 u32 idx, off, stat = output->dma->stat; in ddb_output_free()
587 if (output->dma->cbuf != idx) { in ddb_output_free()
588 if ((((output->dma->cbuf + 1) % output->dma->num) == idx) && in ddb_output_free()
589 (output->dma->size - output->dma->coff <= (2 * 188))) in ddb_output_free()
593 diff = off - output->dma->coff; in ddb_output_free()
603 u32 idx, off, stat = output->dma->stat; in ddb_output_write()
610 len = output->dma->size - output->dma->coff; in ddb_output_write()
611 if ((((output->dma->cbuf + 1) % output->dma->num) == idx) && in ddb_output_write()
617 if (output->dma->cbuf == idx) { in ddb_output_write()
618 if (off > output->dma->coff) { in ddb_output_write()
619 len = off - output->dma->coff; in ddb_output_write()
628 if (copy_from_user(output->dma->vbuf[output->dma->cbuf] + in ddb_output_write()
629 output->dma->coff, in ddb_output_write()
635 output->dma->pbuf[output->dma->cbuf], in ddb_output_write()
636 output->dma->size, DMA_TO_DEVICE); in ddb_output_write()
639 output->dma->coff += len; in ddb_output_write()
640 if (output->dma->coff == output->dma->size) { in ddb_output_write()
641 output->dma->coff = 0; in ddb_output_write()
642 output->dma->cbuf = ((output->dma->cbuf + 1) % in ddb_output_write()
643 output->dma->num); in ddb_output_write()
646 (output->dma->cbuf << 11) | in ddb_output_write()
647 (output->dma->coff >> 7), in ddb_output_write()
648 DMA_BUFFER_ACK(output->dma)); in ddb_output_write()
656 u32 idx, off, stat = input->dma->stat; in ddb_input_avail()
657 u32 ctrl = ddbreadl(dev, DMA_BUFFER_CONTROL(input->dma)); in ddb_input_avail()
664 ddbwritel(dev, stat, DMA_BUFFER_ACK(input->dma)); in ddb_input_avail()
667 if (input->dma->cbuf != idx) in ddb_input_avail()
677 u32 idx, free, stat = input->dma->stat; in ddb_input_read()
683 if (input->dma->cbuf == idx) in ddb_input_read()
685 free = input->dma->size - input->dma->coff; in ddb_input_read()
691 input->dma->pbuf[input->dma->cbuf], in ddb_input_read()
692 input->dma->size, DMA_FROM_DEVICE); in ddb_input_read()
693 ret = copy_to_user(buf, input->dma->vbuf[input->dma->cbuf] + in ddb_input_read()
694 input->dma->coff, free); in ddb_input_read()
697 input->dma->coff += free; in ddb_input_read()
698 if (input->dma->coff == input->dma->size) { in ddb_input_read()
699 input->dma->coff = 0; in ddb_input_read()
700 input->dma->cbuf = (input->dma->cbuf + 1) % in ddb_input_read()
701 input->dma->num; in ddb_input_read()
706 (input->dma->cbuf << 11) | (input->dma->coff >> 7), in ddb_input_read()
707 DMA_BUFFER_ACK(input->dma)); in ddb_input_read()
731 output->dma->wq, in ts_write()
761 input->dma->wq, in ts_read()
782 poll_wait(file, &input->dma->wq, wait); in ts_poll()
783 poll_wait(file, &output->dma->wq, wait); in ts_poll()
2122 input->dma->stat, DMA_BUFFER_ACK(output->dma)); in input_write_output()
2123 output->dma->cbuf = (input->dma->stat >> 11) & 0x1f; in input_write_output()
2124 output->dma->coff = (input->dma->stat & 0x7ff) << 7; in input_write_output()
2131 output->dma->stat, DMA_BUFFER_ACK(input->dma)); in output_ack_input()
2138 struct ddb_dma *dma, *dma2; in input_write_dvb() local
2142 dma = input->dma; in input_write_dvb()
2143 dma2 = input->dma; in input_write_dvb()
2149 dma2 = input->redo->dma; in input_write_dvb()
2152 while (dma->cbuf != ((dma->stat >> 11) & 0x1f) || in input_write_dvb()
2153 (4 & dma->ctrl)) { in input_write_dvb()
2154 if (4 & dma->ctrl) { in input_write_dvb()
2159 dma_sync_single_for_cpu(dev->dev, dma2->pbuf[dma->cbuf], in input_write_dvb()
2162 dma2->vbuf[dma->cbuf], in input_write_dvb()
2164 dma->cbuf = (dma->cbuf + 1) % dma2->num; in input_write_dvb()
2166 ddbwritel(dev, (dma->cbuf << 11), in input_write_dvb()
2167 DMA_BUFFER_ACK(dma)); in input_write_dvb()
2168 dma->stat = safe_ddbreadl(dev, DMA_BUFFER_CURRENT(dma)); in input_write_dvb()
2169 dma->ctrl = safe_ddbreadl(dev, DMA_BUFFER_CONTROL(dma)); in input_write_dvb()
2175 struct ddb_dma *dma = container_of(work, struct ddb_dma, work); in input_work() local
2176 struct ddb_input *input = (struct ddb_input *)dma->io; in input_work()
2180 spin_lock_irqsave(&dma->lock, flags); in input_work()
2181 if (!dma->running) { in input_work()
2182 spin_unlock_irqrestore(&dma->lock, flags); in input_work()
2185 dma->stat = ddbreadl(dev, DMA_BUFFER_CURRENT(dma)); in input_work()
2186 dma->ctrl = ddbreadl(dev, DMA_BUFFER_CONTROL(dma)); in input_work()
2192 wake_up(&dma->wq); in input_work()
2193 spin_unlock_irqrestore(&dma->lock, flags); in input_work()
2199 struct ddb_dma *dma = input->dma; in input_handler() local
2201 queue_work(ddb_wq, &dma->work); in input_handler()
2206 struct ddb_dma *dma = container_of(work, struct ddb_dma, work); in output_work() local
2207 struct ddb_output *output = (struct ddb_output *)dma->io; in output_work()
2211 spin_lock_irqsave(&dma->lock, flags); in output_work()
2212 if (!dma->running) in output_work()
2214 dma->stat = ddbreadl(dev, DMA_BUFFER_CURRENT(dma)); in output_work()
2215 dma->ctrl = ddbreadl(dev, DMA_BUFFER_CONTROL(dma)); in output_work()
2218 wake_up(&dma->wq); in output_work()
2220 spin_unlock_irqrestore(&dma->lock, flags); in output_work()
2226 struct ddb_dma *dma = output->dma; in output_handler() local
2228 queue_work(ddb_wq, &dma->work); in output_handler()
2251 struct ddb_dma *dma; in ddb_dma_init() local
2254 dma = out ? &io->port->dev->odma[nr] : &io->port->dev->idma[nr]; in ddb_dma_init()
2255 io->dma = dma; in ddb_dma_init()
2256 dma->io = io; in ddb_dma_init()
2258 spin_lock_init(&dma->lock); in ddb_dma_init()
2259 init_waitqueue_head(&dma->wq); in ddb_dma_init()
2261 INIT_WORK(&dma->work, output_work); in ddb_dma_init()
2262 dma->regs = rm->odma->base + rm->odma->size * nr; in ddb_dma_init()
2263 dma->bufregs = rm->odma_buf->base + rm->odma_buf->size * nr; in ddb_dma_init()
2264 dma->num = dma_buf_num; in ddb_dma_init()
2265 dma->size = dma_buf_size * 128 * 47; in ddb_dma_init()
2266 dma->div = 1; in ddb_dma_init()
2268 INIT_WORK(&dma->work, input_work); in ddb_dma_init()
2269 dma->regs = rm->idma->base + rm->idma->size * nr; in ddb_dma_init()
2270 dma->bufregs = rm->idma_buf->base + rm->idma_buf->size * nr; in ddb_dma_init()
2271 dma->num = dma_buf_num; in ddb_dma_init()
2272 dma->size = dma_buf_size * 128 * 47; in ddb_dma_init()
2273 dma->div = 1; in ddb_dma_init()
2275 ddbwritel(io->port->dev, 0, DMA_BUFFER_ACK(dma)); in ddb_dma_init()
2277 io->port->lnr, io->nr, nr, dma->regs, dma->bufregs); in ddb_dma_init()
2462 if (port->input[0] && port->input[0]->dma) in ddb_ports_release()
2463 cancel_work_sync(&port->input[0]->dma->work); in ddb_ports_release()
2464 if (port->input[1] && port->input[1]->dma) in ddb_ports_release()
2465 cancel_work_sync(&port->input[1]->dma->work); in ddb_ports_release()
2466 if (port->output && port->output->dma) in ddb_ports_release()
2467 cancel_work_sync(&port->output->dma->work); in ddb_ports_release()