From: Benjamin Bara <benjamin.bara@xxxxxxxxxxx> For now, the driver activates the first mode (1080p) as current active mode in probe(). This e.g. means that one cannot set VBLANK below 45 (vmax_min - height), although theoretically the minimum is 30 (720p mode). Define the absolute possible/supported ranges to have them available later. Signed-off-by: Benjamin Bara <benjamin.bara@xxxxxxxxxxx> --- Changes since v2: - new --- drivers/media/i2c/imx290.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c index 1c97f9650eb4..466492bab600 100644 --- a/drivers/media/i2c/imx290.c +++ b/drivers/media/i2c/imx290.c @@ -499,6 +499,10 @@ static const struct imx290_clk_cfg imx290_720p_clock_config[] = { }; /* Mode configs */ +#define WIDTH_720P 1280 +#define HEIGHT_720P 720 +#define MINIMUM_WIDTH WIDTH_720P +#define MINIMUM_HEIGHT HEIGHT_720P static const struct imx290_mode imx290_modes_2lanes[] = { { .width = 1920, @@ -512,8 +516,8 @@ static const struct imx290_mode imx290_modes_2lanes[] = { .clk_cfg = imx290_1080p_clock_config, }, { - .width = 1280, - .height = 720, + .width = WIDTH_720P, + .height = HEIGHT_720P, .hmax_min = 3300, .vmax_min = 750, .link_freq_index = FREQ_INDEX_720P, @@ -537,8 +541,8 @@ static const struct imx290_mode imx290_modes_4lanes[] = { .clk_cfg = imx290_1080p_clock_config, }, { - .width = 1280, - .height = 720, + .width = WIDTH_720P, + .height = HEIGHT_720P, .hmax_min = 3300, .vmax_min = 750, .link_freq_index = FREQ_INDEX_720P, @@ -846,6 +850,30 @@ static const char * const imx290_test_pattern_menu[] = { "000/555h Toggle Pattern", }; +/* absolute supported control ranges */ +#define HBLANK_MAX (IMX290_HMAX_MAX - MINIMUM_WIDTH) +#define VBLANK_MAX (IMX290_VMAX_MAX - MINIMUM_HEIGHT) +static unsigned int imx290_get_blank_min(const struct imx290 *imx290, bool v) +{ + const struct imx290_mode *modes = imx290_modes_ptr(imx290); + unsigned int min = UINT_MAX; + int i; + + for (i = 0; i < imx290_modes_num(imx290); i++) { + unsigned int tmp; + + if (v) + tmp = modes[i].hmax_min - modes[i].width; + else + tmp = modes[i].vmax_min - modes[i].height; + + if (tmp < min) + min = tmp; + } + + return min; +} + static void imx290_ctrl_update(struct imx290 *imx290, const struct imx290_mode *mode) { -- 2.46.0