Reduce parallel port rate according to maximum pixel clock frequency admissible by camera interface. This allows to support any resolutions/framerate requests by decreasing the framerate according to maximum camera interface capabilities. Signed-off-by: Hugues Fruchet <hugues.fruchet@xxxxxx> --- drivers/media/i2c/ov5640.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c index da4d754..9f3c32e 100644 --- a/drivers/media/i2c/ov5640.c +++ b/drivers/media/i2c/ov5640.c @@ -918,6 +918,8 @@ static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor, { u8 prediv, mult, sysdiv, pll_rdiv, bit_div, pclk_div; int ret; + struct i2c_client *client = sensor->i2c_client; + unsigned int pclk_freq, max_pclk_freq; /* * FIXME, value of PCLK divider deduced from * mode registers hardcoded sequence and tests @@ -941,6 +943,16 @@ static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor, if (ret) return ret; + pclk_freq = rate / dvp_pclk_divider; + max_pclk_freq = sensor->ep.bus.parallel.pclk_max_frequency; + + /* clip rate according to optional maximum pixel clock limit */ + if (max_pclk_freq && pclk_freq > max_pclk_freq) { + rate = max_pclk_freq * dvp_pclk_divider; + dev_dbg(&client->dev, "DVP pixel clock too high (%d > %d Hz), reducing rate...\n", + pclk_freq, max_pclk_freq); + } + ov5640_calc_pclk(sensor, rate, &prediv, &mult, &sysdiv, &pll_rdiv, &bit_div, &pclk_div); -- 2.7.4