Make sure to drop the reference taken when looking up the VPU firmware device during codec init on probe failure (e.g. probe deferral) and on driver unbind.
Fixes: 590577a4e525 ("[media] vcodec: mediatek: Add Mediatek V4L2 Video Decoder Driver") Fixes: 4e855a6efa54 ("[media] vcodec: mediatek: Add Mediatek V4L2 Video Encoder Driver") Cc: stable@vger.kernel.org # 4.8 Cc: Tiffany Lin tiffany.lin@mediatek.com Signed-off-by: Johan Hovold johan@kernel.org --- .../mediatek/vcodec/common/mtk_vcodec_fw_vpu.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vpu.c b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vpu.c index d7027d600208..9237738d7632 100644 --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vpu.c +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vpu.c @@ -83,12 +83,20 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = { .release = mtk_vcodec_vpu_release, };
+static void mtk_vcodec_vpu_put_device(void *_dev) +{ + struct device *dev = _dev; + + put_device(dev); +} + struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use) { struct platform_device *fw_pdev; struct platform_device *plat_dev; struct mtk_vcodec_fw *fw; enum rst_id rst_id; + int ret;
if (fw_use == ENCODER) { struct mtk_vcodec_enc_dev *enc_dev = priv; @@ -111,6 +119,11 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use return ERR_PTR(-EINVAL); }
+ ret = devm_add_action_or_reset(&plat_dev->dev, mtk_vcodec_vpu_put_device, + &fw_pdev->dev); + if (ret) + return ERR_PTR(ret); + if (fw_use == DECODER) vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_vpu_reset_dec_handler, priv, rst_id); else
linux-stable-mirror@lists.linaro.org