media: i2c: adv7180: Add support for the test patterns
ADV7180 has a built-in mechanism to generate some video patterns, which is very useful for debug/bring-up activities. Add support for it. The test_pattern parameter can be one of the following values: 0: "Single color" 1: "Color bars" 2: "Luma ramp" 3: "Boundary box" 4: "Disable" Tested on a imx6q board with an ADV7280. Signed-off-by: Fabio Estevam <festevam@gmail.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
7a12903182
commit
a76c86f427
@ -66,6 +66,9 @@
|
||||
#define ADV7180_HUE_DEF 0
|
||||
#define ADV7180_HUE_MAX 128
|
||||
|
||||
#define ADV7180_REG_DEF_VALUE_Y 0x000c
|
||||
#define ADV7180_DEF_VAL_EN 0x1
|
||||
#define ADV7180_DEF_VAL_AUTO_EN 0x2
|
||||
#define ADV7180_REG_CTRL 0x000e
|
||||
#define ADV7180_CTRL_IRQ_SPACE 0x20
|
||||
|
||||
@ -549,6 +552,40 @@ static int adv7180_s_power(struct v4l2_subdev *sd, int on)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const char * const test_pattern_menu[] = {
|
||||
"Single color",
|
||||
"Color bars",
|
||||
"Luma ramp",
|
||||
"Boundary box",
|
||||
"Disable",
|
||||
};
|
||||
|
||||
static int adv7180_test_pattern(struct adv7180_state *state, int value)
|
||||
{
|
||||
unsigned int reg = 0;
|
||||
|
||||
/* Map menu value into register value */
|
||||
if (value < 3)
|
||||
reg = value;
|
||||
if (value == 3)
|
||||
reg = 5;
|
||||
|
||||
adv7180_write(state, ADV7180_REG_ANALOG_CLAMP_CTL, reg);
|
||||
|
||||
if (value == ARRAY_SIZE(test_pattern_menu) - 1) {
|
||||
reg = adv7180_read(state, ADV7180_REG_DEF_VALUE_Y);
|
||||
reg &= ~ADV7180_DEF_VAL_EN;
|
||||
adv7180_write(state, ADV7180_REG_DEF_VALUE_Y, reg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
reg = adv7180_read(state, ADV7180_REG_DEF_VALUE_Y);
|
||||
reg |= ADV7180_DEF_VAL_EN | ADV7180_DEF_VAL_AUTO_EN;
|
||||
adv7180_write(state, ADV7180_REG_DEF_VALUE_Y, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adv7180_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct v4l2_subdev *sd = to_adv7180_sd(ctrl);
|
||||
@ -592,6 +629,9 @@ static int adv7180_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
adv7180_write(state, ADV7180_REG_FLCONTROL, 0x00);
|
||||
}
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN:
|
||||
ret = adv7180_test_pattern(state, val);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
}
|
||||
@ -632,6 +672,12 @@ static int adv7180_init_controls(struct adv7180_state *state)
|
||||
ADV7180_HUE_MAX, 1, ADV7180_HUE_DEF);
|
||||
v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL);
|
||||
|
||||
v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, &adv7180_ctrl_ops,
|
||||
V4L2_CID_TEST_PATTERN,
|
||||
ARRAY_SIZE(test_pattern_menu) - 1,
|
||||
0, ARRAY_SIZE(test_pattern_menu) - 1,
|
||||
test_pattern_menu);
|
||||
|
||||
state->sd.ctrl_handler = &state->ctrl_hdl;
|
||||
if (state->ctrl_hdl.error) {
|
||||
int err = state->ctrl_hdl.error;
|
||||
|
Loading…
x
Reference in New Issue
Block a user