V4L/DVB (11898): cx18: Perform 64 bit divide so it works for 32 bit systems
authorAndy Walls <awalls@radix.net>
Fri, 29 May 2009 23:54:02 +0000 (20:54 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 16 Jun 2009 21:21:16 +0000 (18:21 -0300)
Thanks to David Ward and Mike Krufky for reporting the problem and
debugging this as an unresolved symbol due to a 64 bit divide on a 32 bit
system.  David Ward provided the content of this patch; Andy Walls only
performed some cosmetic edits.

Reported-by: David Ward <david.ward@gatech.edu>
Signed-off-by: David Ward <david.ward@gatech.edu>
Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx18/cx18-av-core.c

index 0b3d840cc2e2c2f23f09e84cf7e4c8a32ba59882..536dedb23ba36cb3080a53c0e958c6049d20300c 100644 (file)
@@ -447,6 +447,7 @@ void cx18_av_std_setup(struct cx18 *cx)
 
        if (pll_post) {
                int fsc, pll;
+               u64 tmp;
 
                pll = (28636360L * ((((u64)pll_int) << 25) + pll_frac)) >> 25;
                pll /= pll_post;
@@ -459,7 +460,9 @@ void cx18_av_std_setup(struct cx18 *cx)
                                    "= %d.%03d\n", src_decimation / 256,
                                    ((src_decimation % 256) * 1000) / 256);
 
-               fsc = ((((u64)sc) * 28636360)/src_decimation) >> 13L;
+               tmp = 28636360 * (u64) sc;
+               do_div(tmp, src_decimation);
+               fsc = tmp >> 13;
                CX18_DEBUG_INFO_DEV(sd,
                                    "Chroma sub-carrier initial freq = %d.%06d "
                                    "MHz\n", fsc / 1000000, fsc % 1000000);