[RFC PATCH 3/6] media: rkcif: Use shared media graph

From: Paul Elder

Date: Fri Jun 19 2026 - 01:28:18 EST


Make rkcif use shared media graph. This allows it to be in the same
media graph as rkisp2 on the rk3588, opening to door to allowing the
entire capture pipeline to run in inline mode.

Signed-off-by: Paul Elder <paul.elder@xxxxxxxxxxxxxxxx>
---
.../platform/rockchip/rkcif/rkcif-common.h | 2 +-
.../media/platform/rockchip/rkcif/rkcif-dev.c | 32 +++++++++----------
.../platform/rockchip/rkcif/rkcif-interface.c | 10 ++++++
3 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-common.h b/drivers/media/platform/rockchip/rkcif/rkcif-common.h
index 4d9211ba9bda..f2989d152ba2 100644
--- a/drivers/media/platform/rockchip/rkcif/rkcif-common.h
+++ b/drivers/media/platform/rockchip/rkcif/rkcif-common.h
@@ -242,7 +242,7 @@ struct rkcif_device {

struct rkcif_interface interfaces[RKCIF_IF_MAX];

- struct media_device media_dev;
+ struct media_device *media_dev;
struct v4l2_device v4l2_dev;
struct v4l2_async_notifier notifier;
};
diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-dev.c b/drivers/media/platform/rockchip/rkcif/rkcif-dev.c
index be3a174b9aab..4c86e3e2f3cd 100644
--- a/drivers/media/platform/rockchip/rkcif/rkcif-dev.c
+++ b/drivers/media/platform/rockchip/rkcif/rkcif-dev.c
@@ -20,6 +20,7 @@
#include <linux/pm_runtime.h>
#include <linux/reset.h>

+#include <media/mc-shared-graph.h>
#include <media/v4l2-fwnode.h>
#include <media/v4l2-mc.h>

@@ -165,6 +166,7 @@ static int rkcif_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct rkcif_device *rkcif;
+ struct media_device *mdev;
int ret, irq;

rkcif = devm_kzalloc(dev, sizeof(*rkcif), GFP_KERNEL);
@@ -212,22 +214,22 @@ static int rkcif_probe(struct platform_device *pdev)

pm_runtime_enable(&pdev->dev);

- rkcif->media_dev.dev = dev;
- strscpy(rkcif->media_dev.model, RKCIF_DRIVER_NAME,
- sizeof(rkcif->media_dev.model));
- media_device_init(&rkcif->media_dev);
+ mdev = media_device_shared_join(rkcif->dev);
+ if (IS_ERR(mdev)) {
+ dev_err(dev, "failed to register media device: %d\n", ret);
+ goto err_pm_runtime_disable;
+ }
+
+ rkcif->media_dev = mdev;
+ rkcif->media_dev->dev = dev;
+ strscpy(rkcif->media_dev->model, RKCIF_DRIVER_NAME,
+ sizeof(rkcif->media_dev->model));

- rkcif->v4l2_dev.mdev = &rkcif->media_dev;
+ rkcif->v4l2_dev.mdev = rkcif->media_dev;
ret = v4l2_device_register(dev, &rkcif->v4l2_dev);
if (ret)
goto err_media_dev_cleanup;

- ret = media_device_register(&rkcif->media_dev);
- if (ret < 0) {
- dev_err(dev, "failed to register media device: %d\n", ret);
- goto err_v4l2_dev_unregister;
- }
-
v4l2_async_nf_init(&rkcif->notifier, &rkcif->v4l2_dev);
rkcif->notifier.ops = &rkcif_notifier_ops;

@@ -247,11 +249,10 @@ static int rkcif_probe(struct platform_device *pdev)
rkcif_unregister(rkcif);
err_notifier_cleanup:
v4l2_async_nf_cleanup(&rkcif->notifier);
- media_device_unregister(&rkcif->media_dev);
-err_v4l2_dev_unregister:
v4l2_device_unregister(&rkcif->v4l2_dev);
err_media_dev_cleanup:
- media_device_cleanup(&rkcif->media_dev);
+ media_device_shared_leave(rkcif->media_dev, rkcif->dev);
+err_pm_runtime_disable:
pm_runtime_disable(&pdev->dev);
return ret;
}
@@ -263,9 +264,8 @@ static void rkcif_remove(struct platform_device *pdev)
v4l2_async_nf_unregister(&rkcif->notifier);
rkcif_unregister(rkcif);
v4l2_async_nf_cleanup(&rkcif->notifier);
- media_device_unregister(&rkcif->media_dev);
v4l2_device_unregister(&rkcif->v4l2_dev);
- media_device_cleanup(&rkcif->media_dev);
+ media_device_shared_leave(rkcif->media_dev, rkcif->dev);
pm_runtime_disable(&pdev->dev);
}

diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-interface.c b/drivers/media/platform/rockchip/rkcif/rkcif-interface.c
index 414a9980cf2e..cd791186f224 100644
--- a/drivers/media/platform/rockchip/rkcif/rkcif-interface.c
+++ b/drivers/media/platform/rockchip/rkcif/rkcif-interface.c
@@ -6,6 +6,7 @@
* Copyright (C) 2025 Collabora, Ltd.
*/

+#include <media/mc-shared-graph.h>
#include <media/v4l2-common.h>
#include <media/v4l2-fwnode.h>
#include <media/v4l2-mc.h>
@@ -399,6 +400,15 @@ int rkcif_interface_register(struct rkcif_device *rkcif,
if (ret)
goto err_subdev_unregister;

+ ret = media_device_shared_join_link_source(interface->rkcif->media_dev,
+ interface->rkcif->dev,
+ &interface->sd.entity,
+ RKCIF_IF_PAD_SRC,
+ 0);
+ if (ret)
+ goto err_subdev_unregister;
+
+
return 0;

err_subdev_unregister:
--
2.47.2