@@ -2207,6 +2207,7 @@
u8 value[4] = { 0, 0, 0, 0 };
u32 tmp = 0;
int status = 0;
+ int demod_reset_high = 0;
if (dev->power_mode != mode)
dev->power_mode = mode;
@@ -2406,9 +2407,25 @@
msleep(PWR_SLEEP_INTERVAL);
+ /* For Hauppauge devices based on the ldgt3305, the 3305 will hold SDA
+ low from powerup until 10ms after the device is brought out of reset.
+ As a result, we need to *always* bring the device out of reset if
+ PWR_TUNER_EN is enabled (since we have a shared power plane for both
+ the tuner and demod). If you fail to bring the chip out of reset
+ *and* wait 10ms, the i2c bus will get jammed. This is a vendor
+ documented limitation of the lgdt3305 demodulator */
+ if ((tmp & PWR_TUNER_EN) &&
+ (dev->model == CX231XX_BOARD_HAUPPAUGE_EXETER)) {
+ demod_reset_high = 1;
+ }
+
/* For power saving, only enable Pwr_resetout_n
when digital TV is selected. */
if (mode == POLARIS_AVMODE_DIGITAL) {
+ demod_reset_high = 1;
+ }
+
+ if (demod_reset_high) {
tmp |= PWR_RESETOUT_EN;
value[0] = (u8) tmp;
value[1] = (u8) (tmp >> 8);