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