Merge tag 'media/v6.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[linux-2.6-microblaze.git] / drivers / media / platform / renesas / rzg2l-cru / rzg2l-video.c
index d0ffa90..b16b8af 100644 (file)
@@ -430,13 +430,6 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_dev *cru)
 
        spin_lock_irqsave(&cru->qlock, flags);
 
-       /* Initialize image convert */
-       ret = rzg2l_cru_initialize_image_conv(cru, fmt);
-       if (ret) {
-               spin_unlock_irqrestore(&cru->qlock, flags);
-               return ret;
-       }
-
        /* Select a video input */
        rzg2l_cru_write(cru, CRUnCTRL, CRUnCTRL_VINSEL(0));
 
@@ -450,6 +443,13 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_dev *cru)
        /* Initialize the AXI master */
        rzg2l_cru_initialize_axi(cru);
 
+       /* Initialize image convert */
+       ret = rzg2l_cru_initialize_image_conv(cru, fmt);
+       if (ret) {
+               spin_unlock_irqrestore(&cru->qlock, flags);
+               return ret;
+       }
+
        /* Enable interrupt */
        rzg2l_cru_write(cru, CRUnIE, CRUnIE_EFE);
 
@@ -461,16 +461,6 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_dev *cru)
        return 0;
 }
 
-void rzg2l_cru_vclk_unprepare(struct rzg2l_cru_dev *cru)
-{
-       clk_disable_unprepare(cru->vclk);
-}
-
-int rzg2l_cru_vclk_prepare(struct rzg2l_cru_dev *cru)
-{
-       return clk_prepare_enable(cru->vclk);
-}
-
 static int rzg2l_cru_set_stream(struct rzg2l_cru_dev *cru, int on)
 {
        struct media_pipeline *pipe;
@@ -499,39 +489,24 @@ static int rzg2l_cru_set_stream(struct rzg2l_cru_dev *cru, int on)
 
                video_device_pipeline_stop(&cru->vdev);
 
-               pm_runtime_put_sync(cru->dev);
-               clk_disable_unprepare(cru->vclk);
-
                return stream_off_ret;
        }
 
-       ret = pm_runtime_resume_and_get(cru->dev);
-       if (ret)
-               return ret;
-
-       ret = clk_prepare_enable(cru->vclk);
-       if (ret)
-               goto err_pm_put;
-
        ret = rzg2l_cru_mc_validate_format(cru, sd, pad);
        if (ret)
-               goto err_vclk_disable;
+               return ret;
 
        pipe = media_entity_pipeline(&sd->entity) ? : &cru->vdev.pipe;
        ret = video_device_pipeline_start(&cru->vdev, pipe);
        if (ret)
-               goto err_vclk_disable;
+               return ret;
 
        ret = v4l2_subdev_call(sd, video, pre_streamon, 0);
-       if (ret == -ENOIOCTLCMD)
-               ret = 0;
-       if (ret)
+       if (ret && ret != -ENOIOCTLCMD)
                goto pipe_line_stop;
 
        ret = v4l2_subdev_call(sd, video, s_stream, 1);
-       if (ret == -ENOIOCTLCMD)
-               ret = 0;
-       if (ret)
+       if (ret && ret != -ENOIOCTLCMD)
                goto err_s_stream;
 
        return 0;
@@ -542,12 +517,6 @@ err_s_stream:
 pipe_line_stop:
        video_device_pipeline_stop(&cru->vdev);
 
-err_vclk_disable:
-       clk_disable_unprepare(cru->vclk);
-
-err_pm_put:
-       pm_runtime_put_sync(cru->dev);
-
        return ret;
 }
 
@@ -646,25 +615,33 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queue *vq, unsigned int count
        struct rzg2l_cru_dev *cru = vb2_get_drv_priv(vq);
        int ret;
 
+       ret = pm_runtime_resume_and_get(cru->dev);
+       if (ret)
+               return ret;
+
+       ret = clk_prepare_enable(cru->vclk);
+       if (ret)
+               goto err_pm_put;
+
        /* Release reset state */
        ret = reset_control_deassert(cru->aresetn);
        if (ret) {
                dev_err(cru->dev, "failed to deassert aresetn\n");
-               return ret;
+               goto err_vclk_disable;
        }
 
        ret = reset_control_deassert(cru->presetn);
        if (ret) {
                reset_control_assert(cru->aresetn);
                dev_err(cru->dev, "failed to deassert presetn\n");
-               return ret;
+               goto assert_aresetn;
        }
 
        ret = request_irq(cru->image_conv_irq, rzg2l_cru_irq,
                          IRQF_SHARED, KBUILD_MODNAME, cru);
        if (ret) {
                dev_err(cru->dev, "failed to request irq\n");
-               goto assert_resets;
+               goto assert_presetn;
        }
 
        /* Allocate scratch buffer. */
@@ -696,10 +673,18 @@ out:
 free_image_conv_irq:
        free_irq(cru->image_conv_irq, cru);
 
-assert_resets:
+assert_presetn:
        reset_control_assert(cru->presetn);
+
+assert_aresetn:
        reset_control_assert(cru->aresetn);
 
+err_vclk_disable:
+       clk_disable_unprepare(cru->vclk);
+
+err_pm_put:
+       pm_runtime_put_sync(cru->dev);
+
        return ret;
 }
 
@@ -714,9 +699,11 @@ static void rzg2l_cru_stop_streaming_vq(struct vb2_queue *vq)
                          cru->scratch, cru->scratch_phys);
 
        free_irq(cru->image_conv_irq, cru);
-       reset_control_assert(cru->presetn);
-
        return_unused_buffers(cru, VB2_BUF_STATE_ERROR);
+
+       reset_control_assert(cru->presetn);
+       clk_disable_unprepare(cru->vclk);
+       pm_runtime_put_sync(cru->dev);
 }
 
 static const struct vb2_ops rzg2l_cru_qops = {