aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2013-07-31 20:48:51 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-08-20 15:01:52 -0400
commit22ca680e02aceb88d939b1eb1bbe3e94b71bf555 (patch)
tree73660253d8593cf876c88f78ebcaae8d70e77328
parent6450e5091c6dfc12afc164e8225b7677b1b1a422 (diff)
[media] msi3101: correct ADC sampling rate calc a little bit
No need to compare numbers, we could just store that fractional value MSB directly. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/staging/media/msi3101/sdr-msi3101.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/drivers/staging/media/msi3101/sdr-msi3101.c b/drivers/staging/media/msi3101/sdr-msi3101.c
index 2b73fc1f39f4..04bbbdf0acd3 100644
--- a/drivers/staging/media/msi3101/sdr-msi3101.c
+++ b/drivers/staging/media/msi3101/sdr-msi3101.c
@@ -987,7 +987,7 @@ static int msi3101_tuner_write(struct msi3101_state *s, u32 data)
987#define DIV_R_IN 2 987#define DIV_R_IN 2
988static int msi3101_set_usb_adc(struct msi3101_state *s) 988static int msi3101_set_usb_adc(struct msi3101_state *s)
989{ 989{
990 int ret, div_n, div_m, div_r_out, f_sr, f_vco; 990 int ret, div_n, div_m, div_r_out, f_sr, f_vco, fract;
991 u32 reg4, reg3; 991 u32 reg4, reg3;
992 /* 992 /*
993 * Synthesizer config is just a educated guess... 993 * Synthesizer config is just a educated guess...
@@ -998,7 +998,7 @@ static int msi3101_set_usb_adc(struct msi3101_state *s)
998 * [12:10] output divider 998 * [12:10] output divider
999 * [13] 0 ? 999 * [13] 0 ?
1000 * [14] 0 ? 1000 * [14] 0 ?
1001 * [15] increase sr by max fract 1001 * [15] fractional MSB, bit 20
1002 * [16:19] N 1002 * [16:19] N
1003 * [23:20] ? 1003 * [23:20] ?
1004 * [24:31] 0x01 1004 * [24:31] 0x01
@@ -1019,6 +1019,7 @@ static int msi3101_set_usb_adc(struct msi3101_state *s)
1019 1019
1020 f_sr = s->ctrl_sampling_rate->val64; 1020 f_sr = s->ctrl_sampling_rate->val64;
1021 reg3 = 0x01c00303; 1021 reg3 = 0x01c00303;
1022 reg4 = 0x00000004;
1022 1023
1023 for (div_r_out = 4; div_r_out < 16; div_r_out += 2) { 1024 for (div_r_out = 4; div_r_out < 16; div_r_out += 2) {
1024 f_vco = f_sr * div_r_out * 12; 1025 f_vco = f_sr * div_r_out * 12;
@@ -1030,24 +1031,16 @@ static int msi3101_set_usb_adc(struct msi3101_state *s)
1030 1031
1031 div_n = f_vco / (F_REF * DIV_R_IN); 1032 div_n = f_vco / (F_REF * DIV_R_IN);
1032 div_m = f_vco % (F_REF * DIV_R_IN); 1033 div_m = f_vco % (F_REF * DIV_R_IN);
1034 fract = 0x200000ul * div_m / (F_REF * DIV_R_IN);
1033 1035
1034 reg3 |= div_n << 16; 1036 reg3 |= div_n << 16;
1035 reg3 |= (div_r_out / 2 - 1) << 10; 1037 reg3 |= (div_r_out / 2 - 1) << 10;
1036 reg4 = 0x0ffffful * div_m / F_REF; 1038 reg3 |= ((fract >> 20) & 0x000001) << 15; /* [20] */
1037 1039 reg4 |= ((fract >> 0) & 0x0fffff) << 8; /* [19:0] */
1038 if (reg4 >= 0x0ffffful) {
1039 dev_dbg(&s->udev->dev,
1040 "%s: extending fractional part value %08x\n",
1041 __func__, reg4);
1042 reg4 -= 0x0ffffful;
1043 reg3 |= 1 << 15;
1044 }
1045
1046 reg4 = (reg4 << 8) | 0x04;
1047 1040
1048 dev_dbg(&s->udev->dev, 1041 dev_dbg(&s->udev->dev,
1049 "%s: f_sr=%d f_vco=%d div_n=%d div_m=%d div_r_out=%d reg4=%08x\n", 1042 "%s: f_sr=%d f_vco=%d div_n=%d div_m=%d div_r_out=%d reg3=%08x reg4=%08x\n",
1050 __func__, f_sr, f_vco, div_n, div_m, div_r_out, reg4); 1043 __func__, f_sr, f_vco, div_n, div_m, div_r_out, reg3, reg4);
1051 1044
1052 ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00608008); 1045 ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00608008);
1053 if (ret) 1046 if (ret)