Hi Kieran, On Tue, May 9, 2017 at 6:39 PM, Kieran Bingham <kieran.bingham+renesas@xxxxxxxxxxxxxxxx> wrote: > When the VSP1 is used in an active display pipeline, the output of the > WPF can supply the LIF entity directly and simultaneously write to > memory. > > Support this functionality in the VSP1 driver, by extending the WPF > source pads, and establishing a V4L2 video device node connected to the > new source. > > The source will be able to perform pixel format conversion, but not > rescaling, and as such the output from the memory node will always be > of the same dimensions as the display output. > > Signed-off-by: Kieran Bingham <kieran.bingham+renesas@xxxxxxxxxxxxxxxx> > --- a/drivers/media/platform/vsp1/vsp1_video.c > +++ b/drivers/media/platform/vsp1/vsp1_video.c > @@ -900,6 +901,147 @@ static const struct vb2_ops vsp1_video_queue_qops = { > .stop_streaming = vsp1_video_stop_streaming, > }; > > + > +/* ----------------------------------------------------------------------------- > + * videobuf2 queue operations for writeback nodes > + */ > + > +static void vsp1_video_wb_process_buffer(struct vsp1_video *video) > +{ > + struct vsp1_vb2_buffer *buf; > + unsigned long flags; > + > + /* > + * Writeback uses a running stream, unlike the M2M interface which > + * controls a pipeline process manually though the use of > + * vsp1_pipeline_run(). > + * > + * Instead writeback will commence at the next frame interval, and can > + * be marked complete at the interval following that. To handle this we > + * store the configured buffer as pending until the next callback. > + * > + * | | | | | > + * A |<-->| > + * B |<-->| > + * C |<-->| : Only at interrupt C can A be marked done > + */ > + > + spin_lock_irqsave(&video->irqlock, flags); > + > + /* Move the pending image to the active hw queue */ > + if (video->pending) { > + list_add_tail(&video->pending->queue, &video->irqqueue); > + video->pending = NULL; > + } > + > + buf = list_first_entry_or_null(&video->wbqueue, struct vsp1_vb2_buffer, > + queue); > + > + if (buf) { > + video->rwpf->mem = buf->mem; > + > + /* > + * Store this buffer as pending. It will commence at the next > + * frame start interrupt > + */ > + video->pending = buf; > + list_del(&buf->queue); > + } else { > + /* Disable writeback with no buffer */ > + video->rwpf->mem = (struct vsp1_rwpf_memory) { 0 }; With gcc 4.9.0: drivers/media/platform/vsp1/vsp1_video.c: In function 'vsp1_video_wb_process_buffer': drivers/media/platform/vsp1/vsp1_video.c:942:30: warning: missing braces around initializer [-Wmissing-braces] video->rwpf->mem = (struct vsp1_rwpf_memory) { 0 }; - video->rwpf->mem = (struct vsp1_rwpf_memory) { 0 }; + video->rwpf->mem = (struct vsp1_rwpf_memory) { { 0, } }; > +static void vsp1_video_wb_stop_streaming(struct vb2_queue *vq) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vq); > + struct vsp1_rwpf *rwpf = video->rwpf; > + struct vsp1_pipeline *pipe = rwpf->pipe; > + struct vsp1_vb2_buffer *buffer; > + unsigned long flags; > + > + /* > + * Disable the completion interrupts, and clear the WPF memory to > + * prevent writing out frames > + */ > + spin_lock_irqsave(&video->irqlock, flags); > + video->frame_end = NULL; > + rwpf->mem = (struct vsp1_rwpf_memory) { 0 }; Likewise: - rwpf->mem = (struct vsp1_rwpf_memory) { 0 }; + rwpf->mem = (struct vsp1_rwpf_memory) { { 0, } }; Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds