linux/drivers/media/common
Seth Barry a57c1dcb93 V4L/DVB (13109): tda18271: fix signedness issue in tda18271_rf_tracking_filters_init
While having tda18271 module set with debug=17 (cal & info prints) and
cal=0 (delay calibration process until first use) - I discovered that
during the calibration process, if the frequency test for 69750000
returned a bcal of 0 (see tda18721-fe.c in tda18271_powerscan func) that
the tuner wouldn't be able to pickup any of the frequencies in the range
(all the other frequencies bands returned bcal=1).  I spent some time
going over the code and the NXP's tda18271 spec (ver.4 of it i think) and
adding a lot of debug prints and walking/stepping through the calibration
process.  I found that when the powerscan fails to find a frequency, the
rf calibration is not run and the default value is supposed to be used in
its place (pulled from the RF_CAL_map table) - but something was getting
goofed up there.

Now, my c coding skills are very rusty, but i think root of the problem is
a signedness issue with the math operation for calculating the rf_a1 and
rf_a2 values in tda18271_rf_tracking_filters_init func, which results in
values like 20648 for rf_a1 (when it should probably have a value like 0,
or so slightly negative that it should be zero - this bad value for rf_a1
would in turn makes the approx calc within
tda18271c2_rf_tracking_filters_correction go out of whack).  The simplest
solution i found was to explicitly convert the signedness of the
denominator to avoid the implicit conversion.  The values placed into the
u32 rf_freq array should never exceed about 900mhz, so i think the s32 max
value shouldn't be an issue in this case.

I've tested it out a little, and even when i get a bcal=0 with the
modified code, the default calibration value gets used, rf_a1 is zero, and
the tuner seems to lock on the stream and mythtv seems to play it fine.

Signed-off-by: Seth Barry <seth@cyberseth.com>
Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
CC: stable@kernel.org
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2009-11-07 12:55:04 -02:00
..
tuners V4L/DVB (13109): tda18271: fix signedness issue in tda18271_rf_tracking_filters_init 2009-11-07 12:55:04 -02:00
ir-functions.c V4L/DVB (12595): common/ir: use a struct for keycode tables 2009-09-12 12:19:47 -03:00
ir-keymaps.c V4L/DVB (12595): common/ir: use a struct for keycode tables 2009-09-12 12:19:47 -03:00
Kconfig
Makefile fix drivers/media/common/tuners/ build bug 2008-04-30 08:36:04 -07:00
saa7146_core.c V4L/DVB (10502): saa7146: move v4l2 device registration to saa7146_vv. 2009-03-30 12:42:42 -03:00
saa7146_fops.c V4L/DVB (10502): saa7146: move v4l2 device registration to saa7146_vv. 2009-03-30 12:42:42 -03:00
saa7146_hlp.c V4L/DVB (8128): saa7146: ->cpu_addr and friends are little-endian 2008-07-20 07:13:14 -03:00
saa7146_i2c.c V4L/DVB (10843): saa7146: Clean-up i2c error handling 2009-03-30 12:43:08 -03:00
saa7146_vbi.c V4L/DVB (7237): Convert videobuf-dma-sg to generic DMA API 2008-04-24 14:07:44 -03:00
saa7146_video.c V4L/DVB (11261): saa7146: Remove buffer type check from vidioc_g_parm 2009-03-30 12:43:44 -03:00