Commit 2526ea6e authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (12401): m9v011: add vflip/hflip controls to control mirror/upside down

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent d96ecda6
...@@ -52,13 +52,34 @@ static struct v4l2_queryctrl mt9v011_qctrl[] = { ...@@ -52,13 +52,34 @@ static struct v4l2_queryctrl mt9v011_qctrl[] = {
.step = 1, .step = 1,
.default_value = 0, .default_value = 0,
.flags = 0, .flags = 0,
}, }, {
.id = V4L2_CID_HFLIP,
.type = V4L2_CTRL_TYPE_BOOLEAN,
.name = "Mirror",
.minimum = 0,
.maximum = 1,
.step = 1,
.default_value = 0,
.flags = 0,
}, {
.id = V4L2_CID_VFLIP,
.type = V4L2_CTRL_TYPE_BOOLEAN,
.name = "Vflip",
.minimum = 0,
.maximum = 1,
.step = 1,
.default_value = 0,
.flags = 0,
}, {
}
}; };
struct mt9v011 { struct mt9v011 {
struct v4l2_subdev sd; struct v4l2_subdev sd;
unsigned width, height; unsigned width, height;
unsigned xtal; unsigned xtal;
unsigned hflip:1;
unsigned vflip:1;
u16 global_gain, red_bal, blue_bal; u16 global_gain, red_bal, blue_bal;
}; };
...@@ -131,7 +152,6 @@ static const struct i2c_reg_value mt9v011_init_default[] = { ...@@ -131,7 +152,6 @@ static const struct i2c_reg_value mt9v011_init_default[] = {
{ R0A_MT9V011_CLK_SPEED, 0x0000 }, { R0A_MT9V011_CLK_SPEED, 0x0000 },
{ R1E_MT9V011_DIGITAL_ZOOM, 0x0000 }, { R1E_MT9V011_DIGITAL_ZOOM, 0x0000 },
{ R20_MT9V011_READ_MODE, 0x1000 },
{ R07_MT9V011_OUT_CTRL, 0x0002 }, /* chip enable */ { R07_MT9V011_OUT_CTRL, 0x0002 }, /* chip enable */
}; };
...@@ -255,6 +275,20 @@ static void set_res(struct v4l2_subdev *sd) ...@@ -255,6 +275,20 @@ static void set_res(struct v4l2_subdev *sd)
calc_fps(sd, NULL, NULL); calc_fps(sd, NULL, NULL);
}; };
static void set_read_mode(struct v4l2_subdev *sd)
{
struct mt9v011 *core = to_mt9v011(sd);
unsigned mode = 0x1000;
if (core->hflip)
mode |= 0x4000;
if (core->vflip)
mode |= 0x8000;
mt9v011_write(sd, R20_MT9V011_READ_MODE, mode);
}
static int mt9v011_reset(struct v4l2_subdev *sd, u32 val) static int mt9v011_reset(struct v4l2_subdev *sd, u32 val)
{ {
int i; int i;
...@@ -265,6 +299,7 @@ static int mt9v011_reset(struct v4l2_subdev *sd, u32 val) ...@@ -265,6 +299,7 @@ static int mt9v011_reset(struct v4l2_subdev *sd, u32 val)
set_balance(sd); set_balance(sd);
set_res(sd); set_res(sd);
set_read_mode(sd);
return 0; return 0;
}; };
...@@ -285,6 +320,12 @@ static int mt9v011_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) ...@@ -285,6 +320,12 @@ static int mt9v011_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
case V4L2_CID_BLUE_BALANCE: case V4L2_CID_BLUE_BALANCE:
ctrl->value = core->blue_bal; ctrl->value = core->blue_bal;
return 0; return 0;
case V4L2_CID_HFLIP:
ctrl->value = core->hflip ? 1 : 0;
return 0;
case V4L2_CID_VFLIP:
ctrl->value = core->vflip ? 1 : 0;
return 0;
} }
return -EINVAL; return -EINVAL;
} }
...@@ -333,6 +374,14 @@ static int mt9v011_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) ...@@ -333,6 +374,14 @@ static int mt9v011_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
case V4L2_CID_BLUE_BALANCE: case V4L2_CID_BLUE_BALANCE:
core->blue_bal = ctrl->value; core->blue_bal = ctrl->value;
break; break;
case V4L2_CID_HFLIP:
core->hflip = ctrl->value;
set_read_mode(sd);
return 0;
case V4L2_CID_VFLIP:
core->vflip = ctrl->value;
set_read_mode(sd);
return 0;
default: default:
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment