1ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan/*
2ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
3ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
4ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
5ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * This program is free software; you can redistribute it and/or
6ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * modify it under the terms of the GNU General Public
7ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * License as published by the Free Software Foundation;
8ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * either version 2, or (at your option) any later version.
9ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
10ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * This program is distributed in the hope that it will be useful,
11ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
12ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * the implied warranty of MERCHANTABILITY or FITNESS FOR
13ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * A PARTICULAR PURPOSE.See the GNU General Public License
14ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * for more details.
15ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
16ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * You should have received a copy of the GNU General Public License
17ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * along with this program; if not, write to the Free Software
18ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * Foundation, Inc.,
19ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan */
21ec66841e495b9ab4f92bdf91efe8cf56e1471fbdJonathan Corbet#include <linux/via-core.h>
22ec66841e495b9ab4f92bdf91efe8cf56e1471fbdJonathan Corbet#include <linux/via_i2c.h>
23ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan#include "global.h"
24ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
25dd73d6868b9ecb4841def0c6ff0a25da27db33baFlorian Tobias Schandinat#define viafb_compact_res(x, y) (((x)<<16)|(y))
26dd73d6868b9ecb4841def0c6ff0a25da27db33baFlorian Tobias Schandinat
2791336712ce579dd8e83bc07bf0a45b7c6963eed2Florian Tobias Schandinat/* CLE266 Software Power Sequence */
2891336712ce579dd8e83bc07bf0a45b7c6963eed2Florian Tobias Schandinat/* {Mask}, {Data}, {Delay} */
2923e5abd5555b86fd56af6383e7a832b0cf2a2d95Stephen Hemmingerstatic const int PowerSequenceOn[3][3] = {
3023e5abd5555b86fd56af6383e7a832b0cf2a2d95Stephen Hemminger	{0x10, 0x08, 0x06}, {0x10, 0x08, 0x06},	{0x19, 0x1FE, 0x01}
3123e5abd5555b86fd56af6383e7a832b0cf2a2d95Stephen Hemminger};
3223e5abd5555b86fd56af6383e7a832b0cf2a2d95Stephen Hemmingerstatic const int PowerSequenceOff[3][3] = {
3323e5abd5555b86fd56af6383e7a832b0cf2a2d95Stephen Hemminger	{0x06, 0x08, 0x10}, {0x00, 0x00, 0x00},	{0xD2, 0x19, 0x01}
3423e5abd5555b86fd56af6383e7a832b0cf2a2d95Stephen Hemminger};
3591336712ce579dd8e83bc07bf0a45b7c6963eed2Florian Tobias Schandinat
36ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic struct _lcd_scaling_factor lcd_scaling_factor = {
37ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* LCD Horizontal Scaling Factor Register */
38ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	{LCD_HOR_SCALING_FACTOR_REG_NUM,
39ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	 {{CR9F, 0, 1}, {CR77, 0, 7}, {CR79, 4, 5} } },
40ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* LCD Vertical Scaling Factor Register */
41ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	{LCD_VER_SCALING_FACTOR_REG_NUM,
42ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	 {{CR79, 3, 3}, {CR78, 0, 7}, {CR79, 6, 7} } }
43ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan};
44ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic struct _lcd_scaling_factor lcd_scaling_factor_CLE = {
45ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* LCD Horizontal Scaling Factor Register */
46ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	{LCD_HOR_SCALING_FACTOR_REG_NUM_CLE, {{CR77, 0, 7}, {CR79, 4, 5} } },
47ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* LCD Vertical Scaling Factor Register */
48ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	{LCD_VER_SCALING_FACTOR_REG_NUM_CLE, {{CR78, 0, 7}, {CR79, 6, 7} } }
49ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan};
50ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
51ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic bool lvds_identify_integratedlvds(void);
52f4ab2f7a21338ae0f59ad925c23545e790cd51e3Florian Tobias Schandinatstatic void __devinit fp_id_to_vindex(int panel_id);
53ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic int lvds_register_read(int index);
54ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
55ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		      int panel_vres);
56ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_patch_skew_dvp0(struct lvds_setting_information
57ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 *plvds_setting_info,
58ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 struct lvds_chip_information *plvds_chip_info);
59ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_patch_skew_dvp1(struct lvds_setting_information
60ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 *plvds_setting_info,
61ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 struct lvds_chip_information *plvds_chip_info);
62ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_patch_skew(struct lvds_setting_information
63ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	*plvds_setting_info, struct lvds_chip_information *plvds_chip_info);
64ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
65ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void integrated_lvds_disable(struct lvds_setting_information
66ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			     *plvds_setting_info,
67ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			     struct lvds_chip_information *plvds_chip_info);
68ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void integrated_lvds_enable(struct lvds_setting_information
69ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    *plvds_setting_info,
70ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    struct lvds_chip_information *plvds_chip_info);
71ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_powersequence_off(void);
72ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_powersequence_on(void);
73ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void fill_lcd_format(void);
74ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void check_diport_of_integrated_lvds(
75ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	struct lvds_chip_information *plvds_chip_info,
76ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				     struct lvds_setting_information
77ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				     *plvds_setting_info);
78ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
79cd00b1154d3c7d711e83c3c17b831aafe6377532Florian Tobias Schandinatstatic inline bool check_lvds_chip(int device_id_subaddr, int device_id)
80ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
81cd00b1154d3c7d711e83c3c17b831aafe6377532Florian Tobias Schandinat	return lvds_register_read(device_id_subaddr) == device_id;
82ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
83ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
84f4ab2f7a21338ae0f59ad925c23545e790cd51e3Florian Tobias Schandinatvoid __devinit viafb_init_lcd_size(void)
85ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
86ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "viafb_init_lcd_size()\n");
87ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
88cc3fd679a344468e892a109b8de3e2948ce14e0fFlorian Tobias Schandinat	fp_id_to_vindex(viafb_lcd_panel_id);
89ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->lvds_setting_info2->lcd_panel_hres =
90ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres;
91ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->lvds_setting_info2->lcd_panel_vres =
92ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres;
93ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->lvds_setting_info2->device_lcd_dualedge =
94ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	    viaparinfo->lvds_setting_info->device_lcd_dualedge;
95ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->lvds_setting_info2->LCDDithering =
96ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering;
97ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
98ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
99ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic bool lvds_identify_integratedlvds(void)
100ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
101ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viafb_display_hardware_layout == HW_LAYOUT_LCD_EXTERNAL_LCD2) {
102ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Two dual channel LCD (Internal LVDS + External LVDS): */
103ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* If we have an external LVDS, such as VT1636, we should
104ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		   have its chip ID already. */
105ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
106ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name =
107ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    INTEGRATED_LVDS;
1082c0e0c88422033c9b6162bf7875aecdd095130b7Joe Perches			DEBUG_MSG(KERN_INFO "Support two dual channel LVDS! "
1092c0e0c88422033c9b6162bf7875aecdd095130b7Joe Perches				  "(Internal LVDS + External LVDS)\n");
110ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		} else {
111ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
112ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    INTEGRATED_LVDS;
1132c0e0c88422033c9b6162bf7875aecdd095130b7Joe Perches			DEBUG_MSG(KERN_INFO "Not found external LVDS, "
1142c0e0c88422033c9b6162bf7875aecdd095130b7Joe Perches				  "so can't support two dual channel LVDS!\n");
115ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
116ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else if (viafb_display_hardware_layout == HW_LAYOUT_LCD1_LCD2) {
117ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Two single channel LCD (Internal LVDS + Internal LVDS): */
118ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
119ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		INTEGRATED_LVDS;
120ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name =
121ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			INTEGRATED_LVDS;
1222c0e0c88422033c9b6162bf7875aecdd095130b7Joe Perches		DEBUG_MSG(KERN_INFO "Support two single channel LVDS! "
1232c0e0c88422033c9b6162bf7875aecdd095130b7Joe Perches			  "(Internal LVDS + Internal LVDS)\n");
124ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else if (viafb_display_hardware_layout != HW_LAYOUT_DVI_ONLY) {
125ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* If we have found external LVDS, just use it,
126ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		   otherwise, we will use internal LVDS as default. */
127ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (!viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
128ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
129ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    INTEGRATED_LVDS;
130ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			DEBUG_MSG(KERN_INFO "Found Integrated LVDS!\n");
131ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
132ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
133ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
134ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			NON_LVDS_TRANSMITTER;
135ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO "Do not support LVDS!\n");
136ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		return false;
137ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
138ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
139ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	return true;
140ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
141ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
142cd00b1154d3c7d711e83c3c17b831aafe6377532Florian Tobias Schandinatbool __devinit viafb_lvds_trasmitter_identify(void)
143ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
144f045f77bc0bf238a871b10bea9e425329a8e4abcJonathan Corbet	if (viafb_lvds_identify_vt1636(VIA_PORT_31)) {
145f045f77bc0bf238a871b10bea9e425329a8e4abcJonathan Corbet		viaparinfo->chip_info->lvds_chip_info.i2c_port = VIA_PORT_31;
146ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO
147277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte			  "Found VIA VT1636 LVDS on port i2c 0x31\n");
148ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
149f045f77bc0bf238a871b10bea9e425329a8e4abcJonathan Corbet		if (viafb_lvds_identify_vt1636(VIA_PORT_2C)) {
150ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info.i2c_port =
151f045f77bc0bf238a871b10bea9e425329a8e4abcJonathan Corbet				VIA_PORT_2C;
152ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			DEBUG_MSG(KERN_INFO
153277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte				  "Found VIA VT1636 LVDS on port gpio 0x2c\n");
154ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
155ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
156ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
157ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700)
158ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		lvds_identify_integratedlvds();
159ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
160ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name)
161ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		return true;
162ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Check for VT1631: */
163ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->chip_info->lvds_chip_info.lvds_chip_name = VT1631_LVDS;
164ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr =
165ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		VT1631_LVDS_I2C_ADDR;
166ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
167cd00b1154d3c7d711e83c3c17b831aafe6377532Florian Tobias Schandinat	if (check_lvds_chip(VT1631_DEVICE_ID_REG, VT1631_DEVICE_ID)) {
168ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO "\n VT1631 LVDS ! \n");
169ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO "\n %2d",
170ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			  viaparinfo->chip_info->lvds_chip_info.lvds_chip_name);
171ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO "\n %2d",
172ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			  viaparinfo->chip_info->lvds_chip_info.lvds_chip_name);
173cd00b1154d3c7d711e83c3c17b831aafe6377532Florian Tobias Schandinat		return true;
174ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
175ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
176ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
177ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		NON_LVDS_TRANSMITTER;
178ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr =
179ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		VT1631_LVDS_I2C_ADDR;
180cd00b1154d3c7d711e83c3c17b831aafe6377532Florian Tobias Schandinat	return false;
181ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
182ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
183f4ab2f7a21338ae0f59ad925c23545e790cd51e3Florian Tobias Schandinatstatic void __devinit fp_id_to_vindex(int panel_id)
184ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
185ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "fp_get_panel_id()\n");
186ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
187ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (panel_id > LCD_PANEL_ID_MAXIMUM)
188ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_lcd_panel_id = panel_id =
189ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_read_reg(VIACR, CR3F) & 0x0F;
190ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
191ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	switch (panel_id) {
192ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x0:
193ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 640;
194ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 480;
195ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
196ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
197ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
198ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x1:
199ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
200ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
201ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
202ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
203ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
204ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x2:
205ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
206ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
207ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
208ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
209ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
210ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x3:
211ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
212ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
213ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
214ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
215ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
216ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x4:
217ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
218ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 1024;
219ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
220ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
221ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
222ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x5:
223ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
224ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 1050;
225ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
226ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
227ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
228ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x6:
229ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
230ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 1200;
231ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
232ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
233ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
234ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x8:
235ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
236ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 480;
237ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
238ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
239ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
240ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x9:
241ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
242ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
243ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
244ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
245ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
246ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0xA:
247ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
248ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
249ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
250ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
251ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
252ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0xB:
253ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
254ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
255ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
256ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
257ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
258ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0xC:
259ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
260ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
261ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
262ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
263ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
264ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0xD:
265ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
266ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 1024;
267ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
268ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
269ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
270ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0xE:
271ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
272ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 1050;
273ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
274ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
275ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
276ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0xF:
277ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
278ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 1200;
279ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
280ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
281ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
282ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x10:
283ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1366;
284ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
285ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
286ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
287ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
288ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x11:
289ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
290ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
291ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
292ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
293ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
294ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x12:
295ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
296ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
297ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
298ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
299ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
300ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x13:
301ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
302ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 800;
303ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
304ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
305ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
306ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x14:
307ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1360;
308ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
309ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
310ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
311ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
312ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x15:
313ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
314ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
315ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
316ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 0;
317ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
318ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case 0x16:
319ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 480;
320ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 640;
321ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
322ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
323ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
324c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball	case 0x17:
325c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball		/* OLPC XO-1.5 panel */
326c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball		viaparinfo->lvds_setting_info->lcd_panel_hres = 1200;
327c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball		viaparinfo->lvds_setting_info->lcd_panel_vres = 900;
328c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
329c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball		viaparinfo->lvds_setting_info->LCDDithering = 0;
330c205d932530719d2a6ddb9152650e5bbe80c9400Chris Ball		break;
331ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	default:
332ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
333ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
334ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
335ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viaparinfo->lvds_setting_info->LCDDithering = 1;
336ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
337ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
338ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
339ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic int lvds_register_read(int index)
340ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
341ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	u8 data;
342ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
343f045f77bc0bf238a871b10bea9e425329a8e4abcJonathan Corbet	viafb_i2c_readbyte(VIA_PORT_2C,
344277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte			(u8) viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr,
345ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			(u8) index, &data);
346ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	return data;
347ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
348ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
349ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
350ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		      int panel_vres)
351ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
352ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	int reg_value = 0;
353ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	int viafb_load_reg_num;
354ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	struct io_register *reg = NULL;
355ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
356ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "load_lcd_scaling()!!\n");
357ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
358ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* LCD Scaling Enable */
359ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR79, VIACR, 0x07, BIT0 + BIT1 + BIT2);
360ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
361ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Check if expansion for horizontal */
362119b953a80d28821a56567d84dab860b0edc7940Florian Tobias Schandinat	if (set_hres < panel_hres) {
363ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Load Horizontal Scaling Factor */
364ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		switch (viaparinfo->chip_info->gfx_chip_name) {
365ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CLE266:
366ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K400:
367ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg_value =
368ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    CLE266_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);
369ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg_num =
370ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    lcd_scaling_factor_CLE.lcd_hor_scaling_factor.
371ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    reg_num;
372ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg = lcd_scaling_factor_CLE.lcd_hor_scaling_factor.reg;
373ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg(reg_value,
374ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_load_reg_num, reg, VIACR);
375ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
376ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K800:
377ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_PM800:
378ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CN700:
379ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CX700:
380ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K8M890:
381ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_P4M890:
3824a73d70ebe890fb71dcdd1cfcb788e1432ed0034Florian Tobias Schandinat		case UNICHROME_P4M900:
383f1ad752a096aca76f93cd7f86815af8093366fdcFlorian Tobias Schandinat		case UNICHROME_CN750:
384f1ad752a096aca76f93cd7f86815af8093366fdcFlorian Tobias Schandinat		case UNICHROME_VX800:
385f1ad752a096aca76f93cd7f86815af8093366fdcFlorian Tobias Schandinat		case UNICHROME_VX855:
38651f4332bb5fef869e8a89895a7bac6b4c03b4946Florian Tobias Schandinat		case UNICHROME_VX900:
387ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg_value =
388ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    K800_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);
389ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			/* Horizontal scaling enabled */
390ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRA2, VIACR, 0xC0, BIT7 + BIT6);
391ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg_num =
392ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    lcd_scaling_factor.lcd_hor_scaling_factor.reg_num;
393ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg = lcd_scaling_factor.lcd_hor_scaling_factor.reg;
394ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg(reg_value,
395ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_load_reg_num, reg, VIACR);
396ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
397ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
398ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
399ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO "Horizontal Scaling value = %d", reg_value);
400ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
401ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Horizontal scaling disabled */
402ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CRA2, VIACR, 0x00, BIT7);
403ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
404ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
405ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Check if expansion for vertical */
406119b953a80d28821a56567d84dab860b0edc7940Florian Tobias Schandinat	if (set_vres < panel_vres) {
407ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Load Vertical Scaling Factor */
408ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		switch (viaparinfo->chip_info->gfx_chip_name) {
409ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CLE266:
410ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K400:
411ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg_value =
412ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    CLE266_LCD_VER_SCF_FORMULA(set_vres, panel_vres);
413ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg_num =
414ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    lcd_scaling_factor_CLE.lcd_ver_scaling_factor.
415ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    reg_num;
416ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg = lcd_scaling_factor_CLE.lcd_ver_scaling_factor.reg;
417ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg(reg_value,
418ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_load_reg_num, reg, VIACR);
419ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
420ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K800:
421ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_PM800:
422ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CN700:
423ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CX700:
424ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K8M890:
425ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_P4M890:
4264a73d70ebe890fb71dcdd1cfcb788e1432ed0034Florian Tobias Schandinat		case UNICHROME_P4M900:
427f1ad752a096aca76f93cd7f86815af8093366fdcFlorian Tobias Schandinat		case UNICHROME_CN750:
428f1ad752a096aca76f93cd7f86815af8093366fdcFlorian Tobias Schandinat		case UNICHROME_VX800:
429f1ad752a096aca76f93cd7f86815af8093366fdcFlorian Tobias Schandinat		case UNICHROME_VX855:
43051f4332bb5fef869e8a89895a7bac6b4c03b4946Florian Tobias Schandinat		case UNICHROME_VX900:
431ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg_value =
432ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    K800_LCD_VER_SCF_FORMULA(set_vres, panel_vres);
433ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			/* Vertical scaling enabled */
434ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRA2, VIACR, 0x08, BIT3);
435ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg_num =
436ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    lcd_scaling_factor.lcd_ver_scaling_factor.reg_num;
437ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			reg = lcd_scaling_factor.lcd_ver_scaling_factor.reg;
438ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_load_reg(reg_value,
439ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_load_reg_num, reg, VIACR);
440ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
441ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
442ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
443ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		DEBUG_MSG(KERN_INFO "Vertical Scaling value = %d", reg_value);
444ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
445ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Vertical scaling disabled */
446ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CRA2, VIACR, 0x00, BIT3);
447ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
448ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
449ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
45091dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinatstatic void via_pitch_alignment_patch_lcd(int iga_path, int hres, int bpp)
451ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
452ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	unsigned char cr13, cr35, cr65, cr66, cr67;
453ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	unsigned long dwScreenPitch = 0;
454ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	unsigned long dwPitch;
455ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
45691dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat	dwPitch = hres * (bpp >> 3);
457ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (dwPitch & 0x1F) {
458ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		dwScreenPitch = ((dwPitch + 31) & ~31) >> 3;
45991dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat		if (iga_path == IGA2) {
46091dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat			if (bpp > 8) {
461ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				cr66 = (unsigned char)(dwScreenPitch & 0xFF);
462ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_write_reg(CR66, VIACR, cr66);
463ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				cr67 = viafb_read_reg(VIACR, CR67) & 0xFC;
464ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				cr67 |=
465ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				    (unsigned
466ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				     char)((dwScreenPitch & 0x300) >> 8);
467ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_write_reg(CR67, VIACR, cr67);
468ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			}
469ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
470ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			/* Fetch Count */
471ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			cr67 = viafb_read_reg(VIACR, CR67) & 0xF3;
472ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			cr67 |= (unsigned char)((dwScreenPitch & 0x600) >> 7);
473ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg(CR67, VIACR, cr67);
474ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			cr65 = (unsigned char)((dwScreenPitch >> 1) & 0xFF);
475ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			cr65 += 2;
476ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg(CR65, VIACR, cr65);
477ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		} else {
47891dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat			if (bpp > 8) {
479ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				cr13 = (unsigned char)(dwScreenPitch & 0xFF);
480ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_write_reg(CR13, VIACR, cr13);
481ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				cr35 = viafb_read_reg(VIACR, CR35) & 0x1F;
482ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				cr35 |=
483ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				    (unsigned
484ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				     char)((dwScreenPitch & 0x700) >> 3);
485ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				viafb_write_reg(CR35, VIACR, cr35);
486ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			}
487ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
488ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
489ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
490ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_patch_skew_dvp0(struct lvds_setting_information
491ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 *plvds_setting_info,
492ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 struct lvds_chip_information *plvds_chip_info)
493ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
494ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (VT1636_LVDS == plvds_chip_info->lvds_chip_name) {
495ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		switch (viaparinfo->chip_info->gfx_chip_name) {
496ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_P4M900:
497ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_vt1636_patch_skew_on_vt3364(plvds_setting_info,
498ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan						    plvds_chip_info);
499ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
500ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_P4M890:
501ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_vt1636_patch_skew_on_vt3327(plvds_setting_info,
502ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan						    plvds_chip_info);
503ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
504ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
505ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
506ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
507ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_patch_skew_dvp1(struct lvds_setting_information
508ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 *plvds_setting_info,
509ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			 struct lvds_chip_information *plvds_chip_info)
510ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
511ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (VT1636_LVDS == plvds_chip_info->lvds_chip_name) {
512ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		switch (viaparinfo->chip_info->gfx_chip_name) {
513ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CX700:
514ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_vt1636_patch_skew_on_vt3324(plvds_setting_info,
515ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan						    plvds_chip_info);
516ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
517ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
518ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
519ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
520ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_patch_skew(struct lvds_setting_information
521ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	*plvds_setting_info, struct lvds_chip_information *plvds_chip_info)
522ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
523ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "lcd_patch_skew\n");
524ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	switch (plvds_chip_info->output_interface) {
525ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_DVP0:
526ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		lcd_patch_skew_dvp0(plvds_setting_info, plvds_chip_info);
527ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
528ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_DVP1:
529ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		lcd_patch_skew_dvp1(plvds_setting_info, plvds_chip_info);
530ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
531ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_DFP_LOW:
532ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (UNICHROME_P4M900 == viaparinfo->chip_info->gfx_chip_name) {
533ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CR99, VIACR, 0x08,
534ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				       BIT0 + BIT1 + BIT2 + BIT3);
535ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
536ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
537ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
538ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
539ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
540ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan/* LCD Set Mode */
5414e5527c9d1f373cb7dda6eec3af1d7b9659cdf85Florian Tobias Schandinatvoid viafb_lcd_set_mode(const struct fb_var_screeninfo *var, u16 cxres,
5424e5527c9d1f373cb7dda6eec3af1d7b9659cdf85Florian Tobias Schandinat	u16 cyres, struct lvds_setting_information *plvds_setting_info,
543bfe7d5f9396d5f2607454fd9ff89397fa3ba9a32Florian Tobias Schandinat	struct lvds_chip_information *plvds_chip_info)
544ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
545ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	int set_iga = plvds_setting_info->iga_path;
54691dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat	int mode_bpp = var->bits_per_pixel;
5474e5527c9d1f373cb7dda6eec3af1d7b9659cdf85Florian Tobias Schandinat	int set_hres = cxres ? cxres : var->xres;
5484e5527c9d1f373cb7dda6eec3af1d7b9659cdf85Florian Tobias Schandinat	int set_vres = cyres ? cyres : var->yres;
549dd73d6868b9ecb4841def0c6ff0a25da27db33baFlorian Tobias Schandinat	int panel_hres = plvds_setting_info->lcd_panel_hres;
550dd73d6868b9ecb4841def0c6ff0a25da27db33baFlorian Tobias Schandinat	int panel_vres = plvds_setting_info->lcd_panel_vres;
5511606f87e98f83512762da6dbc992103ae690ff11Florian Tobias Schandinat	u32 clock;
5529864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat	struct display_timing timing;
5539864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat	struct fb_var_screeninfo panel_var;
5549864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat	const struct fb_videomode *mode_crt_table, *panel_crt_table;
555ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
556ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "viafb_lcd_set_mode!!\n");
557ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Get mode table */
558bfe7d5f9396d5f2607454fd9ff89397fa3ba9a32Florian Tobias Schandinat	mode_crt_table = viafb_get_best_mode(set_hres, set_vres, 60);
559ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Get panel table Pointer */
560bfe7d5f9396d5f2607454fd9ff89397fa3ba9a32Florian Tobias Schandinat	panel_crt_table = viafb_get_best_mode(panel_hres, panel_vres, 60);
5619864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat	viafb_fill_var_timing_info(&panel_var, panel_crt_table);
562ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "bellow viafb_lcd_set_mode!!\n");
563ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (VT1636_LVDS == plvds_chip_info->lvds_chip_name)
564ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_init_lvds_vt1636(plvds_setting_info, plvds_chip_info);
5659864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat	clock = PICOS2KHZ(panel_crt_table->pixclock) * 1000;
566fd3cc69848b7e1873e5f12bbcdd572b20277ecf3Florian Tobias Schandinat	plvds_setting_info->vclk = clock;
567f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat
568f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat	if (set_iga == IGA2 && (set_hres < panel_hres || set_vres < panel_vres)
569f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat		&& plvds_setting_info->display_method == LCD_EXPANDSION) {
5709864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat		timing = var_to_timing(&panel_var, panel_hres, panel_vres);
571f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat		load_lcd_scaling(set_hres, set_vres, panel_hres, panel_vres);
572ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
5739864ca20c50c2fcaba63767a336e16c88b46d7adFlorian Tobias Schandinat		timing = var_to_timing(&panel_var, set_hres, set_vres);
574f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat		if (set_iga == IGA2)
575f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat			/* disable scaling */
576f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat			via_write_reg_mask(VIACR, 0x79, 0x00,
577ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				BIT0 + BIT1 + BIT2);
578ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
579ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
580f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat	if (set_iga == IGA1)
581f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat		via_set_primary_timing(&timing);
582f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat	else if (set_iga == IGA2)
583f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat		via_set_secondary_timing(&timing);
584f18e3e0ce0dacca497e3f1547095b3f9b111b0f7Florian Tobias Schandinat
5854bbac05f8c0ab40dcc52ed6dff44e1b0d80fa6e3Florian Tobias Schandinat	/* Fetch count for IGA2 only */
5864bbac05f8c0ab40dcc52ed6dff44e1b0d80fa6e3Florian Tobias Schandinat	viafb_load_fetch_count_reg(set_hres, mode_bpp / 8, set_iga);
587ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
5884bbac05f8c0ab40dcc52ed6dff44e1b0d80fa6e3Florian Tobias Schandinat	if ((viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266)
5894bbac05f8c0ab40dcc52ed6dff44e1b0d80fa6e3Florian Tobias Schandinat		&& (viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400))
5904bbac05f8c0ab40dcc52ed6dff44e1b0d80fa6e3Florian Tobias Schandinat		viafb_load_FIFO_reg(set_iga, set_hres, set_vres);
591ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
592ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	fill_lcd_format();
5931606f87e98f83512762da6dbc992103ae690ff11Florian Tobias Schandinat	viafb_set_vclock(clock, set_iga);
594ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	lcd_patch_skew(plvds_setting_info, plvds_chip_info);
595ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
596ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* If K8M800, enable LCD Prefetch Mode. */
597ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800)
598ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	    || (UNICHROME_K8M890 == viaparinfo->chip_info->gfx_chip_name))
599ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR6A, VIACR, 0x01, BIT0);
600ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
601ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Patch for non 32bit alignment mode */
60291dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat	via_pitch_alignment_patch_lcd(plvds_setting_info->iga_path, set_hres,
60391dc1be8f698eb016343d534159a919678e3889cFlorian Tobias Schandinat		var->bits_per_pixel);
604ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
605ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
606ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void integrated_lvds_disable(struct lvds_setting_information
607ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			     *plvds_setting_info,
608ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			     struct lvds_chip_information *plvds_chip_info)
609ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
610ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	bool turn_off_first_powersequence = false;
611ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	bool turn_off_second_powersequence = false;
612ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (INTERFACE_LVDS0LVDS1 == plvds_chip_info->output_interface)
613ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		turn_off_first_powersequence = true;
614ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (INTERFACE_LVDS0 == plvds_chip_info->output_interface)
615ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		turn_off_first_powersequence = true;
616ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (INTERFACE_LVDS1 == plvds_chip_info->output_interface)
617ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		turn_off_second_powersequence = true;
618ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (turn_off_second_powersequence) {
619ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Use second power sequence control: */
620ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
621ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Turn off power sequence. */
622ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CRD4, VIACR, 0, BIT1);
623ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
624ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Turn off back light. */
625ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CRD3, VIACR, 0xC0, BIT6 + BIT7);
626ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
627ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (turn_off_first_powersequence) {
628ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Use first power sequence control: */
629ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
630ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Turn off power sequence. */
631ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR6A, VIACR, 0, BIT3);
632ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
633ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Turn off back light. */
634ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, 0xC0, BIT6 + BIT7);
635ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
636ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
637ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Power off LVDS channel. */
638ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	switch (plvds_chip_info->output_interface) {
639ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_LVDS0:
640ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
641ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRD2, VIACR, 0x80, BIT7);
642ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
643ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
644ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
645ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_LVDS1:
646ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
647ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRD2, VIACR, 0x40, BIT6);
648ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
649ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
650ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
651ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_LVDS0LVDS1:
652ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
653ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRD2, VIACR, 0xC0, BIT6 + BIT7);
654ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
655ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
656ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
657ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
658ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
659ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void integrated_lvds_enable(struct lvds_setting_information
660ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    *plvds_setting_info,
661ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    struct lvds_chip_information *plvds_chip_info)
662ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
663ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO "integrated_lvds_enable, out_interface:%d\n",
664ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		  plvds_chip_info->output_interface);
665ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (plvds_setting_info->lcd_mode == LCD_SPWG)
666ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CRD2, VIACR, 0x00, BIT0 + BIT1);
667e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte	else
668ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CRD2, VIACR, 0x03, BIT0 + BIT1);
669ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
670e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte	switch (plvds_chip_info->output_interface) {
671e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte	case INTERFACE_LVDS0LVDS1:
672e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte	case INTERFACE_LVDS0:
673ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Use first power sequence control: */
674ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Use hardware control power sequence. */
675ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, 0, BIT0);
676ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Turn on back light. */
677ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, 0, BIT6 + BIT7);
678ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Turn on hardware power sequence. */
679ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
680e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		break;
681e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte	case INTERFACE_LVDS1:
682e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		/* Use second power sequence control: */
683e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		/* Use hardware control power sequence. */
684e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		viafb_write_reg_mask(CRD3, VIACR, 0, BIT0);
685e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		/* Turn on back light. */
686e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		viafb_write_reg_mask(CRD3, VIACR, 0, BIT6 + BIT7);
687e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		/* Turn on hardware power sequence. */
688e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		viafb_write_reg_mask(CRD4, VIACR, 0x02, BIT1);
689e6bf0d2c9a7f1b9b0ac77698017f8f06f9cc0317Harald Welte		break;
690ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
691ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
692ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Power on LVDS channel. */
693ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	switch (plvds_chip_info->output_interface) {
694ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_LVDS0:
695ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
696ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRD2, VIACR, 0, BIT7);
697ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
698ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
699ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
700ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_LVDS1:
701ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
702ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRD2, VIACR, 0, BIT6);
703ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
704ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
705ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
706ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTERFACE_LVDS0LVDS1:
707ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
708ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_write_reg_mask(CRD2, VIACR, 0, BIT6 + BIT7);
709ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
710ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
711ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
712ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
713ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
714ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanvoid viafb_lcd_disable(void)
715ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
716ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
717ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
718ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		lcd_powersequence_off();
719ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* DI1 pad off */
720ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(SR1E, VIASR, 0x00, 0x30);
721ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
722ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (viafb_LCD2_ON
723ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		    && (INTEGRATED_LVDS ==
724ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name))
725ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			integrated_lvds_disable(viaparinfo->lvds_setting_info,
726ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				&viaparinfo->chip_info->lvds_chip_info2);
727ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (INTEGRATED_LVDS ==
728ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info.lvds_chip_name)
729ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			integrated_lvds_disable(viaparinfo->lvds_setting_info,
730ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				&viaparinfo->chip_info->lvds_chip_info);
731ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (VT1636_LVDS == viaparinfo->chip_info->
732ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			lvds_chip_info.lvds_chip_name)
733ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_disable_lvds_vt1636(viaparinfo->lvds_setting_info,
734ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				&viaparinfo->chip_info->lvds_chip_info);
735ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else if (VT1636_LVDS ==
736ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
737ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_disable_lvds_vt1636(viaparinfo->lvds_setting_info,
738ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				    &viaparinfo->chip_info->lvds_chip_info);
739ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
740ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Backlight off           */
741ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(SR3D, VIASR, 0x00, 0x20);
742ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* 24 bit DI data paht off */
743ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, 0x80, 0x80);
744ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
745ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
746ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Disable expansion bit   */
747ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR79, VIACR, 0x00, 0x01);
748ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Simultaneout disabled   */
749ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR6B, VIACR, 0x00, 0x08);
750ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
751ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
752cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinatstatic void set_lcd_output_path(int set_iga, int output_interface)
753cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat{
754cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	switch (output_interface) {
755cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	case INTERFACE_DFP:
756cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		if ((UNICHROME_K8M890 == viaparinfo->chip_info->gfx_chip_name)
757cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		    || (UNICHROME_P4M890 ==
758cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		    viaparinfo->chip_info->gfx_chip_name))
759cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat			viafb_write_reg_mask(CR97, VIACR, 0x84,
760cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat				       BIT7 + BIT2 + BIT1 + BIT0);
761cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	case INTERFACE_DVP0:
762cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	case INTERFACE_DVP1:
763cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	case INTERFACE_DFP_HIGH:
764cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	case INTERFACE_DFP_LOW:
765cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		if (set_iga == IGA2)
766cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat			viafb_write_reg(CR91, VIACR, 0x00);
767cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		break;
768cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	}
769cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat}
770cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat
771ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanvoid viafb_lcd_enable(void)
772ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
773cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3);
774cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
775cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	set_lcd_output_path(viaparinfo->lvds_setting_info->iga_path,
776cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		viaparinfo->chip_info->lvds_chip_info.output_interface);
777cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat	if (viafb_LCD2_ON)
778cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat		set_lcd_output_path(viaparinfo->lvds_setting_info2->iga_path,
779cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat			viaparinfo->chip_info->
780cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat			lvds_chip_info2.output_interface);
781cd7e9103e983ff0f518ac0e85cee265027ccbfa4Florian Tobias Schandinat
782ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
783ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* DI1 pad on */
784ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(SR1E, VIASR, 0x30, 0x30);
785ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		lcd_powersequence_on();
786ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
787ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (viafb_LCD2_ON && (INTEGRATED_LVDS ==
788ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name))
789ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			integrated_lvds_enable(viaparinfo->lvds_setting_info2, \
790ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				&viaparinfo->chip_info->lvds_chip_info2);
791ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (INTEGRATED_LVDS ==
792ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viaparinfo->chip_info->lvds_chip_info.lvds_chip_name)
793ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			integrated_lvds_enable(viaparinfo->lvds_setting_info,
794ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				&viaparinfo->chip_info->lvds_chip_info);
795ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (VT1636_LVDS == viaparinfo->chip_info->
796ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			lvds_chip_info.lvds_chip_name)
797ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			viafb_enable_lvds_vt1636(viaparinfo->
798ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			lvds_setting_info, &viaparinfo->chip_info->
799ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			lvds_chip_info);
800ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else if (VT1636_LVDS ==
801ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
802ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_enable_lvds_vt1636(viaparinfo->lvds_setting_info,
803ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				   &viaparinfo->chip_info->lvds_chip_info);
804ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
805ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Backlight on            */
806ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(SR3D, VIASR, 0x20, 0x20);
807ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* 24 bit DI data paht on  */
808ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, 0x00, 0x80);
809ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* LCD enabled             */
810ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR6A, VIACR, 0x48, 0x48);
811ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
812ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
813ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
814ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_powersequence_off(void)
815ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
816ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	int i, mask, data;
817ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
818ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Software control power sequence */
819ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR91, VIACR, 0x11, 0x11);
820ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
821ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	for (i = 0; i < 3; i++) {
822ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		mask = PowerSequenceOff[0][i];
823ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		data = PowerSequenceOff[1][i] & mask;
824ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, (u8) data, (u8) mask);
825ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		udelay(PowerSequenceOff[2][i]);
826ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
827ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
828ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Disable LCD */
829ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR6A, VIACR, 0x00, 0x08);
830ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
831ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
832ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void lcd_powersequence_on(void)
833ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
834ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	int i, mask, data;
835ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
836ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Software control power sequence */
837ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR91, VIACR, 0x11, 0x11);
838ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
839ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Enable LCD */
840ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR6A, VIACR, 0x08, 0x08);
841ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
842ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	for (i = 0; i < 3; i++) {
843ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		mask = PowerSequenceOn[0][i];
844ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		data = PowerSequenceOn[1][i] & mask;
845ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		viafb_write_reg_mask(CR91, VIACR, (u8) data, (u8) mask);
846ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		udelay(PowerSequenceOn[2][i]);
847ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
848ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
849ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	udelay(1);
850ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
851ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
852ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void fill_lcd_format(void)
853ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
854ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	u8 bdithering = 0, bdual = 0;
855ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
856ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viaparinfo->lvds_setting_info->device_lcd_dualedge)
857ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		bdual = BIT4;
858ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (viaparinfo->lvds_setting_info->LCDDithering)
859ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		bdithering = BIT0;
860ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Dual & Dithering */
861ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	viafb_write_reg_mask(CR88, VIACR, (bdithering | bdual), BIT4 + BIT0);
862ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
863ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
864ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanstatic void check_diport_of_integrated_lvds(
865ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	struct lvds_chip_information *plvds_chip_info,
866ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				     struct lvds_setting_information
867ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				     *plvds_setting_info)
868ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
869ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Determine LCD DI Port by hardware layout. */
870ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	switch (viafb_display_hardware_layout) {
871ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case HW_LAYOUT_LCD_ONLY:
872ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
873ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			if (plvds_setting_info->device_lcd_dualedge) {
874ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				plvds_chip_info->output_interface =
875ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				    INTERFACE_LVDS0LVDS1;
876ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			} else {
877ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				plvds_chip_info->output_interface =
878ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				    INTERFACE_LVDS0;
879ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			}
880ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
881ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
882ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
883ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
884ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case HW_LAYOUT_DVI_ONLY:
885ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
886ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_NONE;
887ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
888ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
889ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
890ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case HW_LAYOUT_LCD1_LCD2:
891ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case HW_LAYOUT_LCD_EXTERNAL_LCD2:
892ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
893ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface =
894ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			    INTERFACE_LVDS0LVDS1;
895ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
896ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
897ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
898ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case HW_LAYOUT_LCD_DVI:
899ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
900ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_LVDS1;
901ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
902ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
903ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
904ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	default:
905ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		{
906ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_LVDS1;
907ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
908ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
909ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
910ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
911ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	DEBUG_MSG(KERN_INFO
912ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		  "Display Hardware Layout: 0x%x, LCD DI Port: 0x%x\n",
913ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		  viafb_display_hardware_layout,
914ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		  plvds_chip_info->output_interface);
915ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
916ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
917f4ab2f7a21338ae0f59ad925c23545e790cd51e3Florian Tobias Schandinatvoid __devinit viafb_init_lvds_output_interface(struct lvds_chip_information
918ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				*plvds_chip_info,
919ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				struct lvds_setting_information
920ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan				*plvds_setting_info)
921ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
922ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (INTERFACE_NONE != plvds_chip_info->output_interface) {
923ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/*Do nothing, lcd port is specified by module parameter */
924ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		return;
925ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
926ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
927ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	switch (plvds_chip_info->lvds_chip_name) {
928ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
929ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case VT1636_LVDS:
930ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		switch (viaparinfo->chip_info->gfx_chip_name) {
931ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CX700:
932ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_DVP1;
933ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
934ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_CN700:
935ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_DFP_LOW;
936ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
937ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		default:
938ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_DVP0;
939ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
940ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
941ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
942ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
943ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	case INTEGRATED_LVDS:
944ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		check_diport_of_integrated_lvds(plvds_chip_info,
945ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan						plvds_setting_info);
946ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
947ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
948ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	default:
949ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		switch (viaparinfo->chip_info->gfx_chip_name) {
950ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_K8M890:
951ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_P4M900:
952ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		case UNICHROME_P4M890:
953ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_DFP_LOW;
954ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
955ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		default:
956ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			plvds_chip_info->output_interface = INTERFACE_DFP;
957ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			break;
958ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		}
959ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		break;
960ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
961ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
962ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
963ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chanbool viafb_lcd_get_mobile_state(bool *mobile)
964ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan{
965b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger	unsigned char __iomem *romptr, *tableptr, *biosptr;
966ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	u8 core_base;
967ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Rom address */
968b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger	const u32 romaddr = 0x000C0000;
969b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger	u16 start_pattern;
970ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
971ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	biosptr = ioremap(romaddr, 0x10000);
972b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger	start_pattern = readw(biosptr);
973ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
974ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	/* Compare pattern */
975ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	if (start_pattern == 0xAA55) {
976ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Get the start of Table */
977ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* 0x1B means BIOS offset position */
978ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		romptr = biosptr + 0x1B;
979b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger		tableptr = biosptr + readw(romptr);
980ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
981ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* Get the start of biosver structure */
982ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* 18 means BIOS version position. */
983ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		romptr = tableptr + 18;
984b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger		romptr = biosptr + readw(romptr);
985ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
986ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* The offset should be 44, but the
987ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		   actual image is less three char. */
988ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* pRom += 44; */
989ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		romptr += 41;
990ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
991b65d6040e3a7cd75d9287f7ddfd115e85fde4b44Stephen Hemminger		core_base = readb(romptr);
992ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
993ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		if (core_base & 0x8)
994ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			*mobile = false;
995ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		else
996ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan			*mobile = true;
997ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		/* release memory */
998ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		iounmap(biosptr);
999ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan
1000ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		return true;
1001ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	} else {
1002ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		iounmap(biosptr);
1003ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan		return false;
1004ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan	}
1005ac6c97e20f1befecd791feed57170ec6735dcce7Joseph Chan}
1006