diff --git a/kernel/busses/i2c-voodoo3.c b/kernel/busses/i2c-voodoo3.c index fbf201a1..84d245b4 100644 --- a/kernel/busses/i2c-voodoo3.c +++ b/kernel/busses/i2c-voodoo3.c @@ -165,11 +165,13 @@ void Voodoo3_I2CStart(void) { clkon(); /* in theory, clk is already on */ out(); + out(); + out(); + out(); dat(0); out(); clkoff(); out(); - clkon(); } void Voodoo3_I2CStop(void) @@ -182,6 +184,7 @@ void Voodoo3_I2CStop(void) out(); clkoff(); out(); + out(); clkon(); out(); } @@ -190,14 +193,13 @@ int Voodoo3_I2CAck(void) { int ack; - dat(1); /* put data line in tristate/hi */ - clkon(); out(); + clkon(); ack=rdat(); + out(); clkoff(); out(); return ack; - } int Voodoo3_I2CReadByte(void) @@ -205,16 +207,13 @@ int Voodoo3_I2CReadByte(void) int i,temp; unsigned char data=0; - clkoff(); - out(); for (i=7; i>=0; i--) { - out(); out(); clkon(); data|=(rdat()<=0; i--) { dat(temp=data&(1<>8)) { #ifdef DEBUG - printk("i2c-voodoo3: No Ack on data WriteByte to addr 0x%X\n",addr); + printk("i2c-voodoo3: No Ack on data byte 2 WriteByte to addr 0x%X\n",addr); #endif result=-1; } ENDWRITE3: Voodoo3_I2CStop(); @@ -429,7 +426,6 @@ void config_v3(struct pci_dev *dev, int num) cadr&=PCI_BASE_ADDRESS_MEM_MASK; mem=ioremap(cadr, 0x1000); - /* Enable TV out mode, Voodoo3_I2C bus, etc. */ *((unsigned int *)(mem+0x70))=0x8160; *((unsigned int *)(mem+0x78))=0xcf980020; printk("i2c-voodoo3: Using Banshee/Voodoo3 at 0x%p\n",mem);