media: mtk-vcodec: make IRQs disabled upon request
authorAlexandre Courbot <acourbot@chromium.org>
Fri, 21 Aug 2020 11:19:23 +0000 (13:19 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sat, 26 Sep 2020 08:12:09 +0000 (10:12 +0200)
The driver requests IRQs to disable them immediately. This is
potentially racy, fix this by requesting the IRQs to come disabled
instead using the IRQ_NOAUTOEN flag of irq_set_status_flags().

Reported-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c

index e5733f5..d14bc20 100644 (file)
@@ -268,6 +268,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
        }
 
        dev->dec_irq = platform_get_irq(pdev, 0);
+       irq_set_status_flags(dev->dec_irq, IRQ_NOAUTOEN);
        ret = devm_request_irq(&pdev->dev, dev->dec_irq,
                        mtk_vcodec_dec_irq_handler, 0, pdev->name, dev);
        if (ret) {
@@ -277,7 +278,6 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
                goto err_res;
        }
 
-       disable_irq(dev->dec_irq);
        mutex_init(&dev->dec_mutex);
        mutex_init(&dev->dev_mutex);
        spin_lock_init(&dev->irqlock);
index 265643e..dcfa2c2 100644 (file)
@@ -320,6 +320,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
        }
 
        dev->enc_irq = platform_get_irq(pdev, 0);
+       irq_set_status_flags(dev->enc_irq, IRQ_NOAUTOEN);
        ret = devm_request_irq(&pdev->dev, dev->enc_irq,
                               mtk_vcodec_enc_irq_handler,
                               0, pdev->name, dev);
@@ -330,7 +331,6 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
                ret = -EINVAL;
                goto err_res;
        }
-       disable_irq(dev->enc_irq);
 
        if (dev->venc_pdata->has_lt_irq) {
                res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
@@ -342,6 +342,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
                mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[VENC_LT_SYS]);
 
                dev->enc_lt_irq = platform_get_irq(pdev, 1);
+               irq_set_status_flags(dev->enc_lt_irq, IRQ_NOAUTOEN);
                ret = devm_request_irq(&pdev->dev,
                                       dev->enc_lt_irq,
                                       mtk_vcodec_enc_lt_irq_handler,
@@ -353,7 +354,6 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
                        ret = -EINVAL;
                        goto err_res;
                }
-               disable_irq(dev->enc_lt_irq); /* VENC_LT */
        }
 
        mutex_init(&dev->enc_mutex);