[PATCH v5 16/29] media: rockchip: rga: split flip and rotate into separate function
Sven Püschel
s.pueschel at pengutronix.de
Tue Apr 28 02:00:51 PDT 2026
Split the flip and rotate command configuration into a separate
function in preparation of filling the command stream at streamon.
As the userspace can change the flipping and rotation controls while
streaming, we have to update them with each new frame to prevent the
user being unable to change them while streaming.
Signed-off-by: Sven Püschel <s.pueschel at pengutronix.de>
---
drivers/media/platform/rockchip/rga/rga-hw.c | 57 +++++++++++++++++-----------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/drivers/media/platform/rockchip/rga/rga-hw.c b/drivers/media/platform/rockchip/rga/rga-hw.c
index dac3cb6aa17d3..6c1956b04f6ba 100644
--- a/drivers/media/platform/rockchip/rga/rga-hw.c
+++ b/drivers/media/platform/rockchip/rga/rga-hw.c
@@ -156,7 +156,38 @@ static void rga_cmd_set_dst_addr(struct rga_ctx *ctx, dma_addr_t dma_addr)
dest[reg >> 2] |= 0x7 << 8;
}
-static void rga_cmd_set_trans_info(struct rga_ctx *ctx)
+static void rga_cmd_set_flip_rotate_info(struct rga_ctx *ctx)
+{
+ u32 *dest = ctx->cmdbuf_virt;
+ union rga_src_info src_info;
+
+ src_info.val = dest[(RGA_SRC_INFO - RGA_MODE_BASE_REG) >> 2];
+
+ if (ctx->vflip)
+ src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_X;
+
+ if (ctx->hflip)
+ src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_Y;
+
+ switch (ctx->rotate) {
+ case 90:
+ src_info.data.rot_mode = RGA_SRC_ROT_MODE_90_DEGREE;
+ break;
+ case 180:
+ src_info.data.rot_mode = RGA_SRC_ROT_MODE_180_DEGREE;
+ break;
+ case 270:
+ src_info.data.rot_mode = RGA_SRC_ROT_MODE_270_DEGREE;
+ break;
+ default:
+ src_info.data.rot_mode = RGA_SRC_ROT_MODE_0_DEGREE;
+ break;
+ }
+
+ dest[(RGA_SRC_INFO - RGA_MODE_BASE_REG) >> 2] = src_info.val;
+}
+
+static void rga_cmd_set_format_scale_info(struct rga_ctx *ctx)
{
struct rockchip_rga *rga = ctx->rga;
u32 *dest = ctx->cmdbuf_virt;
@@ -219,27 +250,6 @@ static void rga_cmd_set_trans_info(struct rga_ctx *ctx)
}
}
- if (ctx->vflip)
- src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_X;
-
- if (ctx->hflip)
- src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_Y;
-
- switch (ctx->rotate) {
- case 90:
- src_info.data.rot_mode = RGA_SRC_ROT_MODE_90_DEGREE;
- break;
- case 180:
- src_info.data.rot_mode = RGA_SRC_ROT_MODE_180_DEGREE;
- break;
- case 270:
- src_info.data.rot_mode = RGA_SRC_ROT_MODE_270_DEGREE;
- break;
- default:
- src_info.data.rot_mode = RGA_SRC_ROT_MODE_0_DEGREE;
- break;
- }
-
/*
* Calculate the up/down scaling mode/factor.
*
@@ -431,7 +441,8 @@ static void rga_cmd_set(struct rga_ctx *ctx,
rga_cmd_set_src_info(ctx, &src->offset);
rga_cmd_set_dst_info(ctx, &dst->offset);
- rga_cmd_set_trans_info(ctx);
+ rga_cmd_set_format_scale_info(ctx);
+ rga_cmd_set_flip_rotate_info(ctx);
rga_write(rga, RGA_CMD_BASE, ctx->cmdbuf_phy);
--
2.54.0
More information about the Linux-rockchip
mailing list