Add lat soc compatible and to support lat soc power/clk helper.

Signed-off-by: Yunfei Dong <yunfei.d...@mediatek.com>
---
 .../platform/mtk-vcodec/mtk_vcodec_dec_hw.c      | 12 +++++++++---
 .../platform/mtk-vcodec/mtk_vcodec_dec_hw.h      |  2 ++
 .../platform/mtk-vcodec/mtk_vcodec_dec_pm.c      | 16 ++++++++++++++++
 .../media/platform/mtk-vcodec/mtk_vcodec_drv.h   |  1 +
 4 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c 
b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
index 7b5da3e4cac2..7374d5a5c156 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
@@ -28,6 +28,10 @@ static const struct of_device_id mtk_vdec_hw_match[] = {
                .compatible = "mediatek,mtk-vcodec-core",
                .data = (void *)MTK_VDEC_CORE,
        },
+       {
+               .compatible = "mediatek,mtk-vcodec-lat-soc",
+               .data = (void *)MTK_VDEC_LAT_SOC,
+       },
        {},
 };
 MODULE_DEVICE_TABLE(of, mtk_vdec_hw_match);
@@ -166,9 +170,11 @@ static int mtk_vdec_hw_probe(struct platform_device *pdev)
        subdev_dev->reg_base[VDEC_HW_SYS] = main_dev->reg_base[VDEC_HW_SYS];
        set_bit(subdev_dev->hw_idx, main_dev->subdev_bitmap);
 
-       ret = mtk_vdec_hw_init_irq(subdev_dev);
-       if (ret)
-               goto err;
+       if (IS_SUPPORT_VDEC_HW_IRQ(hw_idx)) {
+               ret = mtk_vdec_hw_init_irq(subdev_dev);
+               if (ret)
+                       goto err;
+       }
 
        subdev_dev->reg_base[VDEC_HW_MISC] =
                devm_platform_ioremap_resource(pdev, 0);
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h 
b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h
index a63e4b1b81c3..b8938c6c3e72 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h
@@ -17,6 +17,8 @@
 #define VDEC_IRQ_CLR 0x10
 #define VDEC_IRQ_CFG_REG 0xa4
 
+#define IS_SUPPORT_VDEC_HW_IRQ(hw_idx) (hw_idx != MTK_VDEC_LAT_SOC)
+
 /**
  * enum mtk_vdec_hw_reg_idx - subdev hardware register base index
  * @VDEC_HW_SYS : vdec soc register index
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c 
b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
index 1581a1277473..76e1442fc6f9 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
@@ -203,6 +203,14 @@ static void mtk_vcodec_dec_child_dev_on(struct 
mtk_vcodec_dev *vdec_dev,
                mtk_vcodec_dec_pw_on(pm);
                mtk_vcodec_dec_clock_on(pm);
        }
+
+       if (hw_idx == MTK_VDEC_LAT0) {
+               pm = mtk_vcodec_dec_get_pm(vdec_dev, MTK_VDEC_LAT_SOC);
+               if (pm) {
+                       mtk_vcodec_dec_pw_on(pm);
+                       mtk_vcodec_dec_clock_on(pm);
+               }
+       }
 }
 
 static void mtk_vcodec_dec_child_dev_off(struct mtk_vcodec_dev *vdec_dev,
@@ -215,6 +223,14 @@ static void mtk_vcodec_dec_child_dev_off(struct 
mtk_vcodec_dev *vdec_dev,
                mtk_vcodec_dec_clock_off(pm);
                mtk_vcodec_dec_pw_off(pm);
        }
+
+       if (hw_idx == MTK_VDEC_LAT0) {
+               pm = mtk_vcodec_dec_get_pm(vdec_dev, MTK_VDEC_LAT_SOC);
+               if (pm) {
+                       mtk_vcodec_dec_clock_off(pm);
+                       mtk_vcodec_dec_pw_off(pm);
+               }
+       }
 }
 
 void mtk_vcodec_dec_enable_hardware(struct mtk_vcodec_ctx *ctx, int hw_idx)
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h 
b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
index cd2939b47790..363b999dd709 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
@@ -104,6 +104,7 @@ enum mtk_vdec_hw_id {
        MTK_VDEC_CORE,
        MTK_VDEC_LAT0,
        MTK_VDEC_LAT1,
+       MTK_VDEC_LAT_SOC,
        MTK_VDEC_HW_MAX,
 };
 
-- 
2.25.1

Reply via email to