summaryrefslogtreecommitdiffstats
path: root/drivers/media/video/omap3isp/ispvideo.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-11-18 11:28:24 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-08 13:50:29 -0300
commit1567bb7dcc6a232693143fdbe3b89791f20890ac (patch)
tree5366c345c2bd20bccf09a4b77296763eef28b693 /drivers/media/video/omap3isp/ispvideo.c
parent4742c82ed90d0f8c82639750dcfe481e61d883a4 (diff)
downloadop-kernel-dev-1567bb7dcc6a232693143fdbe3b89791f20890ac.zip
op-kernel-dev-1567bb7dcc6a232693143fdbe3b89791f20890ac.tar.gz
[media] omap3isp: Prevent pipelines that contain a crashed entity from starting
The OMAP3 ISP preview engine will violate the L4 bus protocol if we try to write some of its internal registers after it failed to stop properly. This generates an external abort on non-linefetch fault, triggering a fatal kernel oops. We can't always prevent preview engine stop failures (they can for instance be caused by a sensor crash), but we can improve the system reliability by refusing to start streaming on a pipeline that contains the preview engine if it failed to stop. The driver will then eventually reset the ISP (when all applications will have closed their file handles related to OMAP3 ISP device nodes), making the ISP usable again. Fixes: NB#291334 - camera: Recover gracefully from ISP crash instead of oopsing Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> Reviewed-by: Phil Carmody <ext-phil.2.carmody@nokia.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/omap3isp/ispvideo.c')
-rw-r--r--drivers/media/video/omap3isp/ispvideo.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c
index b020700..2107d99 100644
--- a/drivers/media/video/omap3isp/ispvideo.c
+++ b/drivers/media/video/omap3isp/ispvideo.c
@@ -292,6 +292,7 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe)
int ret;
pipe->max_rate = pipe->l3_ick;
+ pipe->entities = 0;
subdev = isp_video_remote_subdev(pipe->output, NULL);
if (subdev == NULL)
@@ -299,6 +300,9 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe)
while (1) {
unsigned int shifter_link;
+
+ pipe->entities |= 1U << subdev->entity.id;
+
/* Retrieve the sink format */
pad = &subdev->entity.pads[0];
if (!(pad->flags & MEDIA_PAD_FL_SINK))
OpenPOWER on IntegriCloud