diff --git a/src/radeon.h b/src/radeon.h index 37ca67d..f7eadae 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -385,6 +385,21 @@ typedef enum { (info->ChipFamily == CHIP_FAMILY_RV410) || \ (info->ChipFamily == CHIP_FAMILY_RS400)) +/* i2c bus for gatos and DVO, etc. */ +typedef struct +{ + CARD32 i2c_cntl0_reg; + CARD32 i2c_cntl1_reg; + CARD32 i2c_data_reg; + + CARD32 radeon_i2c_timing; + CARD32 radeon_M; + CARD32 radeon_N; + + I2CBusPtr pI2CBus; + +} RADEONI2CInfo; + /* * Errata workarounds */ @@ -819,6 +834,8 @@ typedef struct { CARD32 tv_dac_adj; + RADEONI2CInfo i2c_info; + } RADEONInfoRec, *RADEONInfoPtr; #define RADEONWaitForFifo(pScrn, entries) \ @@ -893,8 +910,12 @@ extern Bool RADEONGetLVDSInfoFromBIOS (ScrnInfoPtr pScrn); extern Bool RADEONGetTMDSInfoFromBIOS (ScrnInfoPtr pScrn); extern Bool RADEONGetHardCodedEDIDFromBIOS (ScrnInfoPtr pScrn); -extern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); +extern void RADEONResetI2C(ScrnInfoPtr pScrn); +extern void RADEONInitI2C(ScrnInfoPtr pScrn); +extern void RADEONResetI2CTiming(ScrnInfoPtr pScrn); + extern Bool RADEONI2cInit(ScrnInfoPtr pScrn); +extern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); extern void RADEONSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag); extern void RADEONSetupConnectors(ScrnInfoPtr pScrn); extern Bool RADEONMapControllers(ScrnInfoPtr pScrn); diff --git a/src/radeon_display.c b/src/radeon_display.c index d661c17..d2dbd01 100644 --- a/src/radeon_display.c +++ b/src/radeon_display.c @@ -158,53 +158,6 @@ static const CARD32 default_tvdac_adj [CHIP_FAMILY_LAST] = 0x00780000, /* rs400 */ /* FIXME: just values from rv380 used... */ }; -static void RADEONI2CGetBits(I2CBusPtr b, int *Clock, int *data) -{ - ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned long val; - unsigned char *RADEONMMIO = info->MMIO; - - /* Get the result */ - val = INREG(info->DDCReg); - - *Clock = (val & RADEON_GPIO_Y_1) != 0; - *data = (val & RADEON_GPIO_Y_0) != 0; -} - -static void RADEONI2CPutBits(I2CBusPtr b, int Clock, int data) -{ - ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned long val; - unsigned char *RADEONMMIO = info->MMIO; - - val = INREG(info->DDCReg) & (CARD32)~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1); - val |= (Clock ? 0:RADEON_GPIO_EN_1); - val |= (data ? 0:RADEON_GPIO_EN_0); - OUTREG(info->DDCReg, val); - - /* read back to improve reliability on some cards. */ - val = INREG(info->DDCReg); -} - -Bool RADEONI2cInit(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - info->pI2CBus = xf86CreateI2CBusRec(); - if (!info->pI2CBus) return FALSE; - - info->pI2CBus->BusName = "DDC"; - info->pI2CBus->scrnIndex = pScrn->scrnIndex; - info->pI2CBus->I2CPutBits = RADEONI2CPutBits; - info->pI2CBus->I2CGetBits = RADEONI2CGetBits; - info->pI2CBus->AcknTimeout = 5; - - if (!xf86I2CBusInit(info->pI2CBus)) return FALSE; - return TRUE; -} - void RADEONSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag) { MonPtr mon = pScrn->monitor; diff --git a/src/radeon_driver.c b/src/radeon_driver.c index d1cd790..8765228 100644 --- a/src/radeon_driver.c +++ b/src/radeon_driver.c @@ -1961,6 +1961,20 @@ static void RADEONPreInitDDC(ScrnInfoPtr pScrn) } } +static void RADEONPreInitI2C(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + /* Load I2C if we have the code to use it */ + if (xf86LoadSubModule(pScrn, "i2c")) { + xf86LoaderReqSymLists(i2cSymbols,NULL); + RADEONInitI2C(pScrn); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize i2c bus\n"); + info->i2c_info.pI2CBus = NULL; + } +} + /* This is called by RADEONPreInit to initialize gamma correction */ static Bool RADEONPreInitGamma(ScrnInfoPtr pScrn) { @@ -3178,6 +3192,8 @@ _X_EXPORT Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) RADEONPreInitDDC(pScrn); + RADEONPreInitI2C(pScrn); + if (!RADEONPreInitControllers(pScrn, pInt10)) goto fail; diff --git a/src/radeon_mm_i2c.c b/src/radeon_mm_i2c.c index cdb9437..d9cdd1d 100644 --- a/src/radeon_mm_i2c.c +++ b/src/radeon_mm_i2c.c @@ -25,288 +25,6 @@ static void RADEON_TDA9885_Init(RADEONPortPrivPtr pPriv); -/* Wait for 10ms at the most for the I2C_GO register to drop. */ -#define I2C_WAIT_FOR_GO() { \ - int i2ctries = 0; \ - RADEONWaitForIdleMMIO(pScrn); \ - write_mem_barrier(); \ - while (i2ctries < 10) { \ - reg = INREG8(RADEON_I2C_CNTL_0+1); \ - if (!(reg & (RADEON_I2C_GO >> 8))) \ - break; \ - if (reg & (RADEON_I2C_ABORT >> 8)) \ - break; \ - usleep(1000); \ - i2ctries++; \ - } \ -} - -/* Wait, and dump the status in the 'status' register. If we time out or - * receive an abort signal, halt/restart the I2C bus and leave _ABORT in the - * status register. */ -#define I2C_WAIT_WITH_STATUS() { \ - I2C_WAIT_FOR_GO() \ - if (reg & ((RADEON_I2C_ABORT >> 8) | (RADEON_I2C_GO >> 8))) { \ - RADEON_I2C_Halt(pScrn); \ - status = RADEON_I2C_ABORT; \ - } \ - else \ - status = RADEON_I2C_WaitForAck(pScrn, pPriv); \ -} - -/**************************************************************************** - * I2C_WaitForAck (void) * - * * - * Function: polls the I2C status bits, waiting for an acknowledge or * - * an error condition. * - * Inputs: NONE * - * Outputs: I2C_DONE - the I2C transfer was completed * - * I2C_NACK - an NACK was received from the slave * - * I2C_HALT - a timeout condition has occured * - ****************************************************************************/ -static CARD8 RADEON_I2C_WaitForAck (ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - CARD8 retval = 0; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - long counter = 0; - - usleep(1000); - while(1) - { - RADEONWaitForIdleMMIO(pScrn); - retval = INREG8(RADEON_I2C_CNTL_0); - if (retval & RADEON_I2C_HALT) - { - return (RADEON_I2C_HALT); - } - if (retval & RADEON_I2C_NACK) - { - return (RADEON_I2C_NACK); - } - if(retval & RADEON_I2C_DONE) - { - return RADEON_I2C_DONE; - } - counter++; - /* 50ms ought to be long enough. */ - if(counter > 50) - { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Timeout condition on Radeon i2c bus\n"); - return RADEON_I2C_HALT; - } - usleep(1000); - } -} - -static void RADEON_I2C_Halt (ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - CARD8 reg; - - /* reset status flags */ - RADEONWaitForIdleMMIO(pScrn); - reg = INREG8 (RADEON_I2C_CNTL_0 + 0) & ~(RADEON_I2C_DONE|RADEON_I2C_NACK|RADEON_I2C_HALT); - OUTREG8 (RADEON_I2C_CNTL_0 + 0, reg); - - /* issue ABORT call */ - RADEONWaitForIdleMMIO(pScrn); - reg = INREG8 (RADEON_I2C_CNTL_0 + 1) & 0xE7; - OUTREG8 (RADEON_I2C_CNTL_0 + 1, (reg |((RADEON_I2C_GO|RADEON_I2C_ABORT) >> 8))); - - /* wait for GO bit to go low */ - I2C_WAIT_FOR_GO(); -} - - -static Bool RADEONI2CWriteRead(I2CDevPtr d, I2CByte *WriteBuffer, int nWrite, - I2CByte *ReadBuffer, int nRead) -{ - int loop, status; - CARD32 i2c_cntl_0, i2c_cntl_1; - CARD8 reg; - RADEONPortPrivPtr pPriv = (RADEONPortPrivPtr)(d->pI2CBus->DriverPrivate.ptr); - ScrnInfoPtr pScrn = xf86Screens[d->pI2CBus->scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - - status=RADEON_I2C_DONE; - - RADEONWaitForIdleMMIO(pScrn); - if(nWrite>0){ -/* RADEONWaitForFifo(pScrn, 4+nWrite); */ - - /* Clear the status bits of the I2C Controller */ - OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST); - - /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) & ~(1)); - - /* Write Value into the buffer */ - for (loop = 0; loop < nWrite; loop++) - { - OUTREG8(RADEON_I2C_DATA, WriteBuffer[loop]); - } - - i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL | - nWrite | 0x100; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); - - i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | - RADEON_I2C_GO | RADEON_I2C_START | ((nRead >0)?0:RADEON_I2C_STOP) | RADEON_I2C_DRIVE_EN; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); - - I2C_WAIT_WITH_STATUS(); - - if(status!=RADEON_I2C_DONE){ - RADEON_I2C_Halt(pScrn); - return FALSE; - } - } - - - if(nRead > 0) { - RADEONWaitForFifo(pScrn, 4+nRead); - - OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST); - - /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) | (1)); - - i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL | - nRead | 0x100; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); - - i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | - RADEON_I2C_GO | RADEON_I2C_START | RADEON_I2C_STOP | RADEON_I2C_DRIVE_EN | RADEON_I2C_RECEIVE; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); - - I2C_WAIT_WITH_STATUS(); - - /* Write Value into the buffer */ - for (loop = 0; loop < nRead; loop++) - { - RADEONWaitForFifo(pScrn, 1); - if((status == RADEON_I2C_HALT) || (status == RADEON_I2C_NACK)) - { - ReadBuffer[loop]=0xff; - } else { - RADEONWaitForIdleMMIO(pScrn); - ReadBuffer[loop]=INREG8(RADEON_I2C_DATA) & 0xff; - } - } - } - - if(status!=RADEON_I2C_DONE){ - RADEON_I2C_Halt(pScrn); - return FALSE; - } - return TRUE; -} - -static Bool R200_I2CWriteRead(I2CDevPtr d, I2CByte *WriteBuffer, int nWrite, - I2CByte *ReadBuffer, int nRead) -{ - int loop, status; - CARD32 i2c_cntl_0, i2c_cntl_1; - CARD8 reg; - RADEONPortPrivPtr pPriv = (RADEONPortPrivPtr)(d->pI2CBus->DriverPrivate.ptr); - ScrnInfoPtr pScrn = xf86Screens[d->pI2CBus->scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - - status=RADEON_I2C_DONE; - - RADEONWaitForIdleMMIO(pScrn); - if(nWrite>0){ -/* RADEONWaitForFifo(pScrn, 4+nWrite); */ - - /* Clear the status bits of the I2C Controller */ - OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST); - - /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) & ~(1)); - - /* Write Value into the buffer */ - for (loop = 0; loop < nWrite; loop++) - { - OUTREG8(RADEON_I2C_DATA, WriteBuffer[loop]); - } - - i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL | - nWrite | 0x010; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); - - i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | - RADEON_I2C_GO | RADEON_I2C_START | ((nRead >0)?0:RADEON_I2C_STOP) | RADEON_I2C_DRIVE_EN; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); - - I2C_WAIT_WITH_STATUS(); - - if(status!=RADEON_I2C_DONE){ - RADEON_I2C_Halt(pScrn); - return FALSE; - } - } - - - if(nRead > 0) { - RADEONWaitForFifo(pScrn, 4+nRead); - - OUTREG(RADEON_I2C_CNTL_0, RADEON_I2C_DONE | RADEON_I2C_NACK | RADEON_I2C_HALT | RADEON_I2C_SOFT_RST); - - /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) | (1)); - - i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | RADEON_I2C_EN | RADEON_I2C_SEL | - nRead | 0x010; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); - - i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | - RADEON_I2C_GO | RADEON_I2C_START | RADEON_I2C_STOP | RADEON_I2C_DRIVE_EN | RADEON_I2C_RECEIVE; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); - - I2C_WAIT_WITH_STATUS(); - - RADEONWaitForIdleMMIO(pScrn); - /* Write Value into the buffer */ - for (loop = 0; loop < nRead; loop++) - { - if((status == RADEON_I2C_HALT) || (status == RADEON_I2C_NACK)) - { - ReadBuffer[loop]=0xff; - } else { - ReadBuffer[loop]=INREG8(RADEON_I2C_DATA) & 0xff; - } - } - } - - if(status!=RADEON_I2C_DONE){ - RADEON_I2C_Halt(pScrn); - return FALSE; - } - return TRUE; -} - -#if 0 -static Bool RADEONProbeAddress(I2CBusPtr b, I2CSlaveAddr addr) -{ - I2CByte a; - I2CDevRec d; - - d.DevName = "Probing"; - d.SlaveAddr = addr; - d.pI2CBus = b; - d.NextDev = NULL; - - return I2C_WriteRead(&d, NULL, 0, &a, 1); -} -#endif - -#define I2C_CLOCK_FREQ (60000.0) - - const struct { char *name; @@ -350,27 +68,20 @@ const struct }; -void RADEONResetI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - - RADEONWaitForFifo(pScrn, 2); - OUTREG8(RADEON_I2C_CNTL_1+2, ((RADEON_I2C_SEL | RADEON_I2C_EN)>>16)); - 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)); -} - -void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) +void RADEONMMInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) { double nm; RADEONInfoPtr info = RADEONPTR(pScrn); RADEONPLLPtr pll = &(info->pll); - pPriv->i2c = NULL; + if (info->i2c_info.pI2CBus == NULL) { + return; + } + pPriv->fi1236 = NULL; pPriv->msp3430 = NULL; pPriv->tda9885 = NULL; - pPriv->uda1380 = NULL; + pPriv->uda1380 = NULL; #if 0 /* put back on when saa7114 support is present */ pPriv->saa7114 = NULL; #endif @@ -401,68 +112,29 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) return; } - - if(pPriv->i2c!=NULL) return; /* for some reason we are asked to init it again.. Stop ! */ - - if(!xf86LoadSubModule(pScrn,"i2c")) - { - xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Unable to initialize i2c bus\n"); - pPriv->i2c = NULL; - return; - } - xf86LoaderReqSymbols("xf86CreateI2CBusRec", - "xf86I2CBusInit", - "xf86DestroyI2CBus", - "xf86CreateI2CDevRec", - "xf86DestroyI2CDevRec", - "xf86I2CDevInit", - "xf86I2CWriteRead", - NULL); - pPriv->i2c=CreateI2CBusRec(); - pPriv->i2c->scrnIndex=pScrn->scrnIndex; - pPriv->i2c->BusName="Radeon multimedia bus"; - pPriv->i2c->DriverPrivate.ptr=(pointer)pPriv; - switch(info->ChipFamily){ - case CHIP_FAMILY_RV350: - case CHIP_FAMILY_R350: - case CHIP_FAMILY_R300: - case CHIP_FAMILY_RV250: - case CHIP_FAMILY_R200: - case CHIP_FAMILY_RV200: - pPriv->i2c->I2CWriteRead=R200_I2CWriteRead; - xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using R200 i2c bus access method\n"); - break; - default: - pPriv->i2c->I2CWriteRead=RADEONI2CWriteRead; - xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using Radeon bus access method\n"); - } - if(!I2CBusInit(pPriv->i2c)) - { - xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Failed to register i2c bus\n"); - } - + /* overrride default timings */ #if 1 - switch(info->ChipFamily){ + switch (info->ChipFamily) { case CHIP_FAMILY_RV200: - nm=(pll->reference_freq * 40000.0)/(1.0*I2C_CLOCK_FREQ); + nm = (pll->reference_freq * 40000.0) / (1.0 * RADEON_I2C_CLOCK_FREQ); break; case CHIP_FAMILY_R300: case CHIP_FAMILY_R200: - if(info->MM_TABLE_valid && (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_MT2032)){ - nm=(pll->reference_freq * 40000.0)/(4.0*I2C_CLOCK_FREQ); + if (info->MM_TABLE_valid && (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type == TUNER_TYPE_MT2032)){ + nm = (pll->reference_freq * 40000.0) / (4.0 * RADEON_I2C_CLOCK_FREQ); break; } default: - nm=(pll->reference_freq * 10000.0)/(4.0*I2C_CLOCK_FREQ); + nm = (pll->reference_freq * 10000.0) / (4.0 * RADEON_I2C_CLOCK_FREQ); } #else - nm=(pll->xclk * 40000.0)/(1.0*I2C_CLOCK_FREQ); + nm = (pll->xclk * 40000.0) / (1.0 * RADEON_I2C_CLOCK_FREQ); #endif - for(pPriv->radeon_N=1; pPriv->radeon_N<255; pPriv->radeon_N++) - if((pPriv->radeon_N * (pPriv->radeon_N-1)) > nm)break; - pPriv->radeon_M=pPriv->radeon_N-1; - pPriv->radeon_i2c_timing=2*pPriv->radeon_N; + for (info->i2c_info.radeon_N = 1; info->i2c_info.radeon_N < 255; info->i2c_info.radeon_N++) + if ((info->i2c_info.radeon_N * (info->i2c_info.radeon_N - 1)) > nm) break; + info->i2c_info.radeon_M = info->i2c_info.radeon_N - 1; + info->i2c_info.radeon_i2c_timing = 2 * info->i2c_info.radeon_N; #if 0 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); @@ -470,7 +142,7 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) pPriv->radeon_N=0x33; pPriv->radeon_i2c_timing=2*pPriv->radeon_N; #endif - RADEONResetI2C(pScrn, pPriv); + RADEONResetI2C(pScrn); #if 0 /* I don't know whether standalone boards are supported with Radeons */ /* looks like none of them have AMC connectors anyway */ @@ -486,11 +158,11 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86LoaderReqSymbols(FI1236SymbolsList, NULL); if(pPriv->fi1236 == NULL) { - pPriv->fi1236 = xf86_Detect_FI1236(pPriv->i2c, FI1236_ADDR_1); + pPriv->fi1236 = xf86_Detect_FI1236(info->i2c_info.pI2CBus, FI1236_ADDR_1); } if(pPriv->fi1236 == NULL) { - pPriv->fi1236 = xf86_Detect_FI1236(pPriv->i2c, FI1236_ADDR_2); + pPriv->fi1236 = xf86_Detect_FI1236(info->i2c_info.pI2CBus, FI1236_ADDR_2); } } if(pPriv->fi1236 != NULL) @@ -515,11 +187,11 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86LoaderReqSymbols(TDA9885SymbolsList, NULL); if(pPriv->tda9885 == NULL) { - pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_1); + pPriv->tda9885 = xf86_Detect_tda9885(info->i2c_info.pI2CBus, TDA9885_ADDR_1); } if(pPriv->tda9885 == NULL) { - pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_2); + pPriv->tda9885 = xf86_Detect_tda9885(info->i2c_info.pI2CBus, TDA9885_ADDR_2); } if(pPriv->tda9885 != NULL) { @@ -540,11 +212,11 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86LoaderReqSymbols(TDA9885SymbolsList, NULL); if(pPriv->tda9885 == NULL) { - pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_1); + pPriv->tda9885 = xf86_Detect_tda9885(info->i2c_info.pI2CBus, TDA9885_ADDR_1); } if(pPriv->tda9885 == NULL) { - pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_2); + pPriv->tda9885 = xf86_Detect_tda9885(info->i2c_info.pI2CBus, TDA9885_ADDR_2); } if(pPriv->tda9885 != NULL) { @@ -563,11 +235,11 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86LoaderReqSymbols(UDA1380SymbolsList, NULL); if(pPriv->uda1380 == NULL) { - pPriv->uda1380 = xf86_Detect_uda1380(pPriv->i2c, UDA1380_ADDR_1); + pPriv->uda1380 = xf86_Detect_uda1380(info->i2c_info.pI2CBus, UDA1380_ADDR_1); } if(pPriv->uda1380 == NULL) { - pPriv->uda1380 = xf86_Detect_uda1380(pPriv->i2c, UDA1380_ADDR_2); + pPriv->uda1380 = xf86_Detect_uda1380(info->i2c_info.pI2CBus, UDA1380_ADDR_2); } if(pPriv->uda1380 != NULL) { @@ -585,16 +257,16 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86LoaderReqSymbols(MSP3430SymbolsList, NULL); if(pPriv->msp3430 == NULL) { - pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_1); + pPriv->msp3430 = xf86_DetectMSP3430(info->i2c_info.pI2CBus, MSP3430_ADDR_1); } if(pPriv->msp3430 == NULL) { - pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_2); + pPriv->msp3430 = xf86_DetectMSP3430(info->i2c_info.pI2CBus, MSP3430_ADDR_2); } #if 0 /* this would confuse bt829 with msp3430 */ if(pPriv->msp3430 == NULL) { - pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_3); + pPriv->msp3430 = xf86_DetectMSP3430(info->i2c_info.pI2CBus, MSP3430_ADDR_3); } #endif } @@ -619,11 +291,11 @@ void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86LoaderReqSymbols(SAA7114SymbolsList, NULL); if(pPriv->saa7114 == NULL) { - pPriv->saa7114 = xf86_DetectSAA7114(pPriv->i2c, SAA7114_ADDR_1); + pPriv->saa7114 = xf86_DetectSAA7114(info->i2c_info.pI2CBus, SAA7114_ADDR_1); } if(pPriv->saa7114 == NULL) { - pPriv->saa7114 = xf86_DetectSAA7114(pPriv->i2c, SAA7114_ADDR_2); + pPriv->saa7114 = xf86_DetectSAA7114(info->i2c_info.pI2CBus, SAA7114_ADDR_2); } } if(pPriv->saa7114 != NULL) diff --git a/src/radeon_reg.h b/src/radeon_reg.h index b50fcf0..305c762 100644 --- a/src/radeon_reg.h +++ b/src/radeon_reg.h @@ -840,25 +840,28 @@ #define RADEON_HTOTAL2_CNTL 0x002e /* PLL */ /* Multimedia I2C bus */ +#define RADEON_I2C_CLOCK_FREQ (60000.0) #define RADEON_I2C_CNTL_0 0x0090 -#define RADEON_I2C_DONE (1<<0) -#define RADEON_I2C_NACK (1<<1) -#define RADEON_I2C_HALT (1<<2) -#define RADEON_I2C_SOFT_RST (1<<5) -#define RADEON_I2C_DRIVE_EN (1<<6) -#define RADEON_I2C_DRIVE_SEL (1<<7) -#define RADEON_I2C_START (1<<8) -#define RADEON_I2C_STOP (1<<9) -#define RADEON_I2C_RECEIVE (1<<10) -#define RADEON_I2C_ABORT (1<<11) -#define RADEON_I2C_GO (1<<12) +# define RADEON_I2C_DONE (1 << 0) +# define RADEON_I2C_NACK (1 << 1) +# define RADEON_I2C_HALT (1 << 2) +# define RADEON_I2C_SOFT_RST (1 << 5) +# define RADEON_I2C_DRIVE_EN (1 << 6) +# define RADEON_I2C_DRIVE_SEL (1 << 7) +# define RADEON_I2C_START (1 << 8) +# define RADEON_I2C_STOP (1 << 9) +# define RADEON_I2C_RECEIVE (1 << 10) +# define RADEON_I2C_ABORT (1 << 11) +# define RADEON_I2C_GO (1 << 12) #define RADEON_I2C_CNTL_1 0x0094 -#define RADEON_I2C_SEL (1<<16) -#define RADEON_I2C_EN (1<<17) +# define RADEON_I2C_ADDR_COUNT_SHIFT 8 +# define R200_I2C_ADDR_COUNT_SHIFT 4 +#define RADEON_I2C_SEL (1 << 16) +#define RADEON_I2C_EN (1 << 17) #define RADEON_I2C_DATA 0x0098 #define RADEON_DVI_I2C_CNTL_0 0x02e0 -#define RADEON_DVI_I2C_CNTL_1 0x02e4 /* ? */ +#define RADEON_DVI_I2C_CNTL_1 0x02e4 #define RADEON_DVI_I2C_DATA 0x02e8 #define RADEON_INTERRUPT_LINE 0x0f3c /* PCI */ diff --git a/src/radeon_video.c b/src/radeon_video.c index 390df89..bcbe45a 100644 --- a/src/radeon_video.c +++ b/src/radeon_video.c @@ -1162,8 +1162,8 @@ RADEONResetVideo(ScrnInfoPtr pScrn) /* xf86_ResetTheatreRegsForNoTVout(pPriv->theatre); */ } - if(pPriv->i2c != NULL){ - RADEONResetI2C(pScrn, pPriv); + if(info->i2c_info.pI2CBus != NULL){ + RADEONResetI2C(pScrn); } } @@ -1369,14 +1369,14 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) pPriv->tuner_type = info->tunerType; /* Initialize I2C bus */ - RADEONInitI2C(pScrn, pPriv); - if(pPriv->i2c != NULL)RADEON_board_setmisc(pPriv); + RADEONMMInitI2C(pScrn, pPriv); + if(info->i2c_info.pI2CBus != NULL)RADEON_board_setmisc(pPriv); #if 0 /* this is just here for easy debugging - normally off */ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Scanning I2C Bus\n"); for(i=0;i<255;i+=2) - if(RADEONProbeAddress(pPriv->i2c, i)) + if(RADEONProbeAddress(info->i2c_info.pI2CBus, i)) xf86DrvMsg(pScrn->scrnIndex, X_INFO, " found device at address 0x%02x\n", i); #endif @@ -1540,7 +1540,7 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup) pPriv->video_stream_active = FALSE; if(pPriv->msp3430 != NULL) xf86_MSP3430SetVolume(pPriv->msp3430, MSP3430_FAST_MUTE); if(pPriv->uda1380 != NULL) xf86_uda1380_mute(pPriv->uda1380, TRUE); - if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv); + if(info->i2c_info.pI2CBus != NULL) RADEON_board_setmisc(pPriv); } if (pPriv->video_memory != NULL) { RADEONFreeMemory(pScrn, pPriv->video_memory); @@ -1720,7 +1720,7 @@ RADEONSetPortAttribute(ScrnInfoPtr pScrn, if(pPriv->msp3430 != NULL) RADEON_MSP_SetEncoding(pPriv); if(pPriv->tda9885 != NULL) RADEON_TDA9885_SetEncoding(pPriv); if(pPriv->fi1236 != NULL) RADEON_FI1236_SetEncoding(pPriv); - if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv); + if(info->i2c_info.pI2CBus != NULL) RADEON_board_setmisc(pPriv); /* put more here to actually change it */ } } @@ -1741,7 +1741,7 @@ RADEONSetPortAttribute(ScrnInfoPtr pScrn, { pPriv->mute = value; if(pPriv->msp3430 != NULL) xf86_MSP3430SetVolume(pPriv->msp3430, pPriv->mute ? MSP3430_FAST_MUTE : MSP3430_VOLUME(pPriv->volume)); - if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv); + if(info->i2c_info.pI2CBus != NULL) RADEON_board_setmisc(pPriv); if(pPriv->uda1380 != NULL) xf86_uda1380_mute(pPriv->uda1380, pPriv->mute); } else if(attribute == xvSAP) @@ -1756,7 +1756,7 @@ RADEONSetPortAttribute(ScrnInfoPtr pScrn, pPriv->volume = value; pPriv->mute = FALSE; if(pPriv->msp3430 != NULL) xf86_MSP3430SetVolume(pPriv->msp3430, MSP3430_VOLUME(value)); - if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv); + if(info->i2c_info.pI2CBus != NULL) RADEON_board_setmisc(pPriv); if(pPriv->uda1380 != NULL) xf86_uda1380_setvolume(pPriv->uda1380, value); } else if(attribute == xvOverlayDeinterlacingMethod) @@ -3498,7 +3498,7 @@ RADEONPutVideo( if(pPriv->msp3430 != NULL) RADEON_MSP_SetEncoding(pPriv); if(pPriv->tda9885 != NULL) RADEON_TDA9885_SetEncoding(pPriv); if(pPriv->fi1236 != NULL) RADEON_FI1236_SetEncoding(pPriv); - if(pPriv->i2c != NULL)RADEON_board_setmisc(pPriv); + if(info->i2c_info.pI2CBus != NULL)RADEON_board_setmisc(pPriv); } diff --git a/src/radeon_video.h b/src/radeon_video.h index b6d5d2d..635ef67 100644 --- a/src/radeon_video.h +++ b/src/radeon_video.h @@ -28,19 +28,12 @@ typedef struct { int ov_alpha; int gr_alpha; - /* i2c bus and devices */ - I2CBusPtr i2c; - CARD32 radeon_i2c_timing; - CARD32 radeon_M; - CARD32 radeon_N; - CARD32 i2c_status; - CARD32 i2c_cntl; - + /* i2c devices */ FI1236Ptr fi1236; CARD8 tuner_type; MSP3430Ptr msp3430; TDA9885Ptr tda9885; - UDA1380Ptr uda1380; + UDA1380Ptr uda1380; /* VIP bus and devices */ GENERIC_BUS_Ptr VIP; @@ -90,9 +83,7 @@ typedef struct { Atom device_id, location_id, instance_id; } RADEONPortPrivRec, *RADEONPortPrivPtr; - -void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); -void RADEONResetI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); +void RADEONMMInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); void RADEONVIP_init(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); void RADEONVIP_reset(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv);