V4L/DVB: lgs8gxx: Use shifts rather than multiply/divide when possible
authorDavid Howells <dhowells@redhat.com>
Fri, 11 Dec 2009 16:11:05 +0000 (13:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 16 Dec 2009 11:27:50 +0000 (09:27 -0200)
If val is a u64, then following:

val *= (u64)1 << 32;
val /= (u64)1 << 32;

should surely be better represented as:

val <<= 32;
val >>= 32;

Especially as, for the division, the compiler might want to actually do a
division:

drivers/built-in.o: In function `lgs8gxx_get_afc_phase':
drivers/media/dvb/frontends/lgs8gxx.c:250: undefined reference to `__udivdi3'

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/lgs8gxx.c

index eabcadc..dee5396 100644 (file)
@@ -199,7 +199,7 @@ static int lgs8gxx_set_if_freq(struct lgs8gxx_state *priv, u32 freq /*in kHz*/)
 
        val = freq;
        if (freq != 0) {
-               val *= (u64)1 << 32;
+               val <<= 32;
                if (if_clk != 0)
                        do_div(val, if_clk);
                v32 = val & 0xFFFFFFFF;
@@ -246,7 +246,7 @@ static int lgs8gxx_get_afc_phase(struct lgs8gxx_state *priv)
 
        val = v32;
        val *= priv->config->if_clk_freq;
-       val /= (u64)1 << 32;
+       val >>= 32;
        dprintk("AFC = %u kHz\n", (u32)val);
        return 0;
 }