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