fimc-is: Workaround to ensure proper video open sequence
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Tue, 28 Jul 2015 05:06:58 +0000 (14:06 +0900)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Fri, 27 Apr 2018 08:25:07 +0000 (10:25 +0200)
This a workaround to prevent system crash when video nodes are opened
in random sequence during system booting.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
fimc-is: hack video node open to require companion to be opened

Change-Id: I3b7f929c087acb32169fd6a26cee6eeb7e225497
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
drivers/media/platform/exynos/fimc-is/fimc-is-core.h
drivers/media/platform/exynos/fimc-is/fimc-is-video-3aa.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-3aac.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-companion.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-isp.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-scc.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-scp.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-sensor.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-vdisc.c
drivers/media/platform/exynos/fimc-is/fimc-is-video-vdiso.c

index 720806e019e8a8929d48fd3e06cb6da02ea5cbb9..5925a36129212672fc0ebdf81d11a167a0ed319a 100644 (file)
@@ -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;
index c06b3f0e6d816873339985a4059f4310ac2d36a0..08b023b098973631ce6a1b907bbb52c9ea37ae6b 100644 (file)
@@ -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);
index 28387c6f3b2d7df2911c4288a7babff9c49b8230..9f25ab4abcc11a4d69c90de46605bf734745a959 100644 (file)
@@ -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);
index a1ed1e65e877b9440fe286b278b737a6c60111c2..5ea30cd123e221802f9771e44cbb24566e9a9ff5 100644 (file)
@@ -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;
 }
 
index 1128f08017b5a564c0e71b6ae4495769e11df6c0..3f417e2bcb6473cdae13adbf8eb84edb738af315 100644 (file)
@@ -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);
index a14132d1711ce00a513d69c66f9b4c5c824c1d10..75704ae1b1456d69edb71254a95cec7485d77b22 100644 (file)
@@ -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);
index 3b7e7c4ee8fbc61a3e2960cb1a3e2e29632687ff..2026260a6a178b63b1a6f6e9c1ba11f7c18a1a4a 100644 (file)
@@ -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);
index 7fa395623832a7a6cb08090687dcde46ef295ac5..d1b194ac63bcea3fd69eaf955510e404fef1d20c 100644 (file)
@@ -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);
index 8e9df9f5000f70aea994bcefc37f5cdf2575850f..0ce8579ff77124dc92328027fd4102bbd5a9ee27 100644 (file)
@@ -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);
index c219bc5a56e2defce9928e77343b4ddea1565dcd..cc670d0fcd1220e6b5c9ccc90b1cabfc0626111a 100644 (file)
@@ -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);