aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2005-12-01 03:51:42 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-12-01 18:48:58 -0500
commitf95006f89576cac504323daa53157013bf099fc9 (patch)
tree1ee888856e45f1f6c9546fae5e64341674b9d320 /drivers/media
parent0fe22865ddee524017a1012528b0e15475acc942 (diff)
[PATCH] V4L: Add workaround for Hauppauge PVR150 with certain NTSC tuner models
Add workaround for Hauppauge PVR150 hardware problem with tuner models 85, 99 and 112 (model numbers as reported by tveeprom). The audio standard autodetection does not always work correctly for these models. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/cx25840/cx25840-core.c34
-rw-r--r--drivers/media/video/cx25840/cx25840.h9
-rw-r--r--drivers/media/video/tveeprom.c3
3 files changed, 43 insertions, 3 deletions
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
index 539db129a9f4..aea3f038cff6 100644
--- a/drivers/media/video/cx25840/cx25840-core.c
+++ b/drivers/media/video/cx25840/cx25840-core.c
@@ -208,8 +208,11 @@ static void cx25840_initialize(struct i2c_client *client, int loadfw)
208 208
209static void input_change(struct i2c_client *client) 209static void input_change(struct i2c_client *client)
210{ 210{
211 struct cx25840_state *state = i2c_get_clientdata(client);
211 v4l2_std_id std = cx25840_get_v4lstd(client); 212 v4l2_std_id std = cx25840_get_v4lstd(client);
212 213
214 /* Note: perhaps V4L2_STD_PAL_M should be handled as V4L2_STD_NTSC
215 instead of V4L2_STD_PAL. Someone needs to test this. */
213 if (std & V4L2_STD_PAL) { 216 if (std & V4L2_STD_PAL) {
214 /* Follow tuner change procedure for PAL */ 217 /* Follow tuner change procedure for PAL */
215 cx25840_write(client, 0x808, 0xff); 218 cx25840_write(client, 0x808, 0xff);
@@ -220,7 +223,32 @@ static void input_change(struct i2c_client *client)
220 cx25840_write(client, 0x80b, 0x10); 223 cx25840_write(client, 0x80b, 0x10);
221 } else if (std & V4L2_STD_NTSC) { 224 } else if (std & V4L2_STD_NTSC) {
222 /* NTSC */ 225 /* NTSC */
223 cx25840_write(client, 0x808, 0xf6); 226 if (state->cardtype == CARDTYPE_PVR150_WORKAROUND) {
227 /* Certain Hauppauge PVR150 models have a hardware bug
228 that causes audio to drop out. For these models the
229 audio standard must be set explicitly.
230 To be precise: it affects cards with tuner models
231 85, 99 and 112 (model numbers from tveeprom). */
232 if (std == V4L2_STD_NTSC_M_JP) {
233 /* Japan uses EIAJ audio standard */
234 cx25840_write(client, 0x808, 0x2f);
235 } else {
236 /* Others use the BTSC audio standard */
237 cx25840_write(client, 0x808, 0x1f);
238 }
239 /* South Korea uses the A2-M (aka Zweiton M) audio
240 standard, and should set 0x808 to 0x3f, but I don't
241 know how to detect this. */
242 } else if (std == V4L2_STD_NTSC_M_JP) {
243 /* Japan uses EIAJ audio standard */
244 cx25840_write(client, 0x808, 0xf7);
245 } else {
246 /* Others use the BTSC audio standard */
247 cx25840_write(client, 0x808, 0xf6);
248 }
249 /* South Korea uses the A2-M (aka Zweiton M) audio standard,
250 and should set 0x808 to 0xf8, but I don't know how to
251 detect this. */
224 cx25840_write(client, 0x80b, 0x00); 252 cx25840_write(client, 0x80b, 0x00);
225 } 253 }
226 254
@@ -241,7 +269,8 @@ static int set_input(struct i2c_client *client, enum cx25840_input input)
241 case CX25840_TUNER: 269 case CX25840_TUNER:
242 cx25840_dbg("now setting Tuner input\n"); 270 cx25840_dbg("now setting Tuner input\n");
243 271
244 if (state->cardtype == CARDTYPE_PVR150) { 272 if (state->cardtype == CARDTYPE_PVR150 ||
273 state->cardtype == CARDTYPE_PVR150_WORKAROUND) {
245 /* CH_SEL_ADC2=1 */ 274 /* CH_SEL_ADC2=1 */
246 cx25840_and_or(client, 0x102, ~0x2, 0x02); 275 cx25840_and_or(client, 0x102, ~0x2, 0x02);
247 } 276 }
@@ -363,6 +392,7 @@ static int set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
363 case CX25840_CID_CARDTYPE: 392 case CX25840_CID_CARDTYPE:
364 switch (ctrl->value) { 393 switch (ctrl->value) {
365 case CARDTYPE_PVR150: 394 case CARDTYPE_PVR150:
395 case CARDTYPE_PVR150_WORKAROUND:
366 case CARDTYPE_PG600: 396 case CARDTYPE_PG600:
367 state->cardtype = ctrl->value; 397 state->cardtype = ctrl->value;
368 break; 398 break;
diff --git a/drivers/media/video/cx25840/cx25840.h b/drivers/media/video/cx25840/cx25840.h
index 5c3f0639fb77..4932ed1c9b19 100644
--- a/drivers/media/video/cx25840/cx25840.h
+++ b/drivers/media/video/cx25840/cx25840.h
@@ -40,9 +40,16 @@ extern int cx25840_debug;
40 40
41#define CX25840_CID_CARDTYPE (V4L2_CID_PRIVATE_BASE+0) 41#define CX25840_CID_CARDTYPE (V4L2_CID_PRIVATE_BASE+0)
42 42
43/* The CARDTYPE_PVR150_WORKAROUND cardtype activates a workaround for a
44 hardware bug that is present in PVR150 (and possible PVR500) cards that
45 have certain NTSC tuners (tveeprom model numbers 85, 99 and 112). The
46 audio autodetect fails on some channels for these models and the workaround
47 is to select the audio standard explicitly. Many thanks to Hauppauge for
48 providing this information. */
43enum cx25840_cardtype { 49enum cx25840_cardtype {
44 CARDTYPE_PVR150, 50 CARDTYPE_PVR150,
45 CARDTYPE_PG600 51 CARDTYPE_PG600,
52 CARDTYPE_PVR150_WORKAROUND,
46}; 53};
47 54
48enum cx25840_input { 55enum cx25840_input {
diff --git a/drivers/media/video/tveeprom.c b/drivers/media/video/tveeprom.c
index f048fd44f0e2..3a986c2a0f72 100644
--- a/drivers/media/video/tveeprom.c
+++ b/drivers/media/video/tveeprom.c
@@ -339,6 +339,7 @@ static int hasRadioTuner(int tunerType)
339 case 78: //PNPEnv_TUNER_TDA8275C1_8290_FM: 339 case 78: //PNPEnv_TUNER_TDA8275C1_8290_FM:
340 case 89: //PNPEnv_TUNER_TCL_MFPE05_2: 340 case 89: //PNPEnv_TUNER_TCL_MFPE05_2:
341 case 92: //PNPEnv_TUNER_PHILIPS_FQ1236A_MK4: 341 case 92: //PNPEnv_TUNER_PHILIPS_FQ1236A_MK4:
342 case 105:
342 return 1; 343 return 1;
343 } 344 }
344 return 0; 345 return 0;
@@ -596,6 +597,8 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
596 t_name2 = "unknown"; 597 t_name2 = "unknown";
597 } 598 }
598 599
600 tvee->tuner_hauppauge_model = tuner1;
601 tvee->tuner2_hauppauge_model = tuner2;
599 tvee->tuner_formats = 0; 602 tvee->tuner_formats = 0;
600 tvee->tuner2_formats = 0; 603 tvee->tuner2_formats = 0;
601 for (i = j = 0; i < 8; i++) { 604 for (i = j = 0; i < 8; i++) {