lg_i2c.c revision 76888252
176888252Smrg/* (c) Itai Nahshon */
276888252Smrg
376888252Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/lg_i2c.c,v 1.1 1998/11/15 04:30:25 dawes Exp $ */
476888252Smrg
576888252Smrg#ifdef HAVE_CONFIG_H
676888252Smrg#include "config.h"
776888252Smrg#endif
876888252Smrg
976888252Smrg#include "xf86.h"
1076888252Smrg#include "xf86_OSproc.h"
1176888252Smrg#include "compiler.h"
1276888252Smrg
1376888252Smrg#include "xf86Pci.h"
1476888252Smrg#include "xf86PciInfo.h"
1576888252Smrg
1676888252Smrg#include "vgaHW.h"
1776888252Smrg
1876888252Smrg#include "cir.h"
1976888252Smrg#define _LG_PRIVATE_
2076888252Smrg#include "lg.h"
2176888252Smrg
2276888252Smrgstatic void
2376888252SmrgLgI2CPutBits(I2CBusPtr b, int clock,  int data)
2476888252Smrg{
2576888252Smrg	unsigned int regval, regno;
2676888252Smrg	CirPtr pCir = ((CirPtr)b->DriverPrivate.ptr);
2776888252Smrg	if (b == pCir->I2CPtr1)
2876888252Smrg		regno = 0x280;
2976888252Smrg	else if (b == pCir->I2CPtr2)
3076888252Smrg		regno = 0x282;
3176888252Smrg	else
3276888252Smrg		return;
3376888252Smrg
3476888252Smrg	regval = 0xff7e;
3576888252Smrg	if (clock) regval |= 0x0080;
3676888252Smrg	if (data)  regval |= 0x0001;
3776888252Smrg	memww(regno, regval);
3876888252Smrg	/* ErrorF("LgI2CPutBits: %d %d\n", clock, data); */
3976888252Smrg}
4076888252Smrg
4176888252Smrgstatic void
4276888252SmrgLgI2CGetBits(I2CBusPtr b, int *clock, int *data)
4376888252Smrg{
4476888252Smrg	unsigned int regval, regno;
4576888252Smrg	CirPtr pCir = ((CirPtr)b->DriverPrivate.ptr);
4676888252Smrg	if (b == pCir->I2CPtr1)
4776888252Smrg		regno = 0x280;
4876888252Smrg	else if (b == pCir->I2CPtr2)
4976888252Smrg		regno = 0x282;
5076888252Smrg	else
5176888252Smrg		return;
5276888252Smrg
5376888252Smrg	regval = memrw(regno);
5476888252Smrg	*clock = (regval & 0x8000) != 0;
5576888252Smrg	*data  = (regval & 0x0100) != 0;
5676888252Smrg	/* ErrorF("LgI2CGetBits: %d %d\n", *clock, *data); */
5776888252Smrg}
5876888252Smrg
5976888252SmrgBool
6076888252SmrgLgI2CInit(ScrnInfoPtr pScrn)
6176888252Smrg{
6276888252Smrg	CirPtr pCir = CIRPTR(pScrn);
6376888252Smrg	I2CBusPtr I2CPtr;
6476888252Smrg
6576888252Smrg#ifdef LG_DEBUG
6676888252Smrg	ErrorF("LgI2CInit\n");
6776888252Smrg#endif
6876888252Smrg
6976888252Smrg	I2CPtr = xf86CreateI2CBusRec();
7076888252Smrg	if (!I2CPtr) return FALSE;
7176888252Smrg
7276888252Smrg	pCir->I2CPtr1 = I2CPtr;
7376888252Smrg
7476888252Smrg	I2CPtr->BusName				= "I2C bus 1";
7576888252Smrg	I2CPtr->scrnIndex			= pScrn->scrnIndex;
7676888252Smrg	I2CPtr->I2CPutBits			= LgI2CPutBits;
7776888252Smrg	I2CPtr->I2CGetBits			= LgI2CGetBits;
7876888252Smrg	I2CPtr->DriverPrivate.ptr	= pCir;
7976888252Smrg
8076888252Smrg	if (!xf86I2CBusInit(I2CPtr))
8176888252Smrg		return FALSE;
8276888252Smrg
8376888252Smrg	I2CPtr = xf86CreateI2CBusRec();
8476888252Smrg	if (!I2CPtr) return FALSE;
8576888252Smrg
8676888252Smrg	pCir->I2CPtr2 = I2CPtr;
8776888252Smrg
8876888252Smrg	I2CPtr->BusName				= "I2C bus 2";
8976888252Smrg	I2CPtr->scrnIndex			= pScrn->scrnIndex;
9076888252Smrg	I2CPtr->I2CPutBits			= LgI2CPutBits;
9176888252Smrg	I2CPtr->I2CGetBits			= LgI2CGetBits;
9276888252Smrg	I2CPtr->DriverPrivate.ptr	= pCir;
9376888252Smrg
9476888252Smrg	if (!xf86I2CBusInit(I2CPtr))
9576888252Smrg		return FALSE;
9676888252Smrg
9776888252Smrg	return TRUE;
9876888252Smrg}
9976888252Smrg
100