This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: atomisp: set per-device's default mode
Author:  Mauro Carvalho Chehab <[email protected]>
Date:    Fri Oct 29 08:09:39 2021 +0100

The atomisp driver originally used the s_parm command to
initialize the run_mode type to the driver. So, before start
setting up the streaming, s_parm should be called.

So, even having 5 "normal" video devices, one meant to be used
for each type, the run_mode was actually selected when
s_parm is called.

Without setting the run mode, applications that don't call
VIDIOC_SET_PARM with a custom atomisp parameters won't work, as
the pipeline won't be set:

        atomisp-isp2 0000:00:03.0: can't create streams
        atomisp-isp2 0000:00:03.0: __get_frame_info 1600x1200 (padded to 0) 
returned -22

However, commit 8a7c5594c020 ("media: v4l2-ioctl: clear fields in s_parm")
broke support for it, with a good reason, as drivers shoudn't be
extending the API for their own purposes.

So, as an step to allow generic apps to use this driver, put
the device's run_mode in preview after open.

After this patch, using v4l2grab starts to work on preview
mode (/dev/video2):

        $ v4l2grab -f YUYV -x 1600 -y 1200 -d /dev/video2 -n 1 -u
        $ feh out000.pnm

So, let's just setup the default run_mode that each video devnode
should assume, setting it at open() time.

Reported-by: Tsuchiya Yuto <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 drivers/staging/media/atomisp/pci/atomisp_fops.c   |  5 +++++
 drivers/staging/media/atomisp/pci/atomisp_subdev.c | 15 ++++++++++-----
 drivers/staging/media/atomisp/pci/atomisp_subdev.h |  3 +++
 drivers/staging/media/atomisp/pci/atomisp_v4l2.c   |  4 +++-
 drivers/staging/media/atomisp/pci/atomisp_v4l2.h   |  3 ++-
 5 files changed, 23 insertions(+), 7 deletions(-)

---

diff --git a/drivers/staging/media/atomisp/pci/atomisp_fops.c 
b/drivers/staging/media/atomisp/pci/atomisp_fops.c
index 036a265502fe..a57d480820bd 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_fops.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_fops.c
@@ -899,6 +899,11 @@ done:
        else
                pipe->users++;
        rt_mutex_unlock(&isp->mutex);
+
+       /* Ensure that a mode is set */
+       if (asd)
+               v4l2_ctrl_s_ctrl(asd->run_mode, pipe->default_run_mode);
+
        return 0;
 
 css_error:
diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.c 
b/drivers/staging/media/atomisp/pci/atomisp_subdev.c
index 12f22ad007c7..ffaf11e0b0ad 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_subdev.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.c
@@ -1164,23 +1164,28 @@ static int isp_subdev_init_entities(struct 
atomisp_sub_device *asd)
 
        atomisp_init_acc_pipe(asd, &asd->video_acc);
 
-       ret = atomisp_video_init(&asd->video_in, "MEMORY");
+       ret = atomisp_video_init(&asd->video_in, "MEMORY",
+                                ATOMISP_RUN_MODE_SDV);
        if (ret < 0)
                return ret;
 
-       ret = atomisp_video_init(&asd->video_out_capture, "CAPTURE");
+       ret = atomisp_video_init(&asd->video_out_capture, "CAPTURE",
+                                ATOMISP_RUN_MODE_STILL_CAPTURE);
        if (ret < 0)
                return ret;
 
-       ret = atomisp_video_init(&asd->video_out_vf, "VIEWFINDER");
+       ret = atomisp_video_init(&asd->video_out_vf, "VIEWFINDER",
+                                ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE);
        if (ret < 0)
                return ret;
 
-       ret = atomisp_video_init(&asd->video_out_preview, "PREVIEW");
+       ret = atomisp_video_init(&asd->video_out_preview, "PREVIEW",
+                                ATOMISP_RUN_MODE_PREVIEW);
        if (ret < 0)
                return ret;
 
-       ret = atomisp_video_init(&asd->video_out_video_capture, "VIDEO");
+       ret = atomisp_video_init(&asd->video_out_video_capture, "VIDEO",
+                                ATOMISP_RUN_MODE_VIDEO);
        if (ret < 0)
                return ret;
 
diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.h 
b/drivers/staging/media/atomisp/pci/atomisp_subdev.h
index d6fcfab6352d..a8d210ea5f8b 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_subdev.h
+++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.h
@@ -81,6 +81,9 @@ struct atomisp_video_pipe {
        /* the link list to store per_frame parameters */
        struct list_head per_frame_params;
 
+       /* Store here the initial run mode */
+       unsigned int default_run_mode;
+
        unsigned int buffers_in_css;
 
        /* irq_lock is used to protect video buffer state change operations and
diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c 
b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c
index 0223e3dd95a6..1b240891a6e2 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c
@@ -447,7 +447,8 @@ const struct atomisp_dfs_config dfs_config_cht_soc = {
        .dfs_table_size = ARRAY_SIZE(dfs_rules_cht_soc),
 };
 
-int atomisp_video_init(struct atomisp_video_pipe *video, const char *name)
+int atomisp_video_init(struct atomisp_video_pipe *video, const char *name,
+                      unsigned int run_mode)
 {
        int ret;
        const char *direction;
@@ -478,6 +479,7 @@ int atomisp_video_init(struct atomisp_video_pipe *video, 
const char *name)
                 "ATOMISP ISP %s %s", name, direction);
        video->vdev.release = video_device_release_empty;
        video_set_drvdata(&video->vdev, video->isp);
+       video->default_run_mode = run_mode;
 
        return 0;
 }
diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.h 
b/drivers/staging/media/atomisp/pci/atomisp_v4l2.h
index 81bb356b8172..72611b8286a4 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.h
+++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.h
@@ -27,7 +27,8 @@ struct v4l2_device;
 struct atomisp_device;
 struct firmware;
 
-int atomisp_video_init(struct atomisp_video_pipe *video, const char *name);
+int atomisp_video_init(struct atomisp_video_pipe *video, const char *name,
+                      unsigned int run_mode);
 void atomisp_acc_init(struct atomisp_acc_pipe *video, const char *name);
 void atomisp_video_unregister(struct atomisp_video_pipe *video);
 void atomisp_acc_unregister(struct atomisp_acc_pipe *video);

_______________________________________________
linuxtv-commits mailing list
[email protected]
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to