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 26static 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 ****************************************************************************/ 67static 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 102static 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 123static 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 208static 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 293static 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 310const 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 353void 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 363void 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 625static void RADEON_TDA9885_Init(RADEONPortPrivPtr pPriv) 626{ 627TDA9885Ptr t=pPriv->tda9885; 628t->sound_trap=0; 629t->auto_mute_fm=1; /* ? */ 630t->carrier_mode=0; /* ??? */ 631t->modulation=2; /* negative FM */ 632t->forced_mute_audio=0; 633t->port1=1; 634t->port2=1; 635t->top_adjustment=0x10; 636t->deemphasis=1; 637t->audio_gain=0; 638t->minimum_gain=0; 639t->gating=0; 640t->vif_agc=1; /* set to 1 ? - depends on design */ 641t->gating=0; 642} 643