summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgbert Eich <eich@freedesktop.org>2008-07-12 11:27:56 +0200
committerEgbert Eich <eich@freedesktop.org>2008-07-12 23:25:36 +0200
commit204767540c450742cae63f89bff1d6909c8c2b8f (patch)
treed39e3bb52d8182a6e79676598fe6573c1d82c901
parent49b3782ffe4690c26f45db95098aabcbd25c097a (diff)
I2C: Add DDC read out support for DDC3/4.
-rw-r--r--src/rhd_i2c.c96
1 files changed, 52 insertions, 44 deletions
diff --git a/src/rhd_i2c.c b/src/rhd_i2c.c
index 06dde99..bf641b7 100644
--- a/src/rhd_i2c.c
+++ b/src/rhd_i2c.c
@@ -797,32 +797,60 @@ rhdRV620I2CStatus(I2CBusPtr I2CPtr)
/*
*
*/
-int
+enum {
+ rhdDdc1data = 0,
+ rhdDdc2data = 2,
+ rhdDdc3data = 4,
+ rhdVIP_DOUT_scl = 0x41,
+ rhdDvoData12 = 0x28,
+ rhdDdc1clk = 1,
+ rhdDdc2clk = 3,
+ rhdDdc3clk = 5,
+ rhdVIP_DOUTvipclk = 0x42,
+ rhdDvoData13 = 0x29
+};
+
+static int
getDDCLineFromGPIO(CARD32 gpio, int shift)
{
switch (gpio) {
case 0x1f90:
switch (shift) {
case 0:
- return 1; /* ddc1 clk */
+ return rhdDdc1clk; /* ddc1 clk */
case 8:
- return 0; /* ddc1 data */
+ return rhdDdc1data; /* ddc1 data */
}
break;
case 0x1f94: /* ddc2 */
switch (shift) {
case 0:
- return 3; /* ddc2 clk */
+ return rhdDdc2clk; /* ddc2 clk */
case 8:
- return 2; /* ddc2 data */
+ return rhdDdc2data; /* ddc2 data */
}
break;
case 0x1f98: /* ddc3 */
switch (shift) {
case 0:
- return 5; /* ddc3 clk */
+ return rhdDdc3clk; /* ddc3 clk */
case 8:
- return 4; /* ddc3 data */
+ return rhdDdc3data; /* ddc3 data */
+ }
+ case 0x1f88: /* ddc4 */
+ switch (shift) {
+ case 0:
+ return rhdVIP_DOUTvipclk; /* ddc4 clk */
+ case 8:
+ return rhdVIP_DOUT_scl; /* ddc4 data */
+ }
+ break;
+ case 0x1fda: /* ddc5 */
+ switch (shift) {
+ case 0:
+ return rhdDvoData13; /* ddc5 clk */
+ case 8:
+ return rhdDvoData12; /* ddc5 data */
}
break;
}
@@ -839,58 +867,35 @@ rhdRV620I2CSetupStatus(I2CBusPtr I2CPtr, int line, int prescale)
#ifdef ATOM_BIOS
RHDPtr rhdPtr = RHDPTRI(I2CPtr);
AtomBiosArgRec data;
+ CARD32 scl_reg;
RHDFUNC(I2CPtr);
if (line > 3)
return FALSE;
{
-#if 0
- int i = 0;
- struct atomGPIOTable {
- unsigned char line;
- unsigned char pad;
- unsigned short reg_7d9c;
- } *table;
-
- data.val = 0x36;
- if (RHDAtomBiosFunc(I2CPtr->scrnIndex,
- rhdPtr->atomBIOS,
- ATOMBIOS_GET_CODE_DATA_TABLE,
- &data) == ATOM_SUCCESS) {
-
- table = (struct atomGPIOTable *)data.CommandDataTable.loc;
-
- while (i * sizeof(struct atomGPIOTable) < data.CommandDataTable.size) {
-
- if (table[i].line == line) {
-
- reg_7d9c = table[i].reg_7d9c;
-
- DEBUGP( ErrorF("Line[%i] = 0x%4.4x\n",line, reg_7d9c)) ;
-
- break;
- }
- i++;
- }
-#else
- int scl = -1, sda = -1;
+ int sda = -1, scl = -1;
+ data.val = line & 0x0f;
if (RHDAtomBiosFunc(I2CPtr->scrnIndex,
rhdPtr->atomBIOS,
ATOM_GPIO_I2C_CLK_MASK,
&data) == ATOM_SUCCESS) {
CARD32 gpio = data.val;
+ scl_reg = gpio;
+ data.val = line & 0x0f;
if (RHDAtomBiosFunc(I2CPtr->scrnIndex,
rhdPtr->atomBIOS,
ATOM_GPIO_I2C_CLK_MASK_SHIFT,
&data) == ATOM_SUCCESS) {
scl = getDDCLineFromGPIO(gpio, data.val);
+ data.val = line & 0x0f;
if (RHDAtomBiosFunc(I2CPtr->scrnIndex,
rhdPtr->atomBIOS,
ATOM_GPIO_I2C_DATA_MASK,
&data) == ATOM_SUCCESS) {
gpio = data.val;
+ data.val = line & 0x0f;
if (RHDAtomBiosFunc(I2CPtr->scrnIndex,
rhdPtr->atomBIOS,
ATOM_GPIO_I2C_DATA_MASK,
@@ -903,23 +908,26 @@ rhdRV620I2CSetupStatus(I2CBusPtr I2CPtr, int line, int prescale)
}
}
}
-#endif
}
if (!reg_7d9c)
#endif
{
- CARD32 regList7d9c[] = { 0x1, 0x0203 };
- if (line > 1)
+ CARD32 regList7d9c[] = { 0x0001,0x0203, 0x0405 };
+ CARD32 gpioClkReg[] = { 0x1f90, 0x1f94, 0x1f98 };
+
+ if (line > 2)
return FALSE;
reg_7d9c = regList7d9c[line];
+ scl_reg = gpioClkReg[line];
}
- RHDRegWrite(I2CPtr, 0x7e40, 0);
- RHDRegWrite(I2CPtr, 0x7e50, 0);
- RHDRegWrite(I2CPtr, 0x7e60, 0);
- RHDRegWrite(I2CPtr, 0x7e20, 0);
+ /* Don't understand this yet */
+ if (scl_reg == 0x1fda)
+ scl_reg = 0x1f90;
+
+ RHDRegWrite(I2CPtr, scl_reg << 2, 0);
RHDRegWrite(I2CPtr, RV62_GENERIC_I2C_PIN_SELECTION, reg_7d9c);
RHDRegMask(I2CPtr, RV62_GENERIC_I2C_SPEED,