]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: platform: rzg2l-cru: rzg2l-video: Move request_irq() to probe()
authorBiju Das <biju.das.jz@bp.renesas.com>
Mon, 26 Aug 2024 11:07:30 +0000 (12:07 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 16 Oct 2024 07:32:40 +0000 (09:32 +0200)
Move request_irq() to probe(), in order to avoid requesting IRQ during
device start which happens frequently. As this function is in probe(), it
is better to replace it with its devm variant for managing the resource
efficiently.

While at it, drop the IRQF_SHARED flag as currently there is a single user
for this IRQ.

Suggested-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
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 873b13ec377286e222a37d361f83dc193ba5d216..922aa2c58d461be4046e840c74a29980e6f6b62c 100644 (file)
@@ -242,7 +242,7 @@ static int rzg2l_cru_media_init(struct rzg2l_cru_dev *cru)
 static int rzg2l_cru_probe(struct platform_device *pdev)
 {
        struct rzg2l_cru_dev *cru;
-       int ret;
+       int irq, ret;
 
        cru = devm_kzalloc(&pdev->dev, sizeof(*cru), GFP_KERNEL);
        if (!cru)
@@ -270,9 +270,14 @@ static int rzg2l_cru_probe(struct platform_device *pdev)
        cru->dev = &pdev->dev;
        cru->info = of_device_get_match_data(&pdev->dev);
 
-       cru->image_conv_irq = platform_get_irq(pdev, 0);
-       if (cru->image_conv_irq < 0)
-               return cru->image_conv_irq;
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               return irq;
+
+       ret = devm_request_irq(&pdev->dev, irq, rzg2l_cru_irq, 0,
+                              KBUILD_MODNAME, cru);
+       if (ret)
+               return dev_err_probe(&pdev->dev, ret, "failed to request irq\n");
 
        platform_set_drvdata(pdev, cru);
 
index a5a99b004322bc29e65f2b032f8b06e6514bf83b..1747602395481f3eb77452705d28b83399c07f84 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef __RZG2L_CRU__
 #define __RZG2L_CRU__
 
+#include <linux/irqreturn.h>
 #include <linux/reset.h>
 
 #include <media/v4l2-async.h>
@@ -68,8 +69,6 @@ struct rzg2l_cru_ip {
  *
  * @vclk:              CRU Main clock
  *
- * @image_conv_irq:    Holds image conversion interrupt number
- *
  * @vdev:              V4L2 video device associated with CRU
  * @v4l2_dev:          V4L2 device
  * @num_buf:           Holds the current number of buffers enabled
@@ -105,8 +104,6 @@ struct rzg2l_cru_dev {
 
        struct clk *vclk;
 
-       int image_conv_irq;
-
        struct video_device vdev;
        struct v4l2_device v4l2_dev;
        u8 num_buf;
@@ -141,6 +138,7 @@ void rzg2l_cru_dma_unregister(struct rzg2l_cru_dev *cru);
 
 int rzg2l_cru_video_register(struct rzg2l_cru_dev *cru);
 void rzg2l_cru_video_unregister(struct rzg2l_cru_dev *cru);
+irqreturn_t rzg2l_cru_irq(int irq, void *data);
 
 const struct v4l2_format_info *rzg2l_cru_format_from_pixel(u32 format);
 
index b16b8af6e8f8cb067fbdd71cf9b49cb4784eaaea..e80bfb9fc1afe23653a49584bed719c49f1707df 100644 (file)
@@ -527,7 +527,7 @@ static void rzg2l_cru_stop_streaming(struct rzg2l_cru_dev *cru)
        rzg2l_cru_set_stream(cru, 0);
 }
 
-static irqreturn_t rzg2l_cru_irq(int irq, void *data)
+irqreturn_t rzg2l_cru_irq(int irq, void *data)
 {
        struct rzg2l_cru_dev *cru = data;
        unsigned int handled = 0;
@@ -637,13 +637,6 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queue *vq, unsigned int count
                goto assert_aresetn;
        }
 
-       ret = request_irq(cru->image_conv_irq, rzg2l_cru_irq,
-                         IRQF_SHARED, KBUILD_MODNAME, cru);
-       if (ret) {
-               dev_err(cru->dev, "failed to request irq\n");
-               goto assert_presetn;
-       }
-
        /* Allocate scratch buffer. */
        cru->scratch = dma_alloc_coherent(cru->dev, cru->format.sizeimage,
                                          &cru->scratch_phys, GFP_KERNEL);
@@ -651,7 +644,7 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queue *vq, unsigned int count
                return_unused_buffers(cru, VB2_BUF_STATE_QUEUED);
                dev_err(cru->dev, "Failed to allocate scratch buffer\n");
                ret = -ENOMEM;
-               goto free_image_conv_irq;
+               goto assert_presetn;
        }
 
        cru->sequence = 0;
@@ -670,9 +663,6 @@ out:
        if (ret)
                dma_free_coherent(cru->dev, cru->format.sizeimage, cru->scratch,
                                  cru->scratch_phys);
-free_image_conv_irq:
-       free_irq(cru->image_conv_irq, cru);
-
 assert_presetn:
        reset_control_assert(cru->presetn);
 
@@ -698,7 +688,6 @@ static void rzg2l_cru_stop_streaming_vq(struct vb2_queue *vq)
        dma_free_coherent(cru->dev, cru->format.sizeimage,
                          cru->scratch, cru->scratch_phys);
 
-       free_irq(cru->image_conv_irq, cru);
        return_unused_buffers(cru, VB2_BUF_STATE_ERROR);
 
        reset_control_assert(cru->presetn);