From 8be4339a9e535e8dfaf08bb693f4d78bc120e530 Mon Sep 17 00:00:00 2001 From: Huang Shenbo Date: Thu, 3 May 2012 14:54:31 +0800 Subject: [PATCH] mt9m114: change flip mappings and add g_*flip BZ: 30559 issues: flip mappings for front sensor image doesn't work as expected and get control values should be added solution: change flip mappings and add g_*flip Change-Id: I7d5142b750585660de669696ce863cc01539e1cc Signed-off-by: Huang Shenbo Reviewed-on: http://android.intel.com:8080/47197 Reviewed-by: Jiang, ZiyuX Reviewed-by: Tao, Jing Reviewed-by: Toivonen, Tuukka Reviewed-by: Koski, Anttu Tested-by: Koski, Anttu Reviewed-by: buildbot Tested-by: buildbot --- drivers/media/video/mt9m114.c | 46 +++++++++++++++++++++++++++++++++---------- drivers/media/video/mt9m114.h | 12 ++++------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/drivers/media/video/mt9m114.c b/drivers/media/video/mt9m114.c index 862c71e..aa544ce 100644 --- a/drivers/media/video/mt9m114.c +++ b/drivers/media/video/mt9m114.c @@ -816,6 +816,36 @@ static int mt9m114_g_fnumber_range(struct v4l2_subdev *sd, s32 * val) return 0; } +/* Horizontal flip the image. */ +static int mt9m114_g_hflip(struct v4l2_subdev *sd, s32 * val) +{ + struct i2c_client *c = v4l2_get_subdevdata(sd); + int ret; + u32 data; + ret = mt9m114_read_reg(c, MISENSOR_16BIT, + (u32)MISENSOR_READ_MODE, &data); + if (ret) + return ret; + *val = !!(data & MISENSOR_HFLIP_MASK); + + return 0; +} + +static int mt9m114_g_vflip(struct v4l2_subdev *sd, s32 * val) +{ + struct i2c_client *c = v4l2_get_subdevdata(sd); + int ret; + u32 data; + + ret = mt9m114_read_reg(c, MISENSOR_16BIT, + (u32)MISENSOR_READ_MODE, &data); + if (ret) + return ret; + *val = !!(data & MISENSOR_VFLIP_MASK); + + return 0; +} + static int mt9m114_s_freq(struct v4l2_subdev *sd, s32 val) { struct i2c_client *c = v4l2_get_subdevdata(sd); @@ -855,6 +885,7 @@ static struct mt9m114_control mt9m114_controls[] = { .step = 1, .default_value = 0, }, + .query = mt9m114_g_vflip, .tweak = mt9m114_t_vflip, }, { @@ -867,6 +898,7 @@ static struct mt9m114_control mt9m114_controls[] = { .step = 1, .default_value = 0, }, + .query = mt9m114_g_hflip, .tweak = mt9m114_t_hflip, }, { @@ -1025,7 +1057,6 @@ static int mt9m114_t_hflip(struct v4l2_subdev *sd, int value) struct i2c_client *c = v4l2_get_subdevdata(sd); struct mt9m114_device *dev = to_mt9m114_sensor(sd); int err; - /* set for direct mode */ err = mt9m114_write_reg(c, MISENSOR_16BIT, 0x098E, 0xC850); if (value) { @@ -1036,9 +1067,8 @@ static int mt9m114_t_hflip(struct v4l2_subdev *sd, int value) err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC888, 0x01, 0x01); err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC889, 0x01, 0x01); - /* enable vert_flip and horz_mirror */ err += misensor_rmw_reg(c, MISENSOR_16BIT, MISENSOR_READ_MODE, - MISENSOR_F_M_MASK, MISENSOR_F_M_EN); + MISENSOR_HFLIP_MASK, MISENSOR_FLIP_EN); dev->bpat = MT9M114_BPAT_GRGRBGBG; } else { @@ -1049,9 +1079,8 @@ static int mt9m114_t_hflip(struct v4l2_subdev *sd, int value) err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC888, 0x01, 0x00); err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC889, 0x01, 0x00); - /* enable vert_flip and disable horz_mirror */ err += misensor_rmw_reg(c, MISENSOR_16BIT, MISENSOR_READ_MODE, - MISENSOR_F_M_MASK, MISENSOR_F_EN); + MISENSOR_HFLIP_MASK, MISENSOR_FLIP_DIS); dev->bpat = MT9M114_BPAT_BGBGGRGR; } @@ -1067,7 +1096,6 @@ static int mt9m114_t_vflip(struct v4l2_subdev *sd, int value) { struct i2c_client *c = v4l2_get_subdevdata(sd); int err; - /* set for direct mode */ err = mt9m114_write_reg(c, MISENSOR_16BIT, 0x098E, 0xC850); if (value >= 1) { @@ -1078,9 +1106,8 @@ static int mt9m114_t_vflip(struct v4l2_subdev *sd, int value) err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC888, 0x02, 0x01); err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC889, 0x02, 0x01); - /* disable vert_flip and horz_mirror */ err += misensor_rmw_reg(c, MISENSOR_16BIT, MISENSOR_READ_MODE, - MISENSOR_F_M_MASK, MISENSOR_F_M_DIS); + MISENSOR_VFLIP_MASK, MISENSOR_FLIP_EN); } else { /* disable H flip - ctx A */ err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC850, 0x02, 0x00); @@ -1089,9 +1116,8 @@ static int mt9m114_t_vflip(struct v4l2_subdev *sd, int value) err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC888, 0x02, 0x00); err += misensor_rmw_reg(c, MISENSOR_8BIT, 0xC889, 0x02, 0x00); - /* enable vert_flip and disable horz_mirror */ err += misensor_rmw_reg(c, MISENSOR_16BIT, MISENSOR_READ_MODE, - MISENSOR_F_M_MASK, MISENSOR_F_EN); + MISENSOR_VFLIP_MASK, MISENSOR_FLIP_DIS); } err += mt9m114_write_reg(c, MISENSOR_8BIT, 0x8404, 0x06); diff --git a/drivers/media/video/mt9m114.h b/drivers/media/video/mt9m114.h index 4af25a7..ce595a1 100644 --- a/drivers/media/video/mt9m114.h +++ b/drivers/media/video/mt9m114.h @@ -57,26 +57,22 @@ #define MISENSOR_TOK_POLL 0xfc00 /* token indicating poll instruction */ #define MISENSOR_TOK_RMW 0x0010 /* RMW operation */ #define MISENSOR_TOK_MASK 0xfff0 -#define MISENSOR_FLIP_EN (1<<1) /* enable vert_flip */ -#define MISENSOR_MIRROR_EN (1<<0) /* enable horz_mirror */ #define MISENSOR_AWB_STEADY (1<<0) /* awb steady */ #define MISENSOR_AE_READY (1<<3) /* ae status ready */ /* mask to set sensor read_mode via misensor_rmw_reg */ #define MISENSOR_R_MODE_MASK 0x0330 /* mask to set sensor vert_flip and horz_mirror */ -#define MISENSOR_F_M_MASK 0x0003 +#define MISENSOR_VFLIP_MASK 0x0002 +#define MISENSOR_HFLIP_MASK 0x0001 +#define MISENSOR_FLIP_EN 1 +#define MISENSOR_FLIP_DIS 0 /* bits set to set sensor read_mode via misensor_rmw_reg */ #define MISENSOR_SKIPPING_SET 0x0011 #define MISENSOR_SUMMING_SET 0x0033 #define MISENSOR_NORMAL_SET 0x0000 -/* bits set to set sensor vert_flip and horz_mirror */ -#define MISENSOR_F_M_EN (MISENSOR_FLIP_EN | MISENSOR_MIRROR_EN) -#define MISENSOR_F_EN MISENSOR_FLIP_EN -#define MISENSOR_F_M_DIS (MISENSOR_FLIP_EN & MISENSOR_MIRROR_EN) - /* sensor register that control sensor read-mode and mirror */ #define MISENSOR_READ_MODE 0xC834 /* sensor ae-track status register */ -- 2.7.4