mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-13 10:38:44 -04:00
media: i2c: imx214: Add test pattern control
This adds V4L2_CID_TEST_PATTERN control support. Acked-by: Ricardo Ribalda <ribalda@chromium.org> Signed-off-by: André Apitzsch <git@apitzsch.eu> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
This commit is contained in:
committed by
Hans Verkuil
parent
f35f7422b9
commit
aac37a3a76
@@ -177,6 +177,23 @@
|
||||
|
||||
#define IMX214_REG_ATR_FAST_MOVE CCI_REG8(0x9300)
|
||||
|
||||
/* Test Pattern Control */
|
||||
#define IMX214_REG_TEST_PATTERN CCI_REG16(0x0600)
|
||||
#define IMX214_TEST_PATTERN_DISABLE 0
|
||||
#define IMX214_TEST_PATTERN_SOLID_COLOR 1
|
||||
#define IMX214_TEST_PATTERN_COLOR_BARS 2
|
||||
#define IMX214_TEST_PATTERN_GREY_COLOR 3
|
||||
#define IMX214_TEST_PATTERN_PN9 4
|
||||
|
||||
/* Test pattern colour components */
|
||||
#define IMX214_REG_TESTP_RED CCI_REG16(0x0602)
|
||||
#define IMX214_REG_TESTP_GREENR CCI_REG16(0x0604)
|
||||
#define IMX214_REG_TESTP_BLUE CCI_REG16(0x0606)
|
||||
#define IMX214_REG_TESTP_GREENB CCI_REG16(0x0608)
|
||||
#define IMX214_TESTP_COLOUR_MIN 0
|
||||
#define IMX214_TESTP_COLOUR_MAX 0x03ff
|
||||
#define IMX214_TESTP_COLOUR_STEP 1
|
||||
|
||||
/* IMX214 native and active pixel array size */
|
||||
#define IMX214_NATIVE_WIDTH 4224U
|
||||
#define IMX214_NATIVE_HEIGHT 3136U
|
||||
@@ -209,6 +226,22 @@ static const u32 imx214_mbus_formats[] = {
|
||||
MEDIA_BUS_FMT_SBGGR10_1X10,
|
||||
};
|
||||
|
||||
static const char * const imx214_test_pattern_menu[] = {
|
||||
"Disabled",
|
||||
"Color Bars",
|
||||
"Solid Color",
|
||||
"Grey Color Bars",
|
||||
"PN9"
|
||||
};
|
||||
|
||||
static const int imx214_test_pattern_val[] = {
|
||||
IMX214_TEST_PATTERN_DISABLE,
|
||||
IMX214_TEST_PATTERN_COLOR_BARS,
|
||||
IMX214_TEST_PATTERN_SOLID_COLOR,
|
||||
IMX214_TEST_PATTERN_GREY_COLOR,
|
||||
IMX214_TEST_PATTERN_PN9,
|
||||
};
|
||||
|
||||
struct imx214 {
|
||||
struct device *dev;
|
||||
struct clk *xclk;
|
||||
@@ -807,6 +840,26 @@ static int imx214_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
cci_write(imx214->regmap, IMX214_REG_FRM_LENGTH_LINES,
|
||||
format->height + ctrl->val, &ret);
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN:
|
||||
cci_write(imx214->regmap, IMX214_REG_TEST_PATTERN,
|
||||
imx214_test_pattern_val[ctrl->val], &ret);
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN_RED:
|
||||
cci_write(imx214->regmap, IMX214_REG_TESTP_RED,
|
||||
ctrl->val, &ret);
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN_GREENR:
|
||||
cci_write(imx214->regmap, IMX214_REG_TESTP_GREENR,
|
||||
ctrl->val, &ret);
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN_BLUE:
|
||||
cci_write(imx214->regmap, IMX214_REG_TESTP_BLUE,
|
||||
ctrl->val, &ret);
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN_GREENB:
|
||||
cci_write(imx214->regmap, IMX214_REG_TESTP_GREENB,
|
||||
ctrl->val, &ret);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
}
|
||||
@@ -834,14 +887,14 @@ static int imx214_ctrls_init(struct imx214 *imx214)
|
||||
struct v4l2_ctrl_handler *ctrl_hdlr;
|
||||
int exposure_max, exposure_def;
|
||||
int hblank;
|
||||
int ret;
|
||||
int i, ret;
|
||||
|
||||
ret = v4l2_fwnode_device_parse(imx214->dev, &props);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ctrl_hdlr = &imx214->ctrls;
|
||||
ret = v4l2_ctrl_handler_init(&imx214->ctrls, 12);
|
||||
ret = v4l2_ctrl_handler_init(&imx214->ctrls, 13);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -910,6 +963,26 @@ static int imx214_ctrls_init(struct imx214 *imx214)
|
||||
|
||||
v4l2_ctrl_cluster(2, &imx214->hflip);
|
||||
|
||||
v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx214_ctrl_ops,
|
||||
V4L2_CID_TEST_PATTERN,
|
||||
ARRAY_SIZE(imx214_test_pattern_menu) - 1,
|
||||
0, 0, imx214_test_pattern_menu);
|
||||
for (i = 0; i < 4; i++) {
|
||||
/*
|
||||
* The assumption is that
|
||||
* V4L2_CID_TEST_PATTERN_GREENR == V4L2_CID_TEST_PATTERN_RED + 1
|
||||
* V4L2_CID_TEST_PATTERN_BLUE == V4L2_CID_TEST_PATTERN_RED + 2
|
||||
* V4L2_CID_TEST_PATTERN_GREENB == V4L2_CID_TEST_PATTERN_RED + 3
|
||||
*/
|
||||
v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
|
||||
V4L2_CID_TEST_PATTERN_RED + i,
|
||||
IMX214_TESTP_COLOUR_MIN,
|
||||
IMX214_TESTP_COLOUR_MAX,
|
||||
IMX214_TESTP_COLOUR_STEP,
|
||||
IMX214_TESTP_COLOUR_MAX);
|
||||
/* The "Solid color" pattern is white by default */
|
||||
}
|
||||
|
||||
imx214->unit_size = v4l2_ctrl_new_std_compound(ctrl_hdlr,
|
||||
NULL,
|
||||
V4L2_CID_UNIT_CELL_SIZE,
|
||||
|
||||
Reference in New Issue
Block a user