* [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation
@ 2025-04-01 9:09 Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
Cleanup and create isys.h and isys-subdev.c files that intention is
to be shared with incoming ipu7 driver.
This is on top of:
https://git.linuxtv.org/sailus/media_tree.git/log/?h=devel
plus one patch:
https://lore.kernel.org/linux-media/20250317073856.162147-1-stanislaw.gruszka@linux.intel.com/
Stanislaw Gruszka (5):
media: intel/ipu6: Separate ipu6 subdev functions
media: intel/ipu6: Remove ipu6_isys dependency from ipu6_isys_subdev
media: intel/ipu6: Remove redundant ipu6_isys_subdev_to_csi2 macro
media: intel/ipu6: Rename ipu6_isys_subdev
media: intel/ipu6: Move isys_subdev functions to common code
drivers/media/pci/intel/ipu6/Makefile | 3 +-
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 31 +--
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h | 7 +-
.../media/pci/intel/ipu6/ipu6-isys-queue.c | 5 +-
.../media/pci/intel/ipu6/ipu6-isys-subdev.c | 249 +----------------
.../media/pci/intel/ipu6/ipu6-isys-subdev.h | 40 +--
.../media/pci/intel/ipu6/ipu6-isys-video.c | 27 +-
.../media/pci/intel/ipu6/ipu6-isys-video.h | 4 +-
drivers/media/pci/intel/ipu6/ipu6-isys.c | 2 +-
drivers/media/pci/intel/ipu6/isys-subdev.c | 253 ++++++++++++++++++
drivers/media/pci/intel/ipu6/isys.h | 42 +++
11 files changed, 333 insertions(+), 330 deletions(-)
create mode 100644 drivers/media/pci/intel/ipu6/isys-subdev.c
create mode 100644 drivers/media/pci/intel/ipu6/isys.h
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] media: intel/ipu6: Move isys_subdev functions to common code
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
@ 2025-04-01 9:09 ` Stanislaw Gruszka
2025-04-01 9:37 ` Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 1/5] media: intel/ipu6: Separate ipu6 subdev functions Stanislaw Gruszka
` (4 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
Move more functions (those that utilize isys_subdev structure internally),
to common code to be shared with ipu7 driver.
Additionally use isd variable name for isys_subdevice, asd name is used
for historical reason - precursor of the drier was atomisp driver, the
variables names stayed unchanged, what is a little confusing.
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 8 +-
.../media/pci/intel/ipu6/ipu6-isys-subdev.c | 179 +-----------------
.../media/pci/intel/ipu6/ipu6-isys-subdev.h | 11 +-
drivers/media/pci/intel/ipu6/isys-subdev.c | 159 ++++++++++++++++
drivers/media/pci/intel/ipu6/isys.h | 9 +
5 files changed, 174 insertions(+), 192 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 2441f47e8742..5c4baaffa092 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -487,7 +487,7 @@ static const struct v4l2_subdev_pad_ops csi2_sd_pad_ops = {
.set_fmt = ipu6_isys_subdev_set_fmt,
.get_selection = ipu6_isys_csi2_get_sel,
.set_selection = ipu6_isys_csi2_set_sel,
- .enum_mbus_code = ipu6_isys_subdev_enum_mbus_code,
+ .enum_mbus_code = isys_subdev_enum_mbus_code,
.set_routing = isys_subdev_set_routing,
.enable_streams = ipu6_isys_csi2_enable_streams,
.disable_streams = ipu6_isys_csi2_disable_streams,
@@ -510,7 +510,7 @@ void ipu6_isys_csi2_cleanup(struct ipu6_isys_csi2 *csi2)
v4l2_device_unregister_subdev(&csi2->asd.sd);
v4l2_subdev_cleanup(&csi2->asd.sd);
- ipu6_isys_subdev_cleanup(&csi2->asd);
+ isys_subdev_cleanup(&csi2->asd);
csi2->isys = NULL;
}
@@ -526,8 +526,8 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
csi2->port = index;
csi2->asd.sd.entity.ops = &csi2_entity_ops;
- ret = ipu6_isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
- NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
+ ret = isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
+ NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
if (ret)
goto fail;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
index 020c25925ca0..655057d54785 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
@@ -141,14 +141,6 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format)
{
- struct isys_subdev *asd = to_isys_subdev(sd);
- struct v4l2_mbus_framefmt *fmt;
- struct v4l2_rect *crop;
- u32 code = asd->supported_codes[0];
- u32 other_pad, other_stream;
- unsigned int i;
- int ret;
-
/* No transcoding, source and sink formats must match. */
if ((sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SOURCE) &&
sd->entity.num_pads > 1)
@@ -160,174 +152,5 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
IPU6_ISYS_MIN_HEIGHT,
IPU6_ISYS_MAX_HEIGHT);
- for (i = 0; asd->supported_codes[i]; i++) {
- if (asd->supported_codes[i] == format->format.code) {
- code = asd->supported_codes[i];
- break;
- }
- }
- format->format.code = code;
- format->format.field = V4L2_FIELD_NONE;
-
- /* Store the format and propagate it to the source pad. */
- fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
- return 0;
-
- /* propagate format to following source pad */
- fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
- format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
- format->pad,
- format->stream,
- &other_pad,
- &other_stream);
- if (ret)
- return -EINVAL;
-
- crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
- /* reset crop */
- crop->left = 0;
- crop->top = 0;
- crop->width = fmt->width;
- crop->height = fmt->height;
-
- return 0;
-}
-
-int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_mbus_code_enum *code)
-{
- struct isys_subdev *asd = to_isys_subdev(sd);
- const u32 *supported_codes = asd->supported_codes;
- u32 index;
-
- for (index = 0; supported_codes[index]; index++) {
- if (index == code->index) {
- code->code = supported_codes[index];
- return 0;
- }
- }
-
- return -EINVAL;
-}
-
-static int subdev_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_krouting *routing)
-{
- static const struct v4l2_mbus_framefmt format = {
- .width = 4096,
- .height = 3072,
- .code = MEDIA_BUS_FMT_SGRBG10_1X10,
- .field = V4L2_FIELD_NONE,
- };
- int ret;
-
- ret = v4l2_subdev_routing_validate(sd, routing,
- V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
- if (ret)
- return ret;
-
- return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
-}
-
-static int ipu6_isys_subdev_init_state(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state)
-{
- struct v4l2_subdev_route route = {
- .sink_pad = 0,
- .sink_stream = 0,
- .source_pad = 1,
- .source_stream = 0,
- .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
- };
- struct v4l2_subdev_krouting routing = {
- .num_routes = 1,
- .routes = &route,
- };
-
- return subdev_set_routing(sd, state, &routing);
-}
-
-static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
- .init_state = ipu6_isys_subdev_init_state,
-};
-
-int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
- const struct v4l2_subdev_ops *ops,
- unsigned int nr_ctrls, unsigned int num_sink_pads,
- unsigned int num_source_pads)
-{
- unsigned int num_pads = num_sink_pads + num_source_pads;
- unsigned int i;
- int ret;
-
- v4l2_subdev_init(&asd->sd, ops);
-
- asd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
- V4L2_SUBDEV_FL_HAS_EVENTS |
- V4L2_SUBDEV_FL_STREAMS;
- asd->sd.owner = THIS_MODULE;
- asd->sd.dev = dev;
- asd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
- asd->sd.internal_ops = &ipu6_isys_subdev_internal_ops;
-
- asd->pad = devm_kcalloc(dev, num_pads, sizeof(*asd->pad), GFP_KERNEL);
- if (!asd->pad)
- return -ENOMEM;
-
- for (i = 0; i < num_sink_pads; i++)
- asd->pad[i].flags = MEDIA_PAD_FL_SINK |
- MEDIA_PAD_FL_MUST_CONNECT;
-
- for (i = num_sink_pads; i < num_pads; i++)
- asd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
-
- ret = media_entity_pads_init(&asd->sd.entity, num_pads, asd->pad);
- if (ret)
- return ret;
-
- if (asd->ctrl_init) {
- ret = v4l2_ctrl_handler_init(&asd->ctrl_handler, nr_ctrls);
- if (ret)
- goto out_media_entity_cleanup;
-
- asd->ctrl_init(&asd->sd);
- if (asd->ctrl_handler.error) {
- ret = asd->ctrl_handler.error;
- goto out_v4l2_ctrl_handler_free;
- }
-
- asd->sd.ctrl_handler = &asd->ctrl_handler;
- }
-
- asd->source = -1;
-
- return 0;
-
-out_v4l2_ctrl_handler_free:
- v4l2_ctrl_handler_free(&asd->ctrl_handler);
-
-out_media_entity_cleanup:
- media_entity_cleanup(&asd->sd.entity);
-
- return ret;
-}
-
-void ipu6_isys_subdev_cleanup(struct isys_subdev *asd)
-{
- media_entity_cleanup(&asd->sd.entity);
- v4l2_ctrl_handler_free(&asd->ctrl_handler);
+ return isys_subdev_set_fmt(sd, state, format);
}
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
index f3835d873991..e8d1ff181a9d 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-/* Copyright (C) 2013--2024 Intel Corporation */
+/* Copyright (C) 2013-2025 Intel Corporation */
#ifndef IPU6_ISYS_SUBDEV_H
#define IPU6_ISYS_SUBDEV_H
@@ -16,13 +16,4 @@ u32 ipu6_isys_convert_bayer_order(u32 code, int x, int y);
int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *fmt);
-int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_mbus_code_enum
- *code);
-int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
- const struct v4l2_subdev_ops *ops,
- unsigned int nr_ctrls, unsigned int num_sink_pads,
- unsigned int num_source_pads);
-void ipu6_isys_subdev_cleanup(struct isys_subdev *asd);
#endif /* IPU6_ISYS_SUBDEV_H */
diff --git a/drivers/media/pci/intel/ipu6/isys-subdev.c b/drivers/media/pci/intel/ipu6/isys-subdev.c
index 483d718f2ea4..7635d768067f 100644
--- a/drivers/media/pci/intel/ipu6/isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/isys-subdev.c
@@ -92,3 +92,162 @@ int isys_subdev_set_routing(struct v4l2_subdev *sd,
{
return subdev_set_routing(sd, state, routing);
}
+
+int isys_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
+ struct v4l2_subdev_format *format)
+{
+ struct isys_subdev *isd = to_isys_subdev(sd);
+ struct v4l2_mbus_framefmt *fmt;
+ struct v4l2_rect *crop;
+ u32 code = isd->supported_codes[0];
+ u32 other_pad, other_stream;
+ unsigned int i;
+ int ret;
+
+ for (i = 0; isd->supported_codes[i]; i++) {
+ if (isd->supported_codes[i] == format->format.code) {
+ code = isd->supported_codes[i];
+ break;
+ }
+ }
+ format->format.code = code;
+ format->format.field = V4L2_FIELD_NONE;
+
+ /* Store the format and propagate it to the source pad. */
+ fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
+ return 0;
+
+ /* propagate format to following source pad */
+ fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
+ format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
+ format->pad, format->stream,
+ &other_pad, &other_stream);
+ if (ret)
+ return -EINVAL;
+
+ crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
+ /* reset crop */
+ crop->left = 0;
+ crop->top = 0;
+ crop->width = fmt->width;
+ crop->height = fmt->height;
+
+ return 0;
+}
+
+int isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_mbus_code_enum *code)
+{
+ struct isys_subdev *isd = to_isys_subdev(sd);
+ const u32 *supported_codes = isd->supported_codes;
+ u32 index;
+
+ for (index = 0; supported_codes[index]; index++) {
+ if (index == code->index) {
+ code->code = supported_codes[index];
+ return 0;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static int isys_subdev_init_state(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state)
+{
+ struct v4l2_subdev_route route = {
+ .sink_pad = 0,
+ .sink_stream = 0,
+ .source_pad = 1,
+ .source_stream = 0,
+ .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
+ };
+ struct v4l2_subdev_krouting routing = {
+ .num_routes = 1,
+ .routes = &route,
+ };
+
+ return subdev_set_routing(sd, state, &routing);
+}
+
+static const struct v4l2_subdev_internal_ops isys_subdev_internal_ops = {
+ .init_state = isys_subdev_init_state,
+};
+
+int isys_subdev_init(struct isys_subdev *isd, struct device *dev,
+ const struct v4l2_subdev_ops *ops, unsigned int nr_ctrls,
+ unsigned int num_sink_pads, unsigned int num_source_pads)
+{
+ unsigned int num_pads = num_sink_pads + num_source_pads;
+ unsigned int i;
+ int ret;
+
+ v4l2_subdev_init(&isd->sd, ops);
+
+ isd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+ V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_STREAMS;
+ isd->sd.owner = THIS_MODULE;
+ isd->sd.dev = dev;
+ isd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
+ isd->sd.internal_ops = &isys_subdev_internal_ops;
+
+ isd->pad = devm_kcalloc(dev, num_pads, sizeof(*isd->pad), GFP_KERNEL);
+ if (!isd->pad)
+ return -ENOMEM;
+
+ for (i = 0; i < num_sink_pads; i++)
+ isd->pad[i].flags = MEDIA_PAD_FL_SINK |
+ MEDIA_PAD_FL_MUST_CONNECT;
+
+ for (i = num_sink_pads; i < num_pads; i++)
+ isd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
+
+ ret = media_entity_pads_init(&isd->sd.entity, num_pads, isd->pad);
+ if (ret)
+ return ret;
+
+ if (isd->ctrl_init) {
+ ret = v4l2_ctrl_handler_init(&isd->ctrl_handler, nr_ctrls);
+ if (ret)
+ goto out_media_entity_cleanup;
+
+ isd->ctrl_init(&isd->sd);
+ if (isd->ctrl_handler.error) {
+ ret = isd->ctrl_handler.error;
+ goto out_v4l2_ctrl_handler_free;
+ }
+
+ isd->sd.ctrl_handler = &isd->ctrl_handler;
+ }
+
+ isd->source = -1;
+
+ return 0;
+
+out_v4l2_ctrl_handler_free:
+ v4l2_ctrl_handler_free(&isd->ctrl_handler);
+
+out_media_entity_cleanup:
+ media_entity_cleanup(&isd->sd.entity);
+
+ return ret;
+}
+
+void isys_subdev_cleanup(struct isys_subdev *isd)
+{
+ media_entity_cleanup(&isd->sd.entity);
+ v4l2_ctrl_handler_free(&isd->ctrl_handler);
+}
diff --git a/drivers/media/pci/intel/ipu6/isys.h b/drivers/media/pci/intel/ipu6/isys.h
index 76f64439952b..4bde32f6d767 100644
--- a/drivers/media/pci/intel/ipu6/isys.h
+++ b/drivers/media/pci/intel/ipu6/isys.h
@@ -30,4 +30,13 @@ int isys_subdev_set_routing(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
enum v4l2_subdev_format_whence which,
struct v4l2_subdev_krouting *routing);
+int isys_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
+ struct v4l2_subdev_format *format);
+int isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_mbus_code_enum *code);
+int isys_subdev_init(struct isys_subdev *asd, struct device *dev,
+ const struct v4l2_subdev_ops *ops, unsigned int nr_ctrls,
+ unsigned int num_sink_pads, unsigned int num_source_pads);
+void isys_subdev_cleanup(struct isys_subdev *asd);
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 1/5] media: intel/ipu6: Separate ipu6 subdev functions
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
@ 2025-04-01 9:09 ` Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 2/5] media: intel/ipu6: Remove ipu6_isys dependency from ipu6_isys_subdev Stanislaw Gruszka
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
Move ipu6 isys functions that do not have dependency's other than
v4l-subdev into separate file. Rename them using isys_ prefix.
This is initial commit of changes that separate layers in ipu6 driver to
make them reusable in incoming ipu7 driver.
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
---
drivers/media/pci/intel/ipu6/Makefile | 3 +-
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 2 +-
.../media/pci/intel/ipu6/ipu6-isys-queue.c | 5 +-
.../media/pci/intel/ipu6/ipu6-isys-subdev.c | 68 --------------
.../media/pci/intel/ipu6/ipu6-isys-subdev.h | 11 +--
.../media/pci/intel/ipu6/ipu6-isys-video.c | 17 ++--
drivers/media/pci/intel/ipu6/isys-subdev.c | 94 +++++++++++++++++++
drivers/media/pci/intel/ipu6/isys.h | 19 ++++
8 files changed, 128 insertions(+), 91 deletions(-)
create mode 100644 drivers/media/pci/intel/ipu6/isys-subdev.c
create mode 100644 drivers/media/pci/intel/ipu6/isys.h
diff --git a/drivers/media/pci/intel/ipu6/Makefile b/drivers/media/pci/intel/ipu6/Makefile
index a821b0a1567f..493aca7a1e71 100644
--- a/drivers/media/pci/intel/ipu6/Makefile
+++ b/drivers/media/pci/intel/ipu6/Makefile
@@ -18,6 +18,7 @@ intel-ipu6-isys-y := ipu6-isys.o \
ipu6-isys-subdev.o \
ipu6-isys-mcd-phy.o \
ipu6-isys-jsl-phy.o \
- ipu6-isys-dwc-phy.o
+ ipu6-isys-dwc-phy.o \
+ isys-subdev.o
obj-$(CONFIG_VIDEO_INTEL_IPU6) += intel-ipu6-isys.o
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index da8581a37e22..923e92785a17 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -494,7 +494,7 @@ static const struct v4l2_subdev_pad_ops csi2_sd_pad_ops = {
.get_selection = ipu6_isys_csi2_get_sel,
.set_selection = ipu6_isys_csi2_set_sel,
.enum_mbus_code = ipu6_isys_subdev_enum_mbus_code,
- .set_routing = ipu6_isys_subdev_set_routing,
+ .set_routing = isys_subdev_set_routing,
.enable_streams = ipu6_isys_csi2_enable_streams,
.disable_streams = ipu6_isys_csi2_disable_streams,
};
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
index 2b2bc6ff8099..5fc52a3b89e6 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
@@ -446,10 +446,9 @@ static int ipu6_isys_link_fmt_validate(struct ipu6_isys_queue *aq)
return -ENOTCONN;
sd = media_entity_to_v4l2_subdev(remote_pad->entity);
- r_stream = ipu6_isys_get_src_stream_by_src_pad(sd, remote_pad->index);
+ r_stream = isys_get_src_stream_by_src_pad(sd, remote_pad->index);
- ret = ipu6_isys_get_stream_pad_fmt(sd, remote_pad->index, r_stream,
- &format);
+ ret = isys_get_stream_pad_fmt(sd, remote_pad->index, r_stream, &format);
if (ret) {
dev_dbg(dev, "failed to get %s: pad %d, stream:%d format\n",
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
index 0a06de5c739c..e5ce76c17ca3 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
@@ -243,66 +243,6 @@ static int subdev_set_routing(struct v4l2_subdev *sd,
return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
}
-int ipu6_isys_get_stream_pad_fmt(struct v4l2_subdev *sd, u32 pad, u32 stream,
- struct v4l2_mbus_framefmt *format)
-{
- struct v4l2_mbus_framefmt *fmt;
- struct v4l2_subdev_state *state;
-
- if (!sd || !format)
- return -EINVAL;
-
- state = v4l2_subdev_lock_and_get_active_state(sd);
- fmt = v4l2_subdev_state_get_format(state, pad, stream);
- if (fmt)
- *format = *fmt;
- v4l2_subdev_unlock_state(state);
-
- return fmt ? 0 : -EINVAL;
-}
-
-int ipu6_isys_get_stream_pad_crop(struct v4l2_subdev *sd, u32 pad, u32 stream,
- struct v4l2_rect *crop)
-{
- struct v4l2_subdev_state *state;
- struct v4l2_rect *rect;
-
- if (!sd || !crop)
- return -EINVAL;
-
- state = v4l2_subdev_lock_and_get_active_state(sd);
- rect = v4l2_subdev_state_get_crop(state, pad, stream);
- if (rect)
- *crop = *rect;
- v4l2_subdev_unlock_state(state);
-
- return rect ? 0 : -EINVAL;
-}
-
-u32 ipu6_isys_get_src_stream_by_src_pad(struct v4l2_subdev *sd, u32 pad)
-{
- struct v4l2_subdev_state *state;
- struct v4l2_subdev_route *routes;
- unsigned int i;
- u32 source_stream = 0;
-
- state = v4l2_subdev_lock_and_get_active_state(sd);
- if (!state)
- return 0;
-
- routes = state->routing.routes;
- for (i = 0; i < state->routing.num_routes; i++) {
- if (routes[i].source_pad == pad) {
- source_stream = routes[i].source_stream;
- break;
- }
- }
-
- v4l2_subdev_unlock_state(state);
-
- return source_stream;
-}
-
static int ipu6_isys_subdev_init_state(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state)
{
@@ -321,14 +261,6 @@ static int ipu6_isys_subdev_init_state(struct v4l2_subdev *sd,
return subdev_set_routing(sd, state, &routing);
}
-int ipu6_isys_subdev_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- enum v4l2_subdev_format_whence which,
- struct v4l2_subdev_krouting *routing)
-{
- return subdev_set_routing(sd, state, routing);
-}
-
static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
.init_state = ipu6_isys_subdev_init_state,
};
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
index 268dfa01e903..42e35ae820c4 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
@@ -10,6 +10,8 @@
#include <media/v4l2-ctrls.h>
#include <media/v4l2-subdev.h>
+#include "isys.h"
+
struct ipu6_isys;
struct ipu6_isys_subdev {
@@ -37,15 +39,6 @@ int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_mbus_code_enum
*code);
-u32 ipu6_isys_get_src_stream_by_src_pad(struct v4l2_subdev *sd, u32 pad);
-int ipu6_isys_get_stream_pad_fmt(struct v4l2_subdev *sd, u32 pad, u32 stream,
- struct v4l2_mbus_framefmt *format);
-int ipu6_isys_get_stream_pad_crop(struct v4l2_subdev *sd, u32 pad, u32 stream,
- struct v4l2_rect *crop);
-int ipu6_isys_subdev_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- enum v4l2_subdev_format_whence which,
- struct v4l2_subdev_krouting *routing);
int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
const struct v4l2_subdev_ops *ops,
unsigned int nr_ctrls,
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
index 959869a88556..2d3506d84922 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
@@ -387,7 +387,7 @@ static int link_validate(struct media_link *link)
link->sink->entity->name);
s_pad = media_pad_remote_pad_first(&av->pad);
- s_stream = ipu6_isys_get_src_stream_by_src_pad(s_sd, s_pad->index);
+ s_stream = isys_get_src_stream_by_src_pad(s_sd, s_pad->index);
v4l2_subdev_lock_state(s_state);
@@ -456,16 +456,15 @@ static int ipu6_isys_fw_pin_cfg(struct ipu6_isys_video *av,
u32 src_stream;
int ret;
- src_stream = ipu6_isys_get_src_stream_by_src_pad(sd, src_pad->index);
- ret = ipu6_isys_get_stream_pad_fmt(sd, src_pad->index, src_stream,
- &fmt);
+ src_stream = isys_get_src_stream_by_src_pad(sd, src_pad->index);
+ ret = isys_get_stream_pad_fmt(sd, src_pad->index, src_stream, &fmt);
if (ret < 0) {
dev_err(dev, "can't get stream format (%d)\n", ret);
return ret;
}
- ret = ipu6_isys_get_stream_pad_crop(sd, src_pad->index, src_stream,
- &v4l2_crop);
+ ret = isys_get_stream_pad_crop(sd, src_pad->index, src_stream,
+ &v4l2_crop);
if (ret < 0) {
dev_err(dev, "can't get stream crop (%d)\n", ret);
return ret;
@@ -776,8 +775,8 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
link_freq = ipu6_isys_csi2_get_link_freq(csi2);
if (link_freq > 0) {
lanes = csi2->nlanes;
- ret = ipu6_isys_get_stream_pad_fmt(&csi2->asd.sd, 0,
- av->source_stream, &format);
+ ret = isys_get_stream_pad_fmt(&csi2->asd.sd, 0,
+ av->source_stream, &format);
if (!ret) {
bpp = ipu6_isys_mbus_code_to_bpp(format.code);
pixel_rate = mul_u64_u32_div(link_freq, lanes * 2, bpp);
@@ -1003,7 +1002,7 @@ int ipu6_isys_video_set_streaming(struct ipu6_isys_video *av, int state,
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);
+ r_stream = isys_get_src_stream_by_src_pad(sd, r_pad->index);
subdev_state = v4l2_subdev_lock_and_get_active_state(sd);
routing = &subdev_state->routing;
diff --git a/drivers/media/pci/intel/ipu6/isys-subdev.c b/drivers/media/pci/intel/ipu6/isys-subdev.c
new file mode 100644
index 000000000000..483d718f2ea4
--- /dev/null
+++ b/drivers/media/pci/intel/ipu6/isys-subdev.c
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2013-2025 Intel Corporation
+ */
+
+#include "isys.h"
+
+int isys_get_stream_pad_fmt(struct v4l2_subdev *sd, u32 pad, u32 stream,
+ struct v4l2_mbus_framefmt *format)
+{
+ struct v4l2_mbus_framefmt *fmt;
+ struct v4l2_subdev_state *state;
+
+ if (!sd || !format)
+ return -EINVAL;
+
+ state = v4l2_subdev_lock_and_get_active_state(sd);
+ fmt = v4l2_subdev_state_get_format(state, pad, stream);
+ if (fmt)
+ *format = *fmt;
+ v4l2_subdev_unlock_state(state);
+
+ return fmt ? 0 : -EINVAL;
+}
+
+int isys_get_stream_pad_crop(struct v4l2_subdev *sd, u32 pad, u32 stream,
+ struct v4l2_rect *crop)
+{
+ struct v4l2_subdev_state *state;
+ struct v4l2_rect *rect;
+
+ if (!sd || !crop)
+ return -EINVAL;
+
+ state = v4l2_subdev_lock_and_get_active_state(sd);
+ rect = v4l2_subdev_state_get_crop(state, pad, stream);
+ if (rect)
+ *crop = *rect;
+ v4l2_subdev_unlock_state(state);
+
+ return rect ? 0 : -EINVAL;
+}
+
+u32 isys_get_src_stream_by_src_pad(struct v4l2_subdev *sd, u32 pad)
+{
+ struct v4l2_subdev_state *state;
+ struct v4l2_subdev_route *routes;
+ unsigned int i;
+ u32 source_stream = 0;
+
+ state = v4l2_subdev_lock_and_get_active_state(sd);
+ if (!state)
+ return 0;
+
+ routes = state->routing.routes;
+ for (i = 0; i < state->routing.num_routes; i++) {
+ if (routes[i].source_pad == pad) {
+ source_stream = routes[i].source_stream;
+ break;
+ }
+ }
+
+ v4l2_subdev_unlock_state(state);
+
+ return source_stream;
+}
+
+static int subdev_set_routing(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_krouting *routing)
+{
+ static const struct v4l2_mbus_framefmt format = {
+ .width = 4096,
+ .height = 3072,
+ .code = MEDIA_BUS_FMT_SGRBG10_1X10,
+ .field = V4L2_FIELD_NONE,
+ };
+ int ret;
+
+ ret = v4l2_subdev_routing_validate(sd, routing,
+ V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
+ if (ret)
+ return ret;
+
+ return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
+}
+
+int isys_subdev_set_routing(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ enum v4l2_subdev_format_whence which,
+ struct v4l2_subdev_krouting *routing)
+{
+ return subdev_set_routing(sd, state, routing);
+}
diff --git a/drivers/media/pci/intel/ipu6/isys.h b/drivers/media/pci/intel/ipu6/isys.h
new file mode 100644
index 000000000000..d822930e94bb
--- /dev/null
+++ b/drivers/media/pci/intel/ipu6/isys.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright (C) 2025 Intel Corporation */
+
+#ifndef ISYS_H
+#define ISYS_H
+
+#include <media/v4l2-subdev.h>
+
+int isys_get_stream_pad_fmt(struct v4l2_subdev *sd, u32 pad, u32 stream,
+ struct v4l2_mbus_framefmt *format);
+int isys_get_stream_pad_crop(struct v4l2_subdev *sd, u32 pad, u32 stream,
+ struct v4l2_rect *crop);
+u32 isys_get_src_stream_by_src_pad(struct v4l2_subdev *sd, u32 pad);
+
+int isys_subdev_set_routing(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ enum v4l2_subdev_format_whence which,
+ struct v4l2_subdev_krouting *routing);
+#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/5] media: intel/ipu6: Remove ipu6_isys dependency from ipu6_isys_subdev
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 1/5] media: intel/ipu6: Separate ipu6 subdev functions Stanislaw Gruszka
@ 2025-04-01 9:09 ` Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 3/5] media: intel/ipu6: Remove redundant ipu6_isys_subdev_to_csi2 macro Stanislaw Gruszka
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
isys back pointer of ipu6_isys_subdev structure is only used to get
pointer to struct device. We can use device pointer directly, what
would allow to refactor ipu6 subdev code to make it more independent.
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 15 ++++-----------
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c | 10 ++++------
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h | 8 ++------
3 files changed, 10 insertions(+), 23 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 923e92785a17..531de32419c6 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -98,12 +98,8 @@ s64 ipu6_isys_csi2_get_link_freq(struct ipu6_isys_csi2 *csi2)
static int csi2_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
struct v4l2_event_subscription *sub)
{
- struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
- struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd);
- struct device *dev = &csi2->isys->adev->auxdev.dev;
-
- dev_dbg(dev, "csi2 subscribe event(type %u id %u)\n",
- sub->type, sub->id);
+ dev_dbg(sd->dev, "csi2 subscribe event(type %u id %u)\n", sub->type,
+ sub->id);
switch (sub->type) {
case V4L2_EVENT_FRAME_SYNC:
@@ -402,8 +398,6 @@ static int ipu6_isys_csi2_set_sel(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_selection *sel)
{
- struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
- struct device *dev = &asd->isys->adev->auxdev.dev;
struct v4l2_mbus_framefmt *sink_ffmt;
struct v4l2_mbus_framefmt *src_ffmt;
struct v4l2_rect *crop;
@@ -442,7 +436,7 @@ static int ipu6_isys_csi2_set_sel(struct v4l2_subdev *sd,
src_ffmt->code = ipu6_isys_convert_bayer_order(sink_ffmt->code,
sel->r.left,
sel->r.top);
- dev_dbg(dev, "set crop for %s sel: %d,%d,%d,%d code: 0x%x\n",
+ dev_dbg(sd->dev, "set crop for %s sel: %d,%d,%d,%d code: 0x%x\n",
sd->name, sel->r.left, sel->r.top, sel->r.width, sel->r.height,
src_ffmt->code);
@@ -532,8 +526,7 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
csi2->port = index;
csi2->asd.sd.entity.ops = &csi2_entity_ops;
- csi2->asd.isys = isys;
- ret = ipu6_isys_subdev_init(&csi2->asd, &csi2_sd_ops, 0,
+ ret = ipu6_isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
if (ret)
goto fail;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
index e5ce76c17ca3..7c6125dc4af4 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
@@ -265,10 +265,9 @@ static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
.init_state = ipu6_isys_subdev_init_state,
};
-int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
+int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,
const struct v4l2_subdev_ops *ops,
- unsigned int nr_ctrls,
- unsigned int num_sink_pads,
+ unsigned int nr_ctrls, unsigned int num_sink_pads,
unsigned int num_source_pads)
{
unsigned int num_pads = num_sink_pads + num_source_pads;
@@ -281,12 +280,11 @@ int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
V4L2_SUBDEV_FL_HAS_EVENTS |
V4L2_SUBDEV_FL_STREAMS;
asd->sd.owner = THIS_MODULE;
- asd->sd.dev = &asd->isys->adev->auxdev.dev;
+ asd->sd.dev = dev;
asd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
asd->sd.internal_ops = &ipu6_isys_subdev_internal_ops;
- asd->pad = devm_kcalloc(&asd->isys->adev->auxdev.dev, num_pads,
- sizeof(*asd->pad), GFP_KERNEL);
+ asd->pad = devm_kcalloc(dev, num_pads, sizeof(*asd->pad), GFP_KERNEL);
if (!asd->pad)
return -ENOMEM;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
index 42e35ae820c4..544537b4e3db 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
@@ -12,11 +12,8 @@
#include "isys.h"
-struct ipu6_isys;
-
struct ipu6_isys_subdev {
struct v4l2_subdev sd;
- struct ipu6_isys *isys;
u32 const *supported_codes;
struct media_pad *pad;
struct v4l2_ctrl_handler ctrl_handler;
@@ -39,10 +36,9 @@ int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_mbus_code_enum
*code);
-int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
+int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,
const struct v4l2_subdev_ops *ops,
- unsigned int nr_ctrls,
- unsigned int num_sink_pads,
+ unsigned int nr_ctrls, unsigned int num_sink_pads,
unsigned int num_source_pads);
void ipu6_isys_subdev_cleanup(struct ipu6_isys_subdev *asd);
#endif /* IPU6_ISYS_SUBDEV_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/5] media: intel/ipu6: Remove redundant ipu6_isys_subdev_to_csi2 macro
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
` (2 preceding siblings ...)
2025-04-01 9:09 ` [PATCH 2/5] media: intel/ipu6: Remove ipu6_isys dependency from ipu6_isys_subdev Stanislaw Gruszka
@ 2025-04-01 9:09 ` Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 4/5] media: intel/ipu6: Rename ipu6_isys_subdev Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 5/5] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
5 siblings, 0 replies; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
to_ipu6_isys_csi2 and ipu6_isys_subdev_to_csi2 are the same macros
with different name, use the former one consequently.
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 4 ++--
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h | 3 ---
drivers/media/pci/intel/ipu6/ipu6-isys-video.c | 4 ++--
drivers/media/pci/intel/ipu6/ipu6-isys.c | 2 +-
4 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 531de32419c6..a59231d81f80 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -560,7 +560,7 @@ void ipu6_isys_csi2_sof_event_by_stream(struct ipu6_isys_stream *stream)
{
struct video_device *vdev = stream->asd->sd.devnode;
struct device *dev = &stream->isys->adev->auxdev.dev;
- struct ipu6_isys_csi2 *csi2 = ipu6_isys_subdev_to_csi2(stream->asd);
+ struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(stream->asd);
struct v4l2_event ev = {
.type = V4L2_EVENT_FRAME_SYNC,
};
@@ -575,7 +575,7 @@ void ipu6_isys_csi2_sof_event_by_stream(struct ipu6_isys_stream *stream)
void ipu6_isys_csi2_eof_event_by_stream(struct ipu6_isys_stream *stream)
{
struct device *dev = &stream->isys->adev->auxdev.dev;
- struct ipu6_isys_csi2 *csi2 = ipu6_isys_subdev_to_csi2(stream->asd);
+ struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(stream->asd);
u32 frame_sequence = atomic_read(&stream->sequence);
dev_dbg(dev, "eof_event::csi2-%i sequence: %i\n",
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
index ce8eed91065c..24ed13b4a63f 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
@@ -57,9 +57,6 @@ struct ipu6_csi2_error {
bool is_info_only;
};
-#define ipu6_isys_subdev_to_csi2(__sd) \
- container_of(__sd, struct ipu6_isys_csi2, asd)
-
#define to_ipu6_isys_csi2(__asd) container_of(__asd, struct ipu6_isys_csi2, asd)
s64 ipu6_isys_csi2_get_link_freq(struct ipu6_isys_csi2 *csi2);
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
index 2d3506d84922..17ae8bb55234 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
@@ -729,7 +729,7 @@ int ipu6_isys_video_prepare_stream(struct ipu6_isys_video *av,
return -EINVAL;
stream->stream_source = stream->asd->source;
- csi2 = ipu6_isys_subdev_to_csi2(stream->asd);
+ csi2 = to_ipu6_isys_csi2(stream->asd);
csi2->receiver_errors = 0;
stream->source_entity = source_entity;
@@ -771,7 +771,7 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
else
av->watermark.hblank = 0;
- csi2 = ipu6_isys_subdev_to_csi2(av->stream->asd);
+ csi2 = to_ipu6_isys_csi2(av->stream->asd);
link_freq = ipu6_isys_csi2_get_link_freq(csi2);
if (link_freq > 0) {
lanes = csi2->nlanes;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.c b/drivers/media/pci/intel/ipu6/ipu6-isys.c
index 8df1d83a74b5..9b7ff5c440de 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.c
@@ -1266,7 +1266,7 @@ static int isys_isr_one(struct ipu6_bus_device *adev)
}
stream->error = resp->error_info.error;
- csi2 = ipu6_isys_subdev_to_csi2(stream->asd);
+ csi2 = to_ipu6_isys_csi2(stream->asd);
switch (resp->type) {
case IPU6_FW_ISYS_RESP_TYPE_STREAM_OPEN_DONE:
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/5] media: intel/ipu6: Rename ipu6_isys_subdev
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
` (3 preceding siblings ...)
2025-04-01 9:09 ` [PATCH 3/5] media: intel/ipu6: Remove redundant ipu6_isys_subdev_to_csi2 macro Stanislaw Gruszka
@ 2025-04-01 9:09 ` Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 5/5] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
5 siblings, 0 replies; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
ipu6_isys_subdev structure will be shared with ipu7, to avoid confusion
rename it to isys_subdev.
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 4 ++--
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h | 4 +++-
.../media/pci/intel/ipu6/ipu6-isys-subdev.c | 8 ++++----
.../media/pci/intel/ipu6/ipu6-isys-subdev.h | 20 ++-----------------
.../media/pci/intel/ipu6/ipu6-isys-video.c | 6 +++---
.../media/pci/intel/ipu6/ipu6-isys-video.h | 4 ++--
drivers/media/pci/intel/ipu6/isys.h | 14 +++++++++++++
7 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index a59231d81f80..2441f47e8742 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -224,7 +224,7 @@ static int ipu6_isys_csi2_set_stream(struct v4l2_subdev *sd,
const struct ipu6_isys_csi2_timing *timing,
unsigned int nlanes, int enable)
{
- struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
+ struct isys_subdev *asd = to_isys_subdev(sd);
struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd);
struct ipu6_isys *isys = csi2->isys;
struct device *dev = &isys->adev->auxdev.dev;
@@ -339,7 +339,7 @@ static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
u32 pad, u64 streams_mask)
{
- struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
+ struct isys_subdev *asd = to_isys_subdev(sd);
struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd);
struct ipu6_isys_csi2_timing timing = { };
struct v4l2_subdev *remote_sd;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
index 24ed13b4a63f..7deafead66cf 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
@@ -9,6 +9,8 @@
#include "ipu6-isys-subdev.h"
#include "ipu6-isys-video.h"
+#include "isys.h"
+
struct media_entity;
struct v4l2_mbus_frame_desc_entry;
@@ -35,7 +37,7 @@ struct ipu6_isys_stream;
#define CSI2_CSI_RX_DLY_CNT_SETTLE_DLANE_B -2
struct ipu6_isys_csi2 {
- struct ipu6_isys_subdev asd;
+ struct isys_subdev asd;
struct ipu6_isys *isys;
struct ipu6_isys_video av[NR_OF_CSI2_SRC_PADS];
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
index 7c6125dc4af4..020c25925ca0 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
@@ -141,7 +141,7 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format)
{
- struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
+ struct isys_subdev *asd = to_isys_subdev(sd);
struct v4l2_mbus_framefmt *fmt;
struct v4l2_rect *crop;
u32 code = asd->supported_codes[0];
@@ -209,7 +209,7 @@ int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_mbus_code_enum *code)
{
- struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
+ struct isys_subdev *asd = to_isys_subdev(sd);
const u32 *supported_codes = asd->supported_codes;
u32 index;
@@ -265,7 +265,7 @@ static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
.init_state = ipu6_isys_subdev_init_state,
};
-int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,
+int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
const struct v4l2_subdev_ops *ops,
unsigned int nr_ctrls, unsigned int num_sink_pads,
unsigned int num_source_pads)
@@ -326,7 +326,7 @@ int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,
return ret;
}
-void ipu6_isys_subdev_cleanup(struct ipu6_isys_subdev *asd)
+void ipu6_isys_subdev_cleanup(struct isys_subdev *asd)
{
media_entity_cleanup(&asd->sd.entity);
v4l2_ctrl_handler_free(&asd->ctrl_handler);
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
index 544537b4e3db..f3835d873991 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
@@ -4,26 +4,10 @@
#ifndef IPU6_ISYS_SUBDEV_H
#define IPU6_ISYS_SUBDEV_H
-#include <linux/container_of.h>
-
-#include <media/media-entity.h>
-#include <media/v4l2-ctrls.h>
#include <media/v4l2-subdev.h>
#include "isys.h"
-struct ipu6_isys_subdev {
- struct v4l2_subdev sd;
- u32 const *supported_codes;
- struct media_pad *pad;
- struct v4l2_ctrl_handler ctrl_handler;
- void (*ctrl_init)(struct v4l2_subdev *sd);
- int source; /* SSI stream source; -1 if unset */
-};
-
-#define to_ipu6_isys_subdev(__sd) \
- container_of(__sd, struct ipu6_isys_subdev, sd)
-
unsigned int ipu6_isys_mbus_code_to_bpp(u32 code);
unsigned int ipu6_isys_mbus_code_to_mipi(u32 code);
bool ipu6_isys_is_bayer_format(u32 code);
@@ -36,9 +20,9 @@ int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_mbus_code_enum
*code);
-int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,
+int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
const struct v4l2_subdev_ops *ops,
unsigned int nr_ctrls, unsigned int num_sink_pads,
unsigned int num_source_pads);
-void ipu6_isys_subdev_cleanup(struct ipu6_isys_subdev *asd);
+void ipu6_isys_subdev_cleanup(struct isys_subdev *asd);
#endif /* IPU6_ISYS_SUBDEV_H */
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
index 17ae8bb55234..e36a21aa9040 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
@@ -869,7 +869,7 @@ void ipu6_isys_put_stream(struct ipu6_isys_stream *stream)
}
static struct ipu6_isys_stream *
-ipu6_isys_get_stream(struct ipu6_isys_video *av, struct ipu6_isys_subdev *asd)
+ipu6_isys_get_stream(struct ipu6_isys_video *av, struct isys_subdev *asd)
{
struct ipu6_isys_stream *stream = NULL;
struct ipu6_isys *isys = av->isys;
@@ -1174,7 +1174,7 @@ 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 isys_subdev *asd;
struct v4l2_subdev *remote_sd;
struct media_pipeline *pipeline;
struct media_pad *source_pad, *remote_pad;
@@ -1189,7 +1189,7 @@ int ipu6_isys_setup_video(struct ipu6_isys_video *av,
}
remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity);
- asd = to_ipu6_isys_subdev(remote_sd);
+ asd = to_isys_subdev(remote_sd);
source_pad = media_pad_remote_pad_first(&remote_pad->entity->pads[0]);
if (!source_pad) {
dev_dbg(dev, "No external source entity\n");
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
index 0cfea78bbc3c..f4dee6120635 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
@@ -21,7 +21,7 @@
struct file;
struct ipu6_isys;
struct ipu6_isys_csi2;
-struct ipu6_isys_subdev;
+struct isys_subdev;
struct ipu6_isys_pixelformat {
u32 pixelformat;
@@ -55,7 +55,7 @@ struct ipu6_isys_stream {
int stream_source;
int stream_handle;
unsigned int nr_output_pins;
- struct ipu6_isys_subdev *asd;
+ struct isys_subdev *asd;
int nr_queues; /* Number of capture queues */
int nr_streaming;
diff --git a/drivers/media/pci/intel/ipu6/isys.h b/drivers/media/pci/intel/ipu6/isys.h
index d822930e94bb..76f64439952b 100644
--- a/drivers/media/pci/intel/ipu6/isys.h
+++ b/drivers/media/pci/intel/ipu6/isys.h
@@ -4,8 +4,22 @@
#ifndef ISYS_H
#define ISYS_H
+#include <linux/container_of.h>
+
+#include <media/v4l2-ctrls.h>
#include <media/v4l2-subdev.h>
+struct isys_subdev {
+ struct v4l2_subdev sd;
+ u32 const *supported_codes;
+ struct media_pad *pad;
+ struct v4l2_ctrl_handler ctrl_handler;
+ void (*ctrl_init)(struct v4l2_subdev *sd);
+ int source; /* SSI stream source; -1 if unset */
+};
+
+#define to_isys_subdev(__sd) container_of(__sd, struct isys_subdev, sd)
+
int isys_get_stream_pad_fmt(struct v4l2_subdev *sd, u32 pad, u32 stream,
struct v4l2_mbus_framefmt *format);
int isys_get_stream_pad_crop(struct v4l2_subdev *sd, u32 pad, u32 stream,
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/5] media: intel/ipu6: Move isys_subdev functions to common code
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
` (4 preceding siblings ...)
2025-04-01 9:09 ` [PATCH 4/5] media: intel/ipu6: Rename ipu6_isys_subdev Stanislaw Gruszka
@ 2025-04-01 9:09 ` Stanislaw Gruszka
2025-04-08 11:01 ` Sakari Ailus
5 siblings, 1 reply; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:09 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
Move more functions (those that utilize isys_subdev structure internally),
to common code to be shared with ipu7 driver.
Additionally use isd variable name for isys_subdevice, asd name is used
for historical reason - precursor of the drier was atomisp driver, the
variables names stayed unchanged, what is a little confusing.
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 8 +-
.../media/pci/intel/ipu6/ipu6-isys-subdev.c | 179 +-----------------
.../media/pci/intel/ipu6/ipu6-isys-subdev.h | 11 +-
drivers/media/pci/intel/ipu6/isys-subdev.c | 159 ++++++++++++++++
drivers/media/pci/intel/ipu6/isys.h | 9 +
5 files changed, 174 insertions(+), 192 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 2441f47e8742..5c4baaffa092 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -487,7 +487,7 @@ static const struct v4l2_subdev_pad_ops csi2_sd_pad_ops = {
.set_fmt = ipu6_isys_subdev_set_fmt,
.get_selection = ipu6_isys_csi2_get_sel,
.set_selection = ipu6_isys_csi2_set_sel,
- .enum_mbus_code = ipu6_isys_subdev_enum_mbus_code,
+ .enum_mbus_code = isys_subdev_enum_mbus_code,
.set_routing = isys_subdev_set_routing,
.enable_streams = ipu6_isys_csi2_enable_streams,
.disable_streams = ipu6_isys_csi2_disable_streams,
@@ -510,7 +510,7 @@ void ipu6_isys_csi2_cleanup(struct ipu6_isys_csi2 *csi2)
v4l2_device_unregister_subdev(&csi2->asd.sd);
v4l2_subdev_cleanup(&csi2->asd.sd);
- ipu6_isys_subdev_cleanup(&csi2->asd);
+ isys_subdev_cleanup(&csi2->asd);
csi2->isys = NULL;
}
@@ -526,8 +526,8 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
csi2->port = index;
csi2->asd.sd.entity.ops = &csi2_entity_ops;
- ret = ipu6_isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
- NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
+ ret = isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
+ NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
if (ret)
goto fail;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
index 020c25925ca0..655057d54785 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
@@ -141,14 +141,6 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format)
{
- struct isys_subdev *asd = to_isys_subdev(sd);
- struct v4l2_mbus_framefmt *fmt;
- struct v4l2_rect *crop;
- u32 code = asd->supported_codes[0];
- u32 other_pad, other_stream;
- unsigned int i;
- int ret;
-
/* No transcoding, source and sink formats must match. */
if ((sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SOURCE) &&
sd->entity.num_pads > 1)
@@ -160,174 +152,5 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
IPU6_ISYS_MIN_HEIGHT,
IPU6_ISYS_MAX_HEIGHT);
- for (i = 0; asd->supported_codes[i]; i++) {
- if (asd->supported_codes[i] == format->format.code) {
- code = asd->supported_codes[i];
- break;
- }
- }
- format->format.code = code;
- format->format.field = V4L2_FIELD_NONE;
-
- /* Store the format and propagate it to the source pad. */
- fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
- return 0;
-
- /* propagate format to following source pad */
- fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
- format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
- format->pad,
- format->stream,
- &other_pad,
- &other_stream);
- if (ret)
- return -EINVAL;
-
- crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
- /* reset crop */
- crop->left = 0;
- crop->top = 0;
- crop->width = fmt->width;
- crop->height = fmt->height;
-
- return 0;
-}
-
-int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_mbus_code_enum *code)
-{
- struct isys_subdev *asd = to_isys_subdev(sd);
- const u32 *supported_codes = asd->supported_codes;
- u32 index;
-
- for (index = 0; supported_codes[index]; index++) {
- if (index == code->index) {
- code->code = supported_codes[index];
- return 0;
- }
- }
-
- return -EINVAL;
-}
-
-static int subdev_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_krouting *routing)
-{
- static const struct v4l2_mbus_framefmt format = {
- .width = 4096,
- .height = 3072,
- .code = MEDIA_BUS_FMT_SGRBG10_1X10,
- .field = V4L2_FIELD_NONE,
- };
- int ret;
-
- ret = v4l2_subdev_routing_validate(sd, routing,
- V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
- if (ret)
- return ret;
-
- return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
-}
-
-static int ipu6_isys_subdev_init_state(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state)
-{
- struct v4l2_subdev_route route = {
- .sink_pad = 0,
- .sink_stream = 0,
- .source_pad = 1,
- .source_stream = 0,
- .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
- };
- struct v4l2_subdev_krouting routing = {
- .num_routes = 1,
- .routes = &route,
- };
-
- return subdev_set_routing(sd, state, &routing);
-}
-
-static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
- .init_state = ipu6_isys_subdev_init_state,
-};
-
-int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
- const struct v4l2_subdev_ops *ops,
- unsigned int nr_ctrls, unsigned int num_sink_pads,
- unsigned int num_source_pads)
-{
- unsigned int num_pads = num_sink_pads + num_source_pads;
- unsigned int i;
- int ret;
-
- v4l2_subdev_init(&asd->sd, ops);
-
- asd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
- V4L2_SUBDEV_FL_HAS_EVENTS |
- V4L2_SUBDEV_FL_STREAMS;
- asd->sd.owner = THIS_MODULE;
- asd->sd.dev = dev;
- asd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
- asd->sd.internal_ops = &ipu6_isys_subdev_internal_ops;
-
- asd->pad = devm_kcalloc(dev, num_pads, sizeof(*asd->pad), GFP_KERNEL);
- if (!asd->pad)
- return -ENOMEM;
-
- for (i = 0; i < num_sink_pads; i++)
- asd->pad[i].flags = MEDIA_PAD_FL_SINK |
- MEDIA_PAD_FL_MUST_CONNECT;
-
- for (i = num_sink_pads; i < num_pads; i++)
- asd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
-
- ret = media_entity_pads_init(&asd->sd.entity, num_pads, asd->pad);
- if (ret)
- return ret;
-
- if (asd->ctrl_init) {
- ret = v4l2_ctrl_handler_init(&asd->ctrl_handler, nr_ctrls);
- if (ret)
- goto out_media_entity_cleanup;
-
- asd->ctrl_init(&asd->sd);
- if (asd->ctrl_handler.error) {
- ret = asd->ctrl_handler.error;
- goto out_v4l2_ctrl_handler_free;
- }
-
- asd->sd.ctrl_handler = &asd->ctrl_handler;
- }
-
- asd->source = -1;
-
- return 0;
-
-out_v4l2_ctrl_handler_free:
- v4l2_ctrl_handler_free(&asd->ctrl_handler);
-
-out_media_entity_cleanup:
- media_entity_cleanup(&asd->sd.entity);
-
- return ret;
-}
-
-void ipu6_isys_subdev_cleanup(struct isys_subdev *asd)
-{
- media_entity_cleanup(&asd->sd.entity);
- v4l2_ctrl_handler_free(&asd->ctrl_handler);
+ return isys_subdev_set_fmt(sd, state, format);
}
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
index f3835d873991..e8d1ff181a9d 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-/* Copyright (C) 2013--2024 Intel Corporation */
+/* Copyright (C) 2013-2025 Intel Corporation */
#ifndef IPU6_ISYS_SUBDEV_H
#define IPU6_ISYS_SUBDEV_H
@@ -16,13 +16,4 @@ u32 ipu6_isys_convert_bayer_order(u32 code, int x, int y);
int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *fmt);
-int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_mbus_code_enum
- *code);
-int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
- const struct v4l2_subdev_ops *ops,
- unsigned int nr_ctrls, unsigned int num_sink_pads,
- unsigned int num_source_pads);
-void ipu6_isys_subdev_cleanup(struct isys_subdev *asd);
#endif /* IPU6_ISYS_SUBDEV_H */
diff --git a/drivers/media/pci/intel/ipu6/isys-subdev.c b/drivers/media/pci/intel/ipu6/isys-subdev.c
index 483d718f2ea4..7635d768067f 100644
--- a/drivers/media/pci/intel/ipu6/isys-subdev.c
+++ b/drivers/media/pci/intel/ipu6/isys-subdev.c
@@ -92,3 +92,162 @@ int isys_subdev_set_routing(struct v4l2_subdev *sd,
{
return subdev_set_routing(sd, state, routing);
}
+
+int isys_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
+ struct v4l2_subdev_format *format)
+{
+ struct isys_subdev *isd = to_isys_subdev(sd);
+ struct v4l2_mbus_framefmt *fmt;
+ struct v4l2_rect *crop;
+ u32 code = isd->supported_codes[0];
+ u32 other_pad, other_stream;
+ unsigned int i;
+ int ret;
+
+ for (i = 0; isd->supported_codes[i]; i++) {
+ if (isd->supported_codes[i] == format->format.code) {
+ code = isd->supported_codes[i];
+ break;
+ }
+ }
+ format->format.code = code;
+ format->format.field = V4L2_FIELD_NONE;
+
+ /* Store the format and propagate it to the source pad. */
+ fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
+ return 0;
+
+ /* propagate format to following source pad */
+ fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
+ format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
+ format->pad, format->stream,
+ &other_pad, &other_stream);
+ if (ret)
+ return -EINVAL;
+
+ crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
+ /* reset crop */
+ crop->left = 0;
+ crop->top = 0;
+ crop->width = fmt->width;
+ crop->height = fmt->height;
+
+ return 0;
+}
+
+int isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_mbus_code_enum *code)
+{
+ struct isys_subdev *isd = to_isys_subdev(sd);
+ const u32 *supported_codes = isd->supported_codes;
+ u32 index;
+
+ for (index = 0; supported_codes[index]; index++) {
+ if (index == code->index) {
+ code->code = supported_codes[index];
+ return 0;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static int isys_subdev_init_state(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state)
+{
+ struct v4l2_subdev_route route = {
+ .sink_pad = 0,
+ .sink_stream = 0,
+ .source_pad = 1,
+ .source_stream = 0,
+ .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
+ };
+ struct v4l2_subdev_krouting routing = {
+ .num_routes = 1,
+ .routes = &route,
+ };
+
+ return subdev_set_routing(sd, state, &routing);
+}
+
+static const struct v4l2_subdev_internal_ops isys_subdev_internal_ops = {
+ .init_state = isys_subdev_init_state,
+};
+
+int isys_subdev_init(struct isys_subdev *isd, struct device *dev,
+ const struct v4l2_subdev_ops *ops, unsigned int nr_ctrls,
+ unsigned int num_sink_pads, unsigned int num_source_pads)
+{
+ unsigned int num_pads = num_sink_pads + num_source_pads;
+ unsigned int i;
+ int ret;
+
+ v4l2_subdev_init(&isd->sd, ops);
+
+ isd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+ V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_STREAMS;
+ isd->sd.owner = THIS_MODULE;
+ isd->sd.dev = dev;
+ isd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
+ isd->sd.internal_ops = &isys_subdev_internal_ops;
+
+ isd->pad = devm_kcalloc(dev, num_pads, sizeof(*isd->pad), GFP_KERNEL);
+ if (!isd->pad)
+ return -ENOMEM;
+
+ for (i = 0; i < num_sink_pads; i++)
+ isd->pad[i].flags = MEDIA_PAD_FL_SINK |
+ MEDIA_PAD_FL_MUST_CONNECT;
+
+ for (i = num_sink_pads; i < num_pads; i++)
+ isd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
+
+ ret = media_entity_pads_init(&isd->sd.entity, num_pads, isd->pad);
+ if (ret)
+ return ret;
+
+ if (isd->ctrl_init) {
+ ret = v4l2_ctrl_handler_init(&isd->ctrl_handler, nr_ctrls);
+ if (ret)
+ goto out_media_entity_cleanup;
+
+ isd->ctrl_init(&isd->sd);
+ if (isd->ctrl_handler.error) {
+ ret = isd->ctrl_handler.error;
+ goto out_v4l2_ctrl_handler_free;
+ }
+
+ isd->sd.ctrl_handler = &isd->ctrl_handler;
+ }
+
+ isd->source = -1;
+
+ return 0;
+
+out_v4l2_ctrl_handler_free:
+ v4l2_ctrl_handler_free(&isd->ctrl_handler);
+
+out_media_entity_cleanup:
+ media_entity_cleanup(&isd->sd.entity);
+
+ return ret;
+}
+
+void isys_subdev_cleanup(struct isys_subdev *isd)
+{
+ media_entity_cleanup(&isd->sd.entity);
+ v4l2_ctrl_handler_free(&isd->ctrl_handler);
+}
diff --git a/drivers/media/pci/intel/ipu6/isys.h b/drivers/media/pci/intel/ipu6/isys.h
index 76f64439952b..4bde32f6d767 100644
--- a/drivers/media/pci/intel/ipu6/isys.h
+++ b/drivers/media/pci/intel/ipu6/isys.h
@@ -30,4 +30,13 @@ int isys_subdev_set_routing(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
enum v4l2_subdev_format_whence which,
struct v4l2_subdev_krouting *routing);
+int isys_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
+ struct v4l2_subdev_format *format);
+int isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ struct v4l2_subdev_mbus_code_enum *code);
+int isys_subdev_init(struct isys_subdev *asd, struct device *dev,
+ const struct v4l2_subdev_ops *ops, unsigned int nr_ctrls,
+ unsigned int num_sink_pads, unsigned int num_source_pads);
+void isys_subdev_cleanup(struct isys_subdev *asd);
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] media: intel/ipu6: Move isys_subdev functions to common code
2025-04-01 9:09 ` [PATCH] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
@ 2025-04-01 9:37 ` Stanislaw Gruszka
0 siblings, 0 replies; 9+ messages in thread
From: Stanislaw Gruszka @ 2025-04-01 9:37 UTC (permalink / raw)
To: linux-media; +Cc: Sakari Ailus, Bingbu Cao
This one should be dropped from the set. Send accidentally.
Sorry about that.
Regards
Stanislaw
On Tue, Apr 01, 2025 at 11:09:48AM +0200, Stanislaw Gruszka wrote:
> Move more functions (those that utilize isys_subdev structure internally),
> to common code to be shared with ipu7 driver.
>
> Additionally use isd variable name for isys_subdevice, asd name is used
> for historical reason - precursor of the drier was atomisp driver, the
> variables names stayed unchanged, what is a little confusing.
>
> Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
> ---
> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 8 +-
> .../media/pci/intel/ipu6/ipu6-isys-subdev.c | 179 +-----------------
> .../media/pci/intel/ipu6/ipu6-isys-subdev.h | 11 +-
> drivers/media/pci/intel/ipu6/isys-subdev.c | 159 ++++++++++++++++
> drivers/media/pci/intel/ipu6/isys.h | 9 +
> 5 files changed, 174 insertions(+), 192 deletions(-)
>
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> index 2441f47e8742..5c4baaffa092 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> @@ -487,7 +487,7 @@ static const struct v4l2_subdev_pad_ops csi2_sd_pad_ops = {
> .set_fmt = ipu6_isys_subdev_set_fmt,
> .get_selection = ipu6_isys_csi2_get_sel,
> .set_selection = ipu6_isys_csi2_set_sel,
> - .enum_mbus_code = ipu6_isys_subdev_enum_mbus_code,
> + .enum_mbus_code = isys_subdev_enum_mbus_code,
> .set_routing = isys_subdev_set_routing,
> .enable_streams = ipu6_isys_csi2_enable_streams,
> .disable_streams = ipu6_isys_csi2_disable_streams,
> @@ -510,7 +510,7 @@ void ipu6_isys_csi2_cleanup(struct ipu6_isys_csi2 *csi2)
>
> v4l2_device_unregister_subdev(&csi2->asd.sd);
> v4l2_subdev_cleanup(&csi2->asd.sd);
> - ipu6_isys_subdev_cleanup(&csi2->asd);
> + isys_subdev_cleanup(&csi2->asd);
> csi2->isys = NULL;
> }
>
> @@ -526,8 +526,8 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
> csi2->port = index;
>
> csi2->asd.sd.entity.ops = &csi2_entity_ops;
> - ret = ipu6_isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
> - NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
> + ret = isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
> + NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
> if (ret)
> goto fail;
>
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> index 020c25925ca0..655057d54785 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> @@ -141,14 +141,6 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
> struct v4l2_subdev_state *state,
> struct v4l2_subdev_format *format)
> {
> - struct isys_subdev *asd = to_isys_subdev(sd);
> - struct v4l2_mbus_framefmt *fmt;
> - struct v4l2_rect *crop;
> - u32 code = asd->supported_codes[0];
> - u32 other_pad, other_stream;
> - unsigned int i;
> - int ret;
> -
> /* No transcoding, source and sink formats must match. */
> if ((sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SOURCE) &&
> sd->entity.num_pads > 1)
> @@ -160,174 +152,5 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
> IPU6_ISYS_MIN_HEIGHT,
> IPU6_ISYS_MAX_HEIGHT);
>
> - for (i = 0; asd->supported_codes[i]; i++) {
> - if (asd->supported_codes[i] == format->format.code) {
> - code = asd->supported_codes[i];
> - break;
> - }
> - }
> - format->format.code = code;
> - format->format.field = V4L2_FIELD_NONE;
> -
> - /* Store the format and propagate it to the source pad. */
> - fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
> - if (!fmt)
> - return -EINVAL;
> -
> - *fmt = format->format;
> -
> - if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
> - return 0;
> -
> - /* propagate format to following source pad */
> - fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
> - format->stream);
> - if (!fmt)
> - return -EINVAL;
> -
> - *fmt = format->format;
> -
> - ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
> - format->pad,
> - format->stream,
> - &other_pad,
> - &other_stream);
> - if (ret)
> - return -EINVAL;
> -
> - crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
> - /* reset crop */
> - crop->left = 0;
> - crop->top = 0;
> - crop->width = fmt->width;
> - crop->height = fmt->height;
> -
> - return 0;
> -}
> -
> -int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state,
> - struct v4l2_subdev_mbus_code_enum *code)
> -{
> - struct isys_subdev *asd = to_isys_subdev(sd);
> - const u32 *supported_codes = asd->supported_codes;
> - u32 index;
> -
> - for (index = 0; supported_codes[index]; index++) {
> - if (index == code->index) {
> - code->code = supported_codes[index];
> - return 0;
> - }
> - }
> -
> - return -EINVAL;
> -}
> -
> -static int subdev_set_routing(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state,
> - struct v4l2_subdev_krouting *routing)
> -{
> - static const struct v4l2_mbus_framefmt format = {
> - .width = 4096,
> - .height = 3072,
> - .code = MEDIA_BUS_FMT_SGRBG10_1X10,
> - .field = V4L2_FIELD_NONE,
> - };
> - int ret;
> -
> - ret = v4l2_subdev_routing_validate(sd, routing,
> - V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
> - if (ret)
> - return ret;
> -
> - return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
> -}
> -
> -static int ipu6_isys_subdev_init_state(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state)
> -{
> - struct v4l2_subdev_route route = {
> - .sink_pad = 0,
> - .sink_stream = 0,
> - .source_pad = 1,
> - .source_stream = 0,
> - .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
> - };
> - struct v4l2_subdev_krouting routing = {
> - .num_routes = 1,
> - .routes = &route,
> - };
> -
> - return subdev_set_routing(sd, state, &routing);
> -}
> -
> -static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
> - .init_state = ipu6_isys_subdev_init_state,
> -};
> -
> -int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
> - const struct v4l2_subdev_ops *ops,
> - unsigned int nr_ctrls, unsigned int num_sink_pads,
> - unsigned int num_source_pads)
> -{
> - unsigned int num_pads = num_sink_pads + num_source_pads;
> - unsigned int i;
> - int ret;
> -
> - v4l2_subdev_init(&asd->sd, ops);
> -
> - asd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
> - V4L2_SUBDEV_FL_HAS_EVENTS |
> - V4L2_SUBDEV_FL_STREAMS;
> - asd->sd.owner = THIS_MODULE;
> - asd->sd.dev = dev;
> - asd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> - asd->sd.internal_ops = &ipu6_isys_subdev_internal_ops;
> -
> - asd->pad = devm_kcalloc(dev, num_pads, sizeof(*asd->pad), GFP_KERNEL);
> - if (!asd->pad)
> - return -ENOMEM;
> -
> - for (i = 0; i < num_sink_pads; i++)
> - asd->pad[i].flags = MEDIA_PAD_FL_SINK |
> - MEDIA_PAD_FL_MUST_CONNECT;
> -
> - for (i = num_sink_pads; i < num_pads; i++)
> - asd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
> -
> - ret = media_entity_pads_init(&asd->sd.entity, num_pads, asd->pad);
> - if (ret)
> - return ret;
> -
> - if (asd->ctrl_init) {
> - ret = v4l2_ctrl_handler_init(&asd->ctrl_handler, nr_ctrls);
> - if (ret)
> - goto out_media_entity_cleanup;
> -
> - asd->ctrl_init(&asd->sd);
> - if (asd->ctrl_handler.error) {
> - ret = asd->ctrl_handler.error;
> - goto out_v4l2_ctrl_handler_free;
> - }
> -
> - asd->sd.ctrl_handler = &asd->ctrl_handler;
> - }
> -
> - asd->source = -1;
> -
> - return 0;
> -
> -out_v4l2_ctrl_handler_free:
> - v4l2_ctrl_handler_free(&asd->ctrl_handler);
> -
> -out_media_entity_cleanup:
> - media_entity_cleanup(&asd->sd.entity);
> -
> - return ret;
> -}
> -
> -void ipu6_isys_subdev_cleanup(struct isys_subdev *asd)
> -{
> - media_entity_cleanup(&asd->sd.entity);
> - v4l2_ctrl_handler_free(&asd->ctrl_handler);
> + return isys_subdev_set_fmt(sd, state, format);
> }
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> index f3835d873991..e8d1ff181a9d 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> @@ -1,5 +1,5 @@
> /* SPDX-License-Identifier: GPL-2.0-only */
> -/* Copyright (C) 2013--2024 Intel Corporation */
> +/* Copyright (C) 2013-2025 Intel Corporation */
>
> #ifndef IPU6_ISYS_SUBDEV_H
> #define IPU6_ISYS_SUBDEV_H
> @@ -16,13 +16,4 @@ u32 ipu6_isys_convert_bayer_order(u32 code, int x, int y);
> int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
> struct v4l2_subdev_state *state,
> struct v4l2_subdev_format *fmt);
> -int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state,
> - struct v4l2_subdev_mbus_code_enum
> - *code);
> -int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
> - const struct v4l2_subdev_ops *ops,
> - unsigned int nr_ctrls, unsigned int num_sink_pads,
> - unsigned int num_source_pads);
> -void ipu6_isys_subdev_cleanup(struct isys_subdev *asd);
> #endif /* IPU6_ISYS_SUBDEV_H */
> diff --git a/drivers/media/pci/intel/ipu6/isys-subdev.c b/drivers/media/pci/intel/ipu6/isys-subdev.c
> index 483d718f2ea4..7635d768067f 100644
> --- a/drivers/media/pci/intel/ipu6/isys-subdev.c
> +++ b/drivers/media/pci/intel/ipu6/isys-subdev.c
> @@ -92,3 +92,162 @@ int isys_subdev_set_routing(struct v4l2_subdev *sd,
> {
> return subdev_set_routing(sd, state, routing);
> }
> +
> +int isys_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
> + struct v4l2_subdev_format *format)
> +{
> + struct isys_subdev *isd = to_isys_subdev(sd);
> + struct v4l2_mbus_framefmt *fmt;
> + struct v4l2_rect *crop;
> + u32 code = isd->supported_codes[0];
> + u32 other_pad, other_stream;
> + unsigned int i;
> + int ret;
> +
> + for (i = 0; isd->supported_codes[i]; i++) {
> + if (isd->supported_codes[i] == format->format.code) {
> + code = isd->supported_codes[i];
> + break;
> + }
> + }
> + format->format.code = code;
> + format->format.field = V4L2_FIELD_NONE;
> +
> + /* Store the format and propagate it to the source pad. */
> + fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
> + if (!fmt)
> + return -EINVAL;
> +
> + *fmt = format->format;
> +
> + if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
> + return 0;
> +
> + /* propagate format to following source pad */
> + fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
> + format->stream);
> + if (!fmt)
> + return -EINVAL;
> +
> + *fmt = format->format;
> +
> + ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
> + format->pad, format->stream,
> + &other_pad, &other_stream);
> + if (ret)
> + return -EINVAL;
> +
> + crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
> + /* reset crop */
> + crop->left = 0;
> + crop->top = 0;
> + crop->width = fmt->width;
> + crop->height = fmt->height;
> +
> + return 0;
> +}
> +
> +int isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
> + struct v4l2_subdev_state *state,
> + struct v4l2_subdev_mbus_code_enum *code)
> +{
> + struct isys_subdev *isd = to_isys_subdev(sd);
> + const u32 *supported_codes = isd->supported_codes;
> + u32 index;
> +
> + for (index = 0; supported_codes[index]; index++) {
> + if (index == code->index) {
> + code->code = supported_codes[index];
> + return 0;
> + }
> + }
> +
> + return -EINVAL;
> +}
> +
> +static int isys_subdev_init_state(struct v4l2_subdev *sd,
> + struct v4l2_subdev_state *state)
> +{
> + struct v4l2_subdev_route route = {
> + .sink_pad = 0,
> + .sink_stream = 0,
> + .source_pad = 1,
> + .source_stream = 0,
> + .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
> + };
> + struct v4l2_subdev_krouting routing = {
> + .num_routes = 1,
> + .routes = &route,
> + };
> +
> + return subdev_set_routing(sd, state, &routing);
> +}
> +
> +static const struct v4l2_subdev_internal_ops isys_subdev_internal_ops = {
> + .init_state = isys_subdev_init_state,
> +};
> +
> +int isys_subdev_init(struct isys_subdev *isd, struct device *dev,
> + const struct v4l2_subdev_ops *ops, unsigned int nr_ctrls,
> + unsigned int num_sink_pads, unsigned int num_source_pads)
> +{
> + unsigned int num_pads = num_sink_pads + num_source_pads;
> + unsigned int i;
> + int ret;
> +
> + v4l2_subdev_init(&isd->sd, ops);
> +
> + isd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
> + V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_STREAMS;
> + isd->sd.owner = THIS_MODULE;
> + isd->sd.dev = dev;
> + isd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> + isd->sd.internal_ops = &isys_subdev_internal_ops;
> +
> + isd->pad = devm_kcalloc(dev, num_pads, sizeof(*isd->pad), GFP_KERNEL);
> + if (!isd->pad)
> + return -ENOMEM;
> +
> + for (i = 0; i < num_sink_pads; i++)
> + isd->pad[i].flags = MEDIA_PAD_FL_SINK |
> + MEDIA_PAD_FL_MUST_CONNECT;
> +
> + for (i = num_sink_pads; i < num_pads; i++)
> + isd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
> +
> + ret = media_entity_pads_init(&isd->sd.entity, num_pads, isd->pad);
> + if (ret)
> + return ret;
> +
> + if (isd->ctrl_init) {
> + ret = v4l2_ctrl_handler_init(&isd->ctrl_handler, nr_ctrls);
> + if (ret)
> + goto out_media_entity_cleanup;
> +
> + isd->ctrl_init(&isd->sd);
> + if (isd->ctrl_handler.error) {
> + ret = isd->ctrl_handler.error;
> + goto out_v4l2_ctrl_handler_free;
> + }
> +
> + isd->sd.ctrl_handler = &isd->ctrl_handler;
> + }
> +
> + isd->source = -1;
> +
> + return 0;
> +
> +out_v4l2_ctrl_handler_free:
> + v4l2_ctrl_handler_free(&isd->ctrl_handler);
> +
> +out_media_entity_cleanup:
> + media_entity_cleanup(&isd->sd.entity);
> +
> + return ret;
> +}
> +
> +void isys_subdev_cleanup(struct isys_subdev *isd)
> +{
> + media_entity_cleanup(&isd->sd.entity);
> + v4l2_ctrl_handler_free(&isd->ctrl_handler);
> +}
> diff --git a/drivers/media/pci/intel/ipu6/isys.h b/drivers/media/pci/intel/ipu6/isys.h
> index 76f64439952b..4bde32f6d767 100644
> --- a/drivers/media/pci/intel/ipu6/isys.h
> +++ b/drivers/media/pci/intel/ipu6/isys.h
> @@ -30,4 +30,13 @@ int isys_subdev_set_routing(struct v4l2_subdev *sd,
> struct v4l2_subdev_state *state,
> enum v4l2_subdev_format_whence which,
> struct v4l2_subdev_krouting *routing);
> +int isys_subdev_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
> + struct v4l2_subdev_format *format);
> +int isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
> + struct v4l2_subdev_state *state,
> + struct v4l2_subdev_mbus_code_enum *code);
> +int isys_subdev_init(struct isys_subdev *asd, struct device *dev,
> + const struct v4l2_subdev_ops *ops, unsigned int nr_ctrls,
> + unsigned int num_sink_pads, unsigned int num_source_pads);
> +void isys_subdev_cleanup(struct isys_subdev *asd);
> #endif
> --
> 2.34.1
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 5/5] media: intel/ipu6: Move isys_subdev functions to common code
2025-04-01 9:09 ` [PATCH 5/5] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
@ 2025-04-08 11:01 ` Sakari Ailus
0 siblings, 0 replies; 9+ messages in thread
From: Sakari Ailus @ 2025-04-08 11:01 UTC (permalink / raw)
To: Stanislaw Gruszka; +Cc: linux-media, Bingbu Cao
Hi Stanislaw,
On Tue, Apr 01, 2025 at 11:09:53AM +0200, Stanislaw Gruszka wrote:
> Move more functions (those that utilize isys_subdev structure internally),
> to common code to be shared with ipu7 driver.
>
> Additionally use isd variable name for isys_subdevice, asd name is used
> for historical reason - precursor of the drier was atomisp driver, the
> variables names stayed unchanged, what is a little confusing.
>
> Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
> ---
> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 8 +-
> .../media/pci/intel/ipu6/ipu6-isys-subdev.c | 179 +-----------------
> .../media/pci/intel/ipu6/ipu6-isys-subdev.h | 11 +-
> drivers/media/pci/intel/ipu6/isys-subdev.c | 159 ++++++++++++++++
> drivers/media/pci/intel/ipu6/isys.h | 9 +
> 5 files changed, 174 insertions(+), 192 deletions(-)
>
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> index 2441f47e8742..5c4baaffa092 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> @@ -487,7 +487,7 @@ static const struct v4l2_subdev_pad_ops csi2_sd_pad_ops = {
> .set_fmt = ipu6_isys_subdev_set_fmt,
> .get_selection = ipu6_isys_csi2_get_sel,
> .set_selection = ipu6_isys_csi2_set_sel,
> - .enum_mbus_code = ipu6_isys_subdev_enum_mbus_code,
> + .enum_mbus_code = isys_subdev_enum_mbus_code,
Regarding naming -- could you keep the ipu prefix here and elsewhere?
It'll be probably easiest to use git format-patch and then:
$ perl -i -pe 's/([^_])(isys_subdev)/$1ipu_$2/g' patches_here
> .set_routing = isys_subdev_set_routing,
> .enable_streams = ipu6_isys_csi2_enable_streams,
> .disable_streams = ipu6_isys_csi2_disable_streams,
> @@ -510,7 +510,7 @@ void ipu6_isys_csi2_cleanup(struct ipu6_isys_csi2 *csi2)
>
> v4l2_device_unregister_subdev(&csi2->asd.sd);
> v4l2_subdev_cleanup(&csi2->asd.sd);
> - ipu6_isys_subdev_cleanup(&csi2->asd);
> + isys_subdev_cleanup(&csi2->asd);
> csi2->isys = NULL;
> }
>
> @@ -526,8 +526,8 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
> csi2->port = index;
>
> csi2->asd.sd.entity.ops = &csi2_entity_ops;
> - ret = ipu6_isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
> - NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
> + ret = isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
> + NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
> if (ret)
> goto fail;
>
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> index 020c25925ca0..655057d54785 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> @@ -141,14 +141,6 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
> struct v4l2_subdev_state *state,
> struct v4l2_subdev_format *format)
> {
> - struct isys_subdev *asd = to_isys_subdev(sd);
> - struct v4l2_mbus_framefmt *fmt;
> - struct v4l2_rect *crop;
> - u32 code = asd->supported_codes[0];
> - u32 other_pad, other_stream;
> - unsigned int i;
> - int ret;
> -
> /* No transcoding, source and sink formats must match. */
> if ((sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SOURCE) &&
> sd->entity.num_pads > 1)
> @@ -160,174 +152,5 @@ int ipu6_isys_subdev_set_fmt(struct v4l2_subdev *sd,
> IPU6_ISYS_MIN_HEIGHT,
> IPU6_ISYS_MAX_HEIGHT);
>
> - for (i = 0; asd->supported_codes[i]; i++) {
> - if (asd->supported_codes[i] == format->format.code) {
> - code = asd->supported_codes[i];
> - break;
> - }
> - }
> - format->format.code = code;
> - format->format.field = V4L2_FIELD_NONE;
> -
> - /* Store the format and propagate it to the source pad. */
> - fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
> - if (!fmt)
> - return -EINVAL;
> -
> - *fmt = format->format;
> -
> - if (!(sd->entity.pads[format->pad].flags & MEDIA_PAD_FL_SINK))
> - return 0;
> -
> - /* propagate format to following source pad */
> - fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
> - format->stream);
> - if (!fmt)
> - return -EINVAL;
> -
> - *fmt = format->format;
> -
> - ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
> - format->pad,
> - format->stream,
> - &other_pad,
> - &other_stream);
> - if (ret)
> - return -EINVAL;
> -
> - crop = v4l2_subdev_state_get_crop(state, other_pad, other_stream);
> - /* reset crop */
> - crop->left = 0;
> - crop->top = 0;
> - crop->width = fmt->width;
> - crop->height = fmt->height;
> -
> - return 0;
> -}
> -
> -int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state,
> - struct v4l2_subdev_mbus_code_enum *code)
> -{
> - struct isys_subdev *asd = to_isys_subdev(sd);
> - const u32 *supported_codes = asd->supported_codes;
> - u32 index;
> -
> - for (index = 0; supported_codes[index]; index++) {
> - if (index == code->index) {
> - code->code = supported_codes[index];
> - return 0;
> - }
> - }
> -
> - return -EINVAL;
> -}
> -
> -static int subdev_set_routing(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state,
> - struct v4l2_subdev_krouting *routing)
> -{
> - static const struct v4l2_mbus_framefmt format = {
> - .width = 4096,
> - .height = 3072,
> - .code = MEDIA_BUS_FMT_SGRBG10_1X10,
> - .field = V4L2_FIELD_NONE,
> - };
> - int ret;
> -
> - ret = v4l2_subdev_routing_validate(sd, routing,
> - V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
> - if (ret)
> - return ret;
> -
> - return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
> -}
> -
> -static int ipu6_isys_subdev_init_state(struct v4l2_subdev *sd,
> - struct v4l2_subdev_state *state)
> -{
> - struct v4l2_subdev_route route = {
> - .sink_pad = 0,
> - .sink_stream = 0,
> - .source_pad = 1,
> - .source_stream = 0,
> - .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
> - };
> - struct v4l2_subdev_krouting routing = {
> - .num_routes = 1,
> - .routes = &route,
> - };
> -
> - return subdev_set_routing(sd, state, &routing);
> -}
> -
> -static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
> - .init_state = ipu6_isys_subdev_init_state,
> -};
> -
> -int ipu6_isys_subdev_init(struct isys_subdev *asd, struct device *dev,
> - const struct v4l2_subdev_ops *ops,
> - unsigned int nr_ctrls, unsigned int num_sink_pads,
> - unsigned int num_source_pads)
> -{
> - unsigned int num_pads = num_sink_pads + num_source_pads;
> - unsigned int i;
> - int ret;
> -
> - v4l2_subdev_init(&asd->sd, ops);
> -
> - asd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
> - V4L2_SUBDEV_FL_HAS_EVENTS |
> - V4L2_SUBDEV_FL_STREAMS;
> - asd->sd.owner = THIS_MODULE;
> - asd->sd.dev = dev;
> - asd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> - asd->sd.internal_ops = &ipu6_isys_subdev_internal_ops;
> -
> - asd->pad = devm_kcalloc(dev, num_pads, sizeof(*asd->pad), GFP_KERNEL);
> - if (!asd->pad)
> - return -ENOMEM;
> -
> - for (i = 0; i < num_sink_pads; i++)
> - asd->pad[i].flags = MEDIA_PAD_FL_SINK |
> - MEDIA_PAD_FL_MUST_CONNECT;
> -
> - for (i = num_sink_pads; i < num_pads; i++)
> - asd->pad[i].flags = MEDIA_PAD_FL_SOURCE;
> -
> - ret = media_entity_pads_init(&asd->sd.entity, num_pads, asd->pad);
> - if (ret)
> - return ret;
> -
> - if (asd->ctrl_init) {
> - ret = v4l2_ctrl_handler_init(&asd->ctrl_handler, nr_ctrls);
> - if (ret)
> - goto out_media_entity_cleanup;
> -
> - asd->ctrl_init(&asd->sd);
> - if (asd->ctrl_handler.error) {
> - ret = asd->ctrl_handler.error;
> - goto out_v4l2_ctrl_handler_free;
> - }
> -
> - asd->sd.ctrl_handler = &asd->ctrl_handler;
> - }
> -
> - asd->source = -1;
> -
> - return 0;
> -
> -out_v4l2_ctrl_handler_free:
> - v4l2_ctrl_handler_free(&asd->ctrl_handler);
> -
> -out_media_entity_cleanup:
> - media_entity_cleanup(&asd->sd.entity);
> -
> - return ret;
> -}
> -
> -void ipu6_isys_subdev_cleanup(struct isys_subdev *asd)
> -{
> - media_entity_cleanup(&asd->sd.entity);
> - v4l2_ctrl_handler_free(&asd->ctrl_handler);
> + return isys_subdev_set_fmt(sd, state, format);
> }
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> index f3835d873991..e8d1ff181a9d 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> @@ -1,5 +1,5 @@
> /* SPDX-License-Identifier: GPL-2.0-only */
> -/* Copyright (C) 2013--2024 Intel Corporation */
> +/* Copyright (C) 2013-2025 Intel Corporation */
It was an en dash! :-o
--
Kind regards,
Sakari Ailus
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-04-08 11:01 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-01 9:09 [PATCH 0/5] media: intel/ipu6: initial ipu7 code sharing preparation Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
2025-04-01 9:37 ` Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 1/5] media: intel/ipu6: Separate ipu6 subdev functions Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 2/5] media: intel/ipu6: Remove ipu6_isys dependency from ipu6_isys_subdev Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 3/5] media: intel/ipu6: Remove redundant ipu6_isys_subdev_to_csi2 macro Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 4/5] media: intel/ipu6: Rename ipu6_isys_subdev Stanislaw Gruszka
2025-04-01 9:09 ` [PATCH 5/5] media: intel/ipu6: Move isys_subdev functions to common code Stanislaw Gruszka
2025-04-08 11:01 ` Sakari Ailus
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox