[COMMON] media: mfc: OTF: change otf initialization sequence.
authorJeonghee Kim <jhhhh.kim@samsung.com>
Mon, 14 May 2018 05:01:50 +0000 (14:01 +0900)
committerSunyoung Kang <sy0816.kang@samsung.com>
Tue, 29 May 2018 06:59:18 +0000 (15:59 +0900)
An unnecessary error message was outputted at the time of booting
while trying to get HWFC information from a repeater driver that is not initialized.
So, the location requesting HWFC information has been changed. (open->s_fmt)

Change-Id: Iaefa9670dc367d7987721ec74847ac7e3cd50757
Signed-off-by: Jeonghee Kim <jhhhh.kim@samsung.com>
drivers/media/platform/exynos/mfc/s5p_mfc.c
drivers/media/platform/exynos/mfc/s5p_mfc_enc.c
drivers/media/platform/exynos/mfc/s5p_mfc_otf.c
drivers/media/platform/exynos/mfc/s5p_mfc_otf.h

index 679f1f10c9efc187316f06eaddf5f13a7d380689..06eea90ad83ea7cb0bc08bb27fafda1e512be3cf 100644 (file)
@@ -568,10 +568,11 @@ static int s5p_mfc_open(struct file *file)
        }
 
 #ifdef CONFIG_VIDEO_EXYNOS_REPEATER
-       if (s5p_mfc_is_encoder_otf_node(node))
-               ret = s5p_mfc_otf_init(ctx);
-       if (ret)
-               mfc_err_ctx("OTF: failed otf init\n");
+       if (s5p_mfc_is_encoder_otf_node(node)) {
+               ret = s5p_mfc_otf_create(ctx);
+               if (ret)
+                       mfc_err_ctx("OTF: otf_create failed\n");
+       }
 #endif
 
        s5p_mfc_perf_init(dev);
@@ -771,8 +772,10 @@ static int s5p_mfc_release(struct file *file)
                mfc_deinit_enc_ctx(ctx);
 
 #ifdef CONFIG_VIDEO_EXYNOS_REPEATER
-       if (ctx->otf_handle)
+       if (ctx->otf_handle) {
                s5p_mfc_otf_deinit(ctx);
+               s5p_mfc_otf_destroy(ctx);
+       }
 #endif
 
        s5p_mfc_destroy_listable_wq_ctx(ctx);
index ee4567ef8d78c92b4da18b72eade0c8fd71686f4..c59e85e3349048b452bcc847209ebd217ac3ed34 100644 (file)
@@ -339,10 +339,17 @@ static int vidioc_s_fmt_vid_cap_mplane(struct file *file, void *priv,
        mfc_info_ctx("Enc output codec(%d) : %s\n",
                        ctx->dst_fmt->codec_mode, ctx->dst_fmt->name);
 
-       if (ctx->otf_handle && ctx->dst_fmt->fourcc != V4L2_PIX_FMT_H264 &&
-                       ctx->dst_fmt->fourcc != V4L2_PIX_FMT_HEVC) {
-               mfc_err_ctx("OTF: only H.264 and HEVC is supported\n");
-               return -EINVAL;
+       if (ctx->otf_handle) {
+               if (ctx->dst_fmt->fourcc != V4L2_PIX_FMT_H264 &&
+                               ctx->dst_fmt->fourcc != V4L2_PIX_FMT_HEVC) {
+                       mfc_err_ctx("OTF: only H.264 and HEVC is supported\n");
+                       return -EINVAL;
+               }
+               if (s5p_mfc_otf_init(ctx)) {
+                       mfc_err_ctx("OTF: otf_init failed\n");
+                       s5p_mfc_otf_destroy(ctx);
+                       return -EINVAL;
+               }
        }
 
        enc->dst_buf_size = pix_fmt_mp->plane_fmt[0].sizeimage;
index 131829576200a9870d057ac10b872e986b10af1c..34d19711469f32c761f663f10b680e45245c5c46 100644 (file)
@@ -261,7 +261,7 @@ static void mfc_otf_destroy_handle(struct s5p_mfc_ctx *ctx)
        mfc_debug_leave();
 }
 
-int s5p_mfc_otf_init(struct s5p_mfc_ctx *ctx)
+int s5p_mfc_otf_create(struct s5p_mfc_ctx *ctx)
 {
        struct s5p_mfc_dev *dev;
        int i;
@@ -291,12 +291,6 @@ int s5p_mfc_otf_init(struct s5p_mfc_ctx *ctx)
                return -EINVAL;
        }
 
-       if (mfc_otf_init_hwfc_buf(ctx)) {
-               mfc_err_dev("OTF: HWFC init failed\n");
-               mfc_otf_destroy_handle(ctx);
-               return -EINVAL;
-       }
-
        if (otf_dump) {
                /* It is for debugging. Do not return error */
                if (s5p_mfc_otf_alloc_stream_buf(ctx)) {
@@ -305,6 +299,48 @@ int s5p_mfc_otf_init(struct s5p_mfc_ctx *ctx)
                }
        }
 
+       mfc_debug(2, "OTF: otf_create is completed\n");
+
+       mfc_debug_leave();
+
+       return 0;
+}
+
+void s5p_mfc_otf_destroy(struct s5p_mfc_ctx *ctx)
+{
+       mfc_debug_enter();
+
+       if (!ctx) {
+               mfc_err_dev("OTF: no mfc context to run\n");
+               return;
+       }
+
+       s5p_mfc_otf_release_stream_buf(ctx);
+       mfc_otf_destroy_handle(ctx);
+       mfc_debug(2, "OTF: otf_destroy is completed\n");
+
+       mfc_debug_leave();
+}
+
+int s5p_mfc_otf_init(struct s5p_mfc_ctx *ctx)
+{
+       mfc_debug_enter();
+
+       if (!ctx) {
+               mfc_err_dev("OTF: no mfc context to run\n");
+               return -EINVAL;
+       }
+
+       if (!ctx->otf_handle) {
+               mfc_err_dev("OTF: otf_handle was not created\n");
+               return -EINVAL;
+       }
+
+       if (mfc_otf_init_hwfc_buf(ctx)) {
+               mfc_err_dev("OTF: HWFC init failed\n");
+               return -EINVAL;
+       }
+
        mfc_debug(2, "OTF: otf_init is completed\n");
 
        mfc_debug_leave();
@@ -321,10 +357,7 @@ void s5p_mfc_otf_deinit(struct s5p_mfc_ctx *ctx)
                return;
        }
 
-       s5p_mfc_otf_release_stream_buf(ctx);
        mfc_otf_deinit_hwfc_buf(ctx);
-       mfc_otf_destroy_handle(ctx);
-       s5p_mfc_qos_off(ctx);
        mfc_debug(2, "OTF: deinit_otf is completed\n");
 
        mfc_debug_leave();
index 1167b23206399ec385d65d37790ca806a747e335..e7b5e5788f4536fd1d753db4909cf25352be6098 100644 (file)
@@ -17,6 +17,8 @@
 
 extern struct s5p_mfc_dev *g_mfc_dev;
 
+int s5p_mfc_otf_create(struct s5p_mfc_ctx *ctx);
+void s5p_mfc_otf_destroy(struct s5p_mfc_ctx *ctx);
 int s5p_mfc_otf_init(struct s5p_mfc_ctx *ctx);
 void s5p_mfc_otf_deinit(struct s5p_mfc_ctx *ctx);
 int s5p_mfc_otf_ctx_ready(struct s5p_mfc_ctx *ctx);