media: mediatek: vcodec: align fw interface

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>
This commit is contained in:
Yunfei Dong 2023-07-29 10:55:05 +08:00 committed by Mauro Carvalho Chehab
parent 94f214f4b6
commit 2e9eadccf7
5 changed files with 23 additions and 19 deletions

@ -5,15 +5,14 @@
#include "mtk_vcodec_util.h" #include "mtk_vcodec_util.h"
#include "mtk_vcodec_drv.h" #include "mtk_vcodec_drv.h"
struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev, struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
enum mtk_vcodec_fw_type type,
enum mtk_vcodec_fw_use fw_use) enum mtk_vcodec_fw_use fw_use)
{ {
switch (type) { switch (type) {
case VPU: case VPU:
return mtk_vcodec_fw_vpu_init(dev, fw_use); return mtk_vcodec_fw_vpu_init(priv, fw_use);
case SCP: case SCP:
return mtk_vcodec_fw_scp_init(dev); return mtk_vcodec_fw_scp_init(priv, fw_use);
default: default:
mtk_v4l2_err("invalid vcodec fw type"); mtk_v4l2_err("invalid vcodec fw type");
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);

@ -25,8 +25,7 @@ struct mtk_vcodec_fw;
typedef void (*mtk_vcodec_ipi_handler) (void *data, typedef void (*mtk_vcodec_ipi_handler) (void *data,
unsigned int len, void *priv); unsigned int len, void *priv);
struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev, struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type type,
enum mtk_vcodec_fw_type type,
enum mtk_vcodec_fw_use fw_use); enum mtk_vcodec_fw_use fw_use);
void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw); void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw);

@ -12,6 +12,7 @@ struct mtk_vcodec_fw {
const struct mtk_vcodec_fw_ops *ops; const struct mtk_vcodec_fw_ops *ops;
struct platform_device *pdev; struct platform_device *pdev;
struct mtk_scp *scp; struct mtk_scp *scp;
enum mtk_vcodec_fw_use fw_use;
}; };
struct mtk_vcodec_fw_ops { struct mtk_vcodec_fw_ops {
@ -28,22 +29,20 @@ struct mtk_vcodec_fw_ops {
}; };
#if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU) #if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU)
struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev, struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use);
enum mtk_vcodec_fw_use fw_use);
#else #else
static inline struct mtk_vcodec_fw * static inline struct mtk_vcodec_fw *
mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev, mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
enum mtk_vcodec_fw_use fw_use)
{ {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
#endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_VPU */ #endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_VPU */
#if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP) #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 #else
static inline struct mtk_vcodec_fw * 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); return ERR_PTR(-ENODEV);
} }

@ -53,18 +53,21 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_rproc_msg = {
.release = mtk_vcodec_scp_release, .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_fw *fw;
struct mtk_vcodec_dev *dev = priv;
struct platform_device *plat_dev;
struct mtk_scp *scp; struct mtk_scp *scp;
scp = scp_get(dev->plat_dev); plat_dev = dev->plat_dev;
scp = scp_get(plat_dev);
if (!scp) { if (!scp) {
mtk_v4l2_err("could not get vdec scp handle"); mtk_v4l2_err("could not get vdec scp handle");
return ERR_PTR(-EPROBE_DEFER); 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->type = SCP;
fw->ops = &mtk_vcodec_rproc_msg; fw->ops = &mtk_vcodec_rproc_msg;
fw->scp = scp; fw->scp = scp;

@ -77,10 +77,11 @@ static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = {
.release = mtk_vcodec_vpu_release, .release = mtk_vcodec_vpu_release,
}; };
struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev, struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use fw_use)
enum mtk_vcodec_fw_use fw_use)
{ {
struct platform_device *fw_pdev; struct platform_device *fw_pdev;
struct mtk_vcodec_dev *dev = priv;
struct platform_device *plat_dev;
struct mtk_vcodec_fw *fw; struct mtk_vcodec_fw *fw;
enum rst_id rst_id; enum rst_id rst_id;
@ -94,19 +95,22 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
break; 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) { if (!fw_pdev) {
mtk_v4l2_err("firmware device is not ready"); mtk_v4l2_err("firmware device is not ready");
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_vpu_reset_handler, dev, rst_id); 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) if (!fw)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
fw->type = VPU; fw->type = VPU;
fw->ops = &mtk_vcodec_vpu_msg; fw->ops = &mtk_vcodec_vpu_msg;
fw->pdev = fw_pdev; fw->pdev = fw_pdev;
fw->fw_use = fw_use;
return fw; return fw;
} }