Index: radeon_mm_i2c.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_mm_i2c.c,v retrieving revision 1.8 diff -u -r1.8 radeon_mm_i2c.c --- radeon_mm_i2c.c 25 Aug 2005 03:07:50 -0000 1.8 +++ radeon_mm_i2c.c 26 Oct 2005 04:59:32 -0000 @@ -43,7 +43,7 @@ RADEONWaitForIdleMMIO(pScrn); \ write_mem_barrier(); \ while (i2ctries < 10) { \ - reg = INREG8(RADEON_I2C_CNTL_0+1); \ + reg = INREG8(RADEON_DVI_I2C_CNTL_0+1); \ if (!(reg & (I2C_GO >> 8))) \ break; \ if (reg & (I2C_ABORT >> 8)) \ @@ -87,7 +87,7 @@ while(1) { RADEONWaitForIdleMMIO(pScrn); - retval = INREG8(RADEON_I2C_CNTL_0); + retval = INREG8(RADEON_DVI_I2C_CNTL_0); if (retval & I2C_HALT) { return (I2C_HALT); @@ -120,13 +120,13 @@ /* reset status flags */ RADEONWaitForIdleMMIO(pScrn); - reg = INREG8 (RADEON_I2C_CNTL_0 + 0) & ~(I2C_DONE|I2C_NACK|I2C_HALT); - OUTREG8 (RADEON_I2C_CNTL_0 + 0, reg); + reg = INREG8 (RADEON_DVI_I2C_CNTL_0 + 0) & ~(I2C_DONE|I2C_NACK|I2C_HALT); + OUTREG8 (RADEON_DVI_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 |((I2C_GO|I2C_ABORT) >> 8))); + reg = INREG8 (RADEON_DVI_I2C_CNTL_0 + 1) & 0xE7; + OUTREG8 (RADEON_DVI_I2C_CNTL_0 + 1, (reg |((I2C_GO|I2C_ABORT) >> 8))); /* wait for GO bit to go low */ I2C_WAIT_FOR_GO(); @@ -151,24 +151,24 @@ /* RADEONWaitForFifo(pScrn, 4+nWrite); */ /* Clear the status bits of the I2C Controller */ - OUTREG(RADEON_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); + OUTREG(RADEON_DVI_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) & ~(1)); + OUTREG(RADEON_DVI_I2C_DATA, (CARD32) (d->SlaveAddr) & ~(1)); /* Write Value into the buffer */ for (loop = 0; loop < nWrite; loop++) { - OUTREG8(RADEON_I2C_DATA, WriteBuffer[loop]); + OUTREG8(RADEON_DVI_I2C_DATA, WriteBuffer[loop]); } i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | I2C_EN | I2C_SEL | nWrite | 0x100; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); + OUTREG(RADEON_DVI_I2C_CNTL_1, i2c_cntl_1); i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | I2C_GO | I2C_START | ((nRead >0)?0:I2C_STOP) | I2C_DRIVE_EN; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); + OUTREG(RADEON_DVI_I2C_CNTL_0, i2c_cntl_0); I2C_WAIT_WITH_STATUS(); @@ -182,18 +182,18 @@ if(nRead > 0) { RADEONWaitForFifo(pScrn, 4+nRead); - OUTREG(RADEON_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); + OUTREG(RADEON_DVI_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) | (1)); + OUTREG(RADEON_DVI_I2C_DATA, (CARD32) (d->SlaveAddr) | (1)); i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | I2C_EN | I2C_SEL | nRead | 0x100; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); + OUTREG(RADEON_DVI_I2C_CNTL_1, i2c_cntl_1); i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | I2C_GO | I2C_START | I2C_STOP | I2C_DRIVE_EN | I2C_RECEIVE; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); + OUTREG(RADEON_DVI_I2C_CNTL_0, i2c_cntl_0); I2C_WAIT_WITH_STATUS(); @@ -206,7 +206,7 @@ ReadBuffer[loop]=0xff; } else { RADEONWaitForIdleMMIO(pScrn); - ReadBuffer[loop]=INREG8(RADEON_I2C_DATA) & 0xff; + ReadBuffer[loop]=INREG8(RADEON_DVI_I2C_DATA) & 0xff; } } } @@ -236,24 +236,24 @@ /* RADEONWaitForFifo(pScrn, 4+nWrite); */ /* Clear the status bits of the I2C Controller */ - OUTREG(RADEON_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); + OUTREG(RADEON_DVI_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) & ~(1)); + OUTREG(RADEON_DVI_I2C_DATA, (CARD32) (d->SlaveAddr) & ~(1)); /* Write Value into the buffer */ for (loop = 0; loop < nWrite; loop++) { - OUTREG8(RADEON_I2C_DATA, WriteBuffer[loop]); + OUTREG8(RADEON_DVI_I2C_DATA, WriteBuffer[loop]); } i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | I2C_EN | I2C_SEL | nWrite | 0x010; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); + OUTREG(RADEON_DVI_I2C_CNTL_1, i2c_cntl_1); i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | I2C_GO | I2C_START | ((nRead >0)?0:I2C_STOP) | I2C_DRIVE_EN; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); + OUTREG(RADEON_DVI_I2C_CNTL_0, i2c_cntl_0); I2C_WAIT_WITH_STATUS(); @@ -267,18 +267,18 @@ if(nRead > 0) { RADEONWaitForFifo(pScrn, 4+nRead); - OUTREG(RADEON_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); + OUTREG(RADEON_DVI_I2C_CNTL_0, I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST); /* Write the address into the buffer first */ - OUTREG(RADEON_I2C_DATA, (CARD32) (d->SlaveAddr) | (1)); + OUTREG(RADEON_DVI_I2C_DATA, (CARD32) (d->SlaveAddr) | (1)); i2c_cntl_1 = (pPriv->radeon_i2c_timing << 24) | I2C_EN | I2C_SEL | nRead | 0x010; - OUTREG(RADEON_I2C_CNTL_1, i2c_cntl_1); + OUTREG(RADEON_DVI_I2C_CNTL_1, i2c_cntl_1); i2c_cntl_0 = (pPriv->radeon_N << 24) | (pPriv->radeon_M << 16) | I2C_GO | I2C_START | I2C_STOP | I2C_DRIVE_EN | I2C_RECEIVE; - OUTREG(RADEON_I2C_CNTL_0, i2c_cntl_0); + OUTREG(RADEON_DVI_I2C_CNTL_0, i2c_cntl_0); I2C_WAIT_WITH_STATUS(); @@ -290,7 +290,7 @@ { ReadBuffer[loop]=0xff; } else { - ReadBuffer[loop]=INREG8(RADEON_I2C_DATA) & 0xff; + ReadBuffer[loop]=INREG8(RADEON_DVI_I2C_DATA) & 0xff; } } } @@ -302,7 +302,7 @@ return TRUE; } -static Bool RADEONProbeAddress(I2CBusPtr b, I2CSlaveAddr addr) +Bool RADEONProbeAddress(I2CBusPtr b, I2CSlaveAddr addr) { I2CByte a; I2CDevRec d; @@ -367,8 +367,8 @@ unsigned char *RADEONMMIO = info->MMIO; RADEONWaitForFifo(pScrn, 2); - OUTREG8(RADEON_I2C_CNTL_1+2, ((I2C_SEL | I2C_EN)>>16)); - OUTREG8(RADEON_I2C_CNTL_0+0, (I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST | I2C_DRIVE_EN | I2C_DRIVE_SEL)); + OUTREG8(RADEON_DVI_I2C_CNTL_1+2, ((I2C_SEL | I2C_EN)>>16)); + OUTREG8(RADEON_DVI_I2C_CNTL_0+0, (I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST | I2C_DRIVE_EN | I2C_DRIVE_SEL)); } void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) @@ -405,7 +405,7 @@ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility X300, disabling multimedia i2c\n"); return; } - +#if 0 /* no multimedia capabilities detected and no information was provided to substitute for it */ if(!info->MM_TABLE_valid && !(info->tunerType>=0)) @@ -413,7 +413,7 @@ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No video input capabilities detected and no information is provided - disabling multimedia i2c\n"); return; } - +#endif if(pPriv->i2c!=NULL) return; /* for some reason we are asked to init it again.. Stop ! */ @@ -436,6 +436,7 @@ pPriv->i2c->BusName="Radeon multimedia bus"; pPriv->i2c->DriverPrivate.ptr=(pointer)pPriv; switch(info->ChipFamily){ + case CHIP_FAMILY_R420: case CHIP_FAMILY_RV350: case CHIP_FAMILY_R350: case CHIP_FAMILY_R300: @@ -484,7 +485,41 @@ pPriv->radeon_i2c_timing=2*pPriv->radeon_N; #endif RADEONResetI2C(pScrn, pPriv); - +#if 1 +/* hack: enable DVI */ +CARD8 data[2]; +I2CDevRec d; +d.DevName = strdup("Sil 1162"); +d.SlaveAddr = 0x70; /* sil databook says 0x70 or 0x72, probe of i2c says 0x98 and sometimes 0x18 */ +d.pI2CBus = pPriv->i2c; +d.NextDev = NULL; +d.StartTimeout = pPriv->i2c->StartTimeout; +d.BitTimeout = pPriv->i2c->BitTimeout; +d.AcknTimeout = pPriv->i2c->AcknTimeout; +d.ByteTimeout = pPriv->i2c->ByteTimeout; +I2CDevInit(&d); + +data[0]=0x08; /* reg */ +data[1]=0x30; /* value */ + +if (I2C_WriteRead(&d, (I2CByte *)data, 2, NULL, 0)) + ErrorF("sil reg 1 success\n"); + +data[0]=0x09; /* reg */ +data[1]=0x00; /* value */ + +if (I2C_WriteRead(&d, (I2CByte *)data, 2, NULL, 0)) + ErrorF("sil reg 2 success\n"); + +data[0]=0x08; /* reg */ +data[1]=0x31; /* value */ + +if (I2C_WriteRead(&d, (I2CByte *)data, 2, NULL, 0)) + ErrorF("sil reg 3 success\n"); + +#endif + +#if 0 #if 0 /* I don't know whether standalone boards are supported with Radeons */ /* looks like none of them have AMC connectors anyway */ if(!info->MM_TABLE_valid)RADEON_read_eeprom(pPriv); @@ -646,7 +681,7 @@ xf86_InitSAA7114(pPriv->saa7114); } #endif - +#endif } static void RADEON_TDA9885_Init(RADEONPortPrivPtr pPriv) Index: radeon_video.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_video.c,v retrieving revision 1.27 diff -u -r1.27 radeon_video.c --- radeon_video.c 11 Sep 2005 20:58:53 -0000 1.27 +++ radeon_video.c 26 Oct 2005 05:00:54 -0000 @@ -1389,8 +1389,9 @@ if(pPriv->i2c != NULL)RADEON_board_setmisc(pPriv); - #if 0 /* this is just here for easy debugging - normally off */ + #if 1 /* this is just here for easy debugging - normally off */ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Scanning I2C Bus\n"); + int i; for(i=0;i<255;i+=2) if(RADEONProbeAddress(pPriv->i2c, i)) xf86DrvMsg(pScrn->scrnIndex, X_INFO, " found device at address 0x%02x\n", i);