#include "mtk_vcodec_util.h"
 #include "mtk_vcodec_drv.h"
 
-struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
-                                          enum mtk_vcodec_fw_type type,
+struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
                                           enum mtk_vcodec_fw_use fw_use)
 {
        switch (type) {
        case VPU:
-               return mtk_vcodec_fw_vpu_init(dev, fw_use);
+               return mtk_vcodec_fw_vpu_init(priv, fw_use);
        case SCP:
-               return mtk_vcodec_fw_scp_init(dev);
+               return mtk_vcodec_fw_scp_init(priv, fw_use);
        default:
                mtk_v4l2_err("invalid vcodec fw type");
                return ERR_PTR(-EINVAL);
 
 typedef void (*mtk_vcodec_ipi_handler) (void *data,
        unsigned int len, void *priv);
 
-struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
-                                          enum mtk_vcodec_fw_type type,
+struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
                                           enum mtk_vcodec_fw_use fw_use);
 void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw);
 
 
        const struct mtk_vcodec_fw_ops *ops;
        struct platform_device *pdev;
        struct mtk_scp *scp;
+       enum mtk_vcodec_fw_use fw_use;
 };
 
 struct mtk_vcodec_fw_ops {
 };
 
 #if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU)
-struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
-                                            enum mtk_vcodec_fw_use fw_use);
+struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use);
 #else
 static inline struct mtk_vcodec_fw *
-mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
-                      enum mtk_vcodec_fw_use fw_use)
+mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
 {
        return ERR_PTR(-ENODEV);
 }
 #endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_VPU */
 
 #if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP)
-struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev);
+struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use);
 #else
 static inline struct mtk_vcodec_fw *
-mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
+mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use)
 {
        return ERR_PTR(-ENODEV);
 }
 
        .release = mtk_vcodec_scp_release,
 };
 
-struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
+struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use fw_use)
 {
        struct mtk_vcodec_fw *fw;
+       struct mtk_vcodec_dev *dev = priv;
+       struct platform_device *plat_dev;
        struct mtk_scp *scp;
 
-       scp = scp_get(dev->plat_dev);
+       plat_dev = dev->plat_dev;
+       scp = scp_get(plat_dev);
        if (!scp) {
                mtk_v4l2_err("could not get vdec scp handle");
                return ERR_PTR(-EPROBE_DEFER);
        }
 
-       fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
+       fw = devm_kzalloc(&plat_dev->dev, sizeof(*fw), GFP_KERNEL);
        fw->type = SCP;
        fw->ops = &mtk_vcodec_rproc_msg;
        fw->scp = scp;
 
        .release = mtk_vcodec_vpu_release,
 };
 
-struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
-                                            enum mtk_vcodec_fw_use fw_use)
+struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
 {
        struct platform_device *fw_pdev;
+       struct mtk_vcodec_dev *dev = priv;
+       struct platform_device *plat_dev;
        struct mtk_vcodec_fw *fw;
        enum rst_id rst_id;
 
                break;
        }
 
-       fw_pdev = vpu_get_plat_device(dev->plat_dev);
+       plat_dev = dev->plat_dev;
+       fw_pdev = vpu_get_plat_device(plat_dev);
        if (!fw_pdev) {
                mtk_v4l2_err("firmware device is not ready");
                return ERR_PTR(-EINVAL);
        }
+
        vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_vpu_reset_handler, dev, rst_id);
 
-       fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
+       fw = devm_kzalloc(&plat_dev->dev, sizeof(*fw), GFP_KERNEL);
        if (!fw)
                return ERR_PTR(-ENOMEM);
        fw->type = VPU;
        fw->ops = &mtk_vcodec_vpu_msg;
        fw->pdev = fw_pdev;
+       fw->fw_use = fw_use;
 
        return fw;
 }