summaryrefslogtreecommitdiffstats
path: root/drivers/media/video/tuner-xc2028.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab2007-11-05 13:07:13 +0100
committerMauro Carvalho Chehab2008-01-25 22:02:01 +0100
commit80b522085a2c870ba0c0bdf2415cc925d7c86ca5 (patch)
treeefcf9cc4690afb00c636c100ad15aec85baa5a82 /drivers/media/video/tuner-xc2028.c
parentV4L/DVB (6560): Fix a bug when setting tuner type (diff)
downloadkernel-qcow2-linux-80b522085a2c870ba0c0bdf2415cc925d7c86ca5.tar.gz
kernel-qcow2-linux-80b522085a2c870ba0c0bdf2415cc925d7c86ca5.tar.xz
kernel-qcow2-linux-80b522085a2c870ba0c0bdf2415cc925d7c86ca5.zip
V4L/DVB (6561): Fix xc2028 get register functions and calls
The status registers require a dword for setting register. Fix it on all occurrences, and at xc3028_get_reg. Also, improves the hardware/firmware detection printk. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/tuner-xc2028.c')
-rw-r--r--drivers/media/video/tuner-xc2028.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/media/video/tuner-xc2028.c b/drivers/media/video/tuner-xc2028.c
index b4c88ed12a8a..ecfc39036f90 100644
--- a/drivers/media/video/tuner-xc2028.c
+++ b/drivers/media/video/tuner-xc2028.c
@@ -91,16 +91,17 @@ struct xc2028_data {
msleep(10); \
} while (0)
-static int xc2028_get_reg(struct xc2028_data *priv, u16 reg)
+static unsigned int xc2028_get_reg(struct xc2028_data *priv, u16 reg)
{
int rc;
unsigned char buf[2];
tuner_info("%s called\n", __FUNCTION__);
- buf[0] = reg;
+ buf[0] = reg>>8;
+ buf[1] = (unsigned char) reg;
- i2c_send(rc, priv, buf, 1);
+ i2c_send(rc, priv, buf, 2);
if (rc < 0)
return rc;
@@ -372,7 +373,7 @@ static int check_firmware(struct dvb_frontend *fe, enum tuner_mode new_mode,
v4l2_std_id std, fe_bandwidth_t bandwidth)
{
struct xc2028_data *priv = fe->tuner_priv;
- int rc, version;
+ int rc, version, hwmodel;
v4l2_std_id std0 = 0;
unsigned int type0 = 0, type = 0;
int change_digital_bandwidth;
@@ -484,9 +485,13 @@ static int check_firmware(struct dvb_frontend *fe, enum tuner_mode new_mode,
if (rc < 0)
return rc;
- version = xc2028_get_reg(priv, 0x4);
- tuner_info("Firmware version is %d.%d\n",
- (version >> 4) & 0x0f, (version) & 0x0f);
+ version = xc2028_get_reg(priv, 0x0004);
+ hwmodel = xc2028_get_reg(priv, 0x0008);
+
+ tuner_info("Device is Xceive %d version %d.%d, "
+ "firmware version %d.%d\n",
+ hwmodel, (version & 0xf000) >> 12, (version & 0xf00) >> 8,
+ (version & 0xf0) >> 4, version & 0xf);
priv->firm_type = std;
@@ -504,13 +509,15 @@ static int xc2028_signal(struct dvb_frontend *fe, u16 *strength)
*strength = 0;
- frq_lock = xc2028_get_reg(priv, 0x2);
+ /* Sync Lock Indicator */
+ frq_lock = xc2028_get_reg(priv, 0x0002);
if (frq_lock <= 0)
goto ret;
/* Frequency is locked. Return signal quality */
- signal = xc2028_get_reg(priv, 0x40);
+ /* Get SNR of the video signal */
+ signal = xc2028_get_reg(priv, 0x0040);
if (signal <= 0)
signal = frq_lock;