]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: rzg2l-cru: Add function pointer to check if FIFO is empty
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Fri, 11 Apr 2025 17:05:43 +0000 (19:05 +0200)
committerHans Verkuil <hverkuil@xs4all.nl>
Wed, 23 Apr 2025 08:55:54 +0000 (10:55 +0200)
Add a `fifo_empty` function pointer to the `rzg2l_cru_info` structure and
pass it as part of the OF data. On RZ/G3E and RZ/V2H(P) SoCs, checking if
the FIFO is empty requires a different register configuration.

Implement `rzg2l_fifo_empty()` and update the code to use it from the
function pointer.

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Link: https://lore.kernel.org/r/20250411170624.472257-16-tommaso.merciai.xr@bp.renesas.com
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h
drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c

index ae989fa2768b3544ac6d2a3868f98aa282c2d6e4..3b5de845331924cf2398e5efe428518312dfe22e 100644 (file)
@@ -359,6 +359,7 @@ static const struct rzg2l_cru_info rzgl2_cru_info = {
        .irq_handler = rzg2l_cru_irq,
        .enable_interrupts = rzg2l_cru_enable_interrupts,
        .disable_interrupts = rzg2l_cru_disable_interrupts,
+       .fifo_empty = rzg2l_fifo_empty,
 };
 
 static const struct of_device_id rzg2l_cru_of_id_table[] = {
index 3f694044d8cd10d25eb5a67db3995f39c65b8c67..2e17bfef43ce6f3186a2dd7f88df8d129ff46b29 100644 (file)
@@ -88,6 +88,7 @@ struct rzg2l_cru_info {
        irqreturn_t (*irq_handler)(int irq, void *data);
        void (*enable_interrupts)(struct rzg2l_cru_dev *cru);
        void (*disable_interrupts)(struct rzg2l_cru_dev *cru);
+       bool (*fifo_empty)(struct rzg2l_cru_dev *cru);
 };
 
 /**
@@ -185,4 +186,6 @@ const struct rzg2l_cru_ip_format *rzg2l_cru_ip_index_to_fmt(u32 index);
 void rzg2l_cru_enable_interrupts(struct rzg2l_cru_dev *cru);
 void rzg2l_cru_disable_interrupts(struct rzg2l_cru_dev *cru);
 
+bool rzg2l_fifo_empty(struct rzg2l_cru_dev *cru);
+
 #endif
index a104821d823f9123e6e5fb6e94522792861b6c38..d35e9b2074937c05b4a3e175bfd83788fd1ce158 100644 (file)
@@ -290,9 +290,23 @@ static int rzg2l_cru_initialize_image_conv(struct rzg2l_cru_dev *cru,
        return 0;
 }
 
-void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev *cru)
+bool rzg2l_fifo_empty(struct rzg2l_cru_dev *cru)
 {
        u32 amnfifopntr, amnfifopntr_w, amnfifopntr_r_y;
+
+       amnfifopntr = rzg2l_cru_read(cru, AMnFIFOPNTR);
+
+       amnfifopntr_w = amnfifopntr & AMnFIFOPNTR_FIFOWPNTR;
+       amnfifopntr_r_y =
+               (amnfifopntr & AMnFIFOPNTR_FIFORPNTR_Y) >> 16;
+       if (amnfifopntr_w == amnfifopntr_r_y)
+               return true;
+
+       return amnfifopntr_w == amnfifopntr_r_y;
+}
+
+void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev *cru)
+{
        unsigned int retries = 0;
        unsigned long flags;
        u32 icnms;
@@ -320,12 +334,7 @@ void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev *cru)
 
        /* Wait until the FIFO becomes empty */
        for (retries = 5; retries > 0; retries--) {
-               amnfifopntr = rzg2l_cru_read(cru, AMnFIFOPNTR);
-
-               amnfifopntr_w = amnfifopntr & AMnFIFOPNTR_FIFOWPNTR;
-               amnfifopntr_r_y =
-                       (amnfifopntr & AMnFIFOPNTR_FIFORPNTR_Y) >> 16;
-               if (amnfifopntr_w == amnfifopntr_r_y)
+               if (cru->info->fifo_empty(cru))
                        break;
 
                usleep_range(10, 20);