[media] stb0899: sign extend raw CRL_FREQ value
authorReinhard Nißl <rnissl@gmx.de>
Sun, 2 Jun 2013 17:37:06 +0000 (14:37 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 8 Jun 2013 23:11:49 +0000 (20:11 -0300)
Contrary to the chip's specs, the register's value is signed, so we
need to sign extend the value before using it in calculations like
when determining the offset frequency.

Signed-off-by: Reinhard Nißl <rnissl@gmx.de>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb-frontends/stb0899_algo.c

index 117a56926dcad041316a53f4ea47ed3c7263505f..bd9dbd70af0fcfa460e4629e54f4e004dfda3da6 100644 (file)
@@ -1487,6 +1487,10 @@ enum stb0899_status stb0899_dvbs2_algo(struct stb0899_state *state)
                /* Store signal parameters      */
                offsetfreq = STB0899_READ_S2REG(STB0899_S2DEMOD, CRL_FREQ);
 
+               /* sign extend 30 bit value before using it in calculations */
+               if (offsetfreq & (1 << 29))
+                       offsetfreq |= -1 << 30;
+
                offsetfreq = offsetfreq / ((1 << 30) / 1000);
                offsetfreq *= (internal->master_clk / 1000000);
                reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_CNTRL2);