aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/radio
diff options
context:
space:
mode:
authorTrent Piepho <xyzzy@speakeasy.org>2007-09-30 23:32:25 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-10-09 21:14:50 -0400
commit857e594ad5662349d95ad33f987cbf55cc356a90 (patch)
treed5ad5fdc83564008dba1644adff48c4a1e95903a /drivers/media/radio
parent4753647e6422341a091e729b9d81a9a5e7fe6179 (diff)
V4L/DVB (6245): GemTek Radio card - frequency calculation
Frequency calculation to use better math. It's still the same IF offset and step size (which are not the same as the datasheet says) as the code was before. It's just more efficient and accurate. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Reviewed-by: Pekka Seppänen <pexu@kapsi.fi> Signed-off-by: Douglas Schilling Landgraf <dougsland@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/radio')
-rw-r--r--drivers/media/radio/radio-gemtek.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/media/radio/radio-gemtek.c b/drivers/media/radio/radio-gemtek.c
index f959bb71c460..0fcd2b09218d 100644
--- a/drivers/media/radio/radio-gemtek.c
+++ b/drivers/media/radio/radio-gemtek.c
@@ -89,6 +89,14 @@ module_param(radio_nr, int, 0444);
89#define GEMTEK_LOWFREQ (87*16000) 89#define GEMTEK_LOWFREQ (87*16000)
90#define GEMTEK_HIGHFREQ (108*16000) 90#define GEMTEK_HIGHFREQ (108*16000)
91 91
92/*
93 * Frequency calculation constants. Intermediate frequency 10.52 MHz (nominal
94 * value 10.7 MHz), reference divisor 6.39 kHz (nominal 6.25 kHz).
95 */
96#define FSCALE 8
97#define IF_OFFSET ((unsigned int)(10.52 * 16000 * (1<<FSCALE)))
98#define REF_FREQ ((unsigned int)(6.39 * 16 * (1<<FSCALE)))
99
92#define GEMTEK_CK 0x01 /* Clock signal */ 100#define GEMTEK_CK 0x01 /* Clock signal */
93#define GEMTEK_DA 0x02 /* Serial data */ 101#define GEMTEK_DA 0x02 /* Serial data */
94#define GEMTEK_CE 0x04 /* Chip enable */ 102#define GEMTEK_CE 0x04 /* Chip enable */
@@ -219,14 +227,11 @@ static void gemtek_bu2614_transmit(struct gemtek_device *dev)
219} 227}
220 228
221/* 229/*
222 * Convert FM-frequency for BU2614FS (3.125 KHz STDF expected). 230 * Calculate divisor from FM-frequency for BU2614FS (3.125 KHz STDF expected).
223 */ 231 */
224static inline void gemtek_convfreq(unsigned long *freq) 232static unsigned long gemtek_convfreq(unsigned long freq)
225{ 233{
226 (*freq) /= 160; 234 return ((freq<<FSCALE) + IF_OFFSET + REF_FREQ/2) / REF_FREQ;
227 (*freq) += 1052; /* FMIN, 10.52 MHz */
228 (*freq) *= 1565; /* STDF, 1 / 156.5 = 0.00639 */
229 (*freq) /= 1000;
230} 235}
231 236
232/* 237/*
@@ -253,10 +258,8 @@ static void gemtek_setfreq(struct gemtek_device *dev, unsigned long freq)
253 gemtek_bu2614_set(dev, BU2614_FMUN, 1); /* GT bit set */ 258 gemtek_bu2614_set(dev, BU2614_FMUN, 1); /* GT bit set */
254 gemtek_bu2614_set(dev, BU2614_TEST, 0); 259 gemtek_bu2614_set(dev, BU2614_TEST, 0);
255 260
256 gemtek_convfreq(&freq);
257
258 gemtek_bu2614_set(dev, BU2614_STDF, GEMTEK_STDF_3_125_KHZ); 261 gemtek_bu2614_set(dev, BU2614_STDF, GEMTEK_STDF_3_125_KHZ);
259 gemtek_bu2614_set(dev, BU2614_FREQ, freq); 262 gemtek_bu2614_set(dev, BU2614_FREQ, gemtek_convfreq(freq));
260 263
261 gemtek_bu2614_transmit(dev); 264 gemtek_bu2614_transmit(dev);
262} 265}