123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan/* 223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. 323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. 423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * This program is free software; you can redistribute it and/or 623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * modify it under the terms of the GNU General Public 723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * License as published by the Free Software Foundation; 823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * either version 2, or (at your option) any later version. 923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 1023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * This program is distributed in the hope that it will be useful, 1123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even 1223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * the implied warranty of MERCHANTABILITY or FITNESS FOR 1323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * A PARTICULAR PURPOSE.See the GNU General Public License 1423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * for more details. 1523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 1623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * You should have received a copy of the GNU General Public License 1723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * along with this program; if not, write to the Free Software 1823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * Foundation, Inc., 1923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 2023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan */ 2123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 22ec66841e495b9ab4f92bdf91efe8cf56e1471fbdJonathan Corbet#include <linux/via-core.h> 23ec66841e495b9ab4f92bdf91efe8cf56e1471fbdJonathan Corbet#include <linux/via_i2c.h> 2423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan#include "global.h" 2523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 26dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA common_init_data[] = { 27dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat/* Index, Mask, Value */ 28dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* Set panel power sequence timing */ 29dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x10, 0xC0, 0x00}, 30dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* T1: VDD on - Data on. Each increment is 1 ms. (50ms = 031h) */ 31dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x0B, 0xFF, 0x40}, 32dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* T2: Data on - Backlight on. Each increment is 2 ms. (210ms = 068h) */ 33dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x0C, 0xFF, 0x31}, 34dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* T3: Backlight off -Data off. Each increment is 2 ms. (210ms = 068h)*/ 35dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x0D, 0xFF, 0x31}, 36dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* T4: Data off - VDD off. Each increment is 1 ms. (50ms = 031h) */ 37dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x0E, 0xFF, 0x68}, 38dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* T5: VDD off - VDD on. Each increment is 100 ms. (500ms = 04h) */ 39dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x0F, 0xFF, 0x68}, 40dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* LVDS output power up */ 41dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x09, 0xA0, 0xA0}, 42dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat /* turn on back light */ 43dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat {0x10, 0x33, 0x13} 44dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat}; 45dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat 46dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat/* Index, Mask, Value */ 47dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA dual_channel_enable_data = {0x08, 0xF0, 0xE0}; 48dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA single_channel_enable_data = {0x08, 0xF0, 0x00}; 49dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA dithering_enable_data = {0x0A, 0x70, 0x50}; 50dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA dithering_disable_data = {0x0A, 0x70, 0x00}; 51dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA vdd_on_data = {0x10, 0x20, 0x20}; 52dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinatstatic const struct IODATA vdd_off_data = {0x10, 0x20, 0x00}; 53dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat 5423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanu8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information 5523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_setting_info, struct lvds_chip_information *plvds_chip_info, 5623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan u8 index) 5723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 5823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan u8 data; 5923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 60277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte viafb_i2c_readbyte(plvds_chip_info->i2c_port, 61277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte plvds_chip_info->lvds_chip_slave_addr, index, &data); 6223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return data; 6323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 6423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 6523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_gpio_i2c_write_mask_lvds(struct lvds_setting_information 6623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_setting_info, struct lvds_chip_information 6723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_chip_info, struct IODATA io_data) 6823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 6923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan int index, data; 7023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 7123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan index = io_data.Index; 7223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan data = viafb_gpio_i2c_read_lvds(plvds_setting_info, plvds_chip_info, 7323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan index); 7423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan data = (data & (~io_data.Mask)) | io_data.Data; 7523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 76277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte viafb_i2c_writebyte(plvds_chip_info->i2c_port, 77277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Welte plvds_chip_info->lvds_chip_slave_addr, index, data); 7823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 7923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 8023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_init_lvds_vt1636(struct lvds_setting_information 8123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_setting_info, struct lvds_chip_information *plvds_chip_info) 8223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 8323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan int reg_num, i; 8423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 8523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Common settings: */ 86dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat reg_num = ARRAY_SIZE(common_init_data); 87dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat for (i = 0; i < reg_num; i++) 8823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, 89dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat plvds_chip_info, common_init_data[i]); 9023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 9123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Input Data Mode Select */ 92dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat if (plvds_setting_info->device_lcd_dualedge) 9323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, 94dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat plvds_chip_info, dual_channel_enable_data); 95dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat else 9623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, 97dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat plvds_chip_info, single_channel_enable_data); 9823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 99dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat if (plvds_setting_info->LCDDithering) 10023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, 101dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat plvds_chip_info, dithering_enable_data); 102dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat else 10323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, 104dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat plvds_chip_info, dithering_disable_data); 10523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 10623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 10723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_enable_lvds_vt1636(struct lvds_setting_information 10823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_setting_info, 10923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_chip_information *plvds_chip_info) 11023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 11123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info, 112dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat vdd_on_data); 11323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 11423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 11523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_disable_lvds_vt1636(struct lvds_setting_information 11623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_setting_info, 11723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_chip_information *plvds_chip_info) 11823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 11923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info, 120dbc28098248197e6b58f33ca0685f694a8e03e60Florian Tobias Schandinat vdd_off_data); 12123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 12223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 123277d32a36cba0b42c9c6836ff07f9b978566e95cHarald Weltebool viafb_lvds_identify_vt1636(u8 i2c_adapter) 12423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 12523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan u8 Buffer[2]; 12623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 12723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan DEBUG_MSG(KERN_INFO "viafb_lvds_identify_vt1636.\n"); 12823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 12923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Sense VT1636 LVDS Transmiter */ 13023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr = 1316b841edf572ad757f11013326b796e126f05a719Jonathan Corbet VT1636_LVDS_I2C_ADDR; 13223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 13323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Check vendor ID first: */ 1346b841edf572ad757f11013326b796e126f05a719Jonathan Corbet if (viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 1356b841edf572ad757f11013326b796e126f05a719Jonathan Corbet 0x00, &Buffer[0])) 1366b841edf572ad757f11013326b796e126f05a719Jonathan Corbet return false; 1376b841edf572ad757f11013326b796e126f05a719Jonathan Corbet viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 0x01, &Buffer[1]); 13823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 13923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan if (!((Buffer[0] == 0x06) && (Buffer[1] == 0x11))) 14023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return false; 14123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 14223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Check Chip ID: */ 1436b841edf572ad757f11013326b796e126f05a719Jonathan Corbet viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 0x02, &Buffer[0]); 1446b841edf572ad757f11013326b796e126f05a719Jonathan Corbet viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 0x03, &Buffer[1]); 14523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan if ((Buffer[0] == 0x45) && (Buffer[1] == 0x33)) { 14623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viaparinfo->chip_info->lvds_chip_info.lvds_chip_name = 14723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan VT1636_LVDS; 14823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return true; 14923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan } 15023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 15123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return false; 15223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 15323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 15423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanstatic int get_clk_range_index(u32 Clk) 15523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 15623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan if (Clk < DPA_CLK_30M) 15723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return DPA_CLK_RANGE_30M; 15823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan else if (Clk < DPA_CLK_50M) 15923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return DPA_CLK_RANGE_30_50M; 16023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan else if (Clk < DPA_CLK_70M) 16123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return DPA_CLK_RANGE_50_70M; 16223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan else if (Clk < DPA_CLK_100M) 16323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return DPA_CLK_RANGE_70_100M; 16423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan else if (Clk < DPA_CLK_150M) 16523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return DPA_CLK_RANGE_100_150M; 16623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan else 16723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan return DPA_CLK_RANGE_150M; 16823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 16923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 17023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanstatic void set_dpa_vt1636(struct lvds_setting_information 17123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan *plvds_setting_info, struct lvds_chip_information *plvds_chip_info, 17223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct VT1636_DPA_SETTING *p_vt1636_dpa_setting) 17323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 17423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct IODATA io_data; 17523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 17623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data.Index = 0x09; 17723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data.Mask = 0x1F; 17823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data.Data = p_vt1636_dpa_setting->CLK_SEL_ST1; 17923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, 18023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan plvds_chip_info, io_data); 18123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 18223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data.Index = 0x08; 18323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data.Mask = 0x0F; 18423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data.Data = p_vt1636_dpa_setting->CLK_SEL_ST2; 18523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info, 18623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan io_data); 18723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 18823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 18923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_vt1636_patch_skew_on_vt3324( 19023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_setting_information *plvds_setting_info, 19123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_chip_information *plvds_chip_info) 19223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 193dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat struct VT1636_DPA_SETTING dpa = {0x00, 0x00}, dpa_16x12 = {0x0B, 0x03}, 194dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat *pdpa; 195dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat int index; 19623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 19723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan DEBUG_MSG(KERN_INFO "viafb_vt1636_patch_skew_on_vt3324.\n"); 19823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 19923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Graphics DPA settings: */ 20023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan index = get_clk_range_index(plvds_setting_info->vclk); 20123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_set_dpa_gfx(plvds_chip_info->output_interface, 20223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan &GFX_DPA_SETTING_TBL_VT3324[index]); 20323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 20423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* LVDS Transmitter DPA settings: */ 205dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat if (plvds_setting_info->lcd_panel_hres == 1600 && 206dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat plvds_setting_info->lcd_panel_vres == 1200) 207dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat pdpa = &dpa_16x12; 208dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat else 209dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat pdpa = &dpa; 210dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat 211dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat set_dpa_vt1636(plvds_setting_info, plvds_chip_info, pdpa); 21223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 21323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 21423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_vt1636_patch_skew_on_vt3327( 21523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_setting_information *plvds_setting_info, 21623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_chip_information *plvds_chip_info) 21723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 218dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat struct VT1636_DPA_SETTING dpa = {0x00, 0x00}; 219dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat int index; 22023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 22123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan DEBUG_MSG(KERN_INFO "viafb_vt1636_patch_skew_on_vt3327.\n"); 22223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 22323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Graphics DPA settings: */ 22423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan index = get_clk_range_index(plvds_setting_info->vclk); 22523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_set_dpa_gfx(plvds_chip_info->output_interface, 22623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan &GFX_DPA_SETTING_TBL_VT3327[index]); 22723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 22823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* LVDS Transmitter DPA settings: */ 229dbf85f2326dbb070256ff153853b00f70c27717aFlorian Tobias Schandinat set_dpa_vt1636(plvds_setting_info, plvds_chip_info, &dpa); 23023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 23123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 23223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chanvoid viafb_vt1636_patch_skew_on_vt3364( 23323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_setting_information *plvds_setting_info, 23423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan struct lvds_chip_information *plvds_chip_info) 23523966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan{ 23623966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan int index; 23723966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 23823966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan DEBUG_MSG(KERN_INFO "viafb_vt1636_patch_skew_on_vt3364.\n"); 23923966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan 24023966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan /* Graphics DPA settings: */ 24123966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan index = get_clk_range_index(plvds_setting_info->vclk); 24223966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan viafb_set_dpa_gfx(plvds_chip_info->output_interface, 24323966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan &GFX_DPA_SETTING_TBL_VT3364[index]); 24423966d5b52e6ee1f90bb343766a9703dafceae83Joseph Chan} 245