[PATCH] v4l: 702: included audio chips enum

- Included audio chips enum

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>
This commit is contained in:
Mauro Carvalho Chehab 2005-11-08 21:36:56 -08:00 committed by Linus Torvalds
parent 6af90ab5e7
commit 90a7ed47a3
2 changed files with 263 additions and 184 deletions

View File

@ -40,6 +40,7 @@
#include <media/tuner.h> #include <media/tuner.h>
#include <media/tveeprom.h> #include <media/tveeprom.h>
#include "audiochip.h"
MODULE_DESCRIPTION("i2c Hauppauge eeprom decoder driver"); MODULE_DESCRIPTION("i2c Hauppauge eeprom decoder driver");
MODULE_AUTHOR("John Klar"); MODULE_AUTHOR("John Klar");
@ -134,8 +135,8 @@ hauppauge_tuner[] =
{ TUNER_TEMIC_4039FR5_NTSC, "Temic 4039FR5" }, { TUNER_TEMIC_4039FR5_NTSC, "Temic 4039FR5" },
{ TUNER_PHILIPS_FQ1216ME, "Philips FQ1216 ME" }, { TUNER_PHILIPS_FQ1216ME, "Philips FQ1216 ME" },
{ TUNER_TEMIC_4066FY5_PAL_I, "Temic 4066FY5" }, { TUNER_TEMIC_4066FY5_PAL_I, "Temic 4066FY5" },
{ TUNER_PHILIPS_NTSC, "Philips TD1536" }, { TUNER_PHILIPS_NTSC, "Philips TD1536" },
{ TUNER_PHILIPS_NTSC, "Philips TD1536D" }, { TUNER_PHILIPS_NTSC, "Philips TD1536D" },
{ TUNER_PHILIPS_NTSC, "Philips FMR1236" }, /* mono radio */ { TUNER_PHILIPS_NTSC, "Philips FMR1236" }, /* mono radio */
{ TUNER_ABSENT, "Philips FI1256MP" }, { TUNER_ABSENT, "Philips FI1256MP" },
/* 40-49 */ /* 40-49 */
@ -189,7 +190,7 @@ hauppauge_tuner[] =
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MB 3"}, { TUNER_LG_PAL_NEW_TAPC, "TCL 2002MB 3"},
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"}, { TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"},
{ TUNER_TCL_2002N, "TCL 2002N 6A"}, { TUNER_TCL_2002N, "TCL 2002N 6A"},
{ TUNER_ABSENT, "Philips FQ1236 MK3"}, { TUNER_PHILIPS_FM1236_MK3, "Philips FQ1236 MK3"},
{ TUNER_ABSENT, "Samsung TCPN 2121P30A"}, { TUNER_ABSENT, "Samsung TCPN 2121P30A"},
{ TUNER_ABSENT, "Samsung TCPE 4121P30A"}, { TUNER_ABSENT, "Samsung TCPE 4121P30A"},
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MFPE05 2"}, { TUNER_PHILIPS_FM1216ME_MK3, "TCL MFPE05 2"},
@ -202,93 +203,129 @@ hauppauge_tuner[] =
{ TUNER_ABSENT, "Philips FQ1236 MK5"}, { TUNER_ABSENT, "Philips FQ1236 MK5"},
{ TUNER_ABSENT, "Samsung TCPG_6121P30A"}, { TUNER_ABSENT, "Samsung TCPG_6121P30A"},
{ TUNER_TCL_2002MB, "TCL 2002MB_3H"}, { TUNER_TCL_2002MB, "TCL 2002MB_3H"},
{ TUNER_ABSENT, "TCL 2002MI_3H"}, { TUNER_ABSENT, "TCL 2002MI_3H"},
{ TUNER_TCL_2002N, "TCL 2002N 5H"}, { TUNER_TCL_2002N, "TCL 2002N 5H"},
/* 100-109 */ /* 100-109 */
{ TUNER_ABSENT, "Philips FMD1216ME"}, { TUNER_ABSENT, "Philips FMD1216ME"},
{ TUNER_TEA5767, "Philips TEA5768HL FM Radio"}, { TUNER_TEA5767, "Philips TEA5768HL FM Radio"},
{ TUNER_ABSENT, "Panasonic ENV57H12D5"}, { TUNER_ABSENT, "Panasonic ENV57H12D5"},
{ TUNER_ABSENT, "TCL MFNM05-4"}, { TUNER_ABSENT, "TCL MFNM05-4"},
{ TUNER_ABSENT, "TCL MNM05-4"}, { TUNER_ABSENT, "TCL MNM05-4"},
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MPE05-2"}, { TUNER_PHILIPS_FM1216ME_MK3, "TCL MPE05-2"},
{ TUNER_ABSENT, "TCL MQNM05-4"}, { TUNER_ABSENT, "TCL MQNM05-4"},
{ TUNER_ABSENT, "LG TAPC-W701D"}, { TUNER_ABSENT, "LG TAPC-W701D"},
{ TUNER_ABSENT, "TCL 9886P-WM"}, { TUNER_ABSENT, "TCL 9886P-WM"},
{ TUNER_ABSENT, "TCL 1676NM-WM"}, { TUNER_ABSENT, "TCL 1676NM-WM"},
}; };
/* This list is supplied by Hauppauge. Thanks! */ static struct HAUPPAUGE_AUDIOIC
static const char *audioIC[] = { {
/* 0-4 */ enum audiochip id;
"None", "TEA6300", "TEA6320", "TDA9850", "MSP3400C", char *name;
/* 5-9 */ }
"MSP3410D", "MSP3415", "MSP3430", "MSP3438", "CS5331", audioIC[] =
/* 10-14 */ {
"MSP3435", "MSP3440", "MSP3445", "MSP3411", "MSP3416", /* 0-4 */
/* 15-19 */ {AUDIO_CHIP_NONE, "None"},
"MSP3425", "MSP3451", "MSP3418", "Type 0x12", "OKI7716", {AUDIO_CHIP_TEA6300, "TEA6300"},
/* 20-24 */ {AUDIO_CHIP_TEA6300, "TEA6320"},
"MSP4410", "MSP4420", "MSP4440", "MSP4450", "MSP4408", {AUDIO_CHIP_TDA985X, "TDA9850"},
/* 25-29 */ {AUDIO_CHIP_MSP34XX, "MSP3400C"},
"MSP4418", "MSP4428", "MSP4448", "MSP4458", "Type 0x1d", /* 5-9 */
/* 30-34 */ {AUDIO_CHIP_MSP34XX, "MSP3410D"},
"CX880", "CX881", "CX883", "CX882", "CX25840", {AUDIO_CHIP_MSP34XX, "MSP3415"},
/* 35-38 */ {AUDIO_CHIP_MSP34XX, "MSP3430"},
"CX25841", "CX25842", "CX25843", "CX23418", {AUDIO_CHIP_UNKNOWN, "MSP3438"},
{AUDIO_CHIP_UNKNOWN, "CS5331"},
/* 10-14 */
{AUDIO_CHIP_MSP34XX, "MSP3435"},
{AUDIO_CHIP_MSP34XX, "MSP3440"},
{AUDIO_CHIP_MSP34XX, "MSP3445"},
{AUDIO_CHIP_UNKNOWN, "MSP3411"},
{AUDIO_CHIP_UNKNOWN, "MSP3416"},
/* 15-19 */
{AUDIO_CHIP_MSP34XX, "MSP3425"},
{AUDIO_CHIP_UNKNOWN, "MSP3451"},
{AUDIO_CHIP_UNKNOWN, "MSP3418"},
{AUDIO_CHIP_UNKNOWN, "Type 0x12"},
{AUDIO_CHIP_UNKNOWN, "OKI7716"},
/* 20-24 */
{AUDIO_CHIP_UNKNOWN, "MSP4410"},
{AUDIO_CHIP_UNKNOWN, "MSP4420"},
{AUDIO_CHIP_UNKNOWN, "MSP4440"},
{AUDIO_CHIP_UNKNOWN, "MSP4450"},
{AUDIO_CHIP_UNKNOWN, "MSP4408"},
/* 25-29 */
{AUDIO_CHIP_UNKNOWN, "MSP4418"},
{AUDIO_CHIP_UNKNOWN, "MSP4428"},
{AUDIO_CHIP_UNKNOWN, "MSP4448"},
{AUDIO_CHIP_UNKNOWN, "MSP4458"},
{AUDIO_CHIP_UNKNOWN, "Type 0x1d"},
/* 30-34 */
{AUDIO_CHIP_INTERNAL, "CX880"},
{AUDIO_CHIP_INTERNAL, "CX881"},
{AUDIO_CHIP_INTERNAL, "CX883"},
{AUDIO_CHIP_INTERNAL, "CX882"},
{AUDIO_CHIP_INTERNAL, "CX25840"},
/* 35-38 */
{AUDIO_CHIP_INTERNAL, "CX25841"},
{AUDIO_CHIP_INTERNAL, "CX25842"},
{AUDIO_CHIP_INTERNAL, "CX25843"},
{AUDIO_CHIP_INTERNAL, "CX23418"},
}; };
/* This list is supplied by Hauppauge. Thanks! */ /* This list is supplied by Hauppauge. Thanks! */
static const char *decoderIC[] = { static const char *decoderIC[] = {
/* 0-4 */ /* 0-4 */
"None", "BT815", "BT817", "BT819", "BT815A", "None", "BT815", "BT817", "BT819", "BT815A",
/* 5-9 */ /* 5-9 */
"BT817A", "BT819A", "BT827", "BT829", "BT848", "BT817A", "BT819A", "BT827", "BT829", "BT848",
/* 10-14 */ /* 10-14 */
"BT848A", "BT849A", "BT829A", "BT827A", "BT878", "BT848A", "BT849A", "BT829A", "BT827A", "BT878",
/* 15-19 */ /* 15-19 */
"BT879", "BT880", "VPX3226E", "SAA7114", "SAA7115", "BT879", "BT880", "VPX3226E", "SAA7114", "SAA7115",
/* 20-24 */ /* 20-24 */
"CX880", "CX881", "CX883", "SAA7111", "SAA7113", "CX880", "CX881", "CX883", "SAA7111", "SAA7113",
/* 25-29 */ /* 25-29 */
"CX882", "TVP5150A", "CX25840", "CX25841", "CX25842", "CX882", "TVP5150A", "CX25840", "CX25841", "CX25842",
/* 30-31 */ /* 30-31 */
"CX25843", "CX23418", "CX25843", "CX23418",
}; };
static int hasRadioTuner(int tunerType) static int hasRadioTuner(int tunerType)
{ {
switch (tunerType) { switch (tunerType) {
case 18: //PNPEnv_TUNER_FR1236_MK2: case 18: //PNPEnv_TUNER_FR1236_MK2:
case 23: //PNPEnv_TUNER_FM1236: case 23: //PNPEnv_TUNER_FM1236:
case 38: //PNPEnv_TUNER_FMR1236: case 38: //PNPEnv_TUNER_FMR1236:
case 16: //PNPEnv_TUNER_FR1216_MK2: case 16: //PNPEnv_TUNER_FR1216_MK2:
case 19: //PNPEnv_TUNER_FR1246_MK2: case 19: //PNPEnv_TUNER_FR1246_MK2:
case 21: //PNPEnv_TUNER_FM1216: case 21: //PNPEnv_TUNER_FM1216:
case 24: //PNPEnv_TUNER_FM1246: case 24: //PNPEnv_TUNER_FM1246:
case 17: //PNPEnv_TUNER_FR1216MF_MK2: case 17: //PNPEnv_TUNER_FR1216MF_MK2:
case 22: //PNPEnv_TUNER_FM1216MF: case 22: //PNPEnv_TUNER_FM1216MF:
case 20: //PNPEnv_TUNER_FR1256_MK2: case 20: //PNPEnv_TUNER_FR1256_MK2:
case 25: //PNPEnv_TUNER_FM1256: case 25: //PNPEnv_TUNER_FM1256:
case 33: //PNPEnv_TUNER_4039FR5: case 33: //PNPEnv_TUNER_4039FR5:
case 42: //PNPEnv_TUNER_4009FR5: case 42: //PNPEnv_TUNER_4009FR5:
case 52: //PNPEnv_TUNER_4049FM5: case 52: //PNPEnv_TUNER_4049FM5:
case 54: //PNPEnv_TUNER_4049FM5_AltI2C: case 54: //PNPEnv_TUNER_4049FM5_AltI2C:
case 44: //PNPEnv_TUNER_4009FN5: case 44: //PNPEnv_TUNER_4009FN5:
case 31: //PNPEnv_TUNER_TCPB9085P: case 31: //PNPEnv_TUNER_TCPB9085P:
case 30: //PNPEnv_TUNER_TCPN9085D: case 30: //PNPEnv_TUNER_TCPN9085D:
case 46: //PNPEnv_TUNER_TP18NSR01F: case 46: //PNPEnv_TUNER_TP18NSR01F:
case 47: //PNPEnv_TUNER_TP18PSB01D: case 47: //PNPEnv_TUNER_TP18PSB01D:
case 49: //PNPEnv_TUNER_TAPC_I001D: case 49: //PNPEnv_TUNER_TAPC_I001D:
case 60: //PNPEnv_TUNER_TAPE_S001D_MK3: case 60: //PNPEnv_TUNER_TAPE_S001D_MK3:
case 57: //PNPEnv_TUNER_FM1216ME_MK3: case 57: //PNPEnv_TUNER_FM1216ME_MK3:
case 59: //PNPEnv_TUNER_FM1216MP_MK3: case 59: //PNPEnv_TUNER_FM1216MP_MK3:
case 58: //PNPEnv_TUNER_FM1236_MK3: case 58: //PNPEnv_TUNER_FM1236_MK3:
case 68: //PNPEnv_TUNER_TAPE_H001F_MK3: case 68: //PNPEnv_TUNER_TAPE_H001F_MK3:
case 61: //PNPEnv_TUNER_TAPE_M001D_MK3: case 61: //PNPEnv_TUNER_TAPE_M001D_MK3:
case 78: //PNPEnv_TUNER_TDA8275C1_8290_FM: case 78: //PNPEnv_TUNER_TDA8275C1_8290_FM:
case 89: //PNPEnv_TUNER_TCL_MFPE05_2: case 89: //PNPEnv_TUNER_TCL_MFPE05_2:
case 92: //PNPEnv_TUNER_PHILIPS_FQ1236A_MK4: case 92: //PNPEnv_TUNER_PHILIPS_FQ1236A_MK4:
return 1; return 1;
} }
return 0; return 0;
} }
@ -318,19 +355,27 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
** # of inputs/outputs ??? ** # of inputs/outputs ???
*/ */
int i, j, len, done, beenhere, tag; int i, j, len, done, beenhere, tag,start;
int tuner1 = 0, t_format1 = 0; int tuner1 = 0, t_format1 = 0, audioic=-1;
char *t_name1 = NULL; char *t_name1 = NULL;
const char *t_fmt_name1[8] = { " none", "", "", "", "", "", "", "" }; const char *t_fmt_name1[8] = { " none", "", "", "", "", "", "", "" };
int tuner2 = 0, t_format2 = 0; int tuner2 = 0, t_format2 = 0;
char *t_name2 = NULL; char *t_name2 = NULL;
const char *t_fmt_name2[8] = { " none", "", "", "", "", "", "", "" }; const char *t_fmt_name2[8] = { " none", "", "", "", "", "", "", "" };
memset(tvee, 0, sizeof(*tvee)); memset(tvee, 0, sizeof(*tvee));
done = len = beenhere = 0; done = len = beenhere = 0;
for (i = 0; !done && i < 256; i += len) {
/* Hack for processing eeprom for em28xx */
if ((eeprom_data[0]==0x1a)&&(eeprom_data[1]==0xeb)&&
(eeprom_data[2]==0x67)&&(eeprom_data[3]==0x95))
start=0xa0;
else
start=0;
for (i = start; !done && i < 256; i += len) {
if (eeprom_data[i] == 0x84) { if (eeprom_data[i] == 0x84) {
len = eeprom_data[i + 1] + (eeprom_data[i + 2] << 8); len = eeprom_data[i + 1] + (eeprom_data[i + 2] << 8);
i += 3; i += 3;
@ -344,28 +389,28 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
++i; ++i;
} else { } else {
tveeprom_warn("Encountered bad packet header [%02x]. " tveeprom_warn("Encountered bad packet header [%02x]. "
"Corrupt or not a Hauppauge eeprom.\n", eeprom_data[i]); "Corrupt or not a Hauppauge eeprom.\n", eeprom_data[i]);
return; return;
} }
if (debug) { if (debug) {
tveeprom_info("Tag [%02x] + %d bytes:", eeprom_data[i], len - 1); tveeprom_info("Tag [%02x] + %d bytes:", eeprom_data[i], len - 1);
for(j = 1; j < len; j++) { for(j = 1; j < len; j++) {
printk(" %02x", eeprom_data[i + j]); printk(" %02x", eeprom_data[i + j]);
} }
printk("\n"); printk("\n");
} }
/* process by tag */ /* process by tag */
tag = eeprom_data[i]; tag = eeprom_data[i];
switch (tag) { switch (tag) {
case 0x00: case 0x00:
/* tag: 'Comprehensive' */ /* tag: 'Comprehensive' */
tuner1 = eeprom_data[i+6]; tuner1 = eeprom_data[i+6];
t_format1 = eeprom_data[i+5]; t_format1 = eeprom_data[i+5];
tvee->has_radio = eeprom_data[i+len-1]; tvee->has_radio = eeprom_data[i+len-1];
/* old style tag, don't know how to detect /* old style tag, don't know how to detect
IR presence, mark as unknown. */ IR presence, mark as unknown. */
tvee->has_ir = 2; tvee->has_ir = 2;
tvee->model = tvee->model =
eeprom_data[i+8] + eeprom_data[i+8] +
@ -376,7 +421,7 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
break; break;
case 0x01: case 0x01:
/* tag: 'SerialID' */ /* tag: 'SerialID' */
tvee->serial_number = tvee->serial_number =
eeprom_data[i+6] + eeprom_data[i+6] +
(eeprom_data[i+7] << 8) + (eeprom_data[i+7] << 8) +
@ -384,17 +429,21 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
break; break;
case 0x02: case 0x02:
/* tag 'AudioInfo' /* tag 'AudioInfo'
Note mask with 0x7F, high bit used on some older models Note mask with 0x7F, high bit used on some older models
to indicate 4052 mux was removed in favor of using MSP to indicate 4052 mux was removed in favor of using MSP
inputs directly. */ inputs directly. */
tvee->audio_processor = eeprom_data[i+2] & 0x7f; audioic = eeprom_data[i+2] & 0x7f;
if (audioic < sizeof(audioIC)/sizeof(*audioIC))
tvee->audio_processor = audioIC[audioic].id;
else
tvee->audio_processor = AUDIO_CHIP_UNKNOWN;
break; break;
/* case 0x03: tag 'EEInfo' */ /* case 0x03: tag 'EEInfo' */
case 0x04: case 0x04:
/* tag 'SerialID2' */ /* tag 'SerialID2' */
tvee->serial_number = tvee->serial_number =
eeprom_data[i+5] + eeprom_data[i+5] +
(eeprom_data[i+6] << 8) + (eeprom_data[i+6] << 8) +
@ -402,15 +451,20 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
break; break;
case 0x05: case 0x05:
/* tag 'Audio2' /* tag 'Audio2'
Note mask with 0x7F, high bit used on some older models Note mask with 0x7F, high bit used on some older models
to indicate 4052 mux was removed in favor of using MSP to indicate 4052 mux was removed in favor of using MSP
inputs directly. */ inputs directly. */
tvee->audio_processor = eeprom_data[i+1] & 0x7f; audioic = eeprom_data[i+1] & 0x7f;
if (audioic < sizeof(audioIC)/sizeof(*audioIC))
tvee->audio_processor = audioIC[audioic].id;
else
tvee->audio_processor = AUDIO_CHIP_UNKNOWN;
break; break;
case 0x06: case 0x06:
/* tag 'ModelRev' */ /* tag 'ModelRev' */
tvee->model = tvee->model =
eeprom_data[i+1] + eeprom_data[i+1] +
(eeprom_data[i+2] << 8); (eeprom_data[i+2] << 8);
@ -420,55 +474,55 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
break; break;
case 0x07: case 0x07:
/* tag 'Details': according to Hauppauge not interesting /* tag 'Details': according to Hauppauge not interesting
on any PCI-era or later boards. */ on any PCI-era or later boards. */
break; break;
/* there is no tag 0x08 defined */ /* there is no tag 0x08 defined */
case 0x09: case 0x09:
/* tag 'Video' */ /* tag 'Video' */
tvee->decoder_processor = eeprom_data[i + 1]; tvee->decoder_processor = eeprom_data[i + 1];
break; break;
case 0x0a: case 0x0a:
/* tag 'Tuner' */ /* tag 'Tuner' */
if (beenhere == 0) { if (beenhere == 0) {
tuner1 = eeprom_data[i+2]; tuner1 = eeprom_data[i+2];
t_format1 = eeprom_data[i+1]; t_format1 = eeprom_data[i+1];
beenhere = 1; beenhere = 1;
} else { } else {
/* a second (radio) tuner may be present */ /* a second (radio) tuner may be present */
tuner2 = eeprom_data[i+2]; tuner2 = eeprom_data[i+2];
t_format2 = eeprom_data[i+1]; t_format2 = eeprom_data[i+1];
if (t_format2 == 0) { /* not a TV tuner? */ if (t_format2 == 0) { /* not a TV tuner? */
tvee->has_radio = 1; /* must be radio */ tvee->has_radio = 1; /* must be radio */
} }
} }
break; break;
case 0x0b: case 0x0b:
/* tag 'Inputs': according to Hauppauge this is specific /* tag 'Inputs': according to Hauppauge this is specific
to each driver family, so no good assumptions can be to each driver family, so no good assumptions can be
made. */ made. */
break; break;
/* case 0x0c: tag 'Balun' */ /* case 0x0c: tag 'Balun' */
/* case 0x0d: tag 'Teletext' */ /* case 0x0d: tag 'Teletext' */
case 0x0e: case 0x0e:
/* tag: 'Radio' */ /* tag: 'Radio' */
tvee->has_radio = eeprom_data[i+1]; tvee->has_radio = eeprom_data[i+1];
break; break;
case 0x0f: case 0x0f:
/* tag 'IRInfo' */ /* tag 'IRInfo' */
tvee->has_ir = eeprom_data[i+1]; tvee->has_ir = eeprom_data[i+1];
break; break;
/* case 0x10: tag 'VBIInfo' */ /* case 0x10: tag 'VBIInfo' */
/* case 0x11: tag 'QCInfo' */ /* case 0x11: tag 'QCInfo' */
/* case 0x12: tag 'InfoBits' */ /* case 0x12: tag 'InfoBits' */
default: default:
tveeprom_dbg("Not sure what to do with tag [%02x]\n", tag); tveeprom_dbg("Not sure what to do with tag [%02x]\n", tag);
@ -489,11 +543,11 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
tvee->rev_str[4] = 0; tvee->rev_str[4] = 0;
} }
if (hasRadioTuner(tuner1) && !tvee->has_radio) { if (hasRadioTuner(tuner1) && !tvee->has_radio) {
tveeprom_info("The eeprom says no radio is present, but the tuner type\n"); tveeprom_info("The eeprom says no radio is present, but the tuner type\n");
tveeprom_info("indicates otherwise. I will assume that radio is present.\n"); tveeprom_info("indicates otherwise. I will assume that radio is present.\n");
tvee->has_radio = 1; tvee->has_radio = 1;
} }
if (tuner1 < sizeof(hauppauge_tuner)/sizeof(struct HAUPPAUGE_TUNER)) { if (tuner1 < sizeof(hauppauge_tuner)/sizeof(struct HAUPPAUGE_TUNER)) {
tvee->tuner_type = hauppauge_tuner[tuner1].id; tvee->tuner_type = hauppauge_tuner[tuner1].id;
@ -516,45 +570,53 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
tvee->tuner_formats |= hauppauge_tuner_fmt[i].id; tvee->tuner_formats |= hauppauge_tuner_fmt[i].id;
t_fmt_name1[j++] = hauppauge_tuner_fmt[i].name; t_fmt_name1[j++] = hauppauge_tuner_fmt[i].name;
} }
if (t_format2 & (1 << i)) { if (t_format2 & (1 << i)) {
tvee->tuner2_formats |= hauppauge_tuner_fmt[i].id; tvee->tuner2_formats |= hauppauge_tuner_fmt[i].id;
t_fmt_name2[j++] = hauppauge_tuner_fmt[i].name; t_fmt_name2[j++] = hauppauge_tuner_fmt[i].name;
} }
} }
tveeprom_info("Hauppauge model %d, rev %s, serial# %d\n", tveeprom_info("Hauppauge model %d, rev %s, serial# %d\n",
tvee->model, tvee->rev_str, tvee->serial_number); tvee->model, tvee->rev_str, tvee->serial_number);
tveeprom_info("tuner model is %s (idx %d, type %d)\n", tveeprom_info("tuner model is %s (idx %d, type %d)\n",
t_name1, tuner1, tvee->tuner_type); t_name1, tuner1, tvee->tuner_type);
tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n", tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
t_fmt_name1[0], t_fmt_name1[1], t_fmt_name1[2], t_fmt_name1[3], t_fmt_name1[0], t_fmt_name1[1], t_fmt_name1[2], t_fmt_name1[3],
t_fmt_name1[4], t_fmt_name1[5], t_fmt_name1[6], t_fmt_name1[7], t_fmt_name1[4], t_fmt_name1[5], t_fmt_name1[6], t_fmt_name1[7],
t_format1); t_format1);
if (tuner2) { if (tuner2) {
tveeprom_info("second tuner model is %s (idx %d, type %d)\n", tveeprom_info("second tuner model is %s (idx %d, type %d)\n",
t_name2, tuner2, tvee->tuner2_type); t_name2, tuner2, tvee->tuner2_type);
} }
if (t_format2) { if (t_format2) {
tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n", tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
t_fmt_name2[0], t_fmt_name2[1], t_fmt_name2[2], t_fmt_name2[3], t_fmt_name2[0], t_fmt_name2[1], t_fmt_name2[2], t_fmt_name2[3],
t_fmt_name2[4], t_fmt_name2[5], t_fmt_name2[6], t_fmt_name2[7], t_fmt_name2[4], t_fmt_name2[5], t_fmt_name2[6], t_fmt_name2[7],
t_format2); t_format2);
} }
tveeprom_info("audio processor is %s (idx %d)\n", if (audioic<0) {
STRM(audioIC, tvee->audio_processor), tveeprom_info("audio processor is unknown (no idx)\n");
tvee->audio_processor); tvee->audio_processor=AUDIO_CHIP_UNKNOWN;
if (tvee->decoder_processor) { } else {
tveeprom_info("decoder processor is %s (idx %d)\n", if (audioic < sizeof(audioIC)/sizeof(*audioIC))
STRM(decoderIC, tvee->decoder_processor), tveeprom_info("audio processor is %s (idx %d)\n",
tvee->decoder_processor); audioIC[audioic].name,audioic);
} else
if (tvee->has_ir == 2) tveeprom_info("audio processor is unknown (idx %d)\n",
tveeprom_info("has %sradio\n", audioic);
tvee->has_radio ? "" : "no "); }
else if (tvee->decoder_processor) {
tveeprom_info("has %sradio, has %sIR remote\n", tveeprom_info("decoder processor is %s (idx %d)\n",
tvee->has_radio ? "" : "no ", STRM(decoderIC, tvee->decoder_processor),
tvee->has_ir ? "" : "no "); tvee->decoder_processor);
}
if (tvee->has_ir == 2)
tveeprom_info("has %sradio\n",
tvee->has_radio ? "" : "no ");
else
tveeprom_info("has %sradio, has %sIR remote\n",
tvee->has_radio ? "" : "no ",
tvee->has_ir ? "" : "no ");
} }
EXPORT_SYMBOL(tveeprom_hauppauge_analog); EXPORT_SYMBOL(tveeprom_hauppauge_analog);
@ -575,18 +637,18 @@ int tveeprom_read(struct i2c_client *c, unsigned char *eedata, int len)
tveeprom_warn("i2c eeprom read error (err=%d)\n", err); tveeprom_warn("i2c eeprom read error (err=%d)\n", err);
return -1; return -1;
} }
if (debug) { if (debug) {
int i; int i;
tveeprom_info("full 256-byte eeprom dump:\n"); tveeprom_info("full 256-byte eeprom dump:\n");
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
if (0 == (i % 16)) if (0 == (i % 16))
tveeprom_info("%02x:", i); tveeprom_info("%02x:", i);
printk(" %02x", eedata[i]); printk(" %02x", eedata[i]);
if (15 == (i % 16)) if (15 == (i % 16))
printk("\n"); printk("\n");
} }
} }
return 0; return 0;
} }
EXPORT_SYMBOL(tveeprom_read); EXPORT_SYMBOL(tveeprom_read);

View File

@ -4,6 +4,23 @@
#ifndef AUDIOCHIP_H #ifndef AUDIOCHIP_H
#define AUDIOCHIP_H #define AUDIOCHIP_H
enum audiochip {
AUDIO_CHIP_NONE,
AUDIO_CHIP_UNKNOWN,
/* Provided by video chip */
AUDIO_CHIP_INTERNAL,
/* Provided by tvaudio.c */
AUDIO_CHIP_TDA8425,
AUDIO_CHIP_TEA6300,
AUDIO_CHIP_TEA6420,
AUDIO_CHIP_TDA9840,
AUDIO_CHIP_TDA985X,
AUDIO_CHIP_TDA9874,
AUDIO_CHIP_PIC16C54,
/* Provided by msp3400.c */
AUDIO_CHIP_MSP34XX
};
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
/* v4l device was opened in Radio mode */ /* v4l device was opened in Radio mode */