[PATCH 51/74] media: qcom: camss: vfe: Pass the buffer to vfe_wm_update()
From: bod
Date: Mon Oct 05 2026 - 13:35:06 EST
From: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
A write master of a multi-planar output needs the address of its own
plane. Pass the struct camss_buffer to the vfe_wm_update() hw op instead
of its first address; every existing backend still programs addr[0].
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
---
drivers/media/platform/qcom/camss/camss-vfe-17x.c | 5 +++--
drivers/media/platform/qcom/camss/camss-vfe-340.c | 3 ++-
drivers/media/platform/qcom/camss/camss-vfe-480.c | 3 ++-
drivers/media/platform/qcom/camss/camss-vfe-680.c | 5 +++--
drivers/media/platform/qcom/camss/camss-vfe-690.c | 4 +++-
drivers/media/platform/qcom/camss/camss-vfe-780.c | 4 +++-
drivers/media/platform/qcom/camss/camss-vfe.c | 6 +++---
drivers/media/platform/qcom/camss/camss-vfe.h | 2 +-
8 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-17x.c b/drivers/media/platform/qcom/camss/camss-vfe-17x.c
index 52812d34530d6..a2d336e7f7aa9 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-17x.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-17x.c
@@ -253,12 +253,13 @@ static void vfe_wm_stop(struct vfe_device *vfe, u8 wm, struct vfe_line *line)
writel_relaxed(0, vfe->base + VFE_BUS_WM_CFG(wm));
}
-static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr,
+static void vfe_wm_update(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line)
{
struct v4l2_pix_format_mplane *pix =
&line->output[0].video_out.active_fmt.fmt.pix_mp;
u32 stride = pix->plane_fmt[0].bytesperline;
+ u32 addr = buffer->addr[0];
writel_relaxed(addr, vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm));
writel_relaxed(stride * pix->height, vfe->base + VFE_BUS_WM_FRAME_INC(wm));
@@ -541,7 +542,7 @@ static void vfe_isr_wm_done(struct vfe_device *vfe, u8 wm)
output->buf[index] = vfe_buf_get_pending(output);
if (output->buf[index])
- vfe_wm_update(vfe, output->wm[0].bus_client, output->buf[index]->addr[0], line);
+ vfe_wm_update(vfe, output->wm[0].bus_client, output->buf[index], line);
else
output->gen2.active_num--;
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-340.c b/drivers/media/platform/qcom/camss/camss-vfe-340.c
index 493c4b2e64162..e5a0a70eed1e6 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-340.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-340.c
@@ -252,9 +252,10 @@ static void vfe_enable_irq(struct vfe_device *vfe)
TFE_BUS_IRQ_MASK_0_IMG_VIOL, vfe->base + TFE_BUS_IRQ_MASK_0);
}
-static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr,
+static void vfe_wm_update(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line)
{
+ u32 addr = buffer->addr[0];
u8 client = tfe_wm_client_map[wm];
writel_relaxed(addr, vfe->base + TFE_BUS_IMAGE_ADDR(client));
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-480.c b/drivers/media/platform/qcom/camss/camss-vfe-480.c
index 75dc73eadd6d0..bb065e47fe91e 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-480.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-480.c
@@ -133,9 +133,10 @@ static void vfe_wm_stop(struct vfe_device *vfe, u8 wm, struct vfe_line *line)
writel_relaxed(0, vfe->base + VFE_BUS_WM_CFG(wm));
}
-static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr,
+static void vfe_wm_update(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line)
{
+ u32 addr = buffer->addr[0];
wm = RDI_WM(wm); /* map to actual WM used (from wm=RDI index) */
writel_relaxed(addr, vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm));
}
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-680.c b/drivers/media/platform/qcom/camss/camss-vfe-680.c
index d9a6402e8d928..242bacb051cc0 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-680.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-680.c
@@ -144,10 +144,11 @@ static void vfe_disable_irq(struct vfe_device *vfe)
writel(0u, vfe->base + VFE_BUS_IRQn_MASK(vfe, 1));
}
-static void vfe_wm_update(struct vfe_device *vfe, u8 rdi, u32 addr,
+static void vfe_wm_update(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line)
{
- u8 wm = RDI_WM(rdi);
+ u32 addr = buffer->addr[0];
+ wm = RDI_WM(wm); /* map to actual WM used (from wm=RDI index) */
writel(addr, vfe->base + VFE_BUS_IMAGE_ADDR(vfe, wm));
}
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-690.c b/drivers/media/platform/qcom/camss/camss-vfe-690.c
index fb40560d4ab41..efe8d963b4703 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-690.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-690.c
@@ -96,9 +96,11 @@ static void vfe_wm_stop(struct vfe_device *vfe, u8 wm, struct vfe_line *line)
writel(0, vfe->base + VFE_BUS_WM_CFG(wm));
}
-static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr,
+static void vfe_wm_update(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line)
{
+ u32 addr = buffer->addr[0];
+
wm = RDI_WM(wm);
writel(addr, vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm));
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-780.c b/drivers/media/platform/qcom/camss/camss-vfe-780.c
index 88d74323fe276..d70e829524fdf 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-780.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-780.c
@@ -118,9 +118,11 @@ static void vfe_wm_stop(struct vfe_device *vfe, u8 wm, struct vfe_line *line)
writel(0, vfe->base + VFE_BUS_WM_CFG(wm));
}
-static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr,
+static void vfe_wm_update(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line)
{
+ u32 addr = buffer->addr[0];
+
wm = line->output[0].wm[0].bus_client;
writel((addr >> 8), vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm));
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
index 896e8d8e8d8a0..fbc2068b301bc 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe.c
@@ -662,7 +662,7 @@ void vfe_buf_done(struct vfe_device *vfe, int wm, struct camss_buf_done_info *bu
ops->vfe_output_update(vfe, output, output->buf[index]);
else
ops->vfe_wm_update(vfe, output->wm[0].bus_client,
- output->buf[index]->addr[0],
+ output->buf[index],
line);
ops->reg_update(vfe, line->id);
} else {
@@ -714,7 +714,7 @@ static int vfe_enable_one_output(struct vfe_line *line, struct vfe_output *outpu
ops->vfe_output_update(vfe, output, output->buf[i]);
else
ops->vfe_wm_update(vfe, output->wm[0].bus_client,
- output->buf[i]->addr[0], line);
+ output->buf[i], line);
ops->reg_update(vfe, line->id);
}
@@ -785,7 +785,7 @@ int vfe_queue_buffer_v2(struct camss_video *vid,
ops->vfe_output_update(vfe, output, buf);
else
ops->vfe_wm_update(vfe, output->wm[0].bus_client,
- buf->addr[0], line);
+ buf, line);
ops->reg_update(vfe, line->id);
} else {
vfe_buf_add_pending(output, buf);
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h
index 4e99a2c5b33af..0b632479cefc6 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.h
+++ b/drivers/media/platform/qcom/camss/camss-vfe.h
@@ -185,7 +185,7 @@ struct vfe_hw_ops {
struct vfe_line *line);
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,
+ void (*vfe_wm_update)(struct vfe_device *vfe, u8 wm, struct camss_buffer *buffer,
struct vfe_line *line);
/* Output based API - new and shiny */
--
2.55.0