Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/via-core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/via_i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include "global.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) static void tmds_register_write(int index, u8 data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) static int tmds_register_read(int index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) static int tmds_register_read_bytes(int index, u8 *buff, int buff_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) static void dvi_get_panel_size_from_DDCv1(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	struct tmds_chip_information *tmds_chip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	struct tmds_setting_information *tmds_setting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) static int viafb_dvi_query_EDID(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) static inline bool check_tmds_chip(int device_id_subaddr, int device_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	return tmds_register_read(device_id_subaddr) == device_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 			 struct tmds_setting_information *tmds_setting)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	viafb_dvi_sense();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	if (viafb_dvi_query_EDID() == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 		dvi_get_panel_size_from_DDCv1(tmds_chip, tmds_setting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) bool viafb_tmds_trasmitter_identify(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	unsigned char sr2a = 0, sr1e = 0, sr3e = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	/* Turn on ouputting pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	switch (viaparinfo->chip_info->gfx_chip_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	case UNICHROME_K8M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	    /*=* DFP Low Pad on *=*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 		sr2a = viafb_read_reg(VIASR, SR2A);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 		viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	case UNICHROME_P4M900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	case UNICHROME_P4M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		/* DFP Low Pad on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		sr2a = viafb_read_reg(VIASR, SR2A);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		/* DVP0 Pad on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		sr1e = viafb_read_reg(VIASR, SR1E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT6 + BIT7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	    /* DVP0/DVP1 Pad on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		sr1e = viafb_read_reg(VIASR, SR1E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		viafb_write_reg_mask(SR1E, VIASR, 0xF0, BIT4 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 			BIT5 + BIT6 + BIT7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	    /* SR3E[1]Multi-function selection:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	    0 = Emulate I2C and DDC bus by GPIO2/3/4. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 		sr3e = viafb_read_reg(VIASR, SR3E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 		viafb_write_reg_mask(SR3E, VIASR, 0x0, BIT5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	/* Check for VT1632: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	viaparinfo->chip_info->tmds_chip_info.tmds_chip_name = VT1632_TMDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		tmds_chip_info.tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		 * Currently only support 12bits,dual edge,add 24bits mode later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		tmds_register_write(0x08, 0x3b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		DEBUG_MSG(KERN_INFO "\n %2d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 			  viaparinfo->chip_info->tmds_chip_info.tmds_chip_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		DEBUG_MSG(KERN_INFO "\n %2d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 			  viaparinfo->chip_info->tmds_chip_info.i2c_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_2C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			tmds_register_write(0x08, 0x3b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			DEBUG_MSG(KERN_INFO "\n %2d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 				  viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 				  tmds_chip_info.tmds_chip_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 			DEBUG_MSG(KERN_INFO "\n %2d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 				  viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 				  tmds_chip_info.i2c_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	viaparinfo->chip_info->tmds_chip_info.tmds_chip_name = INTEGRATED_TMDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	    ((viafb_display_hardware_layout == HW_LAYOUT_DVI_ONLY) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	     (viafb_display_hardware_layout == HW_LAYOUT_LCD_DVI))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		DEBUG_MSG(KERN_INFO "\n Integrated TMDS ! \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	switch (viaparinfo->chip_info->gfx_chip_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	case UNICHROME_K8M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		viafb_write_reg(SR2A, VIASR, sr2a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	case UNICHROME_P4M900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	case UNICHROME_P4M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		viafb_write_reg(SR2A, VIASR, sr2a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		viafb_write_reg(SR1E, VIASR, sr1e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 		viafb_write_reg(SR1E, VIASR, sr1e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 		viafb_write_reg(SR3E, VIASR, sr3e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 		tmds_chip_info.tmds_chip_name = NON_TMDS_TRANSMITTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	viaparinfo->chip_info->tmds_chip_info.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static void tmds_register_write(int index, u8 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	viafb_i2c_writebyte(viaparinfo->chip_info->tmds_chip_info.i2c_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 			    viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 			    index, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static int tmds_register_read(int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	viafb_i2c_readbyte(viaparinfo->chip_info->tmds_chip_info.i2c_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 			   (u8) viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 			   (u8) index, &data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) static int tmds_register_read_bytes(int index, u8 *buff, int buff_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	viafb_i2c_readbytes(viaparinfo->chip_info->tmds_chip_info.i2c_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 			    (u8) viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 			    (u8) index, buff, buff_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* DVI Set Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) void viafb_dvi_set_mode(const struct fb_var_screeninfo *var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	u16 cxres, u16 cyres, int iga)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	struct fb_var_screeninfo dvi_var = *var;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	const struct fb_videomode *rb_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	int maxPixelClock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	maxPixelClock = viaparinfo->shared->tmds_setting_info.max_pixel_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	if (maxPixelClock && PICOS2KHZ(var->pixclock) / 1000 > maxPixelClock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		rb_mode = viafb_get_best_rb_mode(var->xres, var->yres, 60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 		if (rb_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 			viafb_fill_var_timing_info(&dvi_var, rb_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	viafb_fill_crtc_timing(&dvi_var, cxres, cyres, iga);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* Sense DVI Connector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) int viafb_dvi_sense(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	u8 RegSR1E = 0, RegSR3E = 0, RegCR6B = 0, RegCR91 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		RegCR93 = 0, RegCR9B = 0, data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	int ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	DEBUG_MSG(KERN_INFO "viafb_dvi_sense!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		/* DI1 Pad on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		RegSR1E = viafb_read_reg(VIASR, SR1E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		viafb_write_reg(SR1E, VIASR, RegSR1E | 0x30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		/* CR6B[0]VCK Input Selection: 1 = External clock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		RegCR6B = viafb_read_reg(VIACR, CR6B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		viafb_write_reg(CR6B, VIACR, RegCR6B | 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		/* CR91[4] VDD On [3] Data On [2] VEE On [1] Back Light Off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 		   [0] Software Control Power Sequence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		RegCR91 = viafb_read_reg(VIACR, CR91);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		viafb_write_reg(CR91, VIACR, 0x1D);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		/* CR93[7] DI1 Data Source Selection: 1 = DSP2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		   CR93[5] DI1 Clock Source: 1 = internal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		   CR93[4] DI1 Clock Polarity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		   CR93[3:1] DI1 Clock Adjust. CR93[0] DI1 enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		RegCR93 = viafb_read_reg(VIACR, CR93);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		viafb_write_reg(CR93, VIACR, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		/* DVP0/DVP1 Pad on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		RegSR1E = viafb_read_reg(VIASR, SR1E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		viafb_write_reg(SR1E, VIASR, RegSR1E | 0xF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		/* SR3E[1]Multi-function selection:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		   0 = Emulate I2C and DDC bus by GPIO2/3/4. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 		RegSR3E = viafb_read_reg(VIASR, SR3E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		viafb_write_reg(SR3E, VIASR, RegSR3E & (~0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		/* CR91[4] VDD On [3] Data On [2] VEE On [1] Back Light Off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		   [0] Software Control Power Sequence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 		RegCR91 = viafb_read_reg(VIACR, CR91);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		viafb_write_reg(CR91, VIACR, 0x1D);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		/*CR9B[4] DVP1 Data Source Selection: 1 = From secondary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		display.CR9B[2:0] DVP1 Clock Adjust */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		RegCR9B = viafb_read_reg(VIACR, CR9B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		viafb_write_reg(CR9B, VIACR, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	data = (u8) tmds_register_read(0x09);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	if (data & 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	if (ret == false) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		if (viafb_dvi_query_EDID())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 			ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	/* Restore status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	viafb_write_reg(SR1E, VIASR, RegSR1E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	viafb_write_reg(CR91, VIACR, RegCR91);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		viafb_write_reg(CR6B, VIACR, RegCR6B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 		viafb_write_reg(CR93, VIACR, RegCR93);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		viafb_write_reg(SR3E, VIASR, RegSR3E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		viafb_write_reg(CR9B, VIACR, RegCR9B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /* Query Flat Panel's EDID Table Version Through DVI Connector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static int viafb_dvi_query_EDID(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	u8 data0, data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	int restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	DEBUG_MSG(KERN_INFO "viafb_dvi_query_EDID!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	data0 = (u8) tmds_register_read(0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	data1 = (u8) tmds_register_read(0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	if ((data0 == 0) && (data1 == 0xFF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 			tmds_chip_info.tmds_chip_slave_addr = restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 		return EDID_VERSION_1;	/* Found EDID1 Table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /* Get Panel Size Using EDID1 Table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static void dvi_get_panel_size_from_DDCv1(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	struct tmds_chip_information *tmds_chip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	struct tmds_setting_information *tmds_setting)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	int i, restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	unsigned char EDID_DATA[18];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv1 \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	restore = tmds_chip->tmds_chip_slave_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	tmds_chip->tmds_chip_slave_addr = 0xA0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	for (i = 0x25; i < 0x6D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 		switch (i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 		case 0x36:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 		case 0x48:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 		case 0x5A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 		case 0x6C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 			tmds_register_read_bytes(i, EDID_DATA, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 			if (!(EDID_DATA[0] || EDID_DATA[1])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 				/* The first two byte must be zero. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 				if (EDID_DATA[3] == 0xFD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 					/* To get max pixel clock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 					tmds_setting->max_pixel_clock =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 						EDID_DATA[9] * 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	DEBUG_MSG(KERN_INFO "DVI max pixelclock = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		tmds_setting->max_pixel_clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	tmds_chip->tmds_chip_slave_addr = restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /* If Disable DVI, turn off pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) void viafb_dvi_disable(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	if (viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 		tmds_chip_info.output_interface == INTERFACE_TMDS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 		/* Turn off TMDS power. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 		viafb_write_reg(CRD2, VIACR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 		viafb_read_reg(VIACR, CRD2) | 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) static void dvi_patch_skew_dvp0(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	/* Reset data driving first: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	viafb_write_reg_mask(SR1B, VIASR, 0, BIT1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	viafb_write_reg_mask(SR2A, VIASR, 0, BIT4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	switch (viaparinfo->chip_info->gfx_chip_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	case UNICHROME_P4M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 			if ((viaparinfo->tmds_setting_info->h_active == 1600) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 				(viaparinfo->tmds_setting_info->v_active ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 				1200))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 				viafb_write_reg_mask(CR96, VIACR, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 					       BIT0 + BIT1 + BIT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 				viafb_write_reg_mask(CR96, VIACR, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 					       BIT0 + BIT1 + BIT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	case UNICHROME_P4M900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 			viafb_write_reg_mask(CR96, VIACR, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 				       BIT0 + BIT1 + BIT2 + BIT3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 			viafb_write_reg_mask(SR1B, VIASR, 0x02, BIT1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 			viafb_write_reg_mask(SR2A, VIASR, 0x10, BIT4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) static void dvi_patch_skew_dvp_low(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	switch (viaparinfo->chip_info->gfx_chip_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	case UNICHROME_K8M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 			viafb_write_reg_mask(CR99, VIACR, 0x03, BIT0 + BIT1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	case UNICHROME_P4M900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 			viafb_write_reg_mask(CR99, VIACR, 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 				       BIT0 + BIT1 + BIT2 + BIT3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	case UNICHROME_P4M890:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 			viafb_write_reg_mask(CR99, VIACR, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 				       BIT0 + BIT1 + BIT2 + BIT3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) /* If Enable DVI, turn off pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) void viafb_dvi_enable(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	switch (viaparinfo->chip_info->tmds_chip_info.output_interface) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	case INTERFACE_DVP0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 		viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 + BIT5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 		dvi_patch_skew_dvp0();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 			tmds_register_write(0x88, 0x3b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 			/*clear CR91[5] to direct on display period
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 			   in the secondary diplay path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 			via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	case INTERFACE_DVP1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 			viafb_write_reg_mask(CR93, VIACR, 0x21, BIT0 + BIT5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 		/*fix dvi cann't be enabled with MB VT5718C4 - Al Zhang */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 			tmds_register_write(0x88, 0x3b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 			/*clear CR91[5] to direct on display period
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 			  in the secondary diplay path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 			via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 		/*fix DVI cannot enable on EPIA-M board */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 		if (viafb_platform_epia_dvi == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 			viafb_write_reg_mask(CR91, VIACR, 0x1f, 0x1f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 			viafb_write_reg_mask(CR88, VIACR, 0x00, BIT6 + BIT0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 			if (viafb_bus_width == 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 				if (viafb_device_lcd_dualedge == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 					data = 0x3F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 					data = 0x37;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 				viafb_i2c_writebyte(viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 					tmds_chip_info.i2c_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 					viaparinfo->chip_info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 					tmds_chip_info.tmds_chip_slave_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 					0x08, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	case INTERFACE_DFP_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 		if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 			via_write_reg_mask(VIACR, CR97, 0x03, 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	case INTERFACE_DFP_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 		dvi_patch_skew_dvp_low();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 		via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	case INTERFACE_TMDS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 		/* Turn on Display period in the panel path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 		viafb_write_reg_mask(CR91, VIACR, 0, BIT7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 		/* Turn on TMDS power. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 		viafb_write_reg_mask(CRD2, VIACR, 0, BIT3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	if (viaparinfo->tmds_setting_info->iga_path == IGA2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 		/* Disable LCD Scaling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 		viafb_write_reg_mask(CR79, VIACR, 0x00, BIT0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }