trident_i2c.c revision 95b296d0
195b296d0Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident_i2c.c,v 1.2 1999/01/23 09:55:59 dawes Exp $ */
295b296d0Smrg
395b296d0Smrg#ifdef HAVE_CONFIG_H
495b296d0Smrg#include "config.h"
595b296d0Smrg#endif
695b296d0Smrg
795b296d0Smrg#include "xf86.h"
895b296d0Smrg#include "xf86_OSproc.h"
995b296d0Smrg#include "compiler.h"
1095b296d0Smrg
1195b296d0Smrg#include "xf86Pci.h"
1295b296d0Smrg#include "xf86PciInfo.h"
1395b296d0Smrg
1495b296d0Smrg#include "vgaHW.h"
1595b296d0Smrg
1695b296d0Smrg#include "trident.h"
1795b296d0Smrg#include "trident_regs.h"
1895b296d0Smrg
1995b296d0Smrgstatic void
2095b296d0SmrgTRIDENTI2CPutBits(I2CBusPtr b, int clock, int data) {
2195b296d0Smrg    unsigned int reg = 0x0C;
2295b296d0Smrg    TRIDENTPtr pTrident = ((TRIDENTPtr)b->DriverPrivate.ptr);
2395b296d0Smrg    int vgaIOBase = VGAHWPTR(pTrident->pScrn)->IOBase;
2495b296d0Smrg
2595b296d0Smrg#if 0
2695b296d0Smrg    if(!TRIDENTI2CSwitchToBus(b))
2795b296d0Smrg        return FALSE;
2895b296d0Smrg#endif
2995b296d0Smrg
3095b296d0Smrg    if(clock) reg |= 2;
3195b296d0Smrg    if(data)  reg |= 1;
3295b296d0Smrg    OUTB(vgaIOBase + 4, I2C);
3395b296d0Smrg    OUTB(vgaIOBase + 5, reg);
3495b296d0Smrg#if 0
3595b296d0Smrg    ErrorF("TRIDENTI2CPutBits: %d %d\n", clock, data);
3695b296d0Smrg#endif
3795b296d0Smrg}
3895b296d0Smrg
3995b296d0Smrgstatic void
4095b296d0SmrgTRIDENTI2CGetBits(I2CBusPtr b, int *clock, int *data) {
4195b296d0Smrg    unsigned int reg;
4295b296d0Smrg    TRIDENTPtr pTrident = ((TRIDENTPtr)b->DriverPrivate.ptr);
4395b296d0Smrg    int vgaIOBase = VGAHWPTR(pTrident->pScrn)->IOBase;
4495b296d0Smrg
4595b296d0Smrg#if 0
4695b296d0Smrg    if(!TRIDENTI2CSwitchToBus(b))
4795b296d0Smrg        return FALSE;
4895b296d0Smrg#endif
4995b296d0Smrg
5095b296d0Smrg    OUTB(vgaIOBase + 4, I2C);
5195b296d0Smrg    reg = INB(vgaIOBase + 5);
5295b296d0Smrg    *clock = (reg & 0x02) != 0;
5395b296d0Smrg    *data  = (reg & 0x01) != 0;
5495b296d0Smrg#if 0
5595b296d0Smrg    ErrorF("TRIDENTI2CGetBits: %d %d\n", *clock, *data);
5695b296d0Smrg#endif
5795b296d0Smrg}
5895b296d0Smrg
5995b296d0SmrgBool
6095b296d0SmrgTRIDENTI2CInit(ScreenPtr pScreen)
6195b296d0Smrg{
6295b296d0Smrg    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
6395b296d0Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
6495b296d0Smrg    I2CBusPtr I2CPtr;
6595b296d0Smrg
6695b296d0Smrg    I2CPtr = xf86CreateI2CBusRec();
6795b296d0Smrg
6895b296d0Smrg    pTrident->DDC = I2CPtr;
6995b296d0Smrg
7095b296d0Smrg    I2CPtr->BusName    = "DDC";
7195b296d0Smrg    I2CPtr->scrnIndex  = pScrn->scrnIndex;
7295b296d0Smrg    I2CPtr->I2CPutBits = TRIDENTI2CPutBits;
7395b296d0Smrg    I2CPtr->I2CGetBits = TRIDENTI2CGetBits;
7495b296d0Smrg    I2CPtr->DriverPrivate.ptr = pTrident;
7595b296d0Smrg
7695b296d0Smrg    if(!xf86I2CBusInit(I2CPtr))
7795b296d0Smrg       return FALSE;
7895b296d0Smrg
7995b296d0Smrg    return TRUE;
8095b296d0Smrg}
81