From 63c027085087eb057754ecaa355809686cbbc940 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Fri, 25 Dec 2020 18:02:04 +0800 Subject: [PATCH] media: i2c: jx_f37 support mirror/flip Signed-off-by: Zefa Chen Change-Id: Ibc876b49b76055396d4ee64a583b13965d76f344 --- drivers/media/i2c/jx_f37.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/jx_f37.c b/drivers/media/i2c/jx_f37.c index 2ca1724d5732..e8361b110d04 100644 --- a/drivers/media/i2c/jx_f37.c +++ b/drivers/media/i2c/jx_f37.c @@ -3,6 +3,7 @@ * jx_f37 driver * * Copyright (C) 2020 Rockchip Electronics Co., Ltd. + * v0.0x01.0x04 support mirror/flip */ #define DEBUG @@ -24,7 +25,7 @@ #include #include -#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x03) +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x04) #ifndef V4L2_CID_DIGITAL_GAIN #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN @@ -69,6 +70,8 @@ #define JX_F37_FETCH_HIGH_BYTE_VTS(VAL) (((VAL) >> 8) & 0xFF) /* 8-15 Bits */ #define JX_F37_FETCH_LOW_BYTE_VTS(VAL) ((VAL) & 0xFF) /* 0-7 Bits */ +#define JX_F37_FLIP_MIRROR_REG 0x12 + #define REG_NULL 0xFF #define REG_DELAY 0xFE @@ -1241,6 +1244,7 @@ static int jx_f37_set_ctrl(struct v4l2_ctrl *ctrl) struct jx_f37, ctrl_handler); struct i2c_client *client = jx_f37->client; s64 max; + u8 val = 0; int ret = 0; /* Propagate change of current control to all related controls */ @@ -1276,6 +1280,26 @@ static int jx_f37_set_ctrl(struct v4l2_ctrl *ctrl) break; case V4L2_CID_DIGITAL_GAIN: break; + case V4L2_CID_HFLIP: + ret = jx_f37_read_reg(jx_f37->client, JX_F37_FLIP_MIRROR_REG, + &val); + if (ctrl->val) + val |= BIT(5); + else + val &= ~BIT(5); + ret |= jx_f37_write_reg(jx_f37->client, JX_F37_FLIP_MIRROR_REG, + val); + break; + case V4L2_CID_VFLIP: + ret = jx_f37_read_reg(jx_f37->client, JX_F37_FLIP_MIRROR_REG, + &val); + if (ctrl->val) + val |= BIT(4); + else + val &= ~BIT(4); + ret |= jx_f37_write_reg(jx_f37->client, JX_F37_FLIP_MIRROR_REG, + val); + break; case V4L2_CID_VBLANK: dev_dbg(&client->dev, "set vblank: val: %d\n", ctrl->val); ret |= jx_f37_write_reg(jx_f37->client, JX_F37_REG_HIGH_VTS, @@ -1345,6 +1369,12 @@ static int jx_f37_initialize_controls(struct jx_f37 *jx_f37) ANALOG_GAIN_MAX, ANALOG_GAIN_STEP, ANALOG_GAIN_DEFAULT); + v4l2_ctrl_new_std(handler, &jx_f37_ctrl_ops, + V4L2_CID_HFLIP, 0, 1, 1, 0); + + v4l2_ctrl_new_std(handler, &jx_f37_ctrl_ops, + V4L2_CID_VFLIP, 0, 1, 1, 0); + if (handler->error) { ret = handler->error; dev_err(&jx_f37->client->dev,