[RFC PATCH 4/6] media: rkisp2: Use shared media graph
From: Paul Elder
Date: Fri Jun 19 2026 - 01:27:50 EST
Make rkisp2 use shared media graph. This allows it to be in the same
media graph as rkcif 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/rkisp2/rkisp2-common.h | 2 +-
.../platform/rockchip/rkisp2/rkisp2-dev.c | 42 ++++++++++---------
2 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/drivers/media/platform/rockchip/rkisp2/rkisp2-common.h b/drivers/media/platform/rockchip/rkisp2/rkisp2-common.h
index 1eafdb5db5d8..ecf0f5e22064 100644
--- a/drivers/media/platform/rockchip/rkisp2/rkisp2-common.h
+++ b/drivers/media/platform/rockchip/rkisp2/rkisp2-common.h
@@ -432,7 +432,7 @@ struct rkisp2_device {
struct regmap *gasket;
unsigned int gasket_id;
struct v4l2_device v4l2_dev;
- struct media_device media_dev;
+ struct media_device *media_dev;
struct v4l2_async_notifier notifier;
struct v4l2_subdev *source;
struct rkisp2_isp isp;
diff --git a/drivers/media/platform/rockchip/rkisp2/rkisp2-dev.c b/drivers/media/platform/rockchip/rkisp2/rkisp2-dev.c
index 4042bf43d287..f74b7aae3159 100644
--- a/drivers/media/platform/rockchip/rkisp2/rkisp2-dev.c
+++ b/drivers/media/platform/rockchip/rkisp2/rkisp2-dev.c
@@ -20,6 +20,7 @@
#include <linux/platform_device.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pm_runtime.h>
+#include <media/mc-shared-graph.h>
#include <media/v4l2-fwnode.h>
#include <media/v4l2-mc.h>
@@ -117,7 +118,7 @@ static int rkisp2_create_links(struct rkisp2_device *rkisp2)
ret = media_create_pad_link(
source, 0, &rkisp2->isp.sd.entity,
RKISP2_ISP_PAD_SINK_VIDEO,
- MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
+ MEDIA_LNK_FL_ENABLED);
} else {
ret = media_create_pad_link(source, 0,
&rkisp2->isp.sd.entity,
@@ -147,6 +148,12 @@ static int rkisp2_create_links(struct rkisp2_device *rkisp2)
if (ret)
return ret;
+ ret = media_device_shared_join_link_sink(rkisp2->media_dev, rkisp2->dev,
+ &rkisp2->isp.sd.entity,
+ RKISP2_ISP_PAD_SINK_VIDEO, 0);
+ if (ret)
+ return ret;
+
return 0;
}
@@ -233,6 +240,7 @@ static int rkisp2_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct rkisp2_device *rkisp2;
struct v4l2_device *v4l2_dev;
+ struct media_device *mdev;
unsigned int i;
int ret, irq;
u32 cif_id;
@@ -298,29 +306,28 @@ static int rkisp2_probe(struct platform_device *pdev)
pm_runtime_put(&pdev->dev);
- rkisp2->media_dev.hw_revision = info->isp_ver;
- strscpy(rkisp2->media_dev.model, RKISP2_DRIVER_NAME,
- sizeof(rkisp2->media_dev.model));
- rkisp2->media_dev.dev = &pdev->dev;
- strscpy(rkisp2->media_dev.bus_info, RKISP2_BUS_INFO,
- sizeof(rkisp2->media_dev.bus_info));
- media_device_init(&rkisp2->media_dev);
+ mdev = media_device_shared_join(rkisp2->dev);
+ if (IS_ERR(mdev))
+ goto err_pm_runtime_disable;
+
+ rkisp2->media_dev = mdev;
+ rkisp2->media_dev->hw_revision = info->isp_ver;
+ strscpy(rkisp2->media_dev->model, RKISP2_DRIVER_NAME,
+ sizeof(rkisp2->media_dev->model));
+ strscpy(rkisp2->media_dev->bus_info, RKISP2_BUS_INFO,
+ sizeof(rkisp2->media_dev->bus_info));
v4l2_dev = &rkisp2->v4l2_dev;
- v4l2_dev->mdev = &rkisp2->media_dev;
+ v4l2_dev->mdev = rkisp2->media_dev;
strscpy(v4l2_dev->name, RKISP2_DRIVER_NAME, sizeof(v4l2_dev->name));
ret = v4l2_device_register(rkisp2->dev, &rkisp2->v4l2_dev);
if (ret)
goto err_media_dev_cleanup;
- ret = media_device_register(&rkisp2->media_dev);
- if (ret)
- goto err_unreg_v4l2_dev;
-
ret = rkisp2_entities_register(rkisp2);
if (ret)
- goto err_unreg_media_dev;
+ goto err_unreg_v4l2_dev;
ret = v4l2_device_register_subdev_nodes(&rkisp2->v4l2_dev);
if (ret)
@@ -332,12 +339,10 @@ static int rkisp2_probe(struct platform_device *pdev)
err_unreg_entities:
rkisp2_entities_unregister(rkisp2);
-err_unreg_media_dev:
- media_device_unregister(&rkisp2->media_dev);
err_unreg_v4l2_dev:
v4l2_device_unregister(&rkisp2->v4l2_dev);
err_media_dev_cleanup:
- media_device_cleanup(&rkisp2->media_dev);
+ media_device_shared_leave(rkisp2->media_dev, rkisp2->dev);
err_pm_runtime_disable:
pm_runtime_disable(&pdev->dev);
return ret;
@@ -353,10 +358,9 @@ static void rkisp2_remove(struct platform_device *pdev)
rkisp2_entities_unregister(rkisp2);
rkisp2_debug_cleanup(rkisp2);
- media_device_unregister(&rkisp2->media_dev);
v4l2_device_unregister(&rkisp2->v4l2_dev);
- media_device_cleanup(&rkisp2->media_dev);
+ media_device_shared_leave(rkisp2->media_dev, rkisp2->dev);
pm_runtime_disable(&pdev->dev);
}
--
2.47.2