Hi Mark, list.
I am a bit confused with the code for the I2C bus(ses), especially
in a multiple heads environment.
The current code use the extended registers 0x3e, 0x3f in order
to implement the I2C's functions I2CPutBits and I2CGetBits, but
I think that the second head should use actually the registers
0x36 and 0x37.
Am I correct? If yes, following patch should fix that.
Cheers,
--
Ducrot Bruno
http://www.poupinou.org Page profaissionelle
http://toto.tu-me-saoules.com Haume page
diff -Naur xc/programs/Xserver/hw/xfree86/drivers/nv.old/nv_dac.c
xc/programs/Xserver/hw/xfree86/drivers/nv/nv_dac.c
--- xc/programs/Xserver/hw/xfree86/drivers/nv.old/nv_dac.c Mon Oct 14 20:22:45
2002
+++ xc/programs/Xserver/hw/xfree86/drivers/nv/nv_dac.c Mon Nov 25 15:36:42 2002
@@ -320,13 +320,16 @@
{
NVPtr pNv = NVPTR(pScrn);
unsigned char val;
+ unsigned char cr;
+
+ cr = pNv->SecondCRTC ? 0x36 : 0x3e;
/* wait for Vsync */
while(VGA_RD08(pNv->riva.PCIO, 0x3da) & 0x08);
while(!(VGA_RD08(pNv->riva.PCIO, 0x3da) & 0x08));
/* Get the result */
- VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3e);
+ VGA_WR08(pNv->riva.PCIO, 0x3d4, cr);
val = VGA_RD08(pNv->riva.PCIO, 0x3d5);
DEBUG(ErrorF("NV_ddc1Read(%p,...) returns %d\n",
pScrn, val));
@@ -338,9 +341,12 @@
{
NVPtr pNv = NVPTR(xf86Screens[b->scrnIndex]);
unsigned char val;
+ unsigned char cr;
+
+ cr = pNv->SecondCRTC ? 0x36 : 0x3e;
/* Get the result. */
- VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3e);
+ VGA_WR08(pNv->riva.PCIO, 0x3d4, cr);
val = VGA_RD08(pNv->riva.PCIO, 0x3d5);
*clock = (val & DDC_SCL_READ_MASK) != 0;
@@ -354,8 +360,11 @@
{
NVPtr pNv = NVPTR(xf86Screens[b->scrnIndex]);
unsigned char val;
+ unsigned char cr;
+
+ cr = pNv->SecondCRTC ? 0x37 : 0x3f;
- VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3f);
+ VGA_WR08(pNv->riva.PCIO, 0x3d4, cr);
val = VGA_RD08(pNv->riva.PCIO, 0x3d5) & 0xf0;
if (clock)
val |= DDC_SCL_WRITE_MASK;
@@ -367,7 +376,7 @@
else
val &= ~DDC_SDA_WRITE_MASK;
- VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3f);
+ VGA_WR08(pNv->riva.PCIO, 0x3d4, cr);
VGA_WR08(pNv->riva.PCIO, 0x3d5, val | 0x1);
DEBUG(ErrorF("NV_I2CPutBits(%p, %d, %d) val=0x%x\n", b, clock, data, val));