• Paul Kocialkowski's avatar
    media: sun6i-csi: Add capture state using vsync for page flip · b86f6ea0
    Paul Kocialkowski authored
    The current implementation requires up to 3 buffers to properly
    implement page flipping without losing frames: one is configured
    before the video stream is started, one just after that and page
    flipping is synchronized to the frame done interrupt. The comment in
    the code mentions that "CSI will lookup the next dma buffer for next
    frame before the current frame done IRQ triggered".
    
    Based on observations of the CSI unit behavior, it seems that the
    buffer DMA address is sampled when the frame scan begins (in addition
    to starting the stream), which corresponds to the vblank interrupt
    that hits just before the frame-done interrupt of the previous frame.
    
    As a result, the address configured at the frame done interrupt is not
    actually used for the next frame but for the one after that.
    
    This proposal changes the page flipping sync point to the vsync
    interrupt, which allows the DMA address to be sampled for the next
    frame instead and allows operating with only two buffers.
    
    In addition to the change in the sync point, the code is refactored
    to introduce a notion of state that clarifies tracking of the buffers
    with tidy functions.
    Signed-off-by: default avatarPaul Kocialkowski <paul.kocialkowski@bootlin.com>
    Acked-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
    Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
    b86f6ea0
sun6i_csi.h 3.92 KB