Home | History | Annotate | Line # | Download | only in src
      1 #ifdef HAVE_CONFIG_H
      2 #include "config.h"
      3 #endif
      4 
      5 #include <math.h>
      6 
      7 #include "radeon.h"
      8 #include "radeon_reg.h"
      9 #include "radeon_macros.h"
     10 #include "radeon_probe.h"
     11 #include <X11/extensions/Xv.h>
     12 #include "radeon_video.h"
     13 #include "atipciids.h"
     14 
     15 #include "xf86.h"
     16 
     17 /* i2c stuff */
     18 #include "xf86i2c.h"
     19 #include "fi1236.h"
     20 #include "msp3430.h"
     21 #include "tda9885.h"
     22 #include "uda1380.h"
     23 #include "i2c_def.h"
     24 
     25 
     26 static void RADEON_TDA9885_Init(RADEONPortPrivPtr pPriv);
     27 
     28 /* Wait for 10ms at the most for the I2C_GO register to drop. */
     29 #define I2C_WAIT_FOR_GO() { \
     30 	int i2ctries = 0; \
     31 	RADEONWaitForIdleMMIO(pScrn); \
     32 	write_mem_barrier(); \
     33 	while (i2ctries < 10) { \
     34 		reg = INREG8(RADEON_I2C_CNTL_0+1); \
     35 		if (!(reg & (RADEON_I2C_GO >> 8))) \
     36 			break; \
     37 		if (reg & (RADEON_I2C_ABORT >> 8)) \
     38 			break; \
     39 		usleep(1000); \
     40 		i2ctries++; \
     41 	} \
     42 }
     43 
     44 /* Wait, and dump the status in the 'status' register.  If we time out or
     45  * receive an abort signal, halt/restart the I2C bus and leave _ABORT in the
     46  * status register. */
     47 #define I2C_WAIT_WITH_STATUS() { \
     48 	I2C_WAIT_FOR_GO() \
     49 	if (reg & ((RADEON_I2C_ABORT >> 8) | (RADEON_I2C_GO >> 8))) { \
     50 		RADEON_I2C_Halt(pScrn); \
     51 		status = RADEON_I2C_ABORT; \
     52 	} \
     53 	else \
     54 		status = RADEON_I2C_WaitForAck(pScrn, pPriv); \
     55 }
     56 
     57 /****************************************************************************
     58  *  I2C_WaitForAck (void)                                                   *
     59  *                                                                          *
     60  *  Function: polls the I2C status bits, waiting for an acknowledge or      *
     61  *            an error condition.                                           *
     62  *    Inputs: NONE                                                          *
     63  *   Outputs: I2C_DONE - the I2C transfer was completed                     *
     64  *            I2C_NACK - an NACK was received from the slave                *
     65  *            I2C_HALT - a timeout condition has occured                    *
     66  ****************************************************************************/
     67 static uint8_t RADEON_I2C_WaitForAck (ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
     68 {
     69     uint8_t retval = 0;
     70     RADEONInfoPtr info = RADEONPTR(pScrn);
     71     unsigned char *RADEONMMIO = info->MMIO;
     72     long counter = 0;
     73 
     74     usleep(1000);
     75     while(1)
     76     {
     77         RADEONWaitForIdleMMIO(pScrn);
     78         retval = INREG8(RADEON_I2C_CNTL_0);
     79         if (retval & RADEON_I2C_HALT)
     80         {
     81             return (RADEON_I2C_HALT);
     82         }
     83         if (retval & RADEON_I2C_NACK)
     84         {
     85             return (RADEON_I2C_NACK);
     86         }
     87         if(retval & RADEON_I2C_DONE)
     88         {
     89             return RADEON_I2C_DONE;
     90         }
     91         counter++;
     92 	/* 50ms ought to be long enough. */
     93         if(counter > 50)
     94         {
     95              xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Timeout condition on Radeon i2c bus\n");
     96              return RADEON_I2C_HALT;
     97         }
     98 	usleep(1000);
     99     }
    100 }
    101 
    102 static void RADEON_I2C_Halt (ScrnInfoPtr pScrn)
    103 {
    104     RADEONInfoPtr info = RADEONPTR(pScrn);
    105     unsigned char *RADEONMMIO = info->MMIO;
    106     uint8_t    reg;
    107 
    108     /* reset status flags */
    109     RADEONWaitForIdleMMIO(pScrn);
    110     reg = INREG8 (RADEON_I2C_CNTL_0 + 0) & ~(RADEON_I2C_DONE|RADEON_I2C_NACK|RADEON_I2C_HALT);
    111     OUTREG8 (RADEON_I2C_CNTL_0 + 0, reg);
    112 
    113     /* issue ABORT call */
    114     RADEONWaitForIdleMMIO(pScrn);
    115     reg = INREG8 (RADEON_I2C_CNTL_0 + 1) & 0xE7;
    116     OUTREG8 (RADEON_I2C_CNTL_0 + 1, (reg |((RADEON_I2C_GO|RADEON_I2C_ABORT) >> 8)));
    117 
    118     /* wait for GO bit to go low */
    119     I2C_WAIT_FOR_GO();
    120 }
    121 
    122 
    123 static Bool RADEONI2CWriteRead(I2CDevPtr d, I2CByte *WriteBuffer, int nWrite,
    124                             I2CByte *ReadBuffer, int nRead)
    125 {
    126     int loop, status;
    127     uint32_t i2c_cntl_0, i2c_cntl_1;
    128     uint8_t reg;
    129     RADEONPortPrivPtr pPriv = (RADEONPortPrivPtr)(d->pI2CBus->DriverPrivate.ptr);
    130     ScrnInfoPtr pScrn = xf86Screens[d->pI2CBus->scrnIndex];
    131     RADEONInfoPtr info = RADEONPTR(pScrn);
    132     unsigned char *RADEONMMIO = info->MMIO;
    133 
    134     status=RADEON_I2C_DONE;
    135 
    136     RADEONWaitForIdleMMIO(pScrn);
    137     if(nWrite>0){
    138 /*       RADEONWaitForFifo(pScrn, 4+nWrite); */
    139 
    140        /* Clear the status bits of the I2C Controller */
    141        OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST);
    142 
    143        /* Write the address into the buffer first */
    144        OUTREG(RADEON_I2C_DATA, (uint32_t) (d->SlaveAddr) & ~(1));
    145 
    146        /* Write Value into the buffer */
    147        for (loop = 0; loop < nWrite; loop++)
    148        {
    149           OUTREG8(RADEON_I2C_DATA, WriteBuffer[loop]);
    150        }
    151 
    152        i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL |
    153                         nWrite | 0x100;
    154        OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1);
    155 
    156        i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) |
    157                         RADEON_I2C_GO | RADEON_I2C_START | ((nRead >0)?0:RADEON_I2C_STOP) | RADEON_I2C_DRIVE_EN;
    158        OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0);
    159 
    160        I2C_WAIT_WITH_STATUS();
    161 
    162        if(status!=RADEON_I2C_DONE){
    163           RADEON_I2C_Halt(pScrn);
    164           return FALSE;
    165           }
    166     }
    167 
    168 
    169     if(nRead > 0) {
    170        RADEONWaitForFifo(pScrn, 4+nRead);
    171 
    172        OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST);
    173 
    174        /* Write the address into the buffer first */
    175        OUTREG(RADEON_I2C_DATA, (uint32_t) (d->SlaveAddr) | (1));
    176 
    177        i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL |
    178                         nRead | 0x100;
    179        OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1);
    180 
    181        i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) |
    182                         RADEON_I2C_GO | RADEON_I2C_START | RADEON_I2C_STOP | RADEON_I2C_DRIVE_EN | RADEON_I2C_RECEIVE;
    183        OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0);
    184 
    185        I2C_WAIT_WITH_STATUS();
    186 
    187        /* Write Value into the buffer */
    188        for (loop = 0; loop < nRead; loop++)
    189        {
    190           RADEONWaitForFifo(pScrn, 1);
    191           if((status == RADEON_I2C_HALT) || (status == RADEON_I2C_NACK))
    192           {
    193           ReadBuffer[loop]=0xff;
    194           } else {
    195           RADEONWaitForIdleMMIO(pScrn);
    196           ReadBuffer[loop]=INREG8(RADEON_I2C_DATA) & 0xff;
    197           }
    198        }
    199     }
    200 
    201     if(status!=RADEON_I2C_DONE){
    202        RADEON_I2C_Halt(pScrn);
    203        return FALSE;
    204        }
    205     return TRUE;
    206 }
    207 
    208 static Bool R200_I2CWriteRead(I2CDevPtr d, I2CByte *WriteBuffer, int nWrite,
    209                             I2CByte *ReadBuffer, int nRead)
    210 {
    211     int loop, status;
    212     uint32_t i2c_cntl_0, i2c_cntl_1;
    213     uint8_t reg;
    214     RADEONPortPrivPtr pPriv = (RADEONPortPrivPtr)(d->pI2CBus->DriverPrivate.ptr);
    215     ScrnInfoPtr pScrn = xf86Screens[d->pI2CBus->scrnIndex];
    216     RADEONInfoPtr info = RADEONPTR(pScrn);
    217     unsigned char *RADEONMMIO = info->MMIO;
    218 
    219     status=RADEON_I2C_DONE;
    220 
    221     RADEONWaitForIdleMMIO(pScrn);
    222     if(nWrite>0){
    223 /*       RADEONWaitForFifo(pScrn, 4+nWrite); */
    224 
    225        /* Clear the status bits of the I2C Controller */
    226        OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST);
    227 
    228        /* Write the address into the buffer first */
    229        OUTREG(RADEON_I2C_DATA, (uint32_t) (d->SlaveAddr) & ~(1));
    230 
    231        /* Write Value into the buffer */
    232        for (loop = 0; loop < nWrite; loop++)
    233        {
    234           OUTREG8(RADEON_I2C_DATA, WriteBuffer[loop]);
    235        }
    236 
    237        i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL |
    238                         nWrite | 0x010;
    239        OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1);
    240 
    241        i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) |
    242                         RADEON_I2C_GO | RADEON_I2C_START | ((nRead >0)?0:RADEON_I2C_STOP) | RADEON_I2C_DRIVE_EN;
    243        OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0);
    244 
    245        I2C_WAIT_WITH_STATUS();
    246 
    247        if(status!=RADEON_I2C_DONE){
    248           RADEON_I2C_Halt(pScrn);
    249           return FALSE;
    250           }
    251     }
    252 
    253 
    254     if(nRead > 0) {
    255        RADEONWaitForFifo(pScrn, 4+nRead);
    256 
    257        OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST);
    258 
    259        /* Write the address into the buffer first */
    260        OUTREG(RADEON_I2C_DATA, (uint32_t) (d->SlaveAddr) | (1));
    261 
    262        i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL |
    263                         nRead | 0x010;
    264        OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1);
    265 
    266        i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) |
    267                         RADEON_I2C_GO | RADEON_I2C_START | RADEON_I2C_STOP | RADEON_I2C_DRIVE_EN | RADEON_I2C_RECEIVE;
    268        OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0);
    269 
    270        I2C_WAIT_WITH_STATUS();
    271 
    272        RADEONWaitForIdleMMIO(pScrn);
    273        /* Write Value into the buffer */
    274        for (loop = 0; loop < nRead; loop++)
    275        {
    276           if((status == RADEON_I2C_HALT) || (status == RADEON_I2C_NACK))
    277           {
    278           ReadBuffer[loop]=0xff;
    279           } else {
    280           ReadBuffer[loop]=INREG8(RADEON_I2C_DATA) & 0xff;
    281           }
    282        }
    283     }
    284 
    285     if(status!=RADEON_I2C_DONE){
    286        RADEON_I2C_Halt(pScrn);
    287        return FALSE;
    288        }
    289     return TRUE;
    290 }
    291 
    292 #if 0
    293 static Bool RADEONProbeAddress(I2CBusPtr b, I2CSlaveAddr addr)
    294 {
    295      I2CByte a;
    296      I2CDevRec d;
    297 
    298      d.DevName = "Probing";
    299      d.SlaveAddr = addr;
    300      d.pI2CBus = b;
    301      d.NextDev = NULL;
    302 
    303      return I2C_WriteRead(&d, NULL, 0, &a, 1);
    304 }
    305 #endif
    306 
    307 #define I2C_CLOCK_FREQ     (60000.0)
    308 
    309 
    310 const struct
    311 {
    312    char *name;
    313    int type;
    314 } RADEON_tuners[32] =
    315     {
    316         /* name ,index to tuner_parms table */
    317         {"NO TUNER"            , -1},
    318         {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},
    319         {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},
    320         {"Philips FI1216 (or compatible)"               , TUNER_TYPE_FI1216},
    321         {"Philips FI1246 (or compatible)"               , TUNER_TYPE_FI1246},
    322         {"Philips FI1216MF (or compatible)"             , TUNER_TYPE_FI1216},
    323         {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},
    324         {"Philips FI1256 (or compatible)"               , TUNER_TYPE_FI1256},
    325         {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},
    326         {"Philips FI1216 (or compatible)"               , TUNER_TYPE_FI1216},
    327         {"Philips FI1246 (or compatible)"               , TUNER_TYPE_FI1246},
    328         {"Philips FI1216MF (or compatible)"             , TUNER_TYPE_FI1216},
    329         {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},
    330         {"TEMIC-FN5AL"          , TUNER_TYPE_TEMIC_FN5AL},
    331         {"FQ1216ME/P"           , TUNER_TYPE_FI1216},
    332         {"FI1236W"              , TUNER_TYPE_FI1236W},
    333 	{"Philips FI1216ME (or compatible)"             , TUNER_TYPE_FM1216ME},
    334         /*{"Alps TSCxx"           , -1},*/
    335 	{"Philips FM1236/F"     , TUNER_TYPE_FI1236W},
    336 	{"Philips FI1216ME (or compatible)"             , TUNER_TYPE_FM1216ME},
    337         {"UNKNOWN-19"           , -1},
    338         {"UNKNOWN-20"           , -1},
    339         {"UNKNOWN-21"           , -1},
    340         {"UNKNOWN-22"           , -1},
    341         {"UNKNOWN-23"           , -1},
    342         {"UNKNOWN-24"           , -1},
    343         {"UNKNOWN-25"           , -1},
    344         {"UNKNOWN-26"           , -1},
    345         {"UNKNOWN-27"           , -1},
    346         {"UNKNOWN-28"           , -1},
    347         {"Microtuner MT2032"            , TUNER_TYPE_MT2032},
    348         {"Microtuner MT2032"            , TUNER_TYPE_MT2032},
    349         {"UNKNOWN-31"           , -1}
    350     };
    351 
    352 
    353 void RADEONResetI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
    354 {
    355     RADEONInfoPtr info = RADEONPTR(pScrn);
    356     unsigned char *RADEONMMIO = info->MMIO;
    357 
    358     RADEONWaitForFifo(pScrn, 2);
    359     OUTREG8(RADEON_I2C_CNTL_1+2, ((RADEON_I2C_SEL | RADEON_I2C_EN)>>16));
    360     OUTREG8(RADEON_I2C_CNTL_0+0, (RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST | RADEON_I2C_DRIVE_EN | RADEON_I2C_DRIVE_SEL));
    361 }
    362 
    363 void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
    364 {
    365     double nm;
    366     RADEONInfoPtr info = RADEONPTR(pScrn);
    367     RADEONPLLPtr  pll = &(info->pll);
    368 
    369     pPriv->i2c = NULL;
    370     pPriv->fi1236 = NULL;
    371     pPriv->msp3430 = NULL;
    372     pPriv->tda9885 = NULL;
    373 	 pPriv->uda1380 = NULL;
    374     #if 0 /* put back on when saa7114 support is present */
    375     pPriv->saa7114 = NULL;
    376     #endif
    377 
    378     /* Blacklist chipsets that lockup - these are usually older mobility chips */
    379 
    380     switch(info->Chipset){
    381     	case PCI_CHIP_RADEON_LY:
    382 	case PCI_CHIP_RADEON_LZ:
    383 	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility M6, disabling multimedia i2c\n");
    384 	     return;
    385 	case PCI_CHIP_RADEON_LW:
    386 	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility M7, disabling multimedia i2c\n");
    387  	     return;
    388 	/*case PCI_CHIP_RV250_If:
    389 	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon 9000 - skipping multimedia i2c initialization code.\n");
    390 	     return;*/
    391 	case PCI_CHIP_RV370_5460:
    392 	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility X300, disabling multimedia i2c\n");
    393 	     return;
    394 	}
    395 
    396     /* no multimedia capabilities detected and no information was provided to substitute for it */
    397     if(!info->MM_TABLE_valid  &&
    398        !(info->tunerType>=0))
    399     {
    400        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No video input capabilities detected and no information is provided - disabling multimedia i2c\n");
    401        return;
    402     }
    403 
    404 
    405     if(pPriv->i2c!=NULL) return;  /* for some reason we are asked to init it again.. Stop ! */
    406 
    407     if(!xf86LoadSubModule(pScrn,"i2c"))
    408     {
    409         xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Unable to initialize i2c bus\n");
    410         pPriv->i2c = NULL;
    411         return;
    412     }
    413     pPriv->i2c=CreateI2CBusRec();
    414     pPriv->i2c->scrnIndex=pScrn->scrnIndex;
    415     pPriv->i2c->BusName="Radeon multimedia bus";
    416     pPriv->i2c->DriverPrivate.ptr=(pointer)pPriv;
    417     switch(info->ChipFamily){
    418     	case CHIP_FAMILY_RV350:
    419     	case CHIP_FAMILY_R350:
    420     	case CHIP_FAMILY_R300:
    421 	case CHIP_FAMILY_RV250:
    422     	case CHIP_FAMILY_R200:
    423 		case CHIP_FAMILY_RV200:
    424             	pPriv->i2c->I2CWriteRead=R200_I2CWriteRead;
    425             	xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using R200 i2c bus access method\n");
    426 		break;
    427 	default:
    428             	pPriv->i2c->I2CWriteRead=RADEONI2CWriteRead;
    429             	xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using Radeon bus access method\n");
    430         }
    431     if(!I2CBusInit(pPriv->i2c))
    432     {
    433         xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Failed to register i2c bus\n");
    434     }
    435 
    436 #if 1
    437     switch(info->ChipFamily){
    438 	case CHIP_FAMILY_RV200:
    439             nm=(pll->reference_freq * 40000.0)/(1.0*I2C_CLOCK_FREQ);
    440 	    break;
    441     	case CHIP_FAMILY_R300:
    442     	case CHIP_FAMILY_R200:
    443     	    if(info->MM_TABLE_valid && (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_MT2032)){
    444                 nm=(pll->reference_freq * 40000.0)/(4.0*I2C_CLOCK_FREQ);
    445 	        break;
    446                 }
    447 	default:
    448             nm=(pll->reference_freq * 10000.0)/(4.0*I2C_CLOCK_FREQ);
    449         }
    450 #else
    451     nm=(pll->xclk * 40000.0)/(1.0*I2C_CLOCK_FREQ);
    452 #endif
    453     for(pPriv->radeon_N=1; pPriv->radeon_N<255; pPriv->radeon_N++)
    454           if((pPriv->radeon_N * (pPriv->radeon_N-1)) > nm)break;
    455     pPriv->radeon_M=pPriv->radeon_N-1;
    456     pPriv->radeon_i2c_timing=2*pPriv->radeon_N;
    457 
    458 
    459 #if 0
    460     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ref=%d M=0x%02x N=0x%02x timing=0x%02x\n", pll->reference_freq, pPriv->radeon_M, pPriv->radeon_N, pPriv->radeon_i2c_timing);
    461     pPriv->radeon_M=0x32;
    462     pPriv->radeon_N=0x33;
    463     pPriv->radeon_i2c_timing=2*pPriv->radeon_N;
    464 #endif
    465     RADEONResetI2C(pScrn, pPriv);
    466 
    467 #if 0 /* I don't know whether standalone boards are supported with Radeons */
    468       /* looks like none of them have AMC connectors anyway */
    469     if(!info->MM_TABLE_valid)RADEON_read_eeprom(pPriv);
    470 #endif
    471 
    472     if(!xf86LoadSubModule(pScrn,"fi1236"))
    473     {
    474        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize fi1236 driver\n");
    475     }
    476     else
    477     {
    478     if(pPriv->fi1236 == NULL)
    479     {
    480         pPriv->fi1236 = xf86_Detect_FI1236(pPriv->i2c, FI1236_ADDR_1);
    481     }
    482     if(pPriv->fi1236 == NULL)
    483     {
    484         pPriv->fi1236 = xf86_Detect_FI1236(pPriv->i2c, FI1236_ADDR_2);
    485     }
    486     }
    487     if(pPriv->fi1236 != NULL)
    488     {
    489          xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected %s device at 0x%02x\n",
    490                RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].name,
    491                FI1236_ADDR(pPriv->fi1236));
    492          if(info->MM_TABLE_valid)xf86_FI1236_set_tuner_type(pPriv->fi1236, RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type);
    493                 else {
    494                    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "MM_TABLE not found (standalone board ?), forcing tuner type to NTSC\n");
    495                     xf86_FI1236_set_tuner_type(pPriv->fi1236, TUNER_TYPE_FI1236);
    496                 }
    497     }
    498 
    499     if(info->MM_TABLE_valid && (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_MT2032)){
    500     if(!xf86LoadSubModule(pScrn,"tda9885"))
    501     {
    502        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize tda9885 driver\n");
    503     }
    504     else
    505     {
    506     if(pPriv->tda9885 == NULL)
    507     {
    508         pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_1);
    509     }
    510     if(pPriv->tda9885 == NULL)
    511     {
    512         pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_2);
    513     }
    514     if(pPriv->tda9885 != NULL)
    515     {
    516         RADEON_TDA9885_Init(pPriv);
    517     }
    518     }
    519     }
    520 
    521 	if(info->MM_TABLE_valid && ((RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_FM1216ME)
    522 							|| (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_FI1236W)))
    523 	{
    524 		if(!xf86LoadSubModule(pScrn,"tda9885"))
    525 		{
    526 			xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize tda9885 driver\n");
    527 		}
    528 		else
    529 		{
    530 			if(pPriv->tda9885 == NULL)
    531 			{
    532 				pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_1);
    533 			}
    534 			if(pPriv->tda9885 == NULL)
    535 			{
    536 				pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_2);
    537 			}
    538 			if(pPriv->tda9885 != NULL)
    539 			{
    540 				RADEON_TDA9885_Init(pPriv);
    541 				pPriv->fi1236->afc_source = (void*)pPriv->tda9885;
    542 			}
    543 		}
    544 	}
    545 
    546 	if(!xf86LoadSubModule(pScrn,"uda1380"))
    547 	{
    548 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize uda1380 driver\n");
    549 	}
    550 	else
    551 	{
    552 		if(pPriv->uda1380 == NULL)
    553 		{
    554 			pPriv->uda1380 = xf86_Detect_uda1380(pPriv->i2c, UDA1380_ADDR_1);
    555 		}
    556 		if(pPriv->uda1380 == NULL)
    557 		{
    558 			pPriv->uda1380 = xf86_Detect_uda1380(pPriv->i2c, UDA1380_ADDR_2);
    559 		}
    560 		if(pPriv->uda1380 != NULL)
    561 		{
    562 			xf86_uda1380_init(pPriv->uda1380);
    563 		}
    564 	}
    565 
    566 
    567     if(!xf86LoadSubModule(pScrn,"msp3430"))
    568     {
    569        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize msp3430 driver\n");
    570     }
    571     else
    572     {
    573     if(pPriv->msp3430 == NULL)
    574     {
    575        pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_1);
    576     }
    577     if(pPriv->msp3430 == NULL)
    578     {
    579        pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_2);
    580     }
    581 #if 0 /* this would confuse bt829 with msp3430 */
    582     if(pPriv->msp3430 == NULL)
    583     {
    584        pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_3);
    585     }
    586 #endif
    587     }
    588     if(pPriv->msp3430 != NULL)
    589     {
    590        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected MSP3430 at 0x%02x\n",
    591                  MSP3430_ADDR(pPriv->msp3430));
    592        pPriv->msp3430->standard = MSP3430_NTSC;
    593        pPriv->msp3430->connector = MSP3430_CONNECTOR_1;
    594        xf86_ResetMSP3430(pPriv->msp3430);
    595        xf86_InitMSP3430(pPriv->msp3430);
    596        xf86_MSP3430SetVolume(pPriv->msp3430, pPriv->mute ? MSP3430_FAST_MUTE : MSP3430_VOLUME(pPriv->volume));
    597     }
    598 
    599 #if 0 /* put this back when saa7114 driver is ready */
    600     if(!xf86LoadSubModule(pScrn,"saa7114"))
    601     {
    602        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize saa7114 driver\n");
    603     }
    604     else
    605     {
    606     if(pPriv->saa7114 == NULL)
    607     {
    608        pPriv->saa7114 = xf86_DetectSAA7114(pPriv->i2c, SAA7114_ADDR_1);
    609     }
    610     if(pPriv->saa7114 == NULL)
    611     {
    612        pPriv->saa7114 = xf86_DetectSAA7114(pPriv->i2c, SAA7114_ADDR_2);
    613     }
    614     }
    615     if(pPriv->saa7114 != NULL)
    616     {
    617        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected SAA7114 at 0x%02x\n",
    618                  pPriv->saa7114->d.SlaveAddr);
    619        xf86_InitSAA7114(pPriv->saa7114);
    620     }
    621 #endif
    622 
    623 }
    624 
    625 static void RADEON_TDA9885_Init(RADEONPortPrivPtr pPriv)
    626 {
    627 TDA9885Ptr t=pPriv->tda9885;
    628 t->sound_trap=0;
    629 t->auto_mute_fm=1; /* ? */
    630 t->carrier_mode=0; /* ??? */
    631 t->modulation=2; /* negative FM */
    632 t->forced_mute_audio=0;
    633 t->port1=1;
    634 t->port2=1;
    635 t->top_adjustment=0x10;
    636 t->deemphasis=1;
    637 t->audio_gain=0;
    638 t->minimum_gain=0;
    639 t->gating=0;
    640 t->vif_agc=1; /* set to 1 ? - depends on design */
    641 t->gating=0;
    642 }
    643