From 90dd396789bc18d6e765107cce63d1d7721d0e93 Mon Sep 17 00:00:00 2001 From: Sylwester Nawrocki Date: Tue, 28 Jul 2015 14:06:58 +0900 Subject: fimc-is: Workaround to ensure proper video open sequence This a workaround to prevent system crash when video nodes are opened in random sequence during system booting. Signed-off-by: Sylwester Nawrocki fimc-is: hack video node open to require companion to be opened Signed-off-by: Marek Szyprowski --- drivers/media/platform/exynos/fimc-is/fimc-is-core.h | 1 + drivers/media/platform/exynos/fimc-is/fimc-is-video-3aa.c | 6 ++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-3aac.c | 6 ++++++ .../media/platform/exynos/fimc-is/fimc-is-video-companion.c | 7 +++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-isp.c | 6 ++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-scc.c | 6 ++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-scp.c | 6 ++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-sensor.c | 11 +++++++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-vdisc.c | 6 ++++++ drivers/media/platform/exynos/fimc-is/fimc-is-video-vdiso.c | 6 ++++++ 10 files changed, 61 insertions(+) (limited to 'drivers/media') diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-core.h b/drivers/media/platform/exynos/fimc-is/fimc-is-core.h index 720806e019e8..5925a3612921 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-core.h +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-core.h @@ -284,6 +284,7 @@ struct fimc_is_core { bool use_module_check; bool running_rear_camera; bool running_front_camera; + bool fimc_is_companion_opened; }; extern struct device *fimc_is_dev; diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aa.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aa.c index c06b3f0e6d81..08b023b09897 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aa.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aa.c @@ -135,6 +135,12 @@ static int fimc_is_3aa_video_open(struct file *file) else core = container_of(video, struct fimc_is_core, video_3a1); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_3AA_GRP, FRAMEMGR_ID_3AAP); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aac.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aac.c index 28387c6f3b2d..9f25ab4abcc1 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aac.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-3aac.c @@ -129,6 +129,12 @@ static int fimc_is_3aac_video_open(struct file *file) else core = container_of(video, struct fimc_is_core, video_3a1c); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_INVALID, FRAMEMGR_ID_3AAC); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-companion.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-companion.c index a1ed1e65e877..5ea30cd123e2 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-companion.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-companion.c @@ -30,6 +30,7 @@ #include "fimc-is-device-companion.h" #include "fimc-is-video.h" +#include "fimc-is-core.h" const struct v4l2_file_operations fimc_is_comp_video_fops; const struct v4l2_ioctl_ops fimc_is_comp_video_ioctl_ops; @@ -125,6 +126,7 @@ static int fimc_is_comp_video_open(struct file *file) struct fimc_is_video_ctx *vctx; struct fimc_is_device_companion *device; struct platform_device *fimc_is_pdev; + struct fimc_is_core *core; fimc_is_pdev = to_platform_device(fimc_is_dev); exynos_fimc_is_cfg_cam_clk(fimc_is_pdev); @@ -132,6 +134,7 @@ static int fimc_is_comp_video_open(struct file *file) vctx = NULL; video = video_drvdata(file); device = container_of(video, struct fimc_is_device_companion, video); + core = device->private_data; ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_INVALID, FRAMEMGR_ID_INVALID); if (ret) { @@ -148,6 +151,7 @@ static int fimc_is_comp_video_open(struct file *file) goto p_err; } + core->fimc_is_companion_opened = 1; p_err: return ret; } @@ -158,11 +162,13 @@ static int fimc_is_comp_video_close(struct file *file) struct fimc_is_video *video = NULL; struct fimc_is_video_ctx *vctx = NULL; struct fimc_is_device_companion *device = NULL; + struct fimc_is_core *core; BUG_ON(!file); video = video_drvdata(file); device = container_of(video, struct fimc_is_device_companion, video); + core = device->private_data; vctx = file->private_data; if (!vctx) { @@ -182,6 +188,7 @@ static int fimc_is_comp_video_close(struct file *file) err("close_vctx is fail(%d)", ret); p_err: + core->fimc_is_companion_opened = 0; return ret; } diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-isp.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-isp.c index 944fe62eabbf..c9d936dd71e9 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-isp.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-isp.c @@ -95,6 +95,12 @@ static int fimc_is_isp_video_open(struct file *file) video = video_drvdata(file); core = container_of(video, struct fimc_is_core, video_isp); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_ISP_GRP, FRAMEMGR_ID_INVALID); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-scc.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-scc.c index a14132d1711c..75704ae1b145 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-scc.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-scc.c @@ -91,6 +91,12 @@ static int fimc_is_scc_video_open(struct file *file) video = video_drvdata(file); core = container_of(video, struct fimc_is_core, video_scc); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_INVALID, FRAMEMGR_ID_SCC); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-scp.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-scp.c index 3b7e7c4ee8fb..2026260a6a17 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-scp.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-scp.c @@ -91,6 +91,12 @@ static int fimc_is_scp_video_open(struct file *file) video = video_drvdata(file); core = container_of(video, struct fimc_is_core, video_scp); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_INVALID, FRAMEMGR_ID_SCP); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-sensor.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-sensor.c index 7fa395623832..d1b194ac63bc 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-sensor.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-sensor.c @@ -89,11 +89,22 @@ static int fimc_is_sen_video_open(struct file *file) struct fimc_is_video *video; struct fimc_is_video_ctx *vctx; struct fimc_is_device_sensor *device; + struct platform_device *fimc_is_pdev; + struct fimc_is_core *core; + + fimc_is_pdev = to_platform_device(fimc_is_dev); + core = dev_get_drvdata(fimc_is_dev); vctx = NULL; video = video_drvdata(file); device = container_of(video, struct fimc_is_device_sensor, video); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_INVALID, FRAMEMGR_ID_SENSOR); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdisc.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdisc.c index 8e9df9f5000f..0ce8579ff771 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdisc.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdisc.c @@ -85,6 +85,12 @@ static int fimc_is_vdc_video_open(struct file *file) video = video_drvdata(file); core = container_of(video, struct fimc_is_core, video_vdc); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_INVALID, FRAMEMGR_ID_DIS); if (ret) { err("open_vctx is fail(%d)", ret); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdiso.c b/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdiso.c index c219bc5a56e2..cc670d0fcd12 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdiso.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-video-vdiso.c @@ -86,6 +86,12 @@ static int fimc_is_vdo_video_open(struct file *file) video = video_drvdata(file); core = container_of(video, struct fimc_is_core, video_vdo); + if (!core->fimc_is_companion_opened) { + pr_info("%s: /dev/video109 (companion) must be opened first\n", + __func__); + return -EINVAL; + } + ret = open_vctx(file, video, &vctx, FRAMEMGR_ID_DIS_GRP, FRAMEMGR_ID_INVALID); if (ret) { err("open_vctx is fail(%d)", ret); -- cgit v1.2.3