diff options
-rw-r--r-- | sys/dev/bktr/bktr_core.c | 129 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_reg.h | 7 | ||||
-rw-r--r-- | sys/pci/brktree_reg.h | 7 | ||||
-rw-r--r-- | sys/pci/brooktree848.c | 129 |
4 files changed, 208 insertions, 64 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c index a56572d..aa61218 100644 --- a/sys/dev/bktr/bktr_core.c +++ b/sys/dev/bktr/bktr_core.c @@ -406,10 +406,23 @@ struct devsw bktrsw = { */ static struct format_params format_params[] = { -#define FORMAT_PARAMS_NTSC525 0 - { 525, 22, 480, 910, 135, 754, 640, 780, 30 }, -#define FORMAT_PARAMS_PAL625 1 - { 625, 32, 576, 1135, 186, 922, 768, 944, 25 } +/* # define BT848_IFORM_F_AUTO (0x0) - don't matter. */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, 0 }, +/* # define BT848_IFORM_F_NTSCM (0x1) */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 }, +/* # define BT848_IFORM_F_NTSCJ (0x2) */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 }, +/* # define BT848_IFORM_F_PALBDGHI (0x3) */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1 }, +/* # define BT848_IFORM_F_PALM (0x4) */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 }, +/*{ 625, 32, 576, 910, 186, 922, 640, 780, 25, 0x68, 0x5d, BT848_IFORM_X_XT0 }, */ +/* # define BT848_IFORM_F_PALN (0x5) */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1 }, +/* # define BT848_IFORM_F_SECAM (0x6) */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x00, BT848_IFORM_X_XT1 }, +/* # define BT848_IFORM_F_RSVD (0x7) - ???? */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT0 }, }; /* @@ -520,6 +533,10 @@ static struct { #define TDA9850_WADDR 0xb6 #define TDA9850_RADDR 0xb7 +/* address of MSP3400C chip */ +#define MSP3400C_WADDR 0x80 +#define MSP3400C_RADDR 0x81 + /* EEProm (128 * 8) on an STB card */ #define X24C01_WADDR 0xae @@ -562,7 +579,7 @@ static struct { /* the GPIO bits that control the audio MUXes */ -#define GPIO_AUDIOMUX_BITS 0x07 +#define GPIO_AUDIOMUX_BITS 0x0f /* debug utility for holding previous INT_STAT contents */ @@ -1070,7 +1087,7 @@ video_open( bktr_ptr_t bktr ) BT848_IFORM_X_XT0 | BT848_IFORM_F_NTSCM; bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0; - bktr->format_params = FORMAT_PARAMS_NTSC525; + bktr->format_params = BT848_IFORM_F_NTSCM; bktr->max_clip_node = 0; @@ -1130,7 +1147,7 @@ tuner_open( bktr_ptr_t bktr ) /* enable drivers on the GPIO port that control the MUXes */ bktr->base->gpio_out_en = GPIO_AUDIOMUX_BITS; - /* unmure the audio stream */ + /* unmute the audio stream */ set_audio( bktr, AUDIO_UNMUTE ); /* enable stereo if appropriate */ @@ -1399,7 +1416,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) case BT848SFMT: /* set input format */ temp = *(unsigned long*)arg & BT848_IFORM_FORMAT; bt848->iform &= ~BT848_IFORM_FORMAT; - bt848->iform |= temp; + bt848->iform |= (temp | format_params[temp].iform_xtsel); switch( temp ) { case BT848_IFORM_F_AUTO: bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | @@ -1408,23 +1425,25 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) case BT848_IFORM_F_NTSCM: case BT848_IFORM_F_NTSCJ: - case BT848_IFORM_F_PALM: bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_NTSC; - bt848->adelay = 0x68; - bt848->bdelay = 0x5d; - bktr->format_params = FORMAT_PARAMS_NTSC525; + METEOR_NTSC; + bt848->adelay = format_params[temp].adelay; + bt848->bdelay = format_params[temp].bdelay; + bktr->format_params = temp; break; case BT848_IFORM_F_PALBDGHI: case BT848_IFORM_F_PALN: case BT848_IFORM_F_SECAM: case BT848_IFORM_F_RSVD: + case BT848_IFORM_F_PALM: bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | METEOR_PAL; - bt848->adelay = 0x7f; - bt848->bdelay = 0x72; - bktr->format_params = FORMAT_PARAMS_PAL625; + bt848->adelay = format_params[temp].adelay; + bt848->bdelay = format_params[temp].bdelay; + bktr->format_params = temp; + break; + } break; @@ -1438,7 +1457,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) bt848->iform |= BT848_IFORM_F_NTSCM; bt848->adelay = 0x68; bt848->bdelay = 0x5d; - bktr->format_params = FORMAT_PARAMS_NTSC525; + bktr->format_params = BT848_IFORM_F_NTSCM; break; case METEOR_FMT_PAL: @@ -1448,7 +1467,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) bt848->iform |= BT848_IFORM_F_PALBDGHI; bt848->adelay = 0x7f; bt848->bdelay = 0x72; - bktr->format_params = FORMAT_PARAMS_PAL625; + bktr->format_params = BT848_IFORM_F_PALBDGHI; break; case METEOR_FMT_AUTOMODE: @@ -1868,7 +1887,6 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) return( 0 ); } - /* * tuner ioctls */ @@ -3353,6 +3371,7 @@ const struct CARDTYPE cards[] = { { "Unknown", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx unknown */ + 0, 0, /* EEProm unknown */ 0, /* EEProm unknown */ { 0, 0, 0, 0, 0 } }, @@ -3361,14 +3380,16 @@ const struct CARDTYPE cards[] = { { "Miro TV", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx unknown */ + 0, 0, /* EEProm unknown */ 0, /* size unknown */ - { 0x02, 0x01, 0x00, 0x00, 1 } }, /* XXX ??? */ + { 0x02, 0x01, 0x00, 0x0a, 1 } }, /* XXX ??? */ /* CARD_HAUPPAUGE */ { "Hauppauge WinCast/TV", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx is optional */ + 0, PFC8582_WADDR, /* EEProm type */ (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ { 0x00, 0x02, 0x01, 0x01, 1 } }, /* audio MUX values */ @@ -3377,6 +3398,7 @@ const struct CARDTYPE cards[] = { { "STB TV/PCI", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx is optional */ + 0, X24C01_WADDR, /* EEProm type */ (u_char)(128 / EEPROMBLOCKSIZE), /* 128 bytes */ { 0x00, 0x01, 0x02, 0x02, 1 } }, /* audio MUX values */ @@ -3387,6 +3409,7 @@ const struct CARDTYPE cards[] = { 0, 0, 0, + 0, { 0, 0, 0, 0, 0 } } }; @@ -3410,6 +3433,8 @@ const struct CARDTYPE cards[] = { #define PHILIPS_NTSC 4 #define PHILIPS_PAL 5 #define PHILIPS_SECAM 6 +#define TEMIC_PALI 7 +#define PHILIPS_PALI 8 /* XXX FIXME: this list is incomplete */ /* input types */ @@ -3487,7 +3512,23 @@ const struct TUNER tuners[] = { 0x00, /* PLL write address */ TSA552x_SCONTROL, /* control byte for PLL */ { 0x00, 0x00 }, /* band-switch crosspoints */ - { 0xa0, 0x90, 0x30 } } /* the band-switch values */ + { 0xa0, 0x90, 0x30 } }, /* the band-switch values */ + + /* TEMIC_PAL I */ + { "Temic PAL I", /* the 'name' */ + TTYPE_PAL, /* input type */ + TEMIC_PALI_WADDR, /* PLL write address */ + TSA552x_SCONTROL, /* control byte for PLL */ + { 0x00, 0x00 }, /* band-switch crosspoints */ + { 0x02, 0x04, 0x01 } }, /* the band-switch values */ + + /* PHILIPS_PAL */ + { "Philips PAL I", /* the 'name' */ + TTYPE_PAL, /* input type */ + 0x00, /* PLL write address */ + TSA552x_SCONTROL, /* control byte for PLL */ + { 0x00, 0x00 }, /* band-switch crosspoints */ + { 0xa0, 0x90, 0x30 } }, /* the band-switch values */ }; @@ -3527,12 +3568,19 @@ probeCard( bktr_ptr_t bktr, int verbose ) { int card; int status; + bt848_ptr_t bt848; + + bt848 = bktr->base; #if defined( OVERRIDE_CARD ) bktr->card = cards[ (card = OVERRIDE_CARD) ]; goto checkTuner; #endif + bt848->gpio_out_en = 0; + if (bootverbose) + printf("bktr: GPIO is 0x%08x\n", bt848->gpio_data); + /* look for a tuner */ if ( i2cRead( bktr, TSA552x_RADDR ) == ABSENT ) { bktr->card = cards[ (card = CARD_INTEL) ]; @@ -3562,26 +3610,40 @@ checkTuner: #endif /* differentiate type of tuner */ - if ( i2cRead( bktr, TEMIC_NTSC_RADDR ) != ABSENT ) { + switch (card) { + case CARD_MIRO: + switch (((bt848->gpio_data >> 10)-1)&7) { + case 0: bktr->card.tuner = &tuners[ TEMIC_PAL ]; break; + case 1: bktr->card.tuner = &tuners[ PHILIPS_PAL ]; break; + case 2: bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; break; + case 3: bktr->card.tuner = &tuners[ PHILIPS_SECAM ]; break; + case 4: bktr->card.tuner = &tuners[ NO_TUNER ]; break; + case 5: bktr->card.tuner = &tuners[ PHILIPS_PALI ]; break; + case 6: bktr->card.tuner = &tuners[ TEMIC_NTSC ]; break; + case 7: bktr->card.tuner = &tuners[ TEMIC_PALI ]; break; + } + break; + default: + if ( i2cRead( bktr, TEMIC_NTSC_RADDR ) != ABSENT ) { bktr->card.tuner = &tuners[ TEMIC_NTSC ]; goto checkDBX; - } + } - if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) { + if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) { bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; goto checkDBX; - } + } - if ( card == CARD_HAUPPAUGE ) { + if ( card == CARD_HAUPPAUGE ) { if ( i2cRead( bktr, TEMIC_PALI_RADDR ) != ABSENT ) { - bktr->card.tuner = &tuners[ TEMIC_PAL ]; - goto checkDBX; + bktr->card.tuner = &tuners[ TEMIC_PAL ]; + goto checkDBX; } + } + /* no tuner found */ + bktr->card.tuner = &tuners[ NO_TUNER ]; } - /* no tuner found */ - bktr->card.tuner = &tuners[ NO_TUNER ]; - checkDBX: #if defined( OVERRIDE_DBX ) bktr->card.dbx = OVERRIDE_DBX; @@ -3590,6 +3652,8 @@ checkDBX: /* probe for BTSC (dbx) chips */ if ( i2cRead( bktr, TDA9850_RADDR ) != ABSENT ) bktr->card.dbx = 1; + if ( i2cRead( bktr, MSP3400C_RADDR ) != ABSENT ) + bktr->card.msp3400c = 1; if ( verbose ) { printf( "%s", bktr->card.name ); @@ -3597,6 +3661,8 @@ checkDBX: printf( ", %s tuner", bktr->card.tuner->name ); if ( bktr->card.dbx ) printf( ", dbx stereo" ); + if ( bktr->card.msp3400c ) + printf( ", msp3400c stereo" ); printf( ".\n" ); } } @@ -4230,4 +4296,5 @@ SYSINIT(bktrdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bktr_drvinit,NULL) /* c-label-offset: -8 */ /* c-continued-statement-offset: 8 */ /* c-tab-always-indent: nil */ +/* tab-width: 8 */ /* End: */ diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h index 2fb8b3d..d0b4a58 100644 --- a/sys/dev/bktr/bktr_reg.h +++ b/sys/dev/bktr/bktr_reg.h @@ -321,7 +321,8 @@ struct TUNER { struct CARDTYPE { char* name; const struct TUNER* tuner; - u_char dbx; + u_char dbx; /* Has DBX chip? */ + u_char msp3400c; /* Has msp3400c chip? */ u_char eepromAddr; u_char eepromSize; /* bytes / EEPROMBLOCKSIZE */ u_char audiomuxs[ 5 ]; /* tuner, ext, int/unused, @@ -337,6 +338,10 @@ struct format_params { int horizontal, vertical; /* frame rate . for ntsc is 30 frames per second */ int frame_rate; +/* A-delay and B-delay */ + u_char adelay, bdelay; +/* Iform XTSEL value */ + int iform_xtsel; }; diff --git a/sys/pci/brktree_reg.h b/sys/pci/brktree_reg.h index 2fb8b3d..d0b4a58 100644 --- a/sys/pci/brktree_reg.h +++ b/sys/pci/brktree_reg.h @@ -321,7 +321,8 @@ struct TUNER { struct CARDTYPE { char* name; const struct TUNER* tuner; - u_char dbx; + u_char dbx; /* Has DBX chip? */ + u_char msp3400c; /* Has msp3400c chip? */ u_char eepromAddr; u_char eepromSize; /* bytes / EEPROMBLOCKSIZE */ u_char audiomuxs[ 5 ]; /* tuner, ext, int/unused, @@ -337,6 +338,10 @@ struct format_params { int horizontal, vertical; /* frame rate . for ntsc is 30 frames per second */ int frame_rate; +/* A-delay and B-delay */ + u_char adelay, bdelay; +/* Iform XTSEL value */ + int iform_xtsel; }; diff --git a/sys/pci/brooktree848.c b/sys/pci/brooktree848.c index a56572d..aa61218 100644 --- a/sys/pci/brooktree848.c +++ b/sys/pci/brooktree848.c @@ -406,10 +406,23 @@ struct devsw bktrsw = { */ static struct format_params format_params[] = { -#define FORMAT_PARAMS_NTSC525 0 - { 525, 22, 480, 910, 135, 754, 640, 780, 30 }, -#define FORMAT_PARAMS_PAL625 1 - { 625, 32, 576, 1135, 186, 922, 768, 944, 25 } +/* # define BT848_IFORM_F_AUTO (0x0) - don't matter. */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, 0 }, +/* # define BT848_IFORM_F_NTSCM (0x1) */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 }, +/* # define BT848_IFORM_F_NTSCJ (0x2) */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 }, +/* # define BT848_IFORM_F_PALBDGHI (0x3) */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1 }, +/* # define BT848_IFORM_F_PALM (0x4) */ + { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 }, +/*{ 625, 32, 576, 910, 186, 922, 640, 780, 25, 0x68, 0x5d, BT848_IFORM_X_XT0 }, */ +/* # define BT848_IFORM_F_PALN (0x5) */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1 }, +/* # define BT848_IFORM_F_SECAM (0x6) */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x00, BT848_IFORM_X_XT1 }, +/* # define BT848_IFORM_F_RSVD (0x7) - ???? */ + { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT0 }, }; /* @@ -520,6 +533,10 @@ static struct { #define TDA9850_WADDR 0xb6 #define TDA9850_RADDR 0xb7 +/* address of MSP3400C chip */ +#define MSP3400C_WADDR 0x80 +#define MSP3400C_RADDR 0x81 + /* EEProm (128 * 8) on an STB card */ #define X24C01_WADDR 0xae @@ -562,7 +579,7 @@ static struct { /* the GPIO bits that control the audio MUXes */ -#define GPIO_AUDIOMUX_BITS 0x07 +#define GPIO_AUDIOMUX_BITS 0x0f /* debug utility for holding previous INT_STAT contents */ @@ -1070,7 +1087,7 @@ video_open( bktr_ptr_t bktr ) BT848_IFORM_X_XT0 | BT848_IFORM_F_NTSCM; bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0; - bktr->format_params = FORMAT_PARAMS_NTSC525; + bktr->format_params = BT848_IFORM_F_NTSCM; bktr->max_clip_node = 0; @@ -1130,7 +1147,7 @@ tuner_open( bktr_ptr_t bktr ) /* enable drivers on the GPIO port that control the MUXes */ bktr->base->gpio_out_en = GPIO_AUDIOMUX_BITS; - /* unmure the audio stream */ + /* unmute the audio stream */ set_audio( bktr, AUDIO_UNMUTE ); /* enable stereo if appropriate */ @@ -1399,7 +1416,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) case BT848SFMT: /* set input format */ temp = *(unsigned long*)arg & BT848_IFORM_FORMAT; bt848->iform &= ~BT848_IFORM_FORMAT; - bt848->iform |= temp; + bt848->iform |= (temp | format_params[temp].iform_xtsel); switch( temp ) { case BT848_IFORM_F_AUTO: bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | @@ -1408,23 +1425,25 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) case BT848_IFORM_F_NTSCM: case BT848_IFORM_F_NTSCJ: - case BT848_IFORM_F_PALM: bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_NTSC; - bt848->adelay = 0x68; - bt848->bdelay = 0x5d; - bktr->format_params = FORMAT_PARAMS_NTSC525; + METEOR_NTSC; + bt848->adelay = format_params[temp].adelay; + bt848->bdelay = format_params[temp].bdelay; + bktr->format_params = temp; break; case BT848_IFORM_F_PALBDGHI: case BT848_IFORM_F_PALN: case BT848_IFORM_F_SECAM: case BT848_IFORM_F_RSVD: + case BT848_IFORM_F_PALM: bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | METEOR_PAL; - bt848->adelay = 0x7f; - bt848->bdelay = 0x72; - bktr->format_params = FORMAT_PARAMS_PAL625; + bt848->adelay = format_params[temp].adelay; + bt848->bdelay = format_params[temp].bdelay; + bktr->format_params = temp; + break; + } break; @@ -1438,7 +1457,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) bt848->iform |= BT848_IFORM_F_NTSCM; bt848->adelay = 0x68; bt848->bdelay = 0x5d; - bktr->format_params = FORMAT_PARAMS_NTSC525; + bktr->format_params = BT848_IFORM_F_NTSCM; break; case METEOR_FMT_PAL: @@ -1448,7 +1467,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) bt848->iform |= BT848_IFORM_F_PALBDGHI; bt848->adelay = 0x7f; bt848->bdelay = 0x72; - bktr->format_params = FORMAT_PARAMS_PAL625; + bktr->format_params = BT848_IFORM_F_PALBDGHI; break; case METEOR_FMT_AUTOMODE: @@ -1868,7 +1887,6 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ) return( 0 ); } - /* * tuner ioctls */ @@ -3353,6 +3371,7 @@ const struct CARDTYPE cards[] = { { "Unknown", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx unknown */ + 0, 0, /* EEProm unknown */ 0, /* EEProm unknown */ { 0, 0, 0, 0, 0 } }, @@ -3361,14 +3380,16 @@ const struct CARDTYPE cards[] = { { "Miro TV", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx unknown */ + 0, 0, /* EEProm unknown */ 0, /* size unknown */ - { 0x02, 0x01, 0x00, 0x00, 1 } }, /* XXX ??? */ + { 0x02, 0x01, 0x00, 0x0a, 1 } }, /* XXX ??? */ /* CARD_HAUPPAUGE */ { "Hauppauge WinCast/TV", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx is optional */ + 0, PFC8582_WADDR, /* EEProm type */ (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ { 0x00, 0x02, 0x01, 0x01, 1 } }, /* audio MUX values */ @@ -3377,6 +3398,7 @@ const struct CARDTYPE cards[] = { { "STB TV/PCI", /* the 'name' */ NULL, /* the tuner */ 0, /* dbx is optional */ + 0, X24C01_WADDR, /* EEProm type */ (u_char)(128 / EEPROMBLOCKSIZE), /* 128 bytes */ { 0x00, 0x01, 0x02, 0x02, 1 } }, /* audio MUX values */ @@ -3387,6 +3409,7 @@ const struct CARDTYPE cards[] = { 0, 0, 0, + 0, { 0, 0, 0, 0, 0 } } }; @@ -3410,6 +3433,8 @@ const struct CARDTYPE cards[] = { #define PHILIPS_NTSC 4 #define PHILIPS_PAL 5 #define PHILIPS_SECAM 6 +#define TEMIC_PALI 7 +#define PHILIPS_PALI 8 /* XXX FIXME: this list is incomplete */ /* input types */ @@ -3487,7 +3512,23 @@ const struct TUNER tuners[] = { 0x00, /* PLL write address */ TSA552x_SCONTROL, /* control byte for PLL */ { 0x00, 0x00 }, /* band-switch crosspoints */ - { 0xa0, 0x90, 0x30 } } /* the band-switch values */ + { 0xa0, 0x90, 0x30 } }, /* the band-switch values */ + + /* TEMIC_PAL I */ + { "Temic PAL I", /* the 'name' */ + TTYPE_PAL, /* input type */ + TEMIC_PALI_WADDR, /* PLL write address */ + TSA552x_SCONTROL, /* control byte for PLL */ + { 0x00, 0x00 }, /* band-switch crosspoints */ + { 0x02, 0x04, 0x01 } }, /* the band-switch values */ + + /* PHILIPS_PAL */ + { "Philips PAL I", /* the 'name' */ + TTYPE_PAL, /* input type */ + 0x00, /* PLL write address */ + TSA552x_SCONTROL, /* control byte for PLL */ + { 0x00, 0x00 }, /* band-switch crosspoints */ + { 0xa0, 0x90, 0x30 } }, /* the band-switch values */ }; @@ -3527,12 +3568,19 @@ probeCard( bktr_ptr_t bktr, int verbose ) { int card; int status; + bt848_ptr_t bt848; + + bt848 = bktr->base; #if defined( OVERRIDE_CARD ) bktr->card = cards[ (card = OVERRIDE_CARD) ]; goto checkTuner; #endif + bt848->gpio_out_en = 0; + if (bootverbose) + printf("bktr: GPIO is 0x%08x\n", bt848->gpio_data); + /* look for a tuner */ if ( i2cRead( bktr, TSA552x_RADDR ) == ABSENT ) { bktr->card = cards[ (card = CARD_INTEL) ]; @@ -3562,26 +3610,40 @@ checkTuner: #endif /* differentiate type of tuner */ - if ( i2cRead( bktr, TEMIC_NTSC_RADDR ) != ABSENT ) { + switch (card) { + case CARD_MIRO: + switch (((bt848->gpio_data >> 10)-1)&7) { + case 0: bktr->card.tuner = &tuners[ TEMIC_PAL ]; break; + case 1: bktr->card.tuner = &tuners[ PHILIPS_PAL ]; break; + case 2: bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; break; + case 3: bktr->card.tuner = &tuners[ PHILIPS_SECAM ]; break; + case 4: bktr->card.tuner = &tuners[ NO_TUNER ]; break; + case 5: bktr->card.tuner = &tuners[ PHILIPS_PALI ]; break; + case 6: bktr->card.tuner = &tuners[ TEMIC_NTSC ]; break; + case 7: bktr->card.tuner = &tuners[ TEMIC_PALI ]; break; + } + break; + default: + if ( i2cRead( bktr, TEMIC_NTSC_RADDR ) != ABSENT ) { bktr->card.tuner = &tuners[ TEMIC_NTSC ]; goto checkDBX; - } + } - if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) { + if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) { bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; goto checkDBX; - } + } - if ( card == CARD_HAUPPAUGE ) { + if ( card == CARD_HAUPPAUGE ) { if ( i2cRead( bktr, TEMIC_PALI_RADDR ) != ABSENT ) { - bktr->card.tuner = &tuners[ TEMIC_PAL ]; - goto checkDBX; + bktr->card.tuner = &tuners[ TEMIC_PAL ]; + goto checkDBX; } + } + /* no tuner found */ + bktr->card.tuner = &tuners[ NO_TUNER ]; } - /* no tuner found */ - bktr->card.tuner = &tuners[ NO_TUNER ]; - checkDBX: #if defined( OVERRIDE_DBX ) bktr->card.dbx = OVERRIDE_DBX; @@ -3590,6 +3652,8 @@ checkDBX: /* probe for BTSC (dbx) chips */ if ( i2cRead( bktr, TDA9850_RADDR ) != ABSENT ) bktr->card.dbx = 1; + if ( i2cRead( bktr, MSP3400C_RADDR ) != ABSENT ) + bktr->card.msp3400c = 1; if ( verbose ) { printf( "%s", bktr->card.name ); @@ -3597,6 +3661,8 @@ checkDBX: printf( ", %s tuner", bktr->card.tuner->name ); if ( bktr->card.dbx ) printf( ", dbx stereo" ); + if ( bktr->card.msp3400c ) + printf( ", msp3400c stereo" ); printf( ".\n" ); } } @@ -4230,4 +4296,5 @@ SYSINIT(bktrdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bktr_drvinit,NULL) /* c-label-offset: -8 */ /* c-continued-statement-offset: 8 */ /* c-tab-always-indent: nil */ +/* tab-width: 8 */ /* End: */ |