From b58babc2d35ad6822745f4d57aa5897a8bcd2c67 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Fri, 3 Dec 2021 16:49:43 +0800 Subject: [PATCH] media: i2c: imx464 support set mirror/flip Signed-off-by: Zefa Chen Change-Id: I22e55d20b72d37da74396bae677f6893936c534b --- drivers/media/i2c/imx464.c | 58 +++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/imx464.c b/drivers/media/i2c/imx464.c index 8d91faaa1f29..8cfae0d9c9f7 100644 --- a/drivers/media/i2c/imx464.c +++ b/drivers/media/i2c/imx464.c @@ -2893,7 +2893,7 @@ static int IMX464_set_ctrl(struct v4l2_ctrl *ctrl) u32 vts = 0; int ret = 0; u32 shr0 = 0; - //u32 flip = 0; + u32 flip = 0; /* Propagate change of current control to all related controls */ switch (ctrl->id) { @@ -2969,8 +2969,64 @@ static int IMX464_set_ctrl(struct v4l2_ctrl *ctrl) vts); break; case V4L2_CID_HFLIP: + ret = imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_START); + ret |= imx464_write_reg(IMX464->client, IMX464_HREVERSE_REG, + IMX464_REG_VALUE_08BIT, !!ctrl->val); + ret |= imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_END); break; case V4L2_CID_VFLIP: + flip = ctrl->val; + ret = imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_START); + ret |= imx464_write_reg(IMX464->client, IMX464_VREVERSE_REG, + IMX464_REG_VALUE_08BIT, !!flip); + if (flip) { + ret |= imx464_write_reg(IMX464->client, 0x3074, + IMX464_REG_VALUE_08BIT, 0x40); + ret |= imx464_write_reg(IMX464->client, 0x3075, + IMX464_REG_VALUE_08BIT, 0x06); + ret |= imx464_write_reg(IMX464->client, 0x3080, + IMX464_REG_VALUE_08BIT, 0xff); + ret |= imx464_write_reg(IMX464->client, 0x30ad, + IMX464_REG_VALUE_08BIT, 0x7e); + ret |= imx464_write_reg(IMX464->client, 0x30b6, + IMX464_REG_VALUE_08BIT, 0xff); + ret |= imx464_write_reg(IMX464->client, 0x30b7, + IMX464_REG_VALUE_08BIT, 0x01); + ret |= imx464_write_reg(IMX464->client, 0x30d8, + IMX464_REG_VALUE_08BIT, 0x45); + ret |= imx464_write_reg(IMX464->client, 0x3114, + IMX464_REG_VALUE_08BIT, 0x01); + } else { + ret |= imx464_write_reg(IMX464->client, 0x3074, + IMX464_REG_VALUE_08BIT, 0x3c); + ret |= imx464_write_reg(IMX464->client, 0x3075, + IMX464_REG_VALUE_08BIT, 0x00); + ret |= imx464_write_reg(IMX464->client, 0x3080, + IMX464_REG_VALUE_08BIT, 0x01); + ret |= imx464_write_reg(IMX464->client, 0x30ad, + IMX464_REG_VALUE_08BIT, 0x02); + ret |= imx464_write_reg(IMX464->client, 0x30b6, + IMX464_REG_VALUE_08BIT, 0x00); + ret |= imx464_write_reg(IMX464->client, 0x30b7, + IMX464_REG_VALUE_08BIT, 0x00); + ret |= imx464_write_reg(IMX464->client, 0x30d8, + IMX464_REG_VALUE_08BIT, 0x44); + ret |= imx464_write_reg(IMX464->client, 0x3114, + IMX464_REG_VALUE_08BIT, 0x02); + } + ret |= imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_END); break; default: dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",