diff options
Diffstat (limited to 'drivers/media/i2c/imx258.c')
-rw-r--r-- | drivers/media/i2c/imx258.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c index 61d74b794582..a017ec4e0f50 100644 --- a/drivers/media/i2c/imx258.c +++ b/drivers/media/i2c/imx258.c @@ -61,6 +61,15 @@ #define IMX258_DGTL_GAIN_DEFAULT 1024 #define IMX258_DGTL_GAIN_STEP 1 +/* HDR control */ +#define IMX258_REG_HDR 0x0220 +#define IMX258_HDR_ON BIT(0) +#define IMX258_REG_HDR_RATIO 0x0222 +#define IMX258_HDR_RATIO_MIN 0 +#define IMX258_HDR_RATIO_MAX 5 +#define IMX258_HDR_RATIO_STEP 1 +#define IMX258_HDR_RATIO_DEFAULT 0x0 + /* Test Pattern Control */ #define IMX258_REG_TEST_PATTERN 0x0600 @@ -777,6 +786,22 @@ static int imx258_set_ctrl(struct v4l2_ctrl *ctrl) !ctrl->val ? REG_CONFIG_MIRROR_FLIP : REG_CONFIG_FLIP_TEST_PATTERN); break; + case V4L2_CID_WIDE_DYNAMIC_RANGE: + if (!ctrl->val) { + ret = imx258_write_reg(imx258, IMX258_REG_HDR, + IMX258_REG_VALUE_08BIT, + IMX258_HDR_RATIO_MIN); + } else { + ret = imx258_write_reg(imx258, IMX258_REG_HDR, + IMX258_REG_VALUE_08BIT, + IMX258_HDR_ON); + if (ret) + break; + ret = imx258_write_reg(imx258, IMX258_REG_HDR_RATIO, + IMX258_REG_VALUE_08BIT, + BIT(IMX258_HDR_RATIO_MAX)); + } + break; default: dev_info(&client->dev, "ctrl(id:0x%x,val:0x%x) is not handled\n", @@ -1193,6 +1218,9 @@ static int imx258_init_controls(struct imx258 *imx258) IMX258_DGTL_GAIN_STEP, IMX258_DGTL_GAIN_DEFAULT); + v4l2_ctrl_new_std(ctrl_hdlr, &imx258_ctrl_ops, V4L2_CID_WIDE_DYNAMIC_RANGE, + 0, 1, 1, IMX258_HDR_RATIO_DEFAULT); + v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx258_ctrl_ops, V4L2_CID_TEST_PATTERN, ARRAY_SIZE(imx258_test_pattern_menu) - 1, @@ -1289,7 +1317,7 @@ static int imx258_probe(struct i2c_client *client) if (ret) goto error_handler_free; - ret = v4l2_async_register_subdev_sensor_common(&imx258->sd); + ret = v4l2_async_register_subdev_sensor(&imx258->sd); if (ret < 0) goto error_media_entity; |