WAR:media:i2c:ov5693: add flip and mirror setting
mode table enable mirror, WAR by unmirror it.
Bug 200292212
Change-Id: I17ab87946c17d45813f9b76cf5ebb2918d00da03
Signed-off-by: Wenjia Zhou <wenjiaz@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1520873
Reviewed-by: Michelle Bourland <msoult@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sean Pieper <spieper@nvidia.com>
Reviewed-by: Jihoon Bang <jbang@nvidia.com>
diff --git a/drivers/media/i2c/ov5693.c b/drivers/media/i2c/ov5693.c
index 605586d..aa9e7fe 100644
--- a/drivers/media/i2c/ov5693.c
+++ b/drivers/media/i2c/ov5693.c
@@ -499,6 +499,7 @@
struct v4l2_control control;
int err;
u32 frame_time;
+ u8 val;
dev_dbg(&client->dev, "%s++\n", __func__);
@@ -570,7 +571,20 @@
err = ov5693_write_table(priv, mode_table[OV5693_MODE_START_STREAM]);
if (err)
goto exit;
-
+ if (priv->pdata->v_flip) {
+ ov5693_read_reg(priv->s_data, OV5693_TIMING_REG20, &val);
+ ov5693_write_reg(priv->s_data, OV5693_TIMING_REG20,
+ val | VERTICAL_FLIP);
+ }
+ if (priv->pdata->h_mirror) {
+ ov5693_read_reg(priv->s_data, OV5693_TIMING_REG21, &val);
+ ov5693_write_reg(priv->s_data, OV5693_TIMING_REG21,
+ val | HORIZONTAL_MIRROR_MASK);
+ } else {
+ ov5693_read_reg(priv->s_data, OV5693_TIMING_REG21, &val);
+ ov5693_write_reg(priv->s_data, OV5693_TIMING_REG21,
+ val & (~HORIZONTAL_MIRROR_MASK));
+ }
if (test_mode)
err = ov5693_write_table(priv,
mode_table[OV5693_MODE_TEST_PATTERN]);
@@ -1331,7 +1345,9 @@
board_priv_pdata->has_eeprom =
of_property_read_bool(node, "has-eeprom");
-
+ board_priv_pdata->v_flip= of_property_read_bool(node, "vertical-flip");
+ board_priv_pdata->h_mirror = of_property_read_bool(node,
+ "horizontal-mirror");
return board_priv_pdata;
error:
diff --git a/include/media/camera_common.h b/include/media/camera_common.h
index 6b2e875..5c5a17e 100644
--- a/include/media/camera_common.h
+++ b/include/media/camera_common.h
@@ -125,6 +125,8 @@
bool use_cam_gpio;
bool has_eeprom;
struct camera_common_mode_info *mode_info;
+ bool v_flip;
+ bool h_mirror;
};
struct camera_common_eeprom_data {
diff --git a/include/media/ov5693.h b/include/media/ov5693.h
index e8f9485..f164956 100644
--- a/include/media/ov5693.h
+++ b/include/media/ov5693.h
@@ -80,6 +80,10 @@
#define OV5693_GAIN_ADDR_MSB 0x350A
#define OV5693_GAIN_ADDR_LSB 0x350B
#define OV5693_GROUP_HOLD_ADDR 0x3208
+#define OV5693_TIMING_REG20 0x3820
+#define VERTICAL_FLIP ((0x1 << 1) | (0x1 << 6))
+#define OV5693_TIMING_REG21 0x3821
+#define HORIZONTAL_MIRROR_MASK (0x3 << 1)
struct ov5693_mode {
int res_x;