diff options
Diffstat (limited to 'src/lg_i2c.c')
-rw-r--r-- | src/lg_i2c.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/lg_i2c.c b/src/lg_i2c.c new file mode 100644 index 0000000..6cb3e3d --- /dev/null +++ b/src/lg_i2c.c @@ -0,0 +1,96 @@ +/* (c) Itai Nahshon */ + +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/lg_i2c.c,v 1.4 2000/12/06 15:35:17 eich Exp $ */ + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "compiler.h" + +#include "xf86Pci.h" +#include "xf86PciInfo.h" + +#include "vgaHW.h" + +#include "cir.h" +#define _LG_PRIVATE_ +#include "lg.h" + +static void +LgI2CPutBits(I2CBusPtr b, int clock, int data) +{ + unsigned int regval, regno; + CirPtr pCir = ((CirPtr)b->DriverPrivate.ptr); + if (b == pCir->I2CPtr1) + regno = 0x280; + else if (b == pCir->I2CPtr2) + regno = 0x282; + else + return; + + regval = 0xff7e; + if (clock) regval |= 0x0080; + if (data) regval |= 0x0001; + memww(regno, regval); + /* ErrorF("LgI2CPutBits: %d %d\n", clock, data); */ +} + +static void +LgI2CGetBits(I2CBusPtr b, int *clock, int *data) +{ + unsigned int regval, regno; + CirPtr pCir = ((CirPtr)b->DriverPrivate.ptr); + if (b == pCir->I2CPtr1) + regno = 0x280; + else if (b == pCir->I2CPtr2) + regno = 0x282; + else + return; + + regval = memrw(regno); + *clock = (regval & 0x8000) != 0; + *data = (regval & 0x0100) != 0; + /* ErrorF("LgI2CGetBits: %d %d\n", *clock, *data); */ +} + +Bool +LgI2CInit(ScrnInfoPtr pScrn) +{ + CirPtr pCir = CIRPTR(pScrn); + I2CBusPtr I2CPtr; + +#ifdef LG_DEBUG + ErrorF("LgI2CInit\n"); +#endif + + I2CPtr = xf86CreateI2CBusRec(); + if (!I2CPtr) return FALSE; + + pCir->I2CPtr1 = I2CPtr; + + I2CPtr->BusName = "I2C bus 1"; + I2CPtr->scrnIndex = pScrn->scrnIndex; + I2CPtr->I2CPutBits = LgI2CPutBits; + I2CPtr->I2CGetBits = LgI2CGetBits; + I2CPtr->DriverPrivate.ptr = pCir; + + if (!xf86I2CBusInit(I2CPtr)) + return FALSE; + + I2CPtr = xf86CreateI2CBusRec(); + if (!I2CPtr) return FALSE; + + pCir->I2CPtr2 = I2CPtr; + + I2CPtr->BusName = "I2C bus 2"; + I2CPtr->scrnIndex = pScrn->scrnIndex; + I2CPtr->I2CPutBits = LgI2CPutBits; + I2CPtr->I2CGetBits = LgI2CGetBits; + I2CPtr->DriverPrivate.ptr = pCir; + + if (!xf86I2CBusInit(I2CPtr)) + return FALSE; + + return TRUE; +} + |