Add stateless encoder instance field to the dev struct and register another node for the stateless encoder. The stateless API for the node will be implemented in further patches. Signed-off-by: Dafna Hirschfeld <dafna3@xxxxxxxxx> --- drivers/media/platform/vicodec/vicodec-core.c | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c index 73661bc96671..8780df73a41f 100644 --- a/drivers/media/platform/vicodec/vicodec-core.c +++ b/drivers/media/platform/vicodec/vicodec-core.c @@ -104,6 +104,7 @@ struct vicodec_dev { struct v4l2_device v4l2_dev; struct vicodec_dev_instance stateful_enc; struct vicodec_dev_instance stateful_dec; + struct vicodec_dev_instance stateless_enc; struct vicodec_dev_instance stateless_dec; #ifdef CONFIG_MEDIA_CONTROLLER struct media_device mdev; @@ -1903,16 +1904,20 @@ static int vicodec_open(struct file *file) rc = -ENOMEM; goto open_unlock; } + ctx->is_enc = (vfd == &dev->stateful_enc.vfd || + vfd == &dev->stateless_enc.vfd); - if (vfd == &dev->stateful_enc.vfd) { - ctx->is_enc = true; + ctx->is_stateless = (vfd == &dev->stateless_dec.vfd || + vfd == &dev->stateless_enc.vfd); + + if (vfd == &dev->stateful_enc.vfd) ctx->dev_inst = &dev->stateful_enc; - } else if (vfd == &dev->stateless_dec.vfd) { - ctx->is_stateless = true; - ctx->dev_inst = &dev->stateless_dec; - } else { + else if (vfd == &dev->stateful_dec.vfd) ctx->dev_inst = &dev->stateful_dec; - } + else if (vfd == &dev->stateless_enc.vfd) + ctx->dev_inst = &dev->stateless_enc; + else + ctx->dev_inst = &dev->stateless_dec; v4l2_fh_init(&ctx->fh, video_devdata(file)); file->private_data = &ctx->fh; @@ -2162,9 +2167,13 @@ static int vicodec_probe(struct platform_device *pdev) "stateful-decoder", false)) goto unreg_sf_enc; + if (register_instance(dev, &dev->stateless_enc, + "stateless-encoder", false)) + goto unreg_sf_dec; + if (register_instance(dev, &dev->stateless_dec, "stateless-decoder", false)) - goto unreg_sf_dec; + goto unreg_sl_enc; #ifdef CONFIG_MEDIA_CONTROLLER ret = v4l2_m2m_register_media_controller(dev->stateful_enc.m2m_dev, @@ -2183,14 +2192,23 @@ static int vicodec_probe(struct platform_device *pdev) goto unreg_m2m_sf_enc_mc; } + ret = v4l2_m2m_register_media_controller(dev->stateless_enc.m2m_dev, + &dev->stateless_enc.vfd, + MEDIA_ENT_F_PROC_VIDEO_ENCODER); + if (ret) { + v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller for stateless enc\n"); + goto unreg_m2m_sf_dec_mc; + } + ret = v4l2_m2m_register_media_controller(dev->stateless_dec.m2m_dev, &dev->stateless_dec.vfd, MEDIA_ENT_F_PROC_VIDEO_DECODER); if (ret) { v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller for stateless dec\n"); - goto unreg_m2m_sf_dec_mc; + goto unreg_m2m_sl_enc_mc; } + ret = media_device_register(&dev->mdev); if (ret) { v4l2_err(&dev->v4l2_dev, "Failed to register mem2mem media device\n"); @@ -2202,6 +2220,8 @@ static int vicodec_probe(struct platform_device *pdev) #ifdef CONFIG_MEDIA_CONTROLLER unreg_m2m_sl_dec_mc: v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev); +unreg_m2m_sl_enc_mc: + v4l2_m2m_unregister_media_controller(dev->stateless_enc.m2m_dev); unreg_m2m_sf_dec_mc: v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev); unreg_m2m_sf_enc_mc: @@ -2210,6 +2230,9 @@ static int vicodec_probe(struct platform_device *pdev) video_unregister_device(&dev->stateless_dec.vfd); v4l2_m2m_release(dev->stateless_dec.m2m_dev); #endif +unreg_sl_enc: + video_unregister_device(&dev->stateless_enc.vfd); + v4l2_m2m_release(dev->stateless_enc.m2m_dev); unreg_sf_dec: video_unregister_device(&dev->stateful_dec.vfd); v4l2_m2m_release(dev->stateful_dec.m2m_dev); @@ -2232,15 +2255,18 @@ static int vicodec_remove(struct platform_device *pdev) media_device_unregister(&dev->mdev); v4l2_m2m_unregister_media_controller(dev->stateful_enc.m2m_dev); v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev); + v4l2_m2m_unregister_media_controller(dev->stateless_enc.m2m_dev); v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev); media_device_cleanup(&dev->mdev); #endif v4l2_m2m_release(dev->stateful_enc.m2m_dev); v4l2_m2m_release(dev->stateful_dec.m2m_dev); + v4l2_m2m_release(dev->stateless_enc.m2m_dev); v4l2_m2m_release(dev->stateless_dec.m2m_dev); video_unregister_device(&dev->stateful_enc.vfd); video_unregister_device(&dev->stateful_dec.vfd); + video_unregister_device(&dev->stateless_enc.vfd); video_unregister_device(&dev->stateless_dec.vfd); v4l2_device_unregister(&dev->v4l2_dev); -- 2.17.1