media: atomisp: Simplify atomisp_css_[start|stop]()
authorHans de Goede <hdegoede@redhat.com>
Thu, 11 May 2023 18:27:24 +0000 (19:27 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 9 Jun 2023 13:37:51 +0000 (14:37 +0100)
Now that continuous mode is gone and we only have 1 /dev/video# node,
the videobuf2 core guarantees that atomisp_css_[start|stop]() will
only be called one at a time.

So there is no need for atomisp_streaming_count() counts.

When reqbufs has been done then the streams are guaranteed to be created,
and streaming cannot be started without reqbufs so there is no need for
atomisp_css_start() to check if it needs to create the streams.

Use this to clean-up atomisp_css_[start|stop]().

While at it also fix atomisp_css_start() not re-creating the streams
on an error, breaking the guarantee that the streams are always there
after a succesfull reqbufs call.

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/staging/media/atomisp/pci/atomisp_compat_css20.c

index 43760fcc0d43b43265580f151659ce717fc31fd5..092262e1b7ec102e4e16a2e58b43e0188bab6f58 100644 (file)
@@ -1001,42 +1001,17 @@ int atomisp_css_start(struct atomisp_sub_device *asd,
                wbinvd();
        }
 
-       /*
-        * For dual steam case, it is possible that:
-        * 1: for this stream, it is at the stage that:
-        * - after set_fmt is called
-        * - before stream on is called
-        * 2: for the other stream, the stream off is called which css reset
-        * has been done.
-        *
-        * Thus the stream created in set_fmt get destroyed and need to be
-        * recreated in the next stream on.
-        */
-       if (!asd->stream_prepared) {
-               ret = atomisp_create_pipes_stream(asd);
-               if (ret)
-                       return ret;
-       }
-       /*
-        * SP can only be started one time
-        * if atomisp_subdev_streaming_count() tell there already has some
-        * subdev at streamming, then SP should already be started previously,
-        * so need to skip start sp procedure
-        */
-       if (atomisp_streaming_count(isp)) {
-               dev_dbg(isp->dev, "skip start sp\n");
-       } else {
-               if (!sh_css_hrt_system_is_idle())
-                       dev_err(isp->dev, "CSS HW not idle before starting SP\n");
-               if (ia_css_start_sp()) {
-                       dev_err(isp->dev, "start sp error.\n");
-                       ret = -EINVAL;
-                       goto start_err;
-               } else {
-                       sp_is_started = true;
-               }
+       if (!sh_css_hrt_system_is_idle())
+               dev_err(isp->dev, "CSS HW not idle before starting SP\n");
+
+       if (ia_css_start_sp()) {
+               dev_err(isp->dev, "start sp error.\n");
+               ret = -EINVAL;
+               goto start_err;
        }
 
+       sp_is_started = true;
+
        for (i = 0; i < ATOMISP_INPUT_STREAM_NUM; i++) {
                if (asd->stream_env[i].stream) {
                        if (ia_css_stream_start(asd->stream_env[i]
@@ -1054,16 +1029,15 @@ int atomisp_css_start(struct atomisp_sub_device *asd,
        return 0;
 
 start_err:
-       atomisp_destroy_pipes_stream_force(asd);
-
-       /* css 2.0 API limitation: ia_css_stop_sp() could be only called after
-        * destroy all pipes
-        */
        /*
-        * SP can not be stop if other streams are in use
+        * CSS 2.0 API limitation: ia_css_stop_sp() can only be called after
+        * destroying all pipes.
         */
-       if ((atomisp_streaming_count(isp) == 0) && sp_is_started)
+       if (sp_is_started) {
+               atomisp_destroy_pipes_stream_force(asd);
                ia_css_stop_sp();
+               atomisp_create_pipes_stream(asd);
+       }
 
        return ret;
 }
@@ -1843,20 +1817,18 @@ int atomisp_css_input_configure_port(
 void atomisp_css_stop(struct atomisp_sub_device *asd,
                      enum ia_css_pipe_id pipe_id, bool in_reset)
 {
-       struct atomisp_device *isp = asd->isp;
        unsigned long irqflags;
        unsigned int i;
 
-       /* if is called in atomisp_reset(), force destroy streams and pipes */
+       /*
+        * CSS 2.0 API limitation: ia_css_stop_sp() can only be called after
+        * destroying all pipes.
+        */
        atomisp_destroy_pipes_stream_force(asd);
 
        atomisp_init_raw_buffer_bitmap(asd);
 
-       /*
-        * SP can not be stop if other streams are in use
-        */
-       if (atomisp_streaming_count(isp) == 0)
-               ia_css_stop_sp();
+       ia_css_stop_sp();
 
        if (!in_reset) {
                struct atomisp_stream_env *stream_env;