From 67fde0ee8dce630eac0a89f7b5db6a18270328ea Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Fri, 23 Jan 2026 03:31:31 +0800 Subject: [PATCH] ipu7: isys: Acquire phy port number and link frequency from ext subdev --- ...ipu7-isys-csi2-get-link-frequency-fr.patch | 53 +++++++++ ...ipu7-get-source-pad-according-to-csi.patch | 103 ++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 patch/v6.17_iot/0022-media-pci-intel-ipu7-isys-csi2-get-link-frequency-fr.patch create mode 100644 patch/v6.17_iot/0023-media-pci-intel-ipu7-get-source-pad-according-to-csi.patch diff --git a/patch/v6.17_iot/0022-media-pci-intel-ipu7-isys-csi2-get-link-frequency-fr.patch b/patch/v6.17_iot/0022-media-pci-intel-ipu7-isys-csi2-get-link-frequency-fr.patch new file mode 100644 index 0000000..d866631 --- /dev/null +++ b/patch/v6.17_iot/0022-media-pci-intel-ipu7-isys-csi2-get-link-frequency-fr.patch @@ -0,0 +1,53 @@ +From 000be1f9a6b1178fbf711607735c2a440f7528df Mon Sep 17 00:00:00 2001 +From: "Yew, Chang Ching" +Date: Thu, 22 Jan 2026 08:05:37 +0800 +Subject: [PATCH 07/11] media: pci: intel: ipu7-isys-csi2: get link frequency + from pad + +In case driver does not have v4l2-control that stores link frequency, +try to retrieve link frequency from pad + +Signed-off-by: Yew, Chang Ching +--- + drivers/staging/media/ipu7/ipu7-isys-csi2.c | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/media/ipu7/ipu7-isys-csi2.c b/drivers/staging/media/ipu7/ipu7-isys-csi2.c +index 9c16ae9a0e5bd..60e7856a5e2f9 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys-csi2.c ++++ b/drivers/staging/media/ipu7/ipu7-isys-csi2.c +@@ -51,6 +51,9 @@ static const u32 csi2_supported_codes[] = { + s64 ipu7_isys_csi2_get_link_freq(struct ipu7_isys_csi2 *csi2) + { + struct media_pad *src_pad; ++ struct v4l2_subdev *ext_sd; ++ struct device *dev; ++ s64 ret; + + src_pad = media_entity_remote_source_pad_unique(&csi2->asd.sd.entity); + if (IS_ERR(src_pad)) { +@@ -60,7 +63,20 @@ s64 ipu7_isys_csi2_get_link_freq(struct ipu7_isys_csi2 *csi2) + return PTR_ERR(src_pad); + } + +- return v4l2_get_link_freq(src_pad, 0, 0); ++ ext_sd = media_entity_to_v4l2_subdev(src_pad->entity); ++ if (WARN(!ext_sd, "Failed to get subdev for %s\n", csi2->asd.sd.name)) ++ return -ENODEV; ++ ++ ret = v4l2_get_link_freq(ext_sd->ctrl_handler, 0, 0); ++ if (ret < 0) { ++ ret = v4l2_get_link_freq(src_pad, 0, 0); ++ if (ret < 0) { ++ dev_err(dev, "Failed to get link frequency for %s\n", ++ csi2->asd.sd.name); ++ return ret; ++ } ++ } ++ return ret; + } + + static int csi2_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, +-- +2.51.1 + diff --git a/patch/v6.17_iot/0023-media-pci-intel-ipu7-get-source-pad-according-to-csi.patch b/patch/v6.17_iot/0023-media-pci-intel-ipu7-get-source-pad-according-to-csi.patch new file mode 100644 index 0000000..3e8d4fc --- /dev/null +++ b/patch/v6.17_iot/0023-media-pci-intel-ipu7-get-source-pad-according-to-csi.patch @@ -0,0 +1,103 @@ +From bd48b560d4173aa5791f3557e33aceb9bb153f1b Mon Sep 17 00:00:00 2001 +From: "Yew, Chang Ching" +Date: Thu, 22 Jan 2026 08:08:39 +0800 +Subject: [PATCH 08/11] media: pci: intel: ipu7: get source pad according to + csi2 ep fwnode + +Signed-off-by: He, Pengpeng +Signed-off-by: Yew, Chang Ching +--- + drivers/staging/media/ipu7/ipu7-isys.c | 50 +++++++++++++++++++------- + drivers/staging/media/ipu7/ipu7-isys.h | 1 + + 2 files changed, 39 insertions(+), 12 deletions(-) + +diff --git a/drivers/staging/media/ipu7/ipu7-isys.c b/drivers/staging/media/ipu7/ipu7-isys.c +index 2bd8968a78cdf..74c45c3e7b5e4 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys.c ++++ b/drivers/staging/media/ipu7/ipu7-isys.c +@@ -55,23 +55,50 @@ isys_complete_ext_device_registration(struct ipu7_isys *isys, + struct ipu7_isys_csi2_config *csi2) + { + struct device *dev = &isys->adev->auxdev.dev; +- unsigned int i; ++ int source_pad; + int ret; + + v4l2_set_subdev_hostdata(sd, csi2); + +- for (i = 0; i < sd->entity.num_pads; i++) { +- if (sd->entity.pads[i].flags & MEDIA_PAD_FL_SOURCE) +- break; +- } ++ if (csi2->ep) { ++ struct fwnode_handle *ep_source; + +- if (i == sd->entity.num_pads) { +- dev_warn(dev, "no source pad in external entity\n"); +- ret = -ENOENT; +- goto skip_unregister_subdev; ++ ep_source = fwnode_graph_get_remote_endpoint(csi2->ep); ++ if (!ep_source) { ++ dev_warn(dev, "no remote endpoint for subdev\n"); ++ ret = -ENOENT; ++ goto skip_unregister_subdev; ++ } ++ ++ source_pad = media_entity_get_fwnode_pad(&sd->entity, ep_source, ++ MEDIA_PAD_FL_SOURCE); ++ ++ if (source_pad < 0) { ++ dev_warn(dev, "error in no acquire source pad in external entity\n"); ++ ret = -ENOENT; ++ goto skip_unregister_subdev; ++ } ++ ++ dev_dbg(&isys->adev->auxdev.dev, "%s: CSI2 ep %pfw\n", __func__, ++ csi2->ep); ++ dev_dbg(&isys->adev->auxdev.dev, ++ "%s: source pad %d for subdev %s\n", __func__, source_pad, ++ sd->name); ++ ++ fwnode_handle_put(ep_source); ++ } else { ++ for (source_pad = 0; source_pad < sd->entity.num_pads; source_pad++) { ++ if (sd->entity.pads[source_pad].flags & MEDIA_PAD_FL_SOURCE) ++ break; ++ } ++ if (source_pad == sd->entity.num_pads) { ++ dev_warn(dev, "no source pad in external entity\n"); ++ ret = -ENOENT; ++ goto skip_unregister_subdev; ++ } + } + +- ret = media_create_pad_link(&sd->entity, i, ++ ret = media_create_pad_link(&sd->entity, source_pad, + &isys->csi2[csi2->port].asd.sd.entity, + 0, MEDIA_LNK_FL_ENABLED | + MEDIA_LNK_FL_IMMUTABLE); +@@ -226,8 +253,7 @@ static int isys_notifier_init(struct ipu7_isys *isys) + s_asd->csi2.port = vep.base.port; + s_asd->csi2.nlanes = vep.bus.mipi_csi2.num_data_lanes; + s_asd->csi2.bus_type = vep.bus_type; +- +- fwnode_handle_put(ep); ++ s_asd->csi2.ep = ep; + + continue; + +diff --git a/drivers/staging/media/ipu7/ipu7-isys.h b/drivers/staging/media/ipu7/ipu7-isys.h +index 17d4d56301691..55afb5b6e2d94 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys.h ++++ b/drivers/staging/media/ipu7/ipu7-isys.h +@@ -141,6 +141,7 @@ struct ipu7_isys_csi2_config { + unsigned int nlanes; + unsigned int port; + enum v4l2_mbus_type bus_type; ++ struct fwnode_handle *ep; + }; + + struct sensor_async_sd { +-- +2.51.1 +