media: ti-vpe: cal: catch VC errors
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Mon, 14 Jun 2021 11:23:24 +0000 (13:23 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 12 Jul 2021 10:51:37 +0000 (12:51 +0200)
CAL driver currently ignores VC related errors. To help catch error
conditions, enable all the VC error interrupts and handle them in the
interrupt handler by printing an error.

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-camerarx.c
drivers/media/platform/ti-vpe/cal.c

index 3bc63a5..b36e55b 100644 (file)
@@ -226,25 +226,42 @@ static void cal_camerarx_enable_irqs(struct cal_camerarx *phy)
                CAL_CSI2_COMPLEXIO_IRQ_FIFO_OVR_MASK |
                CAL_CSI2_COMPLEXIO_IRQ_SHORT_PACKET_MASK |
                CAL_CSI2_COMPLEXIO_IRQ_ECC_NO_CORRECTION_MASK;
-
-       /* Enable CIO error IRQs. */
+       const u32 vc_err_mask =
+               CAL_CSI2_VC_IRQ_CS_IRQ_MASK(0) |
+               CAL_CSI2_VC_IRQ_CS_IRQ_MASK(1) |
+               CAL_CSI2_VC_IRQ_CS_IRQ_MASK(2) |
+               CAL_CSI2_VC_IRQ_CS_IRQ_MASK(3) |
+               CAL_CSI2_VC_IRQ_ECC_CORRECTION_IRQ_MASK(0) |
+               CAL_CSI2_VC_IRQ_ECC_CORRECTION_IRQ_MASK(1) |
+               CAL_CSI2_VC_IRQ_ECC_CORRECTION_IRQ_MASK(2) |
+               CAL_CSI2_VC_IRQ_ECC_CORRECTION_IRQ_MASK(3);
+
+       /* Enable CIO & VC error IRQs. */
        cal_write(phy->cal, CAL_HL_IRQENABLE_SET(0),
-                 CAL_HL_IRQ_CIO_MASK(phy->instance));
+                 CAL_HL_IRQ_CIO_MASK(phy->instance) |
+                 CAL_HL_IRQ_VC_MASK(phy->instance));
        cal_write(phy->cal, CAL_CSI2_COMPLEXIO_IRQENABLE(phy->instance),
                  cio_err_mask);
+       cal_write(phy->cal, CAL_CSI2_VC_IRQENABLE(phy->instance),
+                 vc_err_mask);
 }
 
 static void cal_camerarx_disable_irqs(struct cal_camerarx *phy)
 {
        /* Disable CIO error irqs */
        cal_write(phy->cal, CAL_HL_IRQENABLE_CLR(0),
-                 CAL_HL_IRQ_CIO_MASK(phy->instance));
+                 CAL_HL_IRQ_CIO_MASK(phy->instance) |
+                 CAL_HL_IRQ_VC_MASK(phy->instance));
        cal_write(phy->cal, CAL_CSI2_COMPLEXIO_IRQENABLE(phy->instance), 0);
+       cal_write(phy->cal, CAL_CSI2_VC_IRQENABLE(phy->instance), 0);
 }
 
 static void cal_camerarx_ppi_enable(struct cal_camerarx *phy)
 {
        cal_write_field(phy->cal, CAL_CSI2_PPI_CTRL(phy->instance),
+                       1, CAL_CSI2_PPI_CTRL_ECC_EN_MASK);
+
+       cal_write_field(phy->cal, CAL_CSI2_PPI_CTRL(phy->instance),
                        1, CAL_CSI2_PPI_CTRL_IF_EN_MASK);
 }
 
index 673952b..df48a89 100644 (file)
@@ -576,6 +576,16 @@ static irqreturn_t cal_irq(int irq_cal, void *data)
                                cal_write(cal, CAL_CSI2_COMPLEXIO_IRQSTATUS(i),
                                          cio_stat);
                        }
+
+                       if (status & CAL_HL_IRQ_VC_MASK(i)) {
+                               u32 vc_stat = cal_read(cal, CAL_CSI2_VC_IRQSTATUS(i));
+
+                               dev_err_ratelimited(cal->dev,
+                                                   "CIO%u VC error: %#08x\n",
+                                                   i, vc_stat);
+
+                               cal_write(cal, CAL_CSI2_VC_IRQSTATUS(i), vc_stat);
+                       }
                }
        }