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:
parent
94f214f4b6
commit
2e9eadccf7
drivers/media/platform/mediatek/vcodec
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user