aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorDevin Heitmueller <dheitmueller@kernellabs.com>2011-03-13 00:02:01 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-05-20 06:26:19 -0400
commit6b142b3c81e6e532dfad7256fcc7e75fded49245 (patch)
tree8ef7b34726effc8a8b84d70fc32b5bfe28d309bd /drivers/media
parent3e5659067892d94d859f8ae4c1129a84fe4d5244 (diff)
[media] drxd: provide ability to disable the i2c gate control function
If the tuner is not actually behind an i2c gate, using the i2c gate control function can wedge the i2c bus. Provide the ability to control on a per-board basis whether it should be used. Problem was noticed on the HVR-900 R2, where it resulted in the first tuning attempt succeeding, and then all subsequent attempts to access the xc3028 being treated as failures (including the call to sleep the tuner). Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/dvb/frontends/drxd.h4
-rw-r--r--drivers/media/dvb/frontends/drxd_hard.c3
-rw-r--r--drivers/media/video/em28xx/em28xx-dvb.c1
3 files changed, 8 insertions, 0 deletions
diff --git a/drivers/media/dvb/frontends/drxd.h b/drivers/media/dvb/frontends/drxd.h
index 81093b9b1568..b21c85315d76 100644
--- a/drivers/media/dvb/frontends/drxd.h
+++ b/drivers/media/dvb/frontends/drxd.h
@@ -44,6 +44,10 @@ struct drxd_config
44 u8 demoda_address; 44 u8 demoda_address;
45 u8 demod_revision; 45 u8 demod_revision;
46 46
47 /* If the tuner is not behind an i2c gate, be sure to flip this bit
48 or else the i2c bus could get wedged */
49 u8 disable_i2c_gate_ctrl;
50
47 u32 IF; 51 u32 IF;
48 int (*pll_set) (void *priv, void *priv_params, 52 int (*pll_set) (void *priv, void *priv_params,
49 u8 pll_addr, u8 demoda_addr, s32 *off); 53 u8 pll_addr, u8 demoda_addr, s32 *off);
diff --git a/drivers/media/dvb/frontends/drxd_hard.c b/drivers/media/dvb/frontends/drxd_hard.c
index 994195fe9fbb..b8baafe3b54b 100644
--- a/drivers/media/dvb/frontends/drxd_hard.c
+++ b/drivers/media/dvb/frontends/drxd_hard.c
@@ -2662,6 +2662,9 @@ int drxd_config_i2c(struct dvb_frontend *fe, int onoff)
2662{ 2662{
2663 struct drxd_state *state=fe->demodulator_priv; 2663 struct drxd_state *state=fe->demodulator_priv;
2664 2664
2665 if (state->config.disable_i2c_gate_ctrl == 1)
2666 return 0;
2667
2665 return DRX_ConfigureI2CBridge(state, onoff); 2668 return DRX_ConfigureI2CBridge(state, onoff);
2666} 2669}
2667 2670
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c
index bdbdb1bd8ec9..f18e41f0bbc1 100644
--- a/drivers/media/video/em28xx/em28xx-dvb.c
+++ b/drivers/media/video/em28xx/em28xx-dvb.c
@@ -291,6 +291,7 @@ static struct drxd_config em28xx_drxd = {
291 .demoda_address = 0x00, .pll_address = 0x00, 291 .demoda_address = 0x00, .pll_address = 0x00,
292 .pll_type = DRXD_PLL_NONE, .clock = 12000, .insert_rs_byte = 1, 292 .pll_type = DRXD_PLL_NONE, .clock = 12000, .insert_rs_byte = 1,
293 .pll_set = NULL, .osc_deviation = NULL, .IF = 42800000, 293 .pll_set = NULL, .osc_deviation = NULL, .IF = 42800000,
294 .disable_i2c_gate_ctrl = 1,
294}; 295};
295 296
296static int mt352_terratec_xs_init(struct dvb_frontend *fe) 297static int mt352_terratec_xs_init(struct dvb_frontend *fe)