[PATCH 50/74] media: qcom: camss: vfe: Pass the completion info to vfe_buf_done()
From: bod
Date: Mon Oct 05 2026 - 13:38:58 EST
From: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
The CSID reports which completion groups finished in the info it passes
to camss_buf_done(). Hand it on to the VFE: the vfe_buf_done() hw op and
the generic vfe_buf_done() take the struct camss_buf_done_info, and the
VFEs that see their own completions, vfe-340 and vfe-480, pass an empty
one.
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
---
drivers/media/platform/qcom/camss/camss-vfe-340.c | 7 +++++--
drivers/media/platform/qcom/camss/camss-vfe-480.c | 9 ++++++---
drivers/media/platform/qcom/camss/camss-vfe.c | 2 +-
drivers/media/platform/qcom/camss/camss-vfe.h | 6 ++++--
drivers/media/platform/qcom/camss/camss.c | 2 +-
5 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-340.c b/drivers/media/platform/qcom/camss/camss-vfe-340.c
index 87f3e8f2ff539..493c4b2e64162 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-340.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-340.c
@@ -203,8 +203,11 @@ static irqreturn_t vfe_isr(int irq, void *dev)
}
for (i = 0; i < TFE_SUBGROUP_NUM; i++) {
- if (bus_status & TFE_BUS_IRQ_MASK_BUF_DONE(i))
- vfe_buf_done(vfe, __subgroup_to_line(i));
+ if (bus_status & TFE_BUS_IRQ_MASK_BUF_DONE(i)) {
+ struct camss_buf_done_info info = {};
+
+ vfe_buf_done(vfe, __subgroup_to_line(i), &info);
+ }
}
if (bus_status & TFE_BUS_IRQ_MASK_0_CONS_VIOL)
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-480.c b/drivers/media/platform/qcom/camss/camss-vfe-480.c
index 6edbd8119aa7d..75dc73eadd6d0 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-480.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-480.c
@@ -209,8 +209,11 @@ static irqreturn_t vfe_isr(int irq, void *dev)
/* Loop through all WMs IRQs */
for (i = 0; i < MSM_VFE_IMAGE_MASTERS_NUM; i++) {
- if (status & BUS_IRQ_MASK_0_COMP_DONE(vfe, RDI_COMP_GROUP(i)))
- vfe_buf_done(vfe, i);
+ if (status & BUS_IRQ_MASK_0_COMP_DONE(vfe, RDI_COMP_GROUP(i))) {
+ struct camss_buf_done_info buf_done_info = {};
+
+ vfe_buf_done(vfe, i, &buf_done_info);
+ }
}
}
@@ -272,7 +275,7 @@ static void vfe_violation_read(struct vfe_device *vfe)
/* nop */
}
-static void vfe_buf_done_480(struct vfe_device *vfe, int port_id)
+static void vfe_buf_done_480(struct vfe_device *vfe, int port_id, struct camss_buf_done_info *info)
{
/* nop */
}
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
index 6ee9b5024447d..896e8d8e8d8a0 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe.c
@@ -621,7 +621,7 @@ u32 vfe_hw_version(struct vfe_device *vfe)
* @vfe: VFE Device
* @wm: Write master id
*/
-void vfe_buf_done(struct vfe_device *vfe, int wm)
+void vfe_buf_done(struct vfe_device *vfe, int wm, struct camss_buf_done_info *buf_done_info)
{
struct vfe_line *line = &vfe->line[vfe->wm_output_map[wm]];
const struct vfe_hw_ops *ops = vfe->res->hw_ops;
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h
index 06bdc337f4d83..4e99a2c5b33af 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.h
+++ b/drivers/media/platform/qcom/camss/camss-vfe.h
@@ -159,6 +159,7 @@ struct vfe_line {
};
struct vfe_device;
+struct camss_buf_done_info;
struct vfe_hw_ops {
void (*enable_irq)(struct vfe_device *vfe);
@@ -182,7 +183,8 @@ struct vfe_hw_ops {
struct vfe_line *line);
void (*vfe_wm_stop)(struct vfe_device *vfe, u8 wm,
struct vfe_line *line);
- void (*vfe_buf_done)(struct vfe_device *vfe, int port_id);
+ void (*vfe_buf_done)(struct vfe_device *vfe, int port_id,
+ struct camss_buf_done_info *buf_done_info);
void (*vfe_wm_update)(struct vfe_device *vfe, u8 wm, u32 addr,
struct vfe_line *line);
@@ -357,7 +359,7 @@ int vfe_enable_v2(struct vfe_line *line);
* @vfe: VFE Device
* @wm: Write master id
*/
-void vfe_buf_done(struct vfe_device *vfe, int wm);
+void vfe_buf_done(struct vfe_device *vfe, int wm, struct camss_buf_done_info *buf_done_info);
/*
* vfe_get_output_v2 - Get vfe output line
diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
index 065d14a872526..123df1d2591e9 100644
--- a/drivers/media/platform/qcom/camss/camss.c
+++ b/drivers/media/platform/qcom/camss/camss.c
@@ -5040,7 +5040,7 @@ void camss_buf_done(struct camss *camss, struct camss_buf_done_info *info)
if (info->hw_id < camss->res->vfe_num) {
vfe = &camss->vfe[info->hw_id];
- vfe->res->hw_ops->vfe_buf_done(vfe, info->port_id);
+ vfe->res->hw_ops->vfe_buf_done(vfe, info->port_id, info);
}
}
--
2.55.0