176888252Smrg/* (c) Itai Nahshon */ 276888252Smrg 376888252Smrg#ifdef HAVE_CONFIG_H 476888252Smrg#include "config.h" 576888252Smrg#endif 676888252Smrg 776888252Smrg#include "xf86.h" 876888252Smrg#include "xf86_OSproc.h" 976888252Smrg#include "compiler.h" 1076888252Smrg 1176888252Smrg#include "xf86Pci.h" 1276888252Smrg 1376888252Smrg#include "vgaHW.h" 1476888252Smrg 1576888252Smrg#include "cir.h" 1676888252Smrg#define _LG_PRIVATE_ 1776888252Smrg#include "lg.h" 1876888252Smrg 190814a2baSmrg 200814a2baSmrgstatic char strI2CBus1[] = "I2C bus 1"; 210814a2baSmrgstatic char strI2CBus2[] = "I2C bus 2"; 220814a2baSmrg 230814a2baSmrg 2476888252Smrgstatic void 250814a2baSmrgLgI2CPutBits(I2CBusPtr b, int clock, int data) 2676888252Smrg{ 270814a2baSmrg unsigned int regval, regno; 280814a2baSmrg CirPtr pCir = ((CirPtr) b->DriverPrivate.ptr); 290814a2baSmrg if (b == pCir->I2CPtr1) 300814a2baSmrg regno = 0x280; 310814a2baSmrg else if (b == pCir->I2CPtr2) 320814a2baSmrg regno = 0x282; 330814a2baSmrg else 340814a2baSmrg return; 350814a2baSmrg 360814a2baSmrg regval = 0xff7e; 370814a2baSmrg if (clock) 380814a2baSmrg regval |= 0x0080; 390814a2baSmrg if (data) 400814a2baSmrg regval |= 0x0001; 410814a2baSmrg memww(regno, regval); 420814a2baSmrg /* 430814a2baSmrg ErrorF("LgI2CPutBits: %d %d\n", clock, data); 440814a2baSmrg */ 4576888252Smrg} 4676888252Smrg 4776888252Smrgstatic void 4876888252SmrgLgI2CGetBits(I2CBusPtr b, int *clock, int *data) 4976888252Smrg{ 500814a2baSmrg unsigned int regval, regno; 510814a2baSmrg CirPtr pCir = ((CirPtr) b->DriverPrivate.ptr); 520814a2baSmrg if (b == pCir->I2CPtr1) 530814a2baSmrg regno = 0x280; 540814a2baSmrg else if (b == pCir->I2CPtr2) 550814a2baSmrg regno = 0x282; 560814a2baSmrg else 570814a2baSmrg return; 580814a2baSmrg 590814a2baSmrg regval = memrw(regno); 600814a2baSmrg *clock = (regval & 0x8000) != 0; 610814a2baSmrg *data = (regval & 0x0100) != 0; 620814a2baSmrg /* 630814a2baSmrg ErrorF("LgI2CGetBits: %d %d\n", *clock, *data); 640814a2baSmrg */ 6576888252Smrg} 6676888252Smrg 6776888252SmrgBool 6876888252SmrgLgI2CInit(ScrnInfoPtr pScrn) 6976888252Smrg{ 700814a2baSmrg CirPtr pCir = CIRPTR(pScrn); 710814a2baSmrg I2CBusPtr I2CPtr; 7276888252Smrg 7376888252Smrg#ifdef LG_DEBUG 740814a2baSmrg ErrorF("LgI2CInit\n"); 7576888252Smrg#endif 7676888252Smrg 770814a2baSmrg I2CPtr = xf86CreateI2CBusRec(); 780814a2baSmrg if (!I2CPtr) 790814a2baSmrg return FALSE; 8076888252Smrg 810814a2baSmrg pCir->I2CPtr1 = I2CPtr; 8276888252Smrg 830814a2baSmrg I2CPtr->BusName = strI2CBus1; 840814a2baSmrg I2CPtr->scrnIndex = pScrn->scrnIndex; 850814a2baSmrg I2CPtr->I2CPutBits = LgI2CPutBits; 860814a2baSmrg I2CPtr->I2CGetBits = LgI2CGetBits; 870814a2baSmrg I2CPtr->DriverPrivate.ptr = pCir; 8876888252Smrg 890814a2baSmrg if (!xf86I2CBusInit(I2CPtr)) 900814a2baSmrg return FALSE; 9176888252Smrg 920814a2baSmrg I2CPtr = xf86CreateI2CBusRec(); 930814a2baSmrg if (!I2CPtr) 940814a2baSmrg return FALSE; 9576888252Smrg 960814a2baSmrg pCir->I2CPtr2 = I2CPtr; 9776888252Smrg 980814a2baSmrg I2CPtr->BusName = strI2CBus2; 990814a2baSmrg I2CPtr->scrnIndex = pScrn->scrnIndex; 1000814a2baSmrg I2CPtr->I2CPutBits = LgI2CPutBits; 1010814a2baSmrg I2CPtr->I2CGetBits = LgI2CGetBits; 1020814a2baSmrg I2CPtr->DriverPrivate.ptr = pCir; 10376888252Smrg 1040814a2baSmrg if (!xf86I2CBusInit(I2CPtr)) 1050814a2baSmrg return FALSE; 10676888252Smrg 1070814a2baSmrg return TRUE; 10876888252Smrg} 10976888252Smrg 110