[media] v4l2-dv-timing: avoid rounding twice in gtf hblank calc
authorPrashant Laddha <prladdha@cisco.com>
Fri, 5 Jun 2015 08:13:31 +0000 (05:13 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 9 Jun 2015 20:41:47 +0000 (17:41 -0300)
Currently, in gtf hblank calculations, the rounding is used twice,
one at intermediate division and one at final state where hblank
is rounded to nearest multiple of twice cell granularity. This
error got introduced in 'commit d7ed5a3ddaec ("[media]
v4l2-dv-timings: fix rounding in hblank and hsync calculation"),
where it missed combining the rounding step. Correcting the same
in this patch.

Signed-off-by: Prashant Laddha <prladdha@cisco.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/v4l2-core/v4l2-dv-timings.c

index 5792192bce6ccd3c14cf9ec01cdced4fbeb0dcc3..89866100a74ae31f6f5b29a55b03b177726e7acf 100644 (file)
@@ -561,20 +561,22 @@ bool v4l2_detect_gtf(unsigned frame_height,
 
                num = ((image_width * GTF_D_C_PRIME * (u64)hfreq) -
                      ((u64)image_width * GTF_D_M_PRIME * 1000));
-               den = hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000;
+               den = (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000) *
+                     (2 * GTF_CELL_GRAN);
                h_blank = div_u64((num + (den >> 1)), den);
+               h_blank *= (2 * GTF_CELL_GRAN);
        } else {
                u64 num;
                u32 den;
 
                num = ((image_width * GTF_S_C_PRIME * (u64)hfreq) -
                      ((u64)image_width * GTF_S_M_PRIME * 1000));
-               den = hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000;
+               den = (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000) *
+                     (2 * GTF_CELL_GRAN);
                h_blank = div_u64((num + (den >> 1)), den);
+               h_blank *= (2 * GTF_CELL_GRAN);
        }
 
-       h_blank = ((h_blank + GTF_CELL_GRAN) / (2 * GTF_CELL_GRAN)) *
-                 (2 * GTF_CELL_GRAN);
        frame_width = image_width + h_blank;
 
        pix_clk = (image_width + h_blank) * hfreq;