OSDN Git Service

media: ti-vpe: cal: support 8 DMA contexts
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Mon, 14 Jun 2021 11:23:38 +0000 (13:23 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 12 Jul 2021 12:22:10 +0000 (14:22 +0200)
The current driver only ever needs 2 DMA contexts (one per PHY), but we
need to use more of the 8 contexts to add support for multiple streams.

Change the code so that we allocate DMA contexts as needed, which at
this time is 1 per PHY, but could be up to 8.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/ti-vpe/cal.c
drivers/media/platform/ti-vpe/cal.h

index 3a83681..ec8ffc8 100644 (file)
@@ -658,7 +658,7 @@ static irqreturn_t cal_irq(int irq_cal, void *data)
                /* Clear Interrupt status */
                cal_write(cal, CAL_HL_IRQSTATUS(1), status);
 
-               for (i = 0; i < ARRAY_SIZE(cal->ctx); ++i) {
+               for (i = 0; i < cal->num_contexts; ++i) {
                        if (status & CAL_HL_IRQ_WDMA_END_MASK(i))
                                cal_irq_wdma_end(cal->ctx[i]);
                }
@@ -672,7 +672,7 @@ static irqreturn_t cal_irq(int irq_cal, void *data)
                /* Clear Interrupt status */
                cal_write(cal, CAL_HL_IRQSTATUS(2), status);
 
-               for (i = 0; i < ARRAY_SIZE(cal->ctx); ++i) {
+               for (i = 0; i < cal->num_contexts; ++i) {
                        if (status & CAL_HL_IRQ_WDMA_START_MASK(i))
                                cal_irq_wdma_start(cal->ctx[i]);
                }
@@ -742,10 +742,7 @@ static int cal_async_notifier_complete(struct v4l2_async_notifier *notifier)
        unsigned int i;
        int ret;
 
-       for (i = 0; i < ARRAY_SIZE(cal->ctx); ++i) {
-               if (!cal->ctx[i])
-                       continue;
-
+       for (i = 0; i < cal->num_contexts; ++i) {
                ret = cal_ctx_v4l2_register(cal->ctx[i]);
                if (ret)
                        goto err_ctx_unreg;
@@ -865,10 +862,8 @@ static void cal_media_unregister(struct cal_dev *cal)
        unsigned int i;
 
        /* Unregister all the V4L2 video devices. */
-       for (i = 0; i < ARRAY_SIZE(cal->ctx); i++) {
-               if (cal->ctx[i])
-                       cal_ctx_v4l2_unregister(cal->ctx[i]);
-       }
+       for (i = 0; i < cal->num_contexts; i++)
+               cal_ctx_v4l2_unregister(cal->ctx[i]);
 
        cal_async_notifier_unregister(cal);
        media_device_unregister(&cal->mdev);
@@ -915,10 +910,8 @@ static void cal_media_cleanup(struct cal_dev *cal)
 {
        unsigned int i;
 
-       for (i = 0; i < ARRAY_SIZE(cal->ctx); i++) {
-               if (cal->ctx[i])
-                       cal_ctx_v4l2_cleanup(cal->ctx[i]);
-       }
+       for (i = 0; i < cal->num_contexts; i++)
+               cal_ctx_v4l2_cleanup(cal->ctx[i]);
 
        v4l2_device_unregister(&cal->v4l2_dev);
        media_device_cleanup(&cal->mdev);
@@ -1067,7 +1060,6 @@ static int cal_init_camerarx_regmap(struct cal_dev *cal)
 static int cal_probe(struct platform_device *pdev)
 {
        struct cal_dev *cal;
-       struct cal_ctx *ctx;
        bool connected = false;
        unsigned int i;
        int ret;
@@ -1157,6 +1149,8 @@ static int cal_probe(struct platform_device *pdev)
                        ret = -ENODEV;
                        goto error_context;
                }
+
+               cal->num_contexts++;
        }
 
        /* Register the media device. */
@@ -1167,11 +1161,8 @@ static int cal_probe(struct platform_device *pdev)
        return 0;
 
 error_context:
-       for (i = 0; i < ARRAY_SIZE(cal->ctx); i++) {
-               ctx = cal->ctx[i];
-               if (ctx)
-                       cal_ctx_v4l2_cleanup(ctx);
-       }
+       for (i = 0; i < cal->num_contexts; i++)
+               cal_ctx_v4l2_cleanup(cal->ctx[i]);
 
 error_camerarx:
        for (i = 0; i < cal->data->num_csi2_phy; i++)
index 7d9a2d6..400f954 100644 (file)
@@ -29,7 +29,7 @@
 #include <media/videobuf2-v4l2.h>
 
 #define CAL_MODULE_NAME                        "cal"
-#define CAL_NUM_CONTEXT                        2
+#define CAL_MAX_NUM_CONTEXT            8
 #define CAL_NUM_CSI2_PORTS             2
 
 /*
@@ -182,7 +182,8 @@ struct cal_dev {
        /* Camera Core Module handle */
        struct cal_camerarx     *phy[CAL_NUM_CSI2_PORTS];
 
-       struct cal_ctx          *ctx[CAL_NUM_CONTEXT];
+       u32 num_contexts;
+       struct cal_ctx          *ctx[CAL_MAX_NUM_CONTEXT];
 
        struct media_device     mdev;
        struct v4l2_device      v4l2_dev;