From 4b50d2f038e77a9b028b78f0f42ce1c33b263bf9 Mon Sep 17 00:00:00 2001 From: Zhichao Yu Date: Thu, 6 Apr 2023 15:42:38 +0800 Subject: [PATCH] media: i2c: gc4653: fix image corruption when switch sensor flip/mirror The configuration of flip/mirror would take effect in the half of frame, which cause frame corruption. To make sure the flip/mirror configuration is took effect in the next frame, we should enable register frame buffer on gc4653. Signed-off-by: Zhichao Yu Change-Id: Ibf85eb46d7c22785a820bcf781bd3e96a3455f00 --- drivers/media/i2c/gc4653.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/media/i2c/gc4653.c b/drivers/media/i2c/gc4653.c index 64d0d7f4cd11..3d3f66a2df57 100644 --- a/drivers/media/i2c/gc4653.c +++ b/drivers/media/i2c/gc4653.c @@ -76,6 +76,10 @@ #define GC4653_MIRROR_BIT_MASK BIT(0) #define GC4653_FLIP_BIT_MASK BIT(1) +#define GC4653_FRAME_BUFFER_REG 0x031d +#define GC4653_FRAME_BUFFER_START 0x2d +#define GC4653_FRAME_BUFFER_END 0x28 + #define REG_NULL 0xFFFF #define GC4653_REG_VALUE_08BIT 1 @@ -1254,8 +1258,12 @@ static int gc4653_set_ctrl(struct v4l2_ctrl *ctrl) val |= GC4653_MIRROR_BIT_MASK; else val &= ~GC4653_MIRROR_BIT_MASK; + ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG, + GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_START); ret |= gc4653_write_reg(gc4653->client, GC4653_FLIP_MIRROR_REG, GC4653_REG_VALUE_08BIT, val); + ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG, + GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_END); break; case V4L2_CID_VFLIP: ret = gc4653_read_reg(gc4653->client, GC4653_FLIP_MIRROR_REG, @@ -1264,8 +1272,12 @@ static int gc4653_set_ctrl(struct v4l2_ctrl *ctrl) val |= GC4653_FLIP_BIT_MASK; else val &= ~GC4653_FLIP_BIT_MASK; + ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG, + GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_START); ret |= gc4653_write_reg(gc4653->client, GC4653_FLIP_MIRROR_REG, GC4653_REG_VALUE_08BIT, val); + ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG, + GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_END); break; default: dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",