[PATCH 11/17] media: rockchip: rga: move video device to the master
From: Sven Püschel
Date: Fri Jun 05 2026 - 18:09:58 EST
Move the video device allocation and registration to the master
component bind function in preparation for binding multiple cores
to the master. Moving it to the master bind function allows to
only register the v4l2 device when all cores have been successfully
bound to the master device. This also causes the video device to be
bound against the master platform device instead of a specific core.
Signed-off-by: Sven Püschel <s.pueschel@xxxxxxxxxxxxxx>
---
drivers/media/platform/rockchip/rga/rga.c | 96 ++++++++++++++++---------------
1 file changed, 50 insertions(+), 46 deletions(-)
diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c
index 11912bf5b6906..952377ae467f5 100644
--- a/drivers/media/platform/rockchip/rga/rga.c
+++ b/drivers/media/platform/rockchip/rga/rga.c
@@ -743,7 +743,6 @@ static int rga_core_bind(struct device *dev, struct device *master, void *data)
struct platform_device *pdev = to_platform_device(dev);
struct rockchip_rga *rga = data;
struct rga_core *core;
- struct video_device *vfd;
int ret = 0;
int irq;
@@ -789,33 +788,11 @@ static int rga_core_bind(struct device *dev, struct device *master, void *data)
goto err_put_clk;
}
- ret = v4l2_device_register(&pdev->dev, &rga->v4l2_dev);
- if (ret)
- goto err_put_clk;
- vfd = video_device_alloc();
- if (!vfd) {
- v4l2_err(&rga->v4l2_dev, "Failed to allocate video device\n");
- ret = -ENOMEM;
- goto unreg_v4l2_dev;
- }
- *vfd = rga_videodev;
- vfd->lock = &rga->mutex;
- vfd->v4l2_dev = &rga->v4l2_dev;
-
- video_set_drvdata(vfd, rga);
- rga->vfd = vfd;
-
platform_set_drvdata(pdev, core);
- rga->m2m_dev = v4l2_m2m_init(&rga_m2m_ops);
- if (IS_ERR(rga->m2m_dev)) {
- v4l2_err(&rga->v4l2_dev, "Failed to init mem2mem device\n");
- ret = PTR_ERR(rga->m2m_dev);
- goto rel_vdev;
- }
ret = pm_runtime_resume_and_get(core->dev);
if (ret < 0)
- goto rel_m2m;
+ goto err_put_clk;
rga->version = rga->hw->get_version(core);
@@ -824,23 +801,8 @@ static int rga_core_bind(struct device *dev, struct device *master, void *data)
pm_runtime_put(core->dev);
- ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1);
- if (ret) {
- v4l2_err(&rga->v4l2_dev, "Failed to register video device\n");
- goto rel_m2m;
- }
-
- v4l2_info(&rga->v4l2_dev, "Registered %s as /dev/%s\n",
- vfd->name, video_device_node_name(vfd));
-
return 0;
-rel_m2m:
- v4l2_m2m_release(rga->m2m_dev);
-rel_vdev:
- video_device_release(vfd);
-unreg_v4l2_dev:
- v4l2_device_unregister(&rga->v4l2_dev);
err_put_clk:
pm_runtime_disable(core->dev);
@@ -851,13 +813,6 @@ static void rga_core_unbind(struct device *dev, struct device *master,
void *data)
{
struct rga_core *core = dev_get_drvdata(dev);
- struct rockchip_rga *rga = core->rga;
-
- v4l2_info(&rga->v4l2_dev, "Removing\n");
-
- v4l2_m2m_release(rga->m2m_dev);
- video_unregister_device(rga->vfd);
- v4l2_device_unregister(&rga->v4l2_dev);
pm_runtime_disable(core->dev);
}
@@ -937,6 +892,7 @@ static struct platform_driver rga_core_pdrv = {
static int rga_bind(struct device *dev)
{
struct rockchip_rga *rga = dev_get_drvdata(dev);
+ struct video_device *vfd;
int ret;
ret = component_bind_all(dev, rga);
@@ -945,11 +901,59 @@ static int rga_bind(struct device *dev)
return ret;
}
+ ret = v4l2_device_register(dev, &rga->v4l2_dev);
+ if (ret)
+ return ret;
+ vfd = video_device_alloc();
+ if (!vfd) {
+ v4l2_err(&rga->v4l2_dev, "Failed to allocate video device\n");
+ ret = -ENOMEM;
+ goto unreg_v4l2_dev;
+ }
+ *vfd = rga_videodev;
+ vfd->lock = &rga->mutex;
+ vfd->v4l2_dev = &rga->v4l2_dev;
+
+ video_set_drvdata(vfd, rga);
+ rga->vfd = vfd;
+
+ rga->m2m_dev = v4l2_m2m_init(&rga_m2m_ops);
+ if (IS_ERR(rga->m2m_dev)) {
+ v4l2_err(&rga->v4l2_dev, "Failed to init mem2mem device\n");
+ ret = PTR_ERR(rga->m2m_dev);
+ goto rel_vdev;
+ }
+
+ ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1);
+ if (ret) {
+ v4l2_err(&rga->v4l2_dev, "Failed to register video device\n");
+ goto rel_m2m;
+ }
+
+ v4l2_info(&rga->v4l2_dev, "Registered %s as /dev/%s\n",
+ vfd->name, video_device_node_name(vfd));
+
return 0;
+
+rel_m2m:
+ v4l2_m2m_release(rga->m2m_dev);
+rel_vdev:
+ video_device_release(vfd);
+unreg_v4l2_dev:
+ v4l2_device_unregister(&rga->v4l2_dev);
+ return ret;
}
static void rga_unbind(struct device *dev)
{
+ struct rockchip_rga *rga = dev_get_drvdata(dev);
+
+ v4l2_info(&rga->v4l2_dev, "Removing\n");
+
+ v4l2_m2m_release(rga->m2m_dev);
+ video_unregister_device(rga->vfd);
+ v4l2_device_unregister(&rga->v4l2_dev);
+
component_unbind_all(dev, NULL);
}
--
2.54.0