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@xxxxxxxxxxxxx> Signed-off-by: Alexandre Courbot <acourbot@xxxxxxxxxxxx> --- The "media: mtk-vcodec: venc: support for MT8183" happens to change this part of the code, this version applies on top of it (but adapting it to the media ToT is trivial). If preferred I can include this one on top of the series on its next respin, even though it also touches the decoder. drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 2 +- drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c index 5b5765b98e57..a6ba342f7bc8 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c @@ -259,6 +259,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) { @@ -268,7 +269,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); diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c index d6438cb4eead..2a4136e6e867 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c @@ -311,6 +311,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); @@ -321,7 +322,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); @@ -333,6 +333,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, @@ -344,7 +345,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); -- 2.28.0.297.g1956fa8f8d-goog