diff options
Diffstat (limited to 'drivers/media/dvb-frontends/cx24123.c')
| -rw-r--r-- | drivers/media/dvb-frontends/cx24123.c | 28 | 
1 files changed, 7 insertions, 21 deletions
diff --git a/drivers/media/dvb-frontends/cx24123.c b/drivers/media/dvb-frontends/cx24123.c index 68c88ab58e7..a771da3e9f9 100644 --- a/drivers/media/dvb-frontends/cx24123.c +++ b/drivers/media/dvb-frontends/cx24123.c @@ -26,6 +26,7 @@  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/init.h> +#include <asm/div64.h>  #include "dvb_frontend.h"  #include "cx24123.h" @@ -452,7 +453,8 @@ static u32 cx24123_int_log2(u32 a, u32 b)  static int cx24123_set_symbolrate(struct cx24123_state *state, u32 srate)  { -	u32 tmp, sample_rate, ratio, sample_gain; +	u64 tmp; +	u32 sample_rate, ratio, sample_gain;  	u8 pll_mult;  	/*  check if symbol rate is within limits */ @@ -482,27 +484,11 @@ static int cx24123_set_symbolrate(struct cx24123_state *state, u32 srate)  	sample_rate = pll_mult * XTAL; -	/* -	    SYSSymbolRate[21:0] = (srate << 23) / sample_rate - -	    We have to use 32 bit unsigned arithmetic without precision loss. -	    The maximum srate is 45000000 or 0x02AEA540. This number has -	    only 6 clear bits on top, hence we can shift it left only 6 bits -	    at a time. Borrowed from cx24110.c -	*/ - -	tmp = srate << 6; -	ratio = tmp / sample_rate; - -	tmp = (tmp % sample_rate) << 6; -	ratio = (ratio << 6) + (tmp / sample_rate); - -	tmp = (tmp % sample_rate) << 6; -	ratio = (ratio << 6) + (tmp / sample_rate); - -	tmp = (tmp % sample_rate) << 5; -	ratio = (ratio << 5) + (tmp / sample_rate); +	/* SYSSymbolRate[21:0] = (srate << 23) / sample_rate */ +	tmp = ((u64)srate) << 23; +	do_div(tmp, sample_rate); +	ratio = (u32) tmp;  	cx24123_writereg(state, 0x01, pll_mult * 6);  |