Re: [PATCH v3] media: ov5640: fix frame interval enumeration

2018-06-20 Thread kbuild test robot
Hi Hugues,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linuxtv-media/master]
[also build test WARNING on v4.18-rc1 next-20180619]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:
https://github.com/0day-ci/linux/commits/Hugues-Fruchet/media-ov5640-fix-frame-interval-enumeration/20180620-175405
base:   git://linuxtv.org/media_tree.git master
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> drivers/media/i2c/ov5640.c:1394:14: sparse: incorrect type in assignment 
>> (different base types) @@expected struct ov5640_mode_info const *mode @@ 
>>got ststruct ov5640_mode_info const *mode @@
   drivers/media/i2c/ov5640.c:1394:14:expected struct ov5640_mode_info 
const *mode
   drivers/media/i2c/ov5640.c:1394:14:got struct ov5640_mode_info const ( 
* )[9]

vim +1394 drivers/media/i2c/ov5640.c

  1387  
  1388  static const struct ov5640_mode_info *
  1389  ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
  1390   int width, int height, bool nearest)
  1391  {
  1392  const struct ov5640_mode_info *mode;
  1393  
> 1394  mode = v4l2_find_nearest_size(ov5640_mode_data[fr],
  1395ARRAY_SIZE(ov5640_mode_data[fr]),
  1396hact, vact,
  1397width, height);
  1398  
  1399  if (!mode ||
  1400  (!nearest && (mode->hact != width || mode->vact != height)))
  1401  return NULL;
  1402  
  1403  return mode;
  1404  }
  1405  

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


[PATCH v3] media: ov5640: fix frame interval enumeration

2018-06-20 Thread Hugues Fruchet
Driver must reject frame interval enumeration of unsupported resolution.
This was detected by v4l2-compliance format ioctl test:
v4l2-compliance Format ioctls:
info: found 2 frameintervals for pixel format 4745504a and size 176x144
  fail: v4l2-test-formats.cpp(123):
   found frame intervals for invalid size 177x144
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: FAIL

Signed-off-by: Hugues Fruchet 
---
version 2:
  - revisit patch according to Mauro comments:
See https://www.mail-archive.com/linux-media@vger.kernel.org/msg127380.html

version 3:
  - revisit patch using v4l2_find_nearest_size() helper as per Sakari 
suggestion:
See https://www.mail-archive.com/linux-media@vger.kernel.org/msg128186.html

 drivers/media/i2c/ov5640.c | 34 --
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index f6e40cc..e4b68e3 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -1389,24 +1389,16 @@ static int ov5640_set_timings(struct ov5640_dev *sensor,
 ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
 int width, int height, bool nearest)
 {
-   const struct ov5640_mode_info *mode = NULL;
-   int i;
-
-   for (i = OV5640_NUM_MODES - 1; i >= 0; i--) {
-   mode = &ov5640_mode_data[fr][i];
-
-   if (!mode->reg_data)
-   continue;
+   const struct ov5640_mode_info *mode;
 
-   if ((nearest && mode->hact <= width &&
-mode->vact <= height) ||
-   (!nearest && mode->hact == width &&
-mode->vact == height))
-   break;
-   }
+   mode = v4l2_find_nearest_size(ov5640_mode_data[fr],
+ ARRAY_SIZE(ov5640_mode_data[fr]),
+ hact, vact,
+ width, height);
 
-   if (nearest && i < 0)
-   mode = &ov5640_mode_data[fr][0];
+   if (!mode ||
+   (!nearest && (mode->hact != width || mode->vact != height)))
+   return NULL;
 
return mode;
 }
@@ -2435,8 +2427,14 @@ static int ov5640_s_frame_interval(struct v4l2_subdev 
*sd,
 
sensor->current_fr = frame_rate;
sensor->frame_interval = fi->interval;
-   sensor->current_mode = ov5640_find_mode(sensor, frame_rate, mode->hact,
-   mode->vact, true);
+   mode = ov5640_find_mode(sensor, frame_rate, mode->hact,
+   mode->vact, true);
+   if (!mode) {
+   ret = -EINVAL;
+   goto out;
+   }
+
+   sensor->current_mode = mode;
sensor->pending_mode_change = true;
 out:
mutex_unlock(&sensor->lock);
-- 
1.9.1