diff options
author | Antti Palosaari <crope@iki.fi> | 2013-07-31 20:48:51 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-08-20 15:01:52 -0400 |
commit | 22ca680e02aceb88d939b1eb1bbe3e94b71bf555 (patch) | |
tree | 73660253d8593cf876c88f78ebcaae8d70e77328 | |
parent | 6450e5091c6dfc12afc164e8225b7677b1b1a422 (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.c | 23 |
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 |
988 | static int msi3101_set_usb_adc(struct msi3101_state *s) | 988 | static 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) |