void viafb_set_gamma_table(int bpp, unsigned int *gamma_table) { int i, sr1a; int active_device_amount = 0; int device_status = viafb_DeviceStatus; for (i = 0; i < sizeof(viafb_DeviceStatus) * 8; i++) { if (device_status & 1) active_device_amount++; device_status >>= 1; } if (bpp == 8) return ; switch (viaparinfo->chip_info->gfx_chip_name) { case UNICHROME_CLE266: case UNICHROME_K400: viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7); break; case UNICHROME_K800: case UNICHROME_PM800: case UNICHROME_CN700: case UNICHROME_CX700: case UNICHROME_K8M890: case UNICHROME_P4M890: case UNICHROME_P4M900: viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7); break; } sr1a = (unsigned int)viafb_read_reg(VIASR, SR1A); viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0); outb(0, LUT_INDEX_WRITE); for (i = 0; i < 256; i++) { outb(gamma_table[i] >> 16, LUT_DATA); outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA); outb(gamma_table[i] & 0xFF, LUT_DATA); } if ((active_device_amount > 1) && !((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) && (viaparinfo->chip_info->gfx_chip_revision < 15))) { viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0); viafb_write_reg_mask(CR6A, VIACR, 0x02, BIT1); outb(0, LUT_INDEX_WRITE); for (i = 0; i < 256; i++) { outb(gamma_table[i] >> 16, LUT_DATA); outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA); outb(gamma_table[i] & 0xFF, LUT_DATA); } }
void viafb_enable_lvds_vt1636(struct lvds_setting_information *plvds_setting_info, struct lvds_chip_information *plvds_chip_info) { viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info, VDD_ON_TBL_VT1636[0]); /* Pad on: */ switch (plvds_chip_info->output_interface) { case INTERFACE_DVP0: { viafb_write_reg_mask(SR1E, VIASR, 0xC0, 0xC0); break; } case INTERFACE_DVP1: { viafb_write_reg_mask(SR1E, VIASR, 0x30, 0x30); break; } case INTERFACE_DFP_LOW: { viafb_write_reg_mask(SR2A, VIASR, 0x03, 0x03); break; } case INTERFACE_DFP_HIGH: { viafb_write_reg_mask(SR2A, VIASR, 0x03, 0x0C); break; } } }
bool __devinit viafb_tmds_trasmitter_identify(void) { unsigned char sr2a = 0, sr1e = 0, sr3e = 0; /* Turn on ouputting pad */ switch (viaparinfo->chip_info->gfx_chip_name) { case UNICHROME_K8M890: /*=* DFP Low Pad on *=*/ sr2a = viafb_read_reg(VIASR, SR2A); viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1); break; case UNICHROME_P4M900: case UNICHROME_P4M890: /* DFP Low Pad on */ sr2a = viafb_read_reg(VIASR, SR2A); viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1); /* DVP0 Pad on */ sr1e = viafb_read_reg(VIASR, SR1E); viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT6 + BIT7); break; default: /* DVP0/DVP1 Pad on */ sr1e = viafb_read_reg(VIASR, SR1E); viafb_write_reg_mask(SR1E, VIASR, 0xF0, BIT4 + BIT5 + BIT6 + BIT7); /* SR3E[1]Multi-function selection: 0 = Emulate I2C and DDC bus by GPIO2/3/4. */ sr3e = viafb_read_reg(VIASR, SR3E); viafb_write_reg_mask(SR3E, VIASR, 0x0, BIT5); break; } /* Check for VT1632: */ viaparinfo->chip_info->tmds_chip_info.tmds_chip_name = VT1632_TMDS; viaparinfo->chip_info-> tmds_chip_info.tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR; viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_31; if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) { /* * Currently only support 12bits,dual edge,add 24bits mode later */ tmds_register_write(0x08, 0x3b); DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n"); DEBUG_MSG(KERN_INFO "\n %2d", viaparinfo->chip_info->tmds_chip_info.tmds_chip_name); DEBUG_MSG(KERN_INFO "\n %2d", viaparinfo->chip_info->tmds_chip_info.i2c_port); return true; } else { viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_2C; if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) { tmds_register_write(0x08, 0x3b); DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n"); DEBUG_MSG(KERN_INFO "\n %2d", viaparinfo->chip_info-> tmds_chip_info.tmds_chip_name); DEBUG_MSG(KERN_INFO "\n %2d", viaparinfo->chip_info-> tmds_chip_info.i2c_port); return true; } } viaparinfo->chip_info->tmds_chip_info.tmds_chip_name = INTEGRATED_TMDS; if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) && ((viafb_display_hardware_layout == HW_LAYOUT_DVI_ONLY) || (viafb_display_hardware_layout == HW_LAYOUT_LCD_DVI))) { DEBUG_MSG(KERN_INFO "\n Integrated TMDS ! \n"); return true; } switch (viaparinfo->chip_info->gfx_chip_name) { case UNICHROME_K8M890: viafb_write_reg(SR2A, VIASR, sr2a); break; case UNICHROME_P4M900: case UNICHROME_P4M890: viafb_write_reg(SR2A, VIASR, sr2a); viafb_write_reg(SR1E, VIASR, sr1e); break; default: viafb_write_reg(SR1E, VIASR, sr1e); viafb_write_reg(SR3E, VIASR, sr3e); break; } viaparinfo->chip_info-> tmds_chip_info.tmds_chip_name = NON_TMDS_TRANSMITTER; viaparinfo->chip_info->tmds_chip_info. tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR; return false; }