media: mediatek: vcodec: align fw interface
authorYunfei Dong <yunfei.dong@mediatek.com>
Sat, 29 Jul 2023 02:55:05 +0000 (10:55 +0800)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Thu, 10 Aug 2023 05:58:33 +0000 (07:58 +0200)
Align scp and vpu firmware interface, remove the depedency for
'struct mtk_vcodec_dev' and 'struct mtk_vcodec_ctx'. It will be
much easier to separate video encoder and decoder.

Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.c
drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw.h
drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_priv.h
drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_scp.c
drivers/media/platform/mediatek/vcodec/mtk_vcodec_fw_vpu.c

index 556e54a..be9159a 100644 (file)
@@ -5,15 +5,14 @@
 #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);
index 1682411..d8cfbec 100644 (file)
@@ -25,8 +25,7 @@ struct mtk_vcodec_fw;
 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);
 
index b41e661..3438a49 100644 (file)
@@ -12,6 +12,7 @@ struct mtk_vcodec_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 {
@@ -28,22 +29,20 @@ 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);
 }
index d8e66b6..9a24724 100644 (file)
@@ -53,18 +53,21 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_rproc_msg = {
        .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;
index cfc7ebe..46a0280 100644 (file)
@@ -77,10 +77,11 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = {
        .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;
 
@@ -94,19 +95,22 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
                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;
 }