uint16_t i2c_helper::smbus_process_call( uint8_t cmd, uint16_t value ) { i2c_smbus_data data; data.word = value; smbus_write( cmd, &data, I2C_SMBUS_PROC_CALL ); return data.word; }
static void smbus_enable(int offset, int bit) { unsigned int cfg = smbus_read(offset); cfg |= bit; smbus_write(offset, cfg); }
void i2c_helper::smbus_write_block_broken( uint8_t cmd, const uint8_t *data, uint8_t length ) { i2c_smbus_data ldata; uint8_t len = length > I2C_SMBUS_BLOCK_MAX ? I2C_SMBUS_BLOCK_MAX : length; ldata.block[0] = len; memcpy( &ldata.block[1], data, len ); smbus_write( cmd, &ldata, I2C_SMBUS_I2C_BLOCK_BROKEN ); }
std::string i2c_helper::smbus_block_process_call( uint8_t cmd, const std::string &data ) { i2c_smbus_data ldata; uint8_t len = data.size( ) > I2C_SMBUS_BLOCK_MAX ? I2C_SMBUS_BLOCK_MAX : static_cast<uint8_t>( data.size( ) ); ldata.block[0] = len; memcpy( &ldata.block[1], len ? &data[0] : "", len ); smbus_write( cmd, &ldata, I2C_SMBUS_BLOCK_PROC_CALL ); return std::string( &ldata.block[1], &ldata.block[1] + ldata.block[0] ); }
/* * hpet address assignation and irq setting should be done in bios. * but pmon don't do this, we just setup here directly. * The operation under is normal. unfortunately, hpet_setup process * is before pci initialize. * * { * struct pci_dev *pdev; * * pdev = pci_get_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, NULL); * pci_write_config_word(pdev, SMBUS_PCI_REGB4, HPET_ADDR); * * ... * } */ static void hpet_setup(void) { /* set hpet base address */ smbus_write(SMBUS_PCI_REGB4, HPET_ADDR); /* enable decodeing of access to HPET MMIO*/ smbus_enable(SMBUS_PCI_REG40, (1 << 28)); /* HPET irq enable */ smbus_enable(SMBUS_PCI_REG64, (1 << 10)); hpet_enable_legacy_int(); }
uint8_t i2c_helper::smbus_block_process_call( uint8_t cmd, uint8_t *data, uint8_t len ) { i2c_smbus_data ldata; len = len > I2C_SMBUS_BLOCK_MAX ? I2C_SMBUS_BLOCK_MAX : len; memcpy( &ldata.block[1], data, len ); smbus_write( cmd, &ldata, I2C_SMBUS_BLOCK_PROC_CALL ); memcpy( data, &ldata.block[1], ldata.block[0] ); return ldata.block[0]; }
void VIA_TVInit(ScrnInfoPtr pScrn) { TRIDENTPtr pTrident=TRIDENTPTR(pScrn); unsigned char idx=0; unsigned char i; unsigned char protect; unsigned char TV_CRTC[TVX_CRTC_NUM] = { 0xC0,0xD0,0xD1,0xD2,0xD3,0xE0,0xE3,0xE4,0xE5, 0xE6,0xE7,0xF0,0xF1,0xF6,0xFE,0xFF }; unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={ 0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09, 0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14, 0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D, 0X1E,0X1F,0X20,0X21,0X3D }; #ifdef DEBUG_CODE_TRACE ErrorF("VIAB3D: VIA_TVInit:\n"); #endif if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0) { /* Overlay window 1 position OK */ ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) NTSC\n"); idx=0; pTrident->OverrideHsync=-71; pTrident->OverrideVsync=15; } else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0) { /* Overlay window 1 position OK */ ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) NTSC\n"); idx=1; pTrident->OverrideHsync=-152; pTrident->OverrideVsync=72; } else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 0) { ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 NTSC\n"); idx=2; pTrident->OverrideHsync=-65; pTrident->OverrideVsync=14; } else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 0) { ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 NTSC\n"); idx=3; pTrident->OverrideHsync=-158; pTrident->OverrideVsync=72; } else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1) { /* Overlay window 1 position OK */ ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) PAL\n"); idx=4; pTrident->OverrideHsync=2; pTrident->OverrideVsync=65; } else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1) { ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) PAL\n"); /* patch TV screen defection */ idx=5; /* patch 800x600 screen defect */ OUTB(0x3d4,0x2f); OUTB(0x3d5,0xbf); pTrident->OverrideHsync=-145; pTrident->OverrideVsync=43; } else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 1) { ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 PAL\n"); idx=6; pTrident->OverrideHsync=0; pTrident->OverrideVsync=63; } else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 1) { ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 PAL\n"); idx=7; OUTB(0x3d4,0x2f); OUTB(0x3d5,0xbf); pTrident->OverrideHsync=-141; pTrident->OverrideVsync=42; } else { ErrorF("VIAB3D: VIA_TVInit: TV Params default mode\n"); return; } /* Unprotect */ OUTB(0x3C4, 0x11); protect = INB(0x3C5); OUTB(0x3C5, 0x92); /* Set TV hw environment */ OUTB(0x3c4,0x24); OUTB(0x3c5,0x4f); OUTB(0x3d4,0xc1); OUTB(0x3d5,0x41); OUTB(0x3ce,0x23); OUTB(0x3cf,0x88); /* set CRT + TV */ OUTB(0x3CE,0x33); OUTB(0x3CF,0x20); /* set CRTC */ for( i = 0; i < TVX_CRTC_NUM; i++ ) { OUTB(0x3D4, TV_CRTC[i]); if (pTrident->TVChipset==2) { OUTB(0x3D5, TV_CH7005C_Table[idx][i]); } else { OUTB(0x3D5, TVX_VT1621_Table[idx][i]); } } /* Digital TV interface control */ switch (pTrident->TVChipset) { case 1: OUTB(0x3C4,0xD8); OUTB(0x3C5,0x60); OUTB(0x3C4,0xD9); OUTB(0x3C5,0x38); break; case 2: OUTB(0x3c4,0xd8); OUTB(0x3c5,0x24); OUTB(0x3C4,0xD9); OUTB(0x3C5,0x18); break; } switch (pTrident->TVChipset) { case 1: /* set TVX registers */ for (i=0; i < TVX_REG_NUM; i++ ) { smbus_write(pScrn,TVX_VT1621_Table[idx][TVX_CRTC_NUM+i], i, TVX_VT1621_PORT); } break; case 2: for (i=0; i<TV_CH7005C_TVREG_NUM; i++) { smbus_write(pScrn,TV_CH7005C_Table[idx][TV_CH7005C_CRTC_NUM+i], TV_CH7005C_RegIdx[i], TV_CH7005C_PORT); } break; } /*VIA_DumpReg(pScrn);*/ /* protect */ OUTB(0x3C4, 0x11); OUTB(0x3C5, protect); }
void VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn) { TRIDENTPtr pTrident=TRIDENTPTR(pScrn); unsigned char protect; unsigned char bTmp; int i; unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={ 0xD8,0XD9,/* SR */ 0X33,/* GR */ 0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */ 0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF }; unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={ 0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09, 0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14, 0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D, 0X1E,0X1F,0X20,0X21,0X3D }; /*ErrorF("VIAB3D: VIA_RestoreTVDependVGAReg:\n");*/ /* Unprotect */ OUTB(0x3C4, 0x11); protect = INB(0x3C5); OUTB(0x3C5, 0x92); /* Set TV Hw environment */ OUTB(0x3d4,0xc1); OUTB(0x3d5,0x41); /* SR_d8,SR_d9 */ for (i=0; i<2; i++) { OUTB(0x3c4,VGA_RegIdx_about_TV[i]); bTmp=pTrident->DefaultTVDependVGASetting[i]; OUTB(0x3c5,bTmp); } /* GR_33 */ OUTB(0x3ce,0x33); bTmp=pTrident->DefaultTVDependVGASetting[2]; OUTB(0x3cf,bTmp); /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */ for (i=3; i<VGA_REGNUM_ABOUT_TV; i++) { OUTB(0x3d4,VGA_RegIdx_about_TV[i]); bTmp=pTrident->DefaultTVDependVGASetting[i]; OUTB(0x3d5,bTmp); } switch (pTrident->TVChipset) { case 1: for (i=0; i<TVX_REG_NUM; i++) { bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]; smbus_write(pScrn,bTmp,i,TVX_VT1621_PORT); } break; case 2: for (i=0; i<TV_CH7005C_TVREG_NUM; i++) { bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]; smbus_write(pScrn,bTmp,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT); } break; default: ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n"); break; } /* protect */ OUTB(0x3C4, 0x11); OUTB(0x3C5, protect); }
void i2c_helper::smbus_write_word_data( uint8_t cmd, uint16_t value ) { i2c_smbus_data data; data.word = value; smbus_write( cmd, &data, I2C_SMBUS_WORD_DATA ); }
void i2c_helper::smbus_write_byte_data( uint8_t cmd, uint8_t value ) { i2c_smbus_data data; data.byte = value; smbus_write( cmd, &data, I2C_SMBUS_BYTE_DATA ); }
void i2c_helper::smbus_write_byte( uint8_t value ) { smbus_write( value, NULL, I2C_SMBUS_BYTE ); }