diff -r 42a7b0fff69d linux/drivers/media/dvb/frontends/stb0899_algo.c --- a/linux/drivers/media/dvb/frontends/stb0899_algo.c Sat Apr 19 11:27:44 2008 +0200 +++ b/linux/drivers/media/dvb/frontends/stb0899_algo.c Sat Apr 19 11:30:47 2008 +0200 @@ -1539,14 +1539,16 @@ enum stb0899_status stb0899_dvbs2_algo(s /* Store signal parameters */ offsetfreq = STB0899_READ_S2REG(STB0899_S2DEMOD, CRL_FREQ); + if (offsetfreq & 0x20000000) { + /* sign extension */ + offsetfreq |= 0xc0000000; + } + /* use 64-bit arithmetic to avoid overflow */ + offsetfreq = (s32)((s64)offsetfreq * + ((s64)internal->master_clk / (s64)1000000) / + ((s64)((1 << 30) / (s64)1000))); - offsetfreq = offsetfreq / ((1 << 30) / 1000); - offsetfreq *= (internal->master_clk / 1000000); - reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_CNTRL2); - if (STB0899_GETFIELD(SPECTRUM_INVERT, reg)) - offsetfreq *= -1; - - internal->freq = internal->freq - offsetfreq; + internal->freq = internal->freq + offsetfreq; internal->srate = stb0899_dvbs2_get_srate(state); reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_STAT2);