lkml.org 
[lkml]   [2021]   [May]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 12/14] media: mtk-vcodec: vdec: add media device if using stateless api
    Date
    From: Yunfei Dong <yunfei.dong@mediatek.com>

    The stateless API requires a media device for issuing requests. Add one
    if we are being instantiated as a stateless decoder.

    Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
    [acourbot: refactor, cleanup and split]
    Co-developed-by: Alexandre Courbot <acourbot@chromium.org>
    Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
    ---
    drivers/media/platform/Kconfig | 2 +
    .../platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 39 +++++++++++++++++++
    .../platform/mtk-vcodec/mtk_vcodec_drv.h | 2 +
    3 files changed, 43 insertions(+)

    diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig
    index ae1468aa1b4e..aa277a19e275 100644
    --- a/drivers/media/platform/Kconfig
    +++ b/drivers/media/platform/Kconfig
    @@ -315,6 +315,8 @@ config VIDEO_MEDIATEK_VCODEC
    select VIDEO_MEDIATEK_VCODEC_VPU if VIDEO_MEDIATEK_VPU
    select VIDEO_MEDIATEK_VCODEC_SCP if MTK_SCP
    select V4L2_H264
    + select MEDIA_CONTROLLER
    + select MEDIA_CONTROLLER_REQUEST_API
    help
    Mediatek video codec driver provides HW capability to
    encode and decode in a range of video formats on MT8173
    diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
    index 1460951f302c..f1e9261cbcf0 100644
    --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
    +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
    @@ -14,6 +14,7 @@
    #include <media/v4l2-event.h>
    #include <media/v4l2-mem2mem.h>
    #include <media/videobuf2-dma-contig.h>
    +#include <media/v4l2-device.h>

    #include "mtk_vcodec_drv.h"
    #include "mtk_vcodec_dec.h"
    @@ -316,6 +317,31 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
    goto err_event_workq;
    }

    + if (dev->vdec_pdata->uses_stateless_api) {
    + dev->mdev_dec.dev = &pdev->dev;
    + strscpy(dev->mdev_dec.model, MTK_VCODEC_DEC_NAME,
    + sizeof(dev->mdev_dec.model));
    +
    + media_device_init(&dev->mdev_dec);
    + dev->mdev_dec.ops = &mtk_vcodec_media_ops;
    + dev->v4l2_dev.mdev = &dev->mdev_dec;
    +
    + ret = v4l2_m2m_register_media_controller(dev->m2m_dev_dec,
    + dev->vfd_dec, MEDIA_ENT_F_PROC_VIDEO_DECODER);
    + if (ret) {
    + mtk_v4l2_err("Failed to register media controller");
    + goto err_reg_cont;
    + }
    +
    + ret = media_device_register(&dev->mdev_dec);
    + if (ret) {
    + mtk_v4l2_err("Failed to register media device");
    + goto err_media_reg;
    + }
    +
    + mtk_v4l2_debug(0, "media registered as /dev/media%d",
    + vfd_dec->num);
    + }
    ret = video_register_device(vfd_dec, VFL_TYPE_VIDEO, 0);
    if (ret) {
    mtk_v4l2_err("Failed to register video device");
    @@ -328,6 +354,12 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
    return 0;

    err_dec_reg:
    + if (dev->vdec_pdata->uses_stateless_api)
    + media_device_unregister(&dev->mdev_dec);
    +err_media_reg:
    + if (dev->vdec_pdata->uses_stateless_api)
    + v4l2_m2m_unregister_media_controller(dev->m2m_dev_dec);
    +err_reg_cont:
    destroy_workqueue(dev->decode_workqueue);
    err_event_workq:
    v4l2_m2m_release(dev->m2m_dev_dec);
    @@ -360,6 +392,13 @@ static int mtk_vcodec_dec_remove(struct platform_device *pdev)

    flush_workqueue(dev->decode_workqueue);
    destroy_workqueue(dev->decode_workqueue);
    +
    + if (media_devnode_is_registered(dev->mdev_dec.devnode)) {
    + media_device_unregister(&dev->mdev_dec);
    + v4l2_m2m_unregister_media_controller(dev->m2m_dev_dec);
    + media_device_cleanup(&dev->mdev_dec);
    + }
    +
    if (dev->m2m_dev_dec)
    v4l2_m2m_release(dev->m2m_dev_dec);

    diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    index e0737165ecdc..1b61d722d313 100644
    --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    @@ -387,6 +387,7 @@ struct mtk_vcodec_enc_pdata {
    * struct mtk_vcodec_dev - driver data
    * @v4l2_dev: V4L2 device to register video devices for.
    * @vfd_dec: Video device for decoder
    + * @mdev_dec: Media device for decoder
    * @vfd_enc: Video device for encoder.
    *
    * @m2m_dev_dec: m2m device for decoder
    @@ -422,6 +423,7 @@ struct mtk_vcodec_enc_pdata {
    struct mtk_vcodec_dev {
    struct v4l2_device v4l2_dev;
    struct video_device *vfd_dec;
    + struct media_device mdev_dec;
    struct video_device *vfd_enc;

    struct v4l2_m2m_dev *m2m_dev_dec;
    --
    2.31.1.751.gd2f1c929bd-goog
    \
     
     \ /
      Last update: 2021-05-19 16:32    [W:4.091 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site