From b65bd423d8b1b7ccf7cd40ed0e91165b6bb4c507 Mon Sep 17 00:00:00 2001 From: Yiqing Zeng Date: Tue, 22 Sep 2020 10:48:17 +0800 Subject: [PATCH] media: i2c: imx307 update exposure formula and max expsure 1. max exposure = vts - 2; 2. shs1 = vts - (exp_line + 1); Signed-off-by: Yiqing Zeng Change-Id: Ibe955838d6f1c995f25ff2d29c911197b3186e0a --- drivers/media/i2c/imx307.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/media/i2c/imx307.c b/drivers/media/i2c/imx307.c index b2ccbbda9681..4f75c3b81eec 100644 --- a/drivers/media/i2c/imx307.c +++ b/drivers/media/i2c/imx307.c @@ -8,6 +8,9 @@ * v1.0x01.0x02 * 1.fixed lvds output data offset, because lvds regards ob line as valid data output * 2.support test pattern + * v1.0x01.0x03 update frame rate from 25fps to 30fps + * v1.0x01.0x04 update max exposure and formula + * shs1 = vts - (line + 1) */ #include @@ -32,7 +35,7 @@ #include #include -#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x02) +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x04) #ifndef V4L2_CID_DIGITAL_GAIN #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN #endif @@ -1278,7 +1281,7 @@ static int imx307_init_conversion_gain(struct imx307 *imx307) IMX307_REG_VALUE_08BIT, &val); val &= 0xef; - ret = imx307_write_reg(client, + ret |= imx307_write_reg(client, IMX307_GAIN_SWITCH_REG, IMX307_REG_VALUE_08BIT, val); @@ -1299,6 +1302,8 @@ static int __imx307_start_stream(struct imx307 *imx307) return ret; /* In case these controls are set before streaming */ ret = __v4l2_ctrl_handler_setup(&imx307->ctrl_handler); + if (ret) + return ret; if (imx307->has_init_exp && imx307->cur_mode->hdr_mode != NO_HDR) { ret = imx307_ioctl(&imx307->subdev, PREISP_CMD_SET_HDRAE_EXP, &imx307->init_hdrae_exp); @@ -1629,7 +1634,7 @@ static int imx307_set_ctrl(struct v4l2_ctrl *ctrl) switch (ctrl->id) { case V4L2_CID_VBLANK: /* Update max exposure while meeting expected vblanking */ - max = imx307->cur_mode->height + ctrl->val - 4; + max = imx307->cur_mode->height + ctrl->val - 2; __v4l2_ctrl_modify_range(imx307->exposure, imx307->exposure->minimum, max, imx307->exposure->step, @@ -1642,7 +1647,7 @@ static int imx307_set_ctrl(struct v4l2_ctrl *ctrl) switch (ctrl->id) { case V4L2_CID_EXPOSURE: - shs1 = imx307->cur_vts - ctrl->val; + shs1 = imx307->cur_vts - (ctrl->val + 1); ret = imx307_write_reg(imx307->client, IMX307_REG_SHS1_H, IMX307_REG_VALUE_08BIT, @@ -1895,6 +1900,8 @@ static int imx307_probe(struct i2c_client *client, ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(endpoint), &imx307->bus_cfg); + if (ret) + dev_warn(dev, "could not get bus config!\n"); if (imx307->bus_cfg.bus_type == 3) { imx307->support_modes = lvds_supported_modes; imx307->support_modes_num = ARRAY_SIZE(lvds_supported_modes);