From nobody Sun Sep 22 15:39:06 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DE8F9C433F5 for ; Fri, 29 Oct 2021 03:56:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C93BE610E8 for ; Fri, 29 Oct 2021 03:56:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232070AbhJ2D6l (ORCPT ); Thu, 28 Oct 2021 23:58:41 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:44586 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S231869AbhJ2D6U (ORCPT ); Thu, 28 Oct 2021 23:58:20 -0400 X-UUID: dcdc3d2c2bfa48cd9e1ddad82b978b9a-20211029 X-UUID: dcdc3d2c2bfa48cd9e1ddad82b978b9a-20211029 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1089520601; Fri, 29 Oct 2021 11:55:48 +0800 Received: from mtkmbs10n2.mediatek.inc (172.21.101.183) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 29 Oct 2021 11:55:46 +0800 Received: from localhost.localdomain (10.17.3.154) by mtkmbs10n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Fri, 29 Oct 2021 11:55:45 +0800 From: Yunfei Dong To: Yunfei Dong , Alexandre Courbot , Hans Verkuil , Tzung-Bi Shih , Tiffany Lin , Andrew-CT Chen , Mauro Carvalho Chehab , Rob Herring , Matthias Brugger , Tomasz Figa CC: Hsin-Yi Wang , Fritz Koenig , Dafna Hirschfeld , Benjamin Gaignard , Daniel Vetter , dri-devel , Irui Wang , , , , , , , Subject: [PATCH v8, 11/17] media: mtk-vcodec: Generalize power and clock on/off interfaces Date: Fri, 29 Oct 2021 11:55:21 +0800 Message-ID: <20211029035527.454-12-yunfei.dong@mediatek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211029035527.454-1-yunfei.dong@mediatek.com> References: <20211029035527.454-1-yunfei.dong@mediatek.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Generalizes power and clock on/off interfaces to support different hardware. Signed-off-by: Yunfei Dong --- .../platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 6 +- .../platform/mtk-vcodec/mtk_vcodec_dec_hw.c | 2 +- .../platform/mtk-vcodec/mtk_vcodec_dec_hw.h | 4 + .../platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 76 ++++++++++++++-- .../platform/mtk-vcodec/mtk_vcodec_dec_pm.h | 8 +- .../platform/mtk-vcodec/mtk_vcodec_drv.h | 2 + .../platform/mtk-vcodec/mtk_vcodec_util.c | 87 ++++++++++++++++--- .../platform/mtk-vcodec/mtk_vcodec_util.h | 8 +- .../media/platform/mtk-vcodec/vdec_drv_if.c | 21 ++--- 9 files changed, 174 insertions(+), 40 deletions(-) diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drive= rs/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c index 17ec5884578e..28f96e1973ff 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c @@ -84,7 +84,7 @@ static irqreturn_t mtk_vcodec_dec_irq_handler(int irq, vo= id *priv) void __iomem *vdec_misc_addr =3D dev->reg_base[VDEC_MISC] + VDEC_IRQ_CFG_REG; =20 - ctx =3D mtk_vcodec_get_curr_ctx(dev); + ctx =3D mtk_vcodec_get_curr_ctx(dev, MTK_VDEC_CORE); =20 /* check if HW active or not */ cg_status =3D readl(dev->reg_base[0]); @@ -233,7 +233,7 @@ static int fops_vcodec_open(struct file *file) mtk_vcodec_dec_set_default_params(ctx); =20 if (v4l2_fh_is_singular(&ctx->fh)) { - ret =3D mtk_vcodec_dec_pw_on(&dev->pm); + ret =3D mtk_vcodec_dec_pw_on(dev, MTK_VDEC_LAT0); if (ret < 0) goto err_load_fw; /* @@ -294,7 +294,7 @@ static int fops_vcodec_release(struct file *file) mtk_vcodec_dec_release(ctx); =20 if (v4l2_fh_is_singular(&ctx->fh)) - mtk_vcodec_dec_pw_off(&dev->pm); + mtk_vcodec_dec_pw_off(dev, MTK_VDEC_LAT0); v4l2_fh_del(&ctx->fh); v4l2_fh_exit(&ctx->fh); v4l2_ctrl_handler_free(&ctx->ctrl_hdl); diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c b/driver= s/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c index a5d8515f0091..71533192bae8 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c @@ -42,7 +42,7 @@ static irqreturn_t mtk_vdec_hw_irq_handler(int irq, void = *priv) void __iomem *vdec_misc_addr =3D dev->reg_base[VDEC_COMP_MISC] + VDEC_IRQ_CFG_REG; =20 - ctx =3D mtk_vcodec_get_curr_ctx(dev->master_dev); + ctx =3D mtk_vcodec_get_curr_ctx(dev->master_dev, dev->comp_idx); =20 /* check if HW active or not */ cg_status =3D readl(dev->reg_base[VDEC_COMP_SYS]); diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h b/driver= s/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h index 7adebe95ed44..5d490ddce2c9 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h @@ -34,6 +34,8 @@ enum mtk_comp_hw_reg_idx { * @master_dev: master device * @reg_base: Mapped address of MTK Vcodec registers. * + * @curr_ctx: The context that is waiting for codec hardware + * * @dec_irq: decoder irq resource * @pm: power management control * @comp_idx: each hardware index @@ -43,6 +45,8 @@ struct mtk_vdec_hw_dev { struct mtk_vcodec_dev *master_dev; void __iomem *reg_base[VDEC_COMP_MAX]; =20 + struct mtk_vcodec_ctx *curr_ctx; + int dec_irq; struct mtk_vcodec_pm pm; int comp_idx; diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c b/driver= s/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c index 09a281e3065a..daaea9bc0a22 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c @@ -5,11 +5,13 @@ */ =20 #include +#include #include #include #include #include =20 +#include "mtk_vcodec_dec_hw.h" #include "mtk_vcodec_dec_pm.h" #include "mtk_vcodec_util.h" =20 @@ -86,10 +88,23 @@ void mtk_vcodec_release_dec_pm(struct mtk_vcodec_pm *pm) } EXPORT_SYMBOL_GPL(mtk_vcodec_release_dec_pm); =20 -int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm) +int mtk_vcodec_dec_pw_on(struct mtk_vcodec_dev *vdec_dev, int comp_idx) { + struct mtk_vdec_hw_dev *comp_dev; + struct mtk_vcodec_pm *pm; int ret; =20 + if (vdec_dev->vdec_pdata->is_subdev_supported) { + comp_dev =3D mtk_vcodec_get_hw_dev(vdec_dev, comp_idx); + if (!comp_dev) { + mtk_v4l2_err("Failed to get hw dev\n"); + return -EINVAL; + } + pm =3D &comp_dev->pm; + } else { + pm =3D &vdec_dev->pm; + } + ret =3D pm_runtime_resume_and_get(pm->dev); if (ret) mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret); @@ -98,21 +113,50 @@ int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm) } EXPORT_SYMBOL_GPL(mtk_vcodec_dec_pw_on); =20 -void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm) +void mtk_vcodec_dec_pw_off(struct mtk_vcodec_dev *vdec_dev, int comp_idx) { + struct mtk_vdec_hw_dev *comp_dev; + struct mtk_vcodec_pm *pm; int ret; =20 + if (vdec_dev->vdec_pdata->is_subdev_supported) { + comp_dev =3D mtk_vcodec_get_hw_dev(vdec_dev, comp_idx); + if (!comp_dev) { + mtk_v4l2_err("Failed to get hw dev\n"); + return; + } + pm =3D &comp_dev->pm; + } else { + pm =3D &vdec_dev->pm; + } + ret =3D pm_runtime_put_sync(pm->dev); if (ret) mtk_v4l2_err("pm_runtime_put_sync fail %d", ret); } EXPORT_SYMBOL_GPL(mtk_vcodec_dec_pw_off); =20 -void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm) +void mtk_vcodec_dec_clock_on(struct mtk_vcodec_dev *vdec_dev, int comp_idx) { - struct mtk_vcodec_clk *dec_clk =3D &pm->vdec_clk; - int ret, i =3D 0; + struct mtk_vdec_hw_dev *comp_dev; + struct mtk_vcodec_pm *pm; + struct mtk_vcodec_clk *dec_clk; + int ret, i; + + if (vdec_dev->vdec_pdata->is_subdev_supported) { + comp_dev =3D mtk_vcodec_get_hw_dev(vdec_dev, comp_idx); + if (!comp_dev) { + mtk_v4l2_err("Failed to get hw dev\n"); + return; + } + pm =3D &comp_dev->pm; + enable_irq(comp_dev->dec_irq); + } else { + pm =3D &vdec_dev->pm; + enable_irq(vdec_dev->dec_irq); + } =20 + dec_clk =3D &pm->vdec_clk; for (i =3D 0; i < dec_clk->clk_num; i++) { ret =3D clk_prepare_enable(dec_clk->clk_info[i].vcodec_clk); if (ret) { @@ -135,11 +179,27 @@ void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm) } EXPORT_SYMBOL_GPL(mtk_vcodec_dec_clock_on); =20 -void mtk_vcodec_dec_clock_off(struct mtk_vcodec_pm *pm) +void mtk_vcodec_dec_clock_off(struct mtk_vcodec_dev *vdec_dev, int comp_id= x) { - struct mtk_vcodec_clk *dec_clk =3D &pm->vdec_clk; - int i =3D 0; + struct mtk_vdec_hw_dev *comp_dev; + struct mtk_vcodec_pm *pm; + struct mtk_vcodec_clk *dec_clk; + int i; =20 + if (vdec_dev->vdec_pdata->is_subdev_supported) { + comp_dev =3D mtk_vcodec_get_hw_dev(vdec_dev, comp_idx); + if (!comp_dev) { + mtk_v4l2_err("Failed to get hw dev\n"); + return; + } + pm =3D &comp_dev->pm; + disable_irq(comp_dev->dec_irq); + } else { + pm =3D &vdec_dev->pm; + disable_irq(vdec_dev->dec_irq); + } + + dec_clk =3D &pm->vdec_clk; mtk_smi_larb_put(pm->larbvdec); for (i =3D dec_clk->clk_num - 1; i >=3D 0; i--) clk_disable_unprepare(dec_clk->clk_info[i].vcodec_clk); diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h b/driver= s/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h index a3df6aef6cb9..698750572b57 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h @@ -13,9 +13,9 @@ int mtk_vcodec_init_dec_pm(struct platform_device *pdev, struct mtk_vcodec_pm *pm); void mtk_vcodec_release_dec_pm(struct mtk_vcodec_pm *pm); =20 -int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm); -void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm); -void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm); -void mtk_vcodec_dec_clock_off(struct mtk_vcodec_pm *pm); +int mtk_vcodec_dec_pw_on(struct mtk_vcodec_dev *vdec_dev, int comp_idx); +void mtk_vcodec_dec_pw_off(struct mtk_vcodec_dev *vdec_dev, int comp_idx); +void mtk_vcodec_dec_clock_on(struct mtk_vcodec_dev *vdec_dev, int comp_idx= ); +void mtk_vcodec_dec_clock_off(struct mtk_vcodec_dev *vdec_dev, int comp_id= x); =20 #endif /* _MTK_VCODEC_DEC_PM_H_ */ diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/m= edia/platform/mtk-vcodec/mtk_vcodec_drv.h index c4946f845aea..20712f80bdb5 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h @@ -284,6 +284,7 @@ struct vdec_pic_info { * @decoded_frame_cnt: number of decoded frames * @lock: protect variables accessed by V4L2 threads and worker thread suc= h as * mtk_video_dec_buf. + * @hw_id: hardware index used to identify different hardware. * * @msg_queue: msg queue used to store lat buffer information. */ @@ -328,6 +329,7 @@ struct mtk_vcodec_ctx { =20 int decoded_frame_cnt; struct mutex lock; + int hw_id; =20 struct vdec_msg_queue msg_queue; }; diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c b/drivers/= media/platform/mtk-vcodec/mtk_vcodec_util.c index ac5973b6735f..e5ec7d334211 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c @@ -6,7 +6,10 @@ */ =20 #include +#include +#include =20 +#include "mtk_vcodec_dec_hw.h" #include "mtk_vcodec_drv.h" #include "mtk_vcodec_util.h" =20 @@ -81,25 +84,87 @@ void mtk_vcodec_mem_free(struct mtk_vcodec_ctx *data, } EXPORT_SYMBOL(mtk_vcodec_mem_free); =20 -void mtk_vcodec_set_curr_ctx(struct mtk_vcodec_dev *dev, - struct mtk_vcodec_ctx *ctx) +void *mtk_vcodec_get_hw_dev(struct mtk_vcodec_dev *dev, int comp_idx) { - unsigned long flags; + struct platform_device *hw_pdev; + struct device_node *node; + struct mtk_vdec_hw_dev *master_dev; + + if (comp_idx >=3D MTK_VDEC_HW_MAX || comp_idx < 0) { + mtk_v4l2_err("Comp idx is out of range:%d", comp_idx); + return NULL; + } + + if (dev->comp_dev[comp_idx]) + return dev->comp_dev[comp_idx]; + + node =3D dev->component_node[comp_idx]; + if (!node) { + mtk_v4l2_err("Get lat node fail:%d", comp_idx); + return NULL; + } + + hw_pdev =3D of_find_device_by_node(node); + of_node_put(node); + + if (WARN_ON(!hw_pdev)) { + mtk_v4l2_err("Get hw id(%d) node fail", comp_idx); + return NULL; + } + + master_dev =3D platform_get_drvdata(hw_pdev); + if (!master_dev) { + mtk_v4l2_err("Get hw id(%d) pdev fail", comp_idx); + return NULL; + } =20 - spin_lock_irqsave(&dev->irqlock, flags); - dev->curr_ctx =3D ctx; - spin_unlock_irqrestore(&dev->irqlock, flags); + dev->comp_dev[master_dev->comp_idx] =3D master_dev; + return master_dev; +} +EXPORT_SYMBOL(mtk_vcodec_get_hw_dev); + +void mtk_vcodec_set_curr_ctx(struct mtk_vcodec_dev *vdec_dev, + struct mtk_vcodec_ctx *ctx, int comp_idx) +{ + unsigned long flags; + struct mtk_vdec_hw_dev *comp_dev; + + spin_lock_irqsave(&vdec_dev->irqlock, flags); + if (vdec_dev->vdec_pdata->is_subdev_supported) { + comp_dev =3D mtk_vcodec_get_hw_dev(vdec_dev, comp_idx); + if (!comp_dev) { + mtk_v4l2_err("Failed to get hw dev"); + spin_unlock_irqrestore(&vdec_dev->irqlock, flags); + return; + } + comp_dev->curr_ctx =3D ctx; + } else { + vdec_dev->curr_ctx =3D ctx; + } + spin_unlock_irqrestore(&vdec_dev->irqlock, flags); } EXPORT_SYMBOL(mtk_vcodec_set_curr_ctx); =20 -struct mtk_vcodec_ctx *mtk_vcodec_get_curr_ctx(struct mtk_vcodec_dev *dev) +struct mtk_vcodec_ctx *mtk_vcodec_get_curr_ctx(struct mtk_vcodec_dev *vdec= _dev, + unsigned int comp_idx) { unsigned long flags; struct mtk_vcodec_ctx *ctx; - - spin_lock_irqsave(&dev->irqlock, flags); - ctx =3D dev->curr_ctx; - spin_unlock_irqrestore(&dev->irqlock, flags); + struct mtk_vdec_hw_dev *comp_dev; + + spin_lock_irqsave(&vdec_dev->irqlock, flags); + if (vdec_dev->vdec_pdata->is_subdev_supported) { + comp_dev =3D mtk_vcodec_get_hw_dev(vdec_dev, comp_idx); + if (!comp_dev) { + mtk_v4l2_err("Failed to get hw dev"); + spin_unlock_irqrestore(&vdec_dev->irqlock, flags); + return NULL; + } + ctx =3D comp_dev->curr_ctx; + } else { + ctx =3D vdec_dev->curr_ctx; + } + spin_unlock_irqrestore(&vdec_dev->irqlock, flags); return ctx; } EXPORT_SYMBOL(mtk_vcodec_get_curr_ctx); diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.h b/drivers/= media/platform/mtk-vcodec/mtk_vcodec_util.h index b999d7b84ed1..fa0422761473 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.h +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.h @@ -79,8 +79,10 @@ int mtk_vcodec_mem_alloc(struct mtk_vcodec_ctx *data, struct mtk_vcodec_mem *mem); void mtk_vcodec_mem_free(struct mtk_vcodec_ctx *data, struct mtk_vcodec_mem *mem); -void mtk_vcodec_set_curr_ctx(struct mtk_vcodec_dev *dev, - struct mtk_vcodec_ctx *ctx); -struct mtk_vcodec_ctx *mtk_vcodec_get_curr_ctx(struct mtk_vcodec_dev *dev); +void mtk_vcodec_set_curr_ctx(struct mtk_vcodec_dev *vdec_dev, + struct mtk_vcodec_ctx *ctx, int comp_idx); +struct mtk_vcodec_ctx *mtk_vcodec_get_curr_ctx(struct mtk_vcodec_dev *vdec= _dev, + unsigned int comp_idx); +void *mtk_vcodec_get_hw_dev(struct mtk_vcodec_dev *dev, int comp_idx); =20 #endif /* _MTK_VCODEC_UTIL_H_ */ diff --git a/drivers/media/platform/mtk-vcodec/vdec_drv_if.c b/drivers/medi= a/platform/mtk-vcodec/vdec_drv_if.c index 42008243ceac..05a5b240e906 100644 --- a/drivers/media/platform/mtk-vcodec/vdec_drv_if.c +++ b/drivers/media/platform/mtk-vcodec/vdec_drv_if.c @@ -24,21 +24,24 @@ int vdec_if_init(struct mtk_vcodec_ctx *ctx, unsigned i= nt fourcc) break; case V4L2_PIX_FMT_H264: ctx->dec_if =3D &vdec_h264_if; + ctx->hw_id =3D MTK_VDEC_CORE; break; case V4L2_PIX_FMT_VP8: ctx->dec_if =3D &vdec_vp8_if; + ctx->hw_id =3D MTK_VDEC_CORE; break; case V4L2_PIX_FMT_VP9: ctx->dec_if =3D &vdec_vp9_if; + ctx->hw_id =3D MTK_VDEC_CORE; break; default: return -EINVAL; } =20 mtk_vdec_lock(ctx); - mtk_vcodec_dec_clock_on(&ctx->dev->pm); + mtk_vcodec_dec_clock_on(ctx->dev, ctx->hw_id); ret =3D ctx->dec_if->init(ctx); - mtk_vcodec_dec_clock_off(&ctx->dev->pm); + mtk_vcodec_dec_clock_off(ctx->dev, ctx->hw_id); mtk_vdec_unlock(ctx); =20 return ret; @@ -69,13 +72,11 @@ int vdec_if_decode(struct mtk_vcodec_ctx *ctx, struct m= tk_vcodec_mem *bs, =20 mtk_vdec_lock(ctx); =20 - mtk_vcodec_set_curr_ctx(ctx->dev, ctx); - mtk_vcodec_dec_clock_on(&ctx->dev->pm); - enable_irq(ctx->dev->dec_irq); + mtk_vcodec_set_curr_ctx(ctx->dev, ctx, ctx->hw_id); + mtk_vcodec_dec_clock_on(ctx->dev, ctx->hw_id); ret =3D ctx->dec_if->decode(ctx->drv_handle, bs, fb, res_chg); - disable_irq(ctx->dev->dec_irq); - mtk_vcodec_dec_clock_off(&ctx->dev->pm); - mtk_vcodec_set_curr_ctx(ctx->dev, NULL); + mtk_vcodec_dec_clock_off(ctx->dev, ctx->hw_id); + mtk_vcodec_set_curr_ctx(ctx->dev, NULL, ctx->hw_id); =20 mtk_vdec_unlock(ctx); =20 @@ -103,9 +104,9 @@ void vdec_if_deinit(struct mtk_vcodec_ctx *ctx) return; =20 mtk_vdec_lock(ctx); - mtk_vcodec_dec_clock_on(&ctx->dev->pm); + mtk_vcodec_dec_clock_on(ctx->dev, ctx->hw_id); ctx->dec_if->deinit(ctx->drv_handle); - mtk_vcodec_dec_clock_off(&ctx->dev->pm); + mtk_vcodec_dec_clock_off(ctx->dev, ctx->hw_id); mtk_vdec_unlock(ctx); =20 ctx->drv_handle =3D NULL; --=20 2.25.1