linux-stable/drivers/media/platform
Niklas Söderlund 82ec4ca9b5 [media] rcar-vin: allow switch between capturing modes when stalling
If userspace can't feed the driver with buffers as fast as the driver
consumes them the driver will stop video capturing and wait for more
buffers from userspace, the driver is stalled. Once it have been feed
one or more free buffers it will recover from the stall and resume
capturing.

Instead of continue to capture using the same capture mode as before the
stall allow the driver to choose between single and continuous mode
based on free buffer availability. Do this by stopping capturing when
the driver becomes stalled and restart capturing once it continues. By
doing
this the capture mode will be evaluated each time the driver is
recovering from a stall.

This behavior is needed to fix a bug where continuous capturing mode is
used, userspace is about to stop the stream and is waiting for the last
buffers to be returned from the driver and is not queuing any new
buffers. In this case the driver becomes stalled when there are only 3
buffers remaining streaming will never resume since the driver is
waiting for userspace to feed it more buffers before it can continue
streaming.  With this fix the driver will then switch to single capture
mode for the last 3 buffers and a deadlock is avoided. The issue can be
demonstrated using yavta.

$ yavta -f RGB565 -s 640x480 -n 4 --capture=10  /dev/video22
Device /dev/video22 opened.
Device `R_Car_VIN' on `platform:e6ef1000.video' (driver 'rcar_vin') supports video, capture, without mplanes.
Video format set: RGB565 (50424752) 640x480 (stride 1280) field interlaced buffer size 614400
Video format: RGB565 (50424752) 640x480 (stride 1280) field interlaced buffer size 614400
4 buffers requested.
length: 614400 offset: 0 timestamp type/source: mono/EoF
Buffer 0/0 mapped at address 0xb6cc7000.
length: 614400 offset: 614400 timestamp type/source: mono/EoF
Buffer 1/0 mapped at address 0xb6c31000.
length: 614400 offset: 1228800 timestamp type/source: mono/EoF
Buffer 2/0 mapped at address 0xb6b9b000.
length: 614400 offset: 1843200 timestamp type/source: mono/EoF
Buffer 3/0 mapped at address 0xb6b05000.
0 (0) [-] interlaced 0 614400 B 38.240285 38.240303 12.421 fps ts mono/EoF
1 (1) [-] interlaced 1 614400 B 38.282329 38.282346 23.785 fps ts mono/EoF
2 (2) [-] interlaced 2 614400 B 38.322324 38.322338 25.003 fps ts mono/EoF
3 (3) [-] interlaced 3 614400 B 38.362318 38.362333 25.004 fps ts mono/EoF
4 (0) [-] interlaced 4 614400 B 38.402313 38.402328 25.003 fps ts mono/EoF
5 (1) [-] interlaced 5 614400 B 38.442307 38.442321 25.004 fps ts mono/EoF
6 (2) [-] interlaced 6 614400 B 38.482301 38.482316 25.004 fps ts mono/EoF
7 (3) [-] interlaced 7 614400 B 38.522295 38.522312 25.004 fps ts mono/EoF
8 (0) [-] interlaced 8 614400 B 38.562290 38.562306 25.003 fps ts mono/EoF
<blocks forever, waiting for the last buffer>

This fix also allow the driver to switch to single capture mode if
userspace doesn't feed it buffers fast enough. Or the other way around,
if userspace suddenly feeds the driver buffers faster it can switch to
continues capturing mode.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-06-06 14:44:45 -03:00
..
am437x [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
atmel [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
blackfin [media] media: Drop FSF's postal address from the source code files 2017-01-27 11:38:09 -02:00
coda [media] coda: simplify optional reset handling 2017-06-06 08:12:45 -03:00
davinci [media] media: vpif: use a configurable i2c_adapter_id for vpif display 2017-03-22 11:55:56 -03:00
exynos-gsc [media] exynos-gsc: Do not swap cb/cr for semi planar formats 2017-03-22 09:50:07 -03:00
exynos4-is [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
marvell-ccic [media] media drivers: annotate fall-through 2017-05-19 07:10:03 -03:00
mtk-jpeg [media] vcodec: mediatek: mark pm functions as __maybe_unused 2017-04-10 06:43:10 -03:00
mtk-mdp [media] mtk-mdp: allocate video_device dynamically 2016-11-22 05:42:29 -02:00
mtk-vcodec [media] mtk_vcodec_dec: return error at mtk_vdec_pic_info_update() 2017-05-19 07:12:05 -03:00
mtk-vpu IOMMU Updates for Linux v4.12 2017-05-09 15:15:47 -07:00
omap Linux 4.9-rc5 2016-11-16 16:42:27 -02:00
omap3isp [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
rcar-vin [media] rcar-vin: allow switch between capturing modes when stalling 2017-06-06 14:44:45 -03:00
s3c-camif [media] media: platform: s3c-camif: constify v4l2_subdev_ops structures 2017-02-03 10:58:00 -02:00
s5p-cec [media] media: s5p-cec: Fixed spelling mistake 2017-06-06 07:45:08 -03:00
s5p-g2d [media] s5p-g2d: Fix error handling 2017-04-05 16:37:15 -03:00
s5p-jpeg [media] s5p-jpeg: don't return a random width/height 2017-05-19 07:10:50 -03:00
s5p-mfc [media] s5p-mfc: Don't allocate codec buffers from pre-allocated region 2017-04-05 16:36:53 -03:00
soc_camera [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
sti [media] cec: stih: fix typos in comments 2017-06-06 07:44:46 -03:00
stm32 [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
ti-vpe [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
vimc [media] vimc: Virtual Media Controller core, capture and sensor 2017-04-14 23:05:13 -03:00
vivid [media] cec: Kconfig cleanup 2017-04-19 06:50:52 -03:00
vsp1 [media] vsp1: set V4L2_CTRL_FLAG_MODIFY_LAYOUT for histogram controls 2017-04-14 22:55:54 -03:00
xilinx [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
arv.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
fsl-viu.c [media] fsl-viu: use setup_timer 2017-04-10 14:55:57 -03:00
Kconfig [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
m2m-deinterlace.c [media] m2m-deinterlace: don't return zero on failure paths in deinterlace_probe() 2017-04-10 14:43:31 -03:00
Makefile [media] stm32-dcmi: STM32 DCMI camera interface driver 2017-06-06 06:49:32 -03:00
mx2_emmaprp.c [media] platform: don't break long lines 2016-10-21 10:06:32 -02:00
pxa_camera.c [media] v4l: Switch from V4L2 OF not V4L2 fwnode API 2017-06-06 09:58:16 -03:00
rcar-fcp.c [media] v4l: rcar-fcp: Fix module autoload for OF registration 2016-11-16 13:17:07 -02:00
rcar_fdp1.c [media] v4l: rcar_fdp1: use %4.4s to format a 4-byte string 2017-02-03 11:50:40 -02:00
rcar_jpu.c [media] platform: constify vb2_ops structures 2016-09-19 16:21:06 -03:00
sh_veu.c [media] vb2: replace void *alloc_ctxs by struct device *alloc_devs 2016-07-08 14:45:07 -03:00
sh_vou.c [media] media drivers: annotate fall-through 2017-05-19 07:10:03 -03:00
via-camera.c [media] platform: don't break long lines 2016-10-21 10:06:32 -02:00
via-camera.h
vim2m.c [media] vim2m: Clean up file handle in open() error path 2017-01-31 07:44:26 -02:00