From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Cc: bingbu.cao@linux.intel.com, tian.shu.qiu@intel.com,
antti.laakso@linux.intel.com, mehdi.djait@linux.intel.com
Subject: [PATCH v3 11/13] media: ipu6: Remove source_entity from struct ipu6_isys_stream
Date: Tue, 30 Dec 2025 15:10:11 +0200 [thread overview]
Message-ID: <20251230131013.75338-12-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20251230131013.75338-1-sakari.ailus@linux.intel.com>
Remove source_entity from struct ipu6_isys_stream and instead pass it on
in function arguments.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
.../media/pci/intel/ipu6/ipu6-isys-queue.c | 22 ++++++++--
.../media/pci/intel/ipu6/ipu6-isys-video.c | 42 +++++--------------
.../media/pci/intel/ipu6/ipu6-isys-video.h | 6 +--
3 files changed, 31 insertions(+), 39 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
index 0e9f0025aeb3..651ddab9ef14 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
@@ -532,14 +532,28 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
ipu6_isys_get_isys_format(ipu6_isys_get_format(av), 0);
struct ipu6_isys_buffer_list __bl, *bl = NULL;
struct ipu6_isys_stream *stream;
- struct media_entity *source_entity = NULL;
+ struct media_pad *source_pad, *remote_pad;
int nr_queues, ret;
dev_dbg(dev, "stream: %s: width %u, height %u, css pixelformat %u\n",
av->vdev.name, ipu6_isys_get_frame_width(av),
ipu6_isys_get_frame_height(av), pfmt->css_pixelformat);
- ret = ipu6_isys_setup_video(av, &source_entity, &nr_queues);
+ remote_pad = media_pad_remote_pad_unique(&av->pad);
+ if (IS_ERR(remote_pad)) {
+ dev_dbg(dev, "failed to get remote pad\n");
+ ret = PTR_ERR(remote_pad);
+ goto out_return_buffers;
+ }
+
+ source_pad = media_pad_remote_pad_unique(&remote_pad->entity->pads[0]);
+ if (IS_ERR(source_pad)) {
+ dev_dbg(dev, "No external source entity\n");
+ ret = PTR_ERR(source_pad);
+ goto out_return_buffers;
+ }
+
+ ret = ipu6_isys_setup_video(av, remote_pad, source_pad, &nr_queues);
if (ret < 0) {
dev_dbg(dev, "failed to setup video\n");
goto out_return_buffers;
@@ -560,7 +574,7 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
stream = av->stream;
mutex_lock(&stream->mutex);
if (!stream->nr_streaming) {
- ret = ipu6_isys_video_prepare_stream(av, source_entity,
+ ret = ipu6_isys_video_prepare_stream(av, source_pad->entity,
nr_queues);
if (ret)
goto out_fw_close;
@@ -571,7 +585,7 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
stream->nr_queues);
list_add(&aq->node, &stream->queues);
- ipu6_isys_configure_stream_watermark(av, true);
+ ipu6_isys_configure_stream_watermark(av, source_pad->entity);
ipu6_isys_update_stream_watermark(av, true);
if (stream->nr_streaming != stream->nr_queues)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
index fb319d623a11..141f0e72c5c8 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
@@ -745,17 +745,16 @@ int ipu6_isys_video_prepare_stream(struct ipu6_isys_video *av,
stream->stream_source = stream->asd->source;
csi2 = ipu6_isys_subdev_to_csi2(stream->asd);
csi2->receiver_errors = 0;
- stream->source_entity = source_entity;
dev_dbg(&av->isys->adev->auxdev.dev,
"prepare stream: external entity %s\n",
- stream->source_entity->name);
+ source_entity->name);
return 0;
}
void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
- bool state)
+ struct media_entity *source)
{
struct ipu6_isys *isys = av->isys;
struct ipu6_isys_csi2 *csi2 = NULL;
@@ -769,10 +768,7 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
u64 pixel_rate = 0;
int ret;
- if (!state)
- return;
-
- esd = media_entity_to_v4l2_subdev(av->stream->source_entity);
+ esd = media_entity_to_v4l2_subdev(source);
av->watermark.width = ipu6_isys_get_frame_width(av);
av->watermark.height = ipu6_isys_get_frame_height(av);
@@ -804,7 +800,7 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
iwake_watermark->force_iwake_disable = true;
mutex_unlock(&iwake_watermark->mutex);
dev_warn(dev, "unexpected pixel_rate from %s, disable iwake.\n",
- av->stream->source_entity->name);
+ source->name);
}
}
@@ -1011,9 +1007,6 @@ int ipu6_isys_video_set_streaming(struct ipu6_isys_video *av, int state,
dev_dbg(dev, "set stream: %d\n", state);
- if (WARN(!stream->source_entity, "No source entity for stream\n"))
- return -ENODEV;
-
sd = &stream->asd->sd;
r_pad = media_pad_remote_pad_first(&av->pad);
r_stream = ipu6_isys_get_src_stream_by_src_pad(sd, r_pad->index);
@@ -1180,7 +1173,8 @@ void ipu6_isys_fw_close(struct ipu6_isys *isys)
}
int ipu6_isys_setup_video(struct ipu6_isys_video *av,
- struct media_entity **source_entity, int *nr_queues)
+ struct media_pad *remote_pad,
+ struct media_pad *source_pad, int *nr_queues)
{
const struct ipu6_isys_pixelformat *pfmt =
ipu6_isys_get_isys_format(ipu6_isys_get_format(av), 0);
@@ -1189,30 +1183,14 @@ int ipu6_isys_setup_video(struct ipu6_isys_video *av,
struct v4l2_subdev_route *route = NULL;
struct v4l2_subdev_route *r;
struct v4l2_subdev_state *state;
- struct ipu6_isys_subdev *asd;
- struct v4l2_subdev *remote_sd;
+ struct v4l2_subdev *remote_sd =
+ media_entity_to_v4l2_subdev(remote_pad->entity);
+ struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(remote_sd);
struct media_pipeline *pipeline;
- struct media_pad *source_pad, *remote_pad;
int ret = -EINVAL;
*nr_queues = 0;
- remote_pad = media_pad_remote_pad_unique(&av->pad);
- if (IS_ERR(remote_pad)) {
- dev_dbg(dev, "failed to get remote pad\n");
- return PTR_ERR(remote_pad);
- }
-
- remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity);
- asd = to_ipu6_isys_subdev(remote_sd);
- source_pad = media_pad_remote_pad_unique(&remote_pad->entity->pads[0]);
- if (IS_ERR(source_pad)) {
- dev_dbg(dev, "No external source entity\n");
- return PTR_ERR(source_pad);
- }
-
- *source_entity = source_pad->entity;
-
/* Find the root */
state = v4l2_subdev_lock_and_get_active_state(remote_sd);
for_each_active_route(&state->routing, r) {
@@ -1232,7 +1210,7 @@ int ipu6_isys_setup_video(struct ipu6_isys_video *av,
ret = ipu6_isys_csi2_get_remote_desc(av->source_stream,
to_ipu6_isys_csi2(asd),
- *source_entity, &entry);
+ source_pad->entity, &entry);
if (ret == -ENOIOCTLCMD) {
av->vc = 0;
av->dt = ipu6_isys_mbus_code_to_mipi(pfmt->code);
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
index 1dd36f2a077e..2ff53315d7b9 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
@@ -43,7 +43,6 @@ struct sequence_info {
*/
struct ipu6_isys_stream {
struct mutex mutex;
- struct media_entity *source_entity;
atomic_t sequence;
unsigned int seq_index;
struct sequence_info seq[IPU6_ISYS_MAX_PARALLEL_SOF];
@@ -113,7 +112,8 @@ int ipu6_isys_video_set_streaming(struct ipu6_isys_video *av, int state,
int ipu6_isys_fw_open(struct ipu6_isys *isys);
void ipu6_isys_fw_close(struct ipu6_isys *isys);
int ipu6_isys_setup_video(struct ipu6_isys_video *av,
- struct media_entity **source_entity, int *nr_queues);
+ struct media_pad *remote_pad,
+ struct media_pad *source_pad, int *nr_queues);
int ipu6_isys_video_init(struct ipu6_isys_video *av);
void ipu6_isys_video_cleanup(struct ipu6_isys_video *av);
void ipu6_isys_put_stream(struct ipu6_isys_stream *stream);
@@ -123,7 +123,7 @@ struct ipu6_isys_stream *
ipu6_isys_query_stream_by_source(struct ipu6_isys *isys, int source, u8 vc);
void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
- bool state);
+ struct media_entity *source);
void ipu6_isys_update_stream_watermark(struct ipu6_isys_video *av, bool state);
u32 ipu6_isys_get_format(struct ipu6_isys_video *av);
--
2.47.3
next prev parent reply other threads:[~2025-12-30 13:10 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-30 13:10 [PATCH v3 00/13] IPU6 driver cleanups and fixes Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 01/13] media: ipu6: Ensure stream_mutex is acquired when dealing with node list Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 02/13] media: ipu6: Drop MMU hardware initialisation in probe() Sakari Ailus
2025-12-31 5:38 ` Bingbu Cao
2026-01-01 19:39 ` Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 03/13] media: ipu6: Remove redundant driver data checks Sakari Ailus
2025-12-31 5:43 ` Bingbu Cao
2025-12-30 13:10 ` [PATCH v3 04/13] media: ipu6: Make symbols static Sakari Ailus
2025-12-31 5:46 ` Bingbu Cao
2025-12-30 13:10 ` [PATCH v3 05/13] media: ipu6: Remove redundant streaming start via buffer queueing Sakari Ailus
2025-12-31 6:01 ` Bingbu Cao
2026-01-01 19:51 ` Sakari Ailus
2026-01-05 3:07 ` Bingbu Cao
2025-12-30 13:10 ` [PATCH v3 06/13] media: ipu6: Don't check pipeline in stream_start Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 07/13] media: ipu6: Close firmware streams on streaming enable failure Sakari Ailus
2025-12-31 6:11 ` Bingbu Cao
2026-01-01 19:58 ` Sakari Ailus
2026-01-05 3:07 ` Bingbu Cao
2026-01-07 21:55 ` Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 08/13] media: ipu6: Drop error argument from ipu6_isys_stream_start() Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 09/13] media: ipu6: Obtain remote pad using media_pad_remote_pad_unique() Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 10/13] media: ipu6: Obtain unique source pad from remote sub-device Sakari Ailus
2025-12-30 13:10 ` Sakari Ailus [this message]
2025-12-30 13:10 ` [PATCH v3 12/13] media: ipu6: Drop custom functions to obtain sd state information Sakari Ailus
2025-12-30 13:10 ` [PATCH v3 13/13] media: ipu6: Always call video_device_pipeline_alloc_start() Sakari Ailus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251230131013.75338-12-sakari.ailus@linux.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=antti.laakso@linux.intel.com \
--cc=bingbu.cao@linux.intel.com \
--cc=linux-media@vger.kernel.org \
--cc=mehdi.djait@linux.intel.com \
--cc=tian.shu.qiu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.