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