diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c index 6dacd38ae947a1..9886a7fcdde2f3 100644 --- a/drivers/media/i2c/imx290.c +++ b/drivers/media/i2c/imx290.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,9 @@ #define IMX290_WINMODE_720P (1 << 4) #define IMX290_WINMODE_CROP (4 << 4) #define IMX290_FR_FDG_SEL CCI_REG8(0x3009) +#define IMX290_FDG_HCG BIT(4) +#define IMX290_FRSEL_60FPS BIT(0) +#define IMX290_FDG_LCG 0 #define IMX290_BLKLEVEL CCI_REG16_LE(0x300a) #define IMX290_GAIN CCI_REG8(0x3014) #define IMX290_VMAX CCI_REG24_LE(0x3018) @@ -162,6 +166,10 @@ #define IMX290_NUM_SUPPLIES 3 +static bool hcg_mode; +module_param(hcg_mode, bool, 0664); +MODULE_PARM_DESC(hcg_mode, "Enable HCG mode"); + enum imx290_colour_variant { IMX290_VARIANT_COLOUR, IMX290_VARIANT_MONO, @@ -649,7 +657,6 @@ static int imx290_set_data_lanes(struct imx290 *imx290) &ret); cci_write(imx290->regmap, IMX290_CSI_LANE_MODE, imx290->nlanes - 1, &ret); - cci_write(imx290->regmap, IMX290_FR_FDG_SEL, 0x01, &ret); return ret; } @@ -763,6 +770,10 @@ static int imx290_set_ctrl(struct v4l2_ctrl *ctrl) switch (ctrl->id) { case V4L2_CID_ANALOGUE_GAIN: ret = cci_write(imx290->regmap, IMX290_GAIN, ctrl->val, NULL); + + cci_write(imx290->regmap, IMX290_FR_FDG_SEL, + IMX290_FRSEL_60FPS | hcg_mode ? + IMX290_FDG_HCG : IMX290_FDG_LCG, &ret); break; case V4L2_CID_VBLANK: