media: sun6i-csi: Split stream sequences and irq code in capture
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Thu, 3 Nov 2022 16:30:52 +0000 (16:30 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 25 Nov 2022 07:05:21 +0000 (07:05 +0000)
Create minimal helpers that split the enable/disable flow, which will
make it easier to move control over to the bridge later on.

Generally speaking the goal is to move register configuration to
the capture code and later split it with the bridge code.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c

index 673e40f78a9a80f7bc0ef3055481b3cdc00e1c61..7944736d27e170202b9f656b7f3445ac4b42b3de 100644 (file)
@@ -535,32 +535,6 @@ int sun6i_csi_update_config(struct sun6i_csi_device *csi_dev,
        return 0;
 }
 
-void sun6i_csi_set_stream(struct sun6i_csi_device *csi_dev, bool enable)
-{
-       struct regmap *regmap = csi_dev->regmap;
-
-       if (!enable) {
-               regmap_update_bits(regmap, SUN6I_CSI_CAP_REG,
-                                  SUN6I_CSI_CAP_VCAP_ON, 0);
-               regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG, 0);
-               return;
-       }
-
-       regmap_write(regmap, SUN6I_CSI_CH_INT_STA_REG,
-                    SUN6I_CSI_CH_INT_STA_CLEAR);
-       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG,
-                    SUN6I_CSI_CH_INT_EN_VS |
-                    SUN6I_CSI_CH_INT_EN_HB_OF |
-                    SUN6I_CSI_CH_INT_EN_FIFO2_OF |
-                    SUN6I_CSI_CH_INT_EN_FIFO1_OF |
-                    SUN6I_CSI_CH_INT_EN_FIFO0_OF |
-                    SUN6I_CSI_CH_INT_EN_FD |
-                    SUN6I_CSI_CH_INT_EN_CD);
-
-       regmap_update_bits(regmap, SUN6I_CSI_CAP_REG, SUN6I_CSI_CAP_VCAP_ON,
-                          SUN6I_CSI_CAP_VCAP_ON);
-}
-
 /* Media */
 
 static const struct media_device_ops sun6i_csi_media_ops = {
index 75867cde7985f4fd5b49d2b5bafb99f22975a34b..6fe40a56d6df66cfc7d4682ee768ab87ed532fe5 100644 (file)
@@ -96,13 +96,6 @@ int sun6i_csi_set_power(struct sun6i_csi_device *csi_dev, bool enable);
 int sun6i_csi_update_config(struct sun6i_csi_device *csi_dev,
                            struct sun6i_csi_config *config);
 
-/**
- * sun6i_csi_set_stream() - start/stop csi streaming
- * @csi_dev:   pointer to the csi device
- * @enable:    start/stop
- */
-void sun6i_csi_set_stream(struct sun6i_csi_device *csi_dev, bool enable);
-
 /* get bpp form v4l2 pixformat */
 static inline int sun6i_csi_get_bpp(unsigned int pixformat)
 {
index 5e7bbaa1006f25ecb5aa27e2cec011d2280da208..3ea443aa6fded4da0cb1225cc4092fd80774c4d8 100644 (file)
@@ -107,6 +107,51 @@ static bool sun6i_csi_capture_format_check(u32 format)
 
 /* Capture */
 
+static void sun6i_csi_capture_irq_enable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG,
+                    SUN6I_CSI_CH_INT_EN_VS |
+                    SUN6I_CSI_CH_INT_EN_HB_OF |
+                    SUN6I_CSI_CH_INT_EN_FIFO2_OF |
+                    SUN6I_CSI_CH_INT_EN_FIFO1_OF |
+                    SUN6I_CSI_CH_INT_EN_FIFO0_OF |
+                    SUN6I_CSI_CH_INT_EN_FD |
+                    SUN6I_CSI_CH_INT_EN_CD);
+}
+
+static void sun6i_csi_capture_irq_disable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG, 0);
+}
+
+static void sun6i_csi_capture_irq_clear(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG, 0);
+       regmap_write(regmap, SUN6I_CSI_CH_INT_STA_REG,
+                    SUN6I_CSI_CH_INT_STA_CLEAR);
+}
+
+static void sun6i_csi_capture_enable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_update_bits(regmap, SUN6I_CSI_CAP_REG, SUN6I_CSI_CAP_VCAP_ON,
+                          SUN6I_CSI_CAP_VCAP_ON);
+}
+
+static void sun6i_csi_capture_disable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_update_bits(regmap, SUN6I_CSI_CAP_REG, SUN6I_CSI_CAP_VCAP_ON, 0);
+}
+
 static void
 sun6i_csi_capture_buffer_configure(struct sun6i_csi_device *csi_dev,
                                   struct sun6i_csi_buffer *csi_buffer)
@@ -357,6 +402,10 @@ static int sun6i_csi_capture_start_streaming(struct vb2_queue *queue,
                goto error_media_pipeline;
        }
 
+       /* Clear */
+
+       sun6i_csi_capture_irq_clear(csi_dev);
+
        /* Configure */
 
        sun6i_csi_capture_configure(csi_dev);
@@ -367,7 +416,8 @@ static int sun6i_csi_capture_start_streaming(struct vb2_queue *queue,
 
        /* Enable */
 
-       sun6i_csi_set_stream(csi_dev, true);
+       sun6i_csi_capture_irq_enable(csi_dev);
+       sun6i_csi_capture_enable(csi_dev);
 
        ret = v4l2_subdev_call(subdev, video, s_stream, 1);
        if (ret && ret != -ENOIOCTLCMD)
@@ -376,7 +426,8 @@ static int sun6i_csi_capture_start_streaming(struct vb2_queue *queue,
        return 0;
 
 error_stream:
-       sun6i_csi_set_stream(csi_dev, false);
+       sun6i_csi_capture_disable(csi_dev);
+       sun6i_csi_capture_irq_disable(csi_dev);
 
 error_media_pipeline:
        video_device_pipeline_stop(video_dev);
@@ -397,7 +448,8 @@ static void sun6i_csi_capture_stop_streaming(struct vb2_queue *queue)
        if (subdev)
                v4l2_subdev_call(subdev, video, s_stream, 0);
 
-       sun6i_csi_set_stream(csi_dev, false);
+       sun6i_csi_capture_disable(csi_dev);
+       sun6i_csi_capture_irq_disable(csi_dev);
 
        video_device_pipeline_stop(&capture->video_dev);