static void update_wids(FFBPtr pFfb, int index) { ffb_dac_info_t *p = &pFfb->dac_info; ffb_dacPtr dac = pFfb->dac; unsigned int base; int limit; if (pFfb->vtSema) return; if (p->flags & FFB_DAC_PAC1) base = FFBDAC_PAC1_SPWLUT(index); else base = FFBDAC_PAC2_SPWLUT(index); DACCFG_WRITE(dac, base, p->wid_table.wid_pool[index].wlut_regval); /* Schedule the window transfer. */ DACCFG_WRITE(dac, FFBDAC_CFG_WTCTRL, (FFBDAC_CFG_WTCTRL_TCMD | FFBDAC_CFG_WTCTRL_TE)); limit = 1000000; while (limit--) { unsigned int wtctrl = DACCFG_READ(dac, FFBDAC_CFG_WTCTRL); if ((wtctrl & FFBDAC_CFG_WTCTRL_DS) == 0) break; } }
static void FFBI2CPutBits(I2CBusPtr b, int clock, int data) { FFBPtr pFfb = GET_FFB_FROM_SCRN(xf86Screens[b->scrnIndex]); ffb_dacPtr dac = pFfb->dac; unsigned int val; #ifdef MDATA_NEEDS_BLANK unsigned int uctrl; #endif val = 0; if (clock) val |= FFBDAC_CFG_MPDATA_SCL; if (data) val |= FFBDAC_CFG_MPDATA_SDA; #ifdef MDATA_NEEDS_BLANK /* Force a blank of the screen. */ uctrl = DACCFG_READ(dac, FFBDAC_CFG_UCTRL); DACCFG_WRITE(dac, FFBDAC_CFG_UCTRL, (uctrl | FFBDAC_UCTRL_ABLANK)); #endif /* Tristate requested pins. */ DACCFG_WRITE(dac, FFBDAC_CFG_MPDATA, val); #ifdef MDATA_NEEDS_BLANK /* Restore UCTRL to unblank the screen. */ DACCFG_WRITE(dac, FFBDAC_CFG_UCTRL, uctrl); #endif }
/* DDC1/DDC2 support */ static unsigned int FFBDacDdc1Read(ScrnInfoPtr pScrn) { FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); ffb_dacPtr dac = pFfb->dac; unsigned int val; #ifdef MDATA_NEEDS_BLANK unsigned int uctrl; #endif #ifdef MDATA_NEEDS_BLANK /* Force a blank of the screen. */ uctrl = DACCFG_READ(dac, FFBDAC_CFG_UCTRL); DACCFG_WRITE(dac, FFBDAC_CFG_UCTRL, (uctrl | FFBDAC_UCTRL_ABLANK)); #endif /* Tristate SCL pin. */ DACCFG_WRITE(dac, FFBDAC_CFG_MPDATA, FFBDAC_CFG_MPDATA_SCL); /* Pause until VSYNC is hit. */ WaitForVSYNC(dac); /* Read the sense line to see what the monitor is driving * it at. */ val = DACCFG_READ(dac, FFBDAC_CFG_MPSENSE); val = (val & FFBDAC_CFG_MPSENSE_SCL) ? 1 : 0; /* Stop tristating the SCL pin. */ DACCFG_WRITE(dac, FFBDAC_CFG_MPDATA, 0); #ifdef MDATA_NEEDS_BLANK /* Restore UCTRL to unblank the screen. */ DACCFG_WRITE(dac, FFBDAC_CFG_UCTRL, uctrl); #endif /* Return the result and we're done. */ return val; }
static void FFBI2CGetBits(I2CBusPtr b, int *clock, int *data) { FFBPtr pFfb = GET_FFB_FROM_SCRN(xf86Screens[b->scrnIndex]); ffb_dacPtr dac = pFfb->dac; unsigned int val; #ifdef MDATA_NEEDS_BLANK unsigned int uctrl; #endif #ifdef MDATA_NEEDS_BLANK /* Force a blank of the screen. */ uctrl = DACCFG_READ(dac, FFBDAC_CFG_UCTRL); DACCFG_WRITE(dac, FFBDAC_CFG_UCTRL, (uctrl | FFBDAC_UCTRL_ABLANK)); #endif /* Tristate SCL+SDA pins. */ DACCFG_WRITE(dac, FFBDAC_CFG_MPDATA, (FFBDAC_CFG_MPDATA_SCL | FFBDAC_CFG_MPDATA_SDA)); /* Read the sense line to see what the monitor is driving * them at. */ val = DACCFG_READ(dac, FFBDAC_CFG_MPSENSE); *clock = (val & FFBDAC_CFG_MPSENSE_SCL) ? 1 : 0; *data = (val & FFBDAC_CFG_MPSENSE_SDA) ? 1 : 0; /* Stop tristating the SCL pin. */ DACCFG_WRITE(dac, FFBDAC_CFG_MPDATA, 0); #ifdef MDATA_NEEDS_BLANK /* Restore UCTRL to unblank the screen. */ DACCFG_WRITE(dac, FFBDAC_CFG_UCTRL, uctrl); #endif }