media: i2c: imx334: add support for test pattern generator

Add support for the imx334's test pattern generator.
By default the test pattern generator is disabled, so add support for
enabling and disabling horizontal and vertical colour bars.

Signed-off-by: Shravan Chippa <shravan.chippa@microchip.com>
Acked-by: Daniele Alessandrelli <daniele.alessandrelli@intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
This commit is contained in:
Shravan Chippa 2023-08-04 20:45:41 +05:30 committed by Hans Verkuil
parent 2d13621c6b
commit a6403dddae

View file

@ -56,6 +56,24 @@
#define IMX334_REG_MIN 0x00
#define IMX334_REG_MAX 0xfffff
/* Test Pattern Control */
#define IMX334_REG_TP 0x329e
#define IMX334_TP_COLOR_HBARS 0xA
#define IMX334_TP_COLOR_VBARS 0xB
#define IMX334_TPG_EN_DOUT 0x329c
#define IMX334_TP_ENABLE 0x1
#define IMX334_TP_DISABLE 0x0
#define IMX334_TPG_COLORW 0x32a0
#define IMX334_TPG_COLORW_120P 0x13
#define IMX334_TP_CLK_EN 0x3148
#define IMX334_TP_CLK_EN_VAL 0x10
#define IMX334_TP_CLK_DIS_VAL 0x0
#define IMX334_DIG_CLP_MODE 0x3280
/**
* struct imx334_reg - imx334 sensor register
* @address: Register address
@ -430,6 +448,18 @@ static const struct imx334_reg mode_3840x2160_regs[] = {
{0x3a29, 0x00},
};
static const char * const imx334_test_pattern_menu[] = {
"Disabled",
"Vertical Color Bars",
"Horizontal Color Bars",
};
static const int imx334_test_pattern_val[] = {
IMX334_TP_DISABLE,
IMX334_TP_COLOR_HBARS,
IMX334_TP_COLOR_VBARS,
};
static const struct imx334_reg raw10_framefmt_regs[] = {
{0x3050, 0x00},
{0x319d, 0x00},
@ -716,6 +746,26 @@ static int imx334_set_ctrl(struct v4l2_ctrl *ctrl)
case V4L2_CID_HBLANK:
ret = 0;
break;
case V4L2_CID_TEST_PATTERN:
if (ctrl->val) {
imx334_write_reg(imx334, IMX334_TP_CLK_EN, 1,
IMX334_TP_CLK_EN_VAL);
imx334_write_reg(imx334, IMX334_DIG_CLP_MODE, 1, 0x0);
imx334_write_reg(imx334, IMX334_TPG_COLORW, 1,
IMX334_TPG_COLORW_120P);
imx334_write_reg(imx334, IMX334_REG_TP, 1,
imx334_test_pattern_val[ctrl->val]);
imx334_write_reg(imx334, IMX334_TPG_EN_DOUT, 1,
IMX334_TP_ENABLE);
} else {
imx334_write_reg(imx334, IMX334_DIG_CLP_MODE, 1, 0x1);
imx334_write_reg(imx334, IMX334_TP_CLK_EN, 1,
IMX334_TP_CLK_DIS_VAL);
imx334_write_reg(imx334, IMX334_TPG_EN_DOUT, 1,
IMX334_TP_DISABLE);
}
ret = 0;
break;
default:
dev_err(imx334->dev, "Invalid control %d", ctrl->id);
ret = -EINVAL;
@ -1222,7 +1272,7 @@ static int imx334_init_controls(struct imx334 *imx334)
u32 lpfr;
int ret;
ret = v4l2_ctrl_handler_init(ctrl_hdlr, 6);
ret = v4l2_ctrl_handler_init(ctrl_hdlr, 7);
if (ret)
return ret;
@ -1282,6 +1332,11 @@ static int imx334_init_controls(struct imx334 *imx334)
if (imx334->hblank_ctrl)
imx334->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx334_ctrl_ops,
V4L2_CID_TEST_PATTERN,
ARRAY_SIZE(imx334_test_pattern_menu) - 1,
0, 0, imx334_test_pattern_menu);
if (ctrl_hdlr->error) {
dev_err(imx334->dev, "control init failed: %d",
ctrl_hdlr->error);