diff options
-rw-r--r-- | src/i810_reg.h | 4 | ||||
-rw-r--r-- | src/i830_i2c.c | 217 |
2 files changed, 19 insertions, 202 deletions
diff --git a/src/i810_reg.h b/src/i810_reg.h index c790e8b6..dee39cef 100644 --- a/src/i810_reg.h +++ b/src/i810_reg.h @@ -267,12 +267,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define GPIOG 0x5028 #define GPIOH 0x502c # define GPIO_CLOCK_DIR_MASK (1 << 0) -# define GPIO_CLOCK_DIR (1 << 1) +# define GPIO_CLOCK_DIR_OUT (1 << 1) # define GPIO_CLOCK_VAL_MASK (1 << 2) # define GPIO_CLOCK_VAL_OUT (1 << 3) # define GPIO_CLOCK_VAL_IN (1 << 4) # define GPIO_DATA_DIR_MASK (1 << 8) -# define GPIO_DATA_DIR (1 << 9) +# define GPIO_DATA_DIR_OUT (1 << 9) # define GPIO_DATA_VAL_MASK (1 << 10) # define GPIO_DATA_VAL_OUT (1 << 11) # define GPIO_DATA_VAL_IN (1 << 12) diff --git a/src/i830_i2c.c b/src/i830_i2c.c index 8c80a0a1..fa0ca301 100644 --- a/src/i830_i2c.c +++ b/src/i830_i2c.c @@ -49,215 +49,35 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "shadow.h" #include "i830.h" -#define I2C_TIMEOUT(x) /*(x)*/ /* Report timeouts */ -#define I2C_TRACE(x) /*(x)*/ /* Report progress */ - -static void i830_setscl(I2CBusPtr b, int state) +static void +i830I2CGetBits(I2CBusPtr b, int *clock, int *data) { - ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; + ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; I830Ptr pI830 = I830PTR(pScrn); CARD32 val; - OUTREG(b->DriverPrivate.uval, - (state ? GPIO_CLOCK_VAL_OUT : 0) | - GPIO_CLOCK_DIR | - GPIO_CLOCK_DIR_MASK | - GPIO_CLOCK_VAL_MASK); val = INREG(b->DriverPrivate.uval); + *data = (val & GPIO_DATA_VAL_IN) != 0; + *clock = (val & GPIO_CLOCK_VAL_IN) != 0; } -static void i830_setsda(I2CBusPtr b, int state) +static void +i830I2CPutBits(I2CBusPtr b, int clock, int data) { - ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; + ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; I830Ptr pI830 = I830PTR(pScrn); - CARD32 val; - OUTREG(b->DriverPrivate.uval, (state ? GPIO_DATA_VAL_OUT : 0) | - GPIO_DATA_DIR | + OUTREG(b->DriverPrivate.uval, + (data ? GPIO_DATA_VAL_OUT : 0) | + (clock ? GPIO_CLOCK_VAL_OUT : 0) | + GPIO_CLOCK_DIR_OUT | + GPIO_DATA_DIR_OUT | + GPIO_CLOCK_DIR_MASK | + GPIO_CLOCK_VAL_MASK | GPIO_DATA_DIR_MASK | GPIO_DATA_VAL_MASK); - val = INREG(b->DriverPrivate.uval); -} - -static void i830_getscl(I2CBusPtr b, int *state) -{ - ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; - I830Ptr pI830 = I830PTR(pScrn); - CARD32 val; - - OUTREG(b->DriverPrivate.uval, GPIO_CLOCK_DIR_MASK); - OUTREG(b->DriverPrivate.uval, 0); - val = INREG(b->DriverPrivate.uval); - *state = ((val & GPIO_CLOCK_VAL_IN) != 0); -} - -static int i830_getsda(I2CBusPtr b) -{ - ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; - I830Ptr pI830 = I830PTR(pScrn); - CARD32 val; - - OUTREG(b->DriverPrivate.uval, GPIO_DATA_DIR_MASK); - OUTREG(b->DriverPrivate.uval, 0); - val = INREG(b->DriverPrivate.uval); - return ((val & GPIO_DATA_VAL_IN) != 0); -} - -static inline void sdalo(I2CBusPtr b) -{ - i830_setsda(b, 0); - b->I2CUDelay(b, b->RiseFallTime); -} - -static inline void sdahi(I2CBusPtr b) -{ - i830_setsda(b, 1); - b->I2CUDelay(b, b->RiseFallTime); -} - -static inline void scllo(I2CBusPtr b) -{ - i830_setscl(b, 0); - b->I2CUDelay(b, b->RiseFallTime); -} - -static inline int sclhi(I2CBusPtr b, int timeout) -{ - int scl = 0; - int i; - - i830_setscl(b, 1); - b->I2CUDelay(b, b->RiseFallTime); - - for (i = timeout; i > 0; i -= b->RiseFallTime) { - i830_getscl(b, &scl); - if (scl) break; - b->I2CUDelay(b, b->RiseFallTime); - } - - if (i <= 0) { - I2C_TIMEOUT(ErrorF("[I2CRaiseSCL(<%s>, %d) timeout]", b->BusName, timeout)); - return FALSE; - } - return TRUE; -} - -static Bool -I830I2CGetByte(I2CDevPtr d, I2CByte *data, Bool last) -{ - I2CBusPtr b = d->pI2CBus; - int i; - unsigned char indata = 0; - - sdahi(b); - - for (i = 0; i < 8; i++) { - if (sclhi(b, d->BitTimeout)==FALSE) { - I2C_TRACE(ErrorF("timeout at bit #%d\n", 7-i)); - return FALSE; - } - indata*=2; - if ( i830_getsda (b) ) { - indata |= 0x01; - } - scllo(b); - } - - if (last) - sdahi(b); - else - sdalo(b); - - if (sclhi(b, d->BitTimeout) == FALSE) { - sdahi(b); - return FALSE; - } - - scllo(b); - sdahi(b); - - *data = indata & 0xff; - I2C_TRACE(ErrorF("R%02x ", (int) *data)); - - return TRUE; -} - -static Bool -I830I2CPutByte(I2CDevPtr d, I2CByte c) -{ - int i; - int sb, ack; - I2CBusPtr b = d->pI2CBus; - - for (i = 7; i>=0; i--) { - sb = c & (1 << i); - i830_setsda(b, sb); - b->I2CUDelay(b, b->RiseFallTime); - - if (sclhi(b, d->ByteTimeout) == FALSE) { - sdahi(b); - return FALSE; - } - - i830_setscl(b, 0); - b->I2CUDelay(b, b->RiseFallTime); - } - sdahi(b); - if (sclhi(b, d->ByteTimeout) == FALSE) { - I2C_TIMEOUT(ErrorF("[I2CPutByte(<%s>, 0x%02x, %d, %d, %d) timeout]", - b->BusName, c, d->BitTimeout, - d->ByteTimeout, d->AcknTimeout)); - return FALSE; - } - ack = i830_getsda(b); - I2C_TRACE(ErrorF("Put byte 0x%02x , getsda() = %d\n", c & 0xff, ack)); - - scllo(b); - return 0 == ack; -} - -static Bool -I830I2CStart(I2CBusPtr b, int timeout) -{ - if (sclhi(b, timeout) == FALSE) - return FALSE; - - sdalo(b); - scllo(b); - - return TRUE; } -static void -I830I2CStop(I2CDevPtr d) -{ - I2CBusPtr b = d->pI2CBus; - - sdalo(b); - sclhi(b, d->ByteTimeout); - sdahi(b); -} - -static Bool -I830I2CAddress(I2CDevPtr d, I2CSlaveAddr addr) -{ - if (I830I2CStart(d->pI2CBus, d->StartTimeout)) { - if (I830I2CPutByte(d, addr & 0xFF)) { - if ((addr & 0xF8) != 0xF0 && - (addr & 0xFE) != 0x00) - return TRUE; - - if (I830I2CPutByte(d, (addr >> 8) & 0xFF)) - return TRUE; - } - - I830I2CStop(d); - } - - return FALSE; -} - - /* the i830 has a number of I2C Buses */ Bool I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg, char *name) @@ -271,11 +91,8 @@ I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg, char *name) pI2CBus->BusName = name; pI2CBus->scrnIndex = pScrn->scrnIndex; - pI2CBus->I2CGetByte = I830I2CGetByte; - pI2CBus->I2CPutByte = I830I2CPutByte; - pI2CBus->I2CStart = I830I2CStart; - pI2CBus->I2CStop = I830I2CStop; - pI2CBus->I2CAddress = I830I2CAddress; + pI2CBus->I2CGetBits = i830I2CGetBits; + pI2CBus->I2CPutBits = i830I2CPutBits; pI2CBus->DriverPrivate.uval = i2c_reg; if (!xf86I2CBusInit(pI2CBus)) |