Lines Matching refs:imgu

56 unsigned int imgu_map_node(struct imgu_device *imgu, unsigned int css_queue)  in imgu_map_node()  argument
69 static void imgu_dummybufs_cleanup(struct imgu_device *imgu, unsigned int pipe) in imgu_dummybufs_cleanup() argument
72 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_dummybufs_cleanup()
75 imgu_dmamap_free(imgu, in imgu_dummybufs_cleanup()
79 static int imgu_dummybufs_preallocate(struct imgu_device *imgu, in imgu_dummybufs_preallocate() argument
84 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_dummybufs_preallocate()
96 if (!imgu_dmamap_alloc(imgu, in imgu_dummybufs_preallocate()
98 imgu_dummybufs_cleanup(imgu, pipe); in imgu_dummybufs_preallocate()
106 static int imgu_dummybufs_init(struct imgu_device *imgu, unsigned int pipe) in imgu_dummybufs_init() argument
112 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_dummybufs_init()
116 node = imgu_map_node(imgu, i); in imgu_dummybufs_init()
136 if (imgu_css_dma_buffer_resize(imgu, in imgu_dummybufs_init()
139 imgu_dummybufs_cleanup(imgu, pipe); in imgu_dummybufs_init()
152 static struct imgu_css_buffer *imgu_dummybufs_get(struct imgu_device *imgu, in imgu_dummybufs_get() argument
156 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_dummybufs_get()
181 static bool imgu_dummybufs_check(struct imgu_device *imgu, in imgu_dummybufs_check() argument
186 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_dummybufs_check()
195 static void imgu_buffer_done(struct imgu_device *imgu, struct vb2_buffer *vb, in imgu_buffer_done() argument
198 mutex_lock(&imgu->lock); in imgu_buffer_done()
200 mutex_unlock(&imgu->lock); in imgu_buffer_done()
203 static struct imgu_css_buffer *imgu_queue_getbuf(struct imgu_device *imgu, in imgu_queue_getbuf() argument
208 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_queue_getbuf()
220 return imgu_dummybufs_get(imgu, imgu_node_map[node].css_queue, pipe); in imgu_queue_getbuf()
227 int imgu_queue_buffers(struct imgu_device *imgu, bool initial, unsigned int pipe) in imgu_queue_buffers() argument
231 struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_queue_buffers()
233 if (!imgu_css_is_streaming(&imgu->css)) in imgu_queue_buffers()
236 dev_dbg(&imgu->pci_dev->dev, "Queue buffers to pipe %d", pipe); in imgu_queue_buffers()
237 mutex_lock(&imgu->lock); in imgu_queue_buffers()
239 if (!imgu_css_pipe_queue_empty(&imgu->css, pipe)) { in imgu_queue_buffers()
240 mutex_unlock(&imgu->lock); in imgu_queue_buffers()
246 imgu_queue_getbuf(imgu, IMGU_NODE_IN, pipe); in imgu_queue_buffers()
250 dev_warn(&imgu->pci_dev->dev, in imgu_queue_buffers()
266 r = imgu_css_set_parameters(&imgu->css, pipe, in imgu_queue_buffers()
270 dev_warn(&imgu->pci_dev->dev, in imgu_queue_buffers()
276 dev_dbg(&imgu->pci_dev->dev, in imgu_queue_buffers()
280 imgu_queue_getbuf(imgu, node, pipe); in imgu_queue_buffers()
287 r = imgu_css_buf_queue(&imgu->css, pipe, buf); in imgu_queue_buffers()
290 dummy = imgu_dummybufs_check(imgu, buf, pipe); in imgu_queue_buffers()
294 dev_dbg(&imgu->pci_dev->dev, in imgu_queue_buffers()
302 mutex_unlock(&imgu->lock); in imgu_queue_buffers()
314 dev_err(&imgu->pci_dev->dev, in imgu_queue_buffers()
328 mutex_lock(&imgu->lock); in imgu_queue_buffers()
339 mutex_unlock(&imgu->lock); in imgu_queue_buffers()
345 static int imgu_powerup(struct imgu_device *imgu) in imgu_powerup() argument
353 for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) { in imgu_powerup()
354 fmt = &imgu->imgu_pipe[pipe].nodes[IMGU_NODE_IN].pad_fmt; in imgu_powerup()
355 dev_dbg(&imgu->pci_dev->dev, "pipe %u input format = %ux%u", in imgu_powerup()
361 r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base, freq); in imgu_powerup()
365 imgu_mmu_resume(imgu->mmu); in imgu_powerup()
369 static void imgu_powerdown(struct imgu_device *imgu) in imgu_powerdown() argument
371 imgu_mmu_suspend(imgu->mmu); in imgu_powerdown()
372 imgu_css_set_powerdown(&imgu->pci_dev->dev, imgu->base); in imgu_powerdown()
375 int imgu_s_stream(struct imgu_device *imgu, int enable) in imgu_s_stream() argument
377 struct device *dev = &imgu->pci_dev->dev; in imgu_s_stream()
384 atomic_set(&imgu->qbuf_barrier, 1); in imgu_s_stream()
385 imgu_css_stop_streaming(&imgu->css); in imgu_s_stream()
386 synchronize_irq(imgu->pci_dev->irq); in imgu_s_stream()
387 atomic_set(&imgu->qbuf_barrier, 0); in imgu_s_stream()
388 imgu_powerdown(imgu); in imgu_s_stream()
389 pm_runtime_put(&imgu->pci_dev->dev); in imgu_s_stream()
401 r = imgu_powerup(imgu); in imgu_s_stream()
409 r = imgu_css_start_streaming(&imgu->css); in imgu_s_stream()
415 for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) { in imgu_s_stream()
417 r = imgu_dummybufs_init(imgu, pipe); in imgu_s_stream()
424 r = imgu_queue_buffers(imgu, true, pipe); in imgu_s_stream()
433 for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) in imgu_s_stream()
434 imgu_dummybufs_cleanup(imgu, pipe); in imgu_s_stream()
436 imgu_css_stop_streaming(&imgu->css); in imgu_s_stream()
443 static void imgu_video_nodes_exit(struct imgu_device *imgu) in imgu_video_nodes_exit() argument
448 imgu_dummybufs_cleanup(imgu, i); in imgu_video_nodes_exit()
450 imgu_v4l2_unregister(imgu); in imgu_video_nodes_exit()
453 static int imgu_video_nodes_init(struct imgu_device *imgu) in imgu_video_nodes_init() argument
461 imgu->buf_struct_size = sizeof(struct imgu_buffer); in imgu_video_nodes_init()
464 imgu_pipe = &imgu->imgu_pipe[j]; in imgu_video_nodes_init()
478 r = imgu_v4l2_register(imgu); in imgu_video_nodes_init()
484 imgu_pipe = &imgu->imgu_pipe[j]; in imgu_video_nodes_init()
488 imgu_css_fmt_set(&imgu->css, fmts, rects, j); in imgu_video_nodes_init()
491 r = imgu_dummybufs_preallocate(imgu, j); in imgu_video_nodes_init()
493 dev_err(&imgu->pci_dev->dev, in imgu_video_nodes_init()
502 imgu_video_nodes_exit(imgu); in imgu_video_nodes_init()
511 struct imgu_device *imgu = imgu_ptr; in imgu_isr_threaded() local
524 mutex_lock(&imgu->lock); in imgu_isr_threaded()
525 b = imgu_css_buf_dequeue(&imgu->css); in imgu_isr_threaded()
526 mutex_unlock(&imgu->lock); in imgu_isr_threaded()
531 dev_err(&imgu->pci_dev->dev, in imgu_isr_threaded()
537 node = imgu_map_node(imgu, b->queue); in imgu_isr_threaded()
539 dummy = imgu_dummybufs_check(imgu, b, pipe); in imgu_isr_threaded()
542 dev_dbg(&imgu->pci_dev->dev, in imgu_isr_threaded()
554 imgu_pipe = &imgu->imgu_pipe[pipe]; in imgu_isr_threaded()
561 dev_dbg(&imgu->pci_dev->dev, "vb2 buffer sequence %d", in imgu_isr_threaded()
564 imgu_buffer_done(imgu, &buf->vid_buf.vbb.vb2_buf, in imgu_isr_threaded()
569 mutex_lock(&imgu->lock); in imgu_isr_threaded()
570 if (imgu_css_queue_empty(&imgu->css)) in imgu_isr_threaded()
571 wake_up_all(&imgu->buf_drain_wq); in imgu_isr_threaded()
572 mutex_unlock(&imgu->lock); in imgu_isr_threaded()
580 if (!atomic_read(&imgu->qbuf_barrier)) in imgu_isr_threaded()
581 for_each_set_bit(p, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) in imgu_isr_threaded()
582 imgu_queue_buffers(imgu, false, p); in imgu_isr_threaded()
589 struct imgu_device *imgu = imgu_ptr; in imgu_isr() local
592 if (imgu_css_irq_ack(&imgu->css) < 0) in imgu_isr()
619 struct imgu_device *imgu; in imgu_pci_probe() local
625 imgu = devm_kzalloc(&pci_dev->dev, sizeof(*imgu), GFP_KERNEL); in imgu_pci_probe()
626 if (!imgu) in imgu_pci_probe()
629 imgu->pci_dev = pci_dev; in imgu_pci_probe()
657 imgu->base = iomap[IMGU_PCI_BAR]; in imgu_pci_probe()
659 pci_set_drvdata(pci_dev, imgu); in imgu_pci_probe()
673 mutex_init(&imgu->lock); in imgu_pci_probe()
674 mutex_init(&imgu->streaming_lock); in imgu_pci_probe()
675 atomic_set(&imgu->qbuf_barrier, 0); in imgu_pci_probe()
676 init_waitqueue_head(&imgu->buf_drain_wq); in imgu_pci_probe()
678 r = imgu_css_set_powerup(&pci_dev->dev, imgu->base, 200); in imgu_pci_probe()
685 imgu->mmu = imgu_mmu_init(&pci_dev->dev, imgu->base); in imgu_pci_probe()
686 if (IS_ERR(imgu->mmu)) { in imgu_pci_probe()
687 r = PTR_ERR(imgu->mmu); in imgu_pci_probe()
692 r = imgu_dmamap_init(imgu); in imgu_pci_probe()
700 r = imgu_css_init(&pci_dev->dev, &imgu->css, imgu->base, phys_len); in imgu_pci_probe()
707 r = imgu_video_nodes_init(imgu); in imgu_pci_probe()
716 IRQF_SHARED, IMGU_NAME, imgu); in imgu_pci_probe()
728 imgu_video_nodes_exit(imgu); in imgu_pci_probe()
730 imgu_css_cleanup(&imgu->css); in imgu_pci_probe()
732 imgu_dmamap_exit(imgu); in imgu_pci_probe()
734 imgu_mmu_exit(imgu->mmu); in imgu_pci_probe()
736 imgu_css_set_powerdown(&pci_dev->dev, imgu->base); in imgu_pci_probe()
738 mutex_destroy(&imgu->streaming_lock); in imgu_pci_probe()
739 mutex_destroy(&imgu->lock); in imgu_pci_probe()
746 struct imgu_device *imgu = pci_get_drvdata(pci_dev); in imgu_pci_remove() local
751 imgu_video_nodes_exit(imgu); in imgu_pci_remove()
752 imgu_css_cleanup(&imgu->css); in imgu_pci_remove()
753 imgu_css_set_powerdown(&pci_dev->dev, imgu->base); in imgu_pci_remove()
754 imgu_dmamap_exit(imgu); in imgu_pci_remove()
755 imgu_mmu_exit(imgu->mmu); in imgu_pci_remove()
756 mutex_destroy(&imgu->streaming_lock); in imgu_pci_remove()
757 mutex_destroy(&imgu->lock); in imgu_pci_remove()
763 struct imgu_device *imgu = pci_get_drvdata(pci_dev); in imgu_suspend() local
766 imgu->suspend_in_stream = imgu_css_is_streaming(&imgu->css); in imgu_suspend()
767 if (!imgu->suspend_in_stream) in imgu_suspend()
770 atomic_set(&imgu->qbuf_barrier, 1); in imgu_suspend()
777 if (!wait_event_timeout(imgu->buf_drain_wq, in imgu_suspend()
778 imgu_css_queue_empty(&imgu->css), msecs_to_jiffies(1000))) in imgu_suspend()
781 imgu_css_stop_streaming(&imgu->css); in imgu_suspend()
782 atomic_set(&imgu->qbuf_barrier, 0); in imgu_suspend()
783 imgu_powerdown(imgu); in imgu_suspend()
792 struct imgu_device *imgu = dev_get_drvdata(dev); in imgu_resume() local
798 if (!imgu->suspend_in_stream) in imgu_resume()
803 r = imgu_powerup(imgu); in imgu_resume()
810 r = imgu_css_start_streaming(&imgu->css); in imgu_resume()
816 for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) { in imgu_resume()
817 r = imgu_queue_buffers(imgu, true, pipe); in imgu_resume()