171d7fec4Smrg/* $XFree86$ */ 271d7fec4Smrg/* 371d7fec4Smrg * $Workfile: dora9211.c $ 471d7fec4Smrg * $Revision: 1.1.1.1 $ 571d7fec4Smrg * 671d7fec4Smrg * File Contents: This file contains the panel functions to interface 771d7fec4Smrg * the dorado platform. 871d7fec4Smrg * 971d7fec4Smrg * SubModule: Geode FlatPanel library 1071d7fec4Smrg * 1171d7fec4Smrg */ 1271d7fec4Smrg 1371d7fec4Smrg/* 1471d7fec4Smrg * NSC_LIC_ALTERNATIVE_PREAMBLE 1571d7fec4Smrg * 1671d7fec4Smrg * Revision 1.0 1771d7fec4Smrg * 1871d7fec4Smrg * National Semiconductor Alternative GPL-BSD License 1971d7fec4Smrg * 2071d7fec4Smrg * National Semiconductor Corporation licenses this software 2171d7fec4Smrg * ("Software"): 2271d7fec4Smrg * 2371d7fec4Smrg * Panel Library 2471d7fec4Smrg * 2571d7fec4Smrg * under one of the two following licenses, depending on how the 2671d7fec4Smrg * Software is received by the Licensee. 2771d7fec4Smrg * 2871d7fec4Smrg * If this Software is received as part of the Linux Framebuffer or 2971d7fec4Smrg * other GPL licensed software, then the GPL license designated 3071d7fec4Smrg * NSC_LIC_GPL applies to this Software; in all other circumstances 3171d7fec4Smrg * then the BSD-style license designated NSC_LIC_BSD shall apply. 3271d7fec4Smrg * 3371d7fec4Smrg * END_NSC_LIC_ALTERNATIVE_PREAMBLE */ 3471d7fec4Smrg 3571d7fec4Smrg/* NSC_LIC_BSD 3671d7fec4Smrg * 3771d7fec4Smrg * National Semiconductor Corporation Open Source License for 3871d7fec4Smrg * 3971d7fec4Smrg * Panel Library 4071d7fec4Smrg * 4171d7fec4Smrg * (BSD License with Export Notice) 4271d7fec4Smrg * 4371d7fec4Smrg * Copyright (c) 1999-2001 4471d7fec4Smrg * National Semiconductor Corporation. 4571d7fec4Smrg * All rights reserved. 4671d7fec4Smrg * 4771d7fec4Smrg * Redistribution and use in source and binary forms, with or without 4871d7fec4Smrg * modification, are permitted provided that the following conditions 4971d7fec4Smrg * are met: 5071d7fec4Smrg * 5171d7fec4Smrg * * Redistributions of source code must retain the above copyright 5271d7fec4Smrg * notice, this list of conditions and the following disclaimer. 5371d7fec4Smrg * 5471d7fec4Smrg * * Redistributions in binary form must reproduce the above 5571d7fec4Smrg * copyright notice, this list of conditions and the following 5671d7fec4Smrg * disclaimer in the documentation and/or other materials provided 5771d7fec4Smrg * with the distribution. 5871d7fec4Smrg * 5971d7fec4Smrg * * Neither the name of the National Semiconductor Corporation nor 6071d7fec4Smrg * the names of its contributors may be used to endorse or promote 6171d7fec4Smrg * products derived from this software without specific prior 6271d7fec4Smrg * written permission. 6371d7fec4Smrg * 6471d7fec4Smrg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 6571d7fec4Smrg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 6671d7fec4Smrg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 6771d7fec4Smrg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 6871d7fec4Smrg * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 6971d7fec4Smrg * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 7071d7fec4Smrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 7171d7fec4Smrg * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 7271d7fec4Smrg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 7371d7fec4Smrg * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE, 7471d7fec4Smrg * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY 7571d7fec4Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 7671d7fec4Smrg * OF SUCH DAMAGE. 7771d7fec4Smrg * 7871d7fec4Smrg * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF 7971d7fec4Smrg * YOUR JURISDICTION. It is licensee's responsibility to comply with 8071d7fec4Smrg * any export regulations applicable in licensee's jurisdiction. Under 8171d7fec4Smrg * CURRENT (2001) U.S. export regulations this software 8271d7fec4Smrg * is eligible for export from the U.S. and can be downloaded by or 8371d7fec4Smrg * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed 8471d7fec4Smrg * destinations which include Cuba, Iraq, Libya, North Korea, Iran, 8571d7fec4Smrg * Syria, Sudan, Afghanistan and any other country to which the U.S. 8671d7fec4Smrg * has embargoed goods and services. 8771d7fec4Smrg * 8871d7fec4Smrg * END_NSC_LIC_BSD */ 8971d7fec4Smrg 9071d7fec4Smrg/* NSC_LIC_GPL 9171d7fec4Smrg * 9271d7fec4Smrg * National Semiconductor Corporation Gnu General Public License for 9371d7fec4Smrg * 9471d7fec4Smrg * Panel Library 9571d7fec4Smrg * 9671d7fec4Smrg * (GPL License with Export Notice) 9771d7fec4Smrg * 9871d7fec4Smrg * Copyright (c) 1999-2001 9971d7fec4Smrg * National Semiconductor Corporation. 10071d7fec4Smrg * All rights reserved. 10171d7fec4Smrg * 10271d7fec4Smrg * Redistribution and use in source and binary forms, with or without 10371d7fec4Smrg * modification, are permitted under the terms of the GNU General 10471d7fec4Smrg * Public License as published by the Free Software Foundation; either 10571d7fec4Smrg * version 2 of the License, or (at your option) any later version 10671d7fec4Smrg * 10771d7fec4Smrg * In addition to the terms of the GNU General Public License, neither 10871d7fec4Smrg * the name of the National Semiconductor Corporation nor the names of 10971d7fec4Smrg * its contributors may be used to endorse or promote products derived 11071d7fec4Smrg * from this software without specific prior written permission. 11171d7fec4Smrg * 11271d7fec4Smrg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 11371d7fec4Smrg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 11471d7fec4Smrg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 11571d7fec4Smrg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 11671d7fec4Smrg * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 11771d7fec4Smrg * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 11871d7fec4Smrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 11971d7fec4Smrg * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 12071d7fec4Smrg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 12171d7fec4Smrg * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE, 12271d7fec4Smrg * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY 12371d7fec4Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 12471d7fec4Smrg * OF SUCH DAMAGE. See the GNU General Public License for more details. 12571d7fec4Smrg * 12671d7fec4Smrg * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF 12771d7fec4Smrg * YOUR JURISDICTION. It is licensee's responsibility to comply with 12871d7fec4Smrg * any export regulations applicable in licensee's jurisdiction. Under 12971d7fec4Smrg * CURRENT (2001) U.S. export regulations this software 13071d7fec4Smrg * is eligible for export from the U.S. and can be downloaded by or 13171d7fec4Smrg * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed 13271d7fec4Smrg * destinations which include Cuba, Iraq, Libya, North Korea, Iran, 13371d7fec4Smrg * Syria, Sudan, Afghanistan and any other country to which the U.S. 13471d7fec4Smrg * has embargoed goods and services. 13571d7fec4Smrg * 13671d7fec4Smrg * You should have received a copy of the GNU General Public License 13771d7fec4Smrg * along with this file; if not, write to the Free Software Foundation, 13871d7fec4Smrg * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 13971d7fec4Smrg * 14071d7fec4Smrg * END_NSC_LIC_GPL */ 14171d7fec4Smrg 14271d7fec4Smrg#include "dora9211.h" 14371d7fec4Smrg 14471d7fec4Smrgvoid 14571d7fec4SmrgDorado_Get_9211_Details(unsigned long flags, PPnl_PanelParams pParam) 14671d7fec4Smrg{ 14771d7fec4Smrg unsigned long DPanelType; 14871d7fec4Smrg int i; 14971d7fec4Smrg 15071d7fec4Smrg for (i = 0; i < 0x7fff; i++) { 15171d7fec4Smrg } 15271d7fec4Smrg 15371d7fec4Smrg Dorado9211GpioInit(); 15471d7fec4Smrg 15571d7fec4Smrg for (i = 0; i < 5; i++) 15671d7fec4Smrg toggle_Centaurus_9211_clock(); 15771d7fec4Smrg 15871d7fec4Smrg if (flags & PNL_PANELCHIP) { 15971d7fec4Smrg DPanelType = Dorado9211ReadReg(0x430); 16071d7fec4Smrg 16171d7fec4Smrg if ((DPanelType & 0xFFFF0000) == 0x92110000) { /* found 9211 */ 16271d7fec4Smrg /* check the values for revision ID */ 16371d7fec4Smrg if (DPanelType >= 0x92110301) 16471d7fec4Smrg pParam->PanelChip = PNL_9211_C; 16571d7fec4Smrg else if ((DPanelType >= 0x92110101) && (DPanelType < 0x92110301)) 16671d7fec4Smrg pParam->PanelChip = PNL_9211_A; 16771d7fec4Smrg else 16871d7fec4Smrg pParam->PanelChip = PNL_UNKNOWN_CHIP; 16971d7fec4Smrg } else { /* no 9211 present */ 17071d7fec4Smrg pParam->PanelChip = PNL_UNKNOWN_CHIP; 17171d7fec4Smrg } 17271d7fec4Smrg } 17371d7fec4Smrg 17471d7fec4Smrg if ((pParam->PanelChip != PNL_UNKNOWN_CHIP) && (flags & PNL_PANELSTAT)) { 17571d7fec4Smrg unsigned long PanelTypeOrg; 17671d7fec4Smrg unsigned char Panel_2Byte; 17771d7fec4Smrg 17871d7fec4Smrg DPanelType = Dorado9211ReadReg(0x438); 17971d7fec4Smrg DPanelType &= 0x00e8e8e8; 18071d7fec4Smrg DPanelType |= 0x00170000; 18171d7fec4Smrg Dorado9211WriteReg(0x438, DPanelType); 18271d7fec4Smrg DPanelType = 0; 18371d7fec4Smrg 18471d7fec4Smrg DPanelType = Dorado9211ReadReg(0x434); 18571d7fec4Smrg DPanelType = (DPanelType >> (DRD_LCDRESGPIO1 + 1)); 18671d7fec4Smrg PanelTypeOrg = DPanelType >> 8; 18771d7fec4Smrg Panel_2Byte = (unsigned char)PanelTypeOrg; 18871d7fec4Smrg Panel_2Byte = (Panel_2Byte >> (DRD_LCDRESGPIO2 - DRD_LCDRESGPIO1 - 1)); 18971d7fec4Smrg DPanelType = (DPanelType | ((unsigned int)Panel_2Byte << 8)); 19071d7fec4Smrg DPanelType = DPanelType >> 1; 19171d7fec4Smrg PanelTypeOrg = DPanelType >> 8; 19271d7fec4Smrg Panel_2Byte = (unsigned char)PanelTypeOrg; 19371d7fec4Smrg Panel_2Byte = (Panel_2Byte >> (DRD_LCDRESGPIO3 - DRD_LCDRESGPIO2 - 1)); 19471d7fec4Smrg DPanelType = (DPanelType | ((unsigned int)Panel_2Byte << 8)); 19571d7fec4Smrg DPanelType = DPanelType >> 1; 19671d7fec4Smrg PanelTypeOrg = DPanelType >> 8; 19771d7fec4Smrg Panel_2Byte = (unsigned char)PanelTypeOrg; 19871d7fec4Smrg Panel_2Byte = (Panel_2Byte >> (DRD_LCDRESGPIO4 - DRD_LCDRESGPIO3 - 1)); 19971d7fec4Smrg DPanelType = (DPanelType | ((unsigned int)Panel_2Byte << 8)); 20071d7fec4Smrg DPanelType = DPanelType >> 5; 20171d7fec4Smrg DPanelType &= 0xf; 20271d7fec4Smrg 20371d7fec4Smrg switch (DPanelType) { 20471d7fec4Smrg case 8: 20571d7fec4Smrg pParam->PanelStat.XRes = 800; 20671d7fec4Smrg pParam->PanelStat.YRes = 600; 20771d7fec4Smrg pParam->PanelStat.Depth = 18; 20871d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 20971d7fec4Smrg pParam->PanelStat.Type = PNL_TFT; 21071d7fec4Smrg break; 21171d7fec4Smrg 21271d7fec4Smrg case 9: 21371d7fec4Smrg pParam->PanelStat.XRes = 640; 21471d7fec4Smrg pParam->PanelStat.YRes = 480; 21571d7fec4Smrg pParam->PanelStat.Depth = 8; 21671d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 21771d7fec4Smrg pParam->PanelStat.Type = PNL_SSTN; 21871d7fec4Smrg break; 21971d7fec4Smrg 22071d7fec4Smrg case 10: 22171d7fec4Smrg pParam->PanelStat.XRes = 1024; 22271d7fec4Smrg pParam->PanelStat.YRes = 768; 22371d7fec4Smrg pParam->PanelStat.Depth = 18; 22471d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 22571d7fec4Smrg pParam->PanelStat.Type = PNL_TFT; 22671d7fec4Smrg break; 22771d7fec4Smrg case 0: 22871d7fec4Smrg case 1: 22971d7fec4Smrg case 2: 23071d7fec4Smrg case 3: 23171d7fec4Smrg case 4: 23271d7fec4Smrg case 5: 23371d7fec4Smrg case 6: 23471d7fec4Smrg case 7: 23571d7fec4Smrg case 11: 23671d7fec4Smrg pParam->PanelStat.XRes = 640; 23771d7fec4Smrg pParam->PanelStat.YRes = 480; 23871d7fec4Smrg pParam->PanelStat.Depth = 16; 23971d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 24071d7fec4Smrg pParam->PanelStat.Type = PNL_DSTN; 24171d7fec4Smrg break; 24271d7fec4Smrg case 12: 24371d7fec4Smrg pParam->PanelStat.XRes = 640; 24471d7fec4Smrg pParam->PanelStat.YRes = 480; 24571d7fec4Smrg pParam->PanelStat.Depth = 18; 24671d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 24771d7fec4Smrg pParam->PanelStat.Type = PNL_TFT; 24871d7fec4Smrg break; 24971d7fec4Smrg case 13: 25071d7fec4Smrg pParam->PanelStat.XRes = 1024; 25171d7fec4Smrg pParam->PanelStat.YRes = 768; 25271d7fec4Smrg pParam->PanelStat.Depth = 24; 25371d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 25471d7fec4Smrg pParam->PanelStat.Type = PNL_DSTN; 25571d7fec4Smrg break; 25671d7fec4Smrg case 14: 25771d7fec4Smrg pParam->PanelStat.XRes = 640; 25871d7fec4Smrg pParam->PanelStat.YRes = 480; 25971d7fec4Smrg pParam->PanelStat.Depth = 8; 26071d7fec4Smrg pParam->PanelStat.MonoColor = PNL_MONO_PANEL; 26171d7fec4Smrg pParam->PanelStat.Type = PNL_DSTN; 26271d7fec4Smrg break; 26371d7fec4Smrg case 15: 26471d7fec4Smrg pParam->PanelStat.XRes = 800; 26571d7fec4Smrg pParam->PanelStat.YRes = 600; 26671d7fec4Smrg pParam->PanelStat.Depth = 16; 26771d7fec4Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 26871d7fec4Smrg pParam->PanelStat.Type = PNL_DSTN; 26971d7fec4Smrg break; 27071d7fec4Smrg default: 27171d7fec4Smrg break; 27271d7fec4Smrg } 27371d7fec4Smrg } 27471d7fec4Smrg /* if block end */ 27571d7fec4Smrg} 27671d7fec4Smrg 27771d7fec4Smrgvoid 27871d7fec4SmrgDorado9211Init(Pnl_PanelStat * pstat) 27971d7fec4Smrg{ 28071d7fec4Smrg int mode; 28171d7fec4Smrg unsigned long orig_value, pm_value; 28271d7fec4Smrg 28371d7fec4Smrg gfx_delay_milliseconds(100); 28471d7fec4Smrg Dorado9211GpioInit(); 28571d7fec4Smrg 28671d7fec4Smrg Dorado9211ToggleClock(); 28771d7fec4Smrg Dorado9211ToggleClock(); 28871d7fec4Smrg Dorado9211ToggleClock(); 28971d7fec4Smrg Dorado9211ToggleClock(); 29071d7fec4Smrg Dorado9211ToggleClock(); 29171d7fec4Smrg 29271d7fec4Smrg gfx_delay_milliseconds(100); 29371d7fec4Smrg 29471d7fec4Smrg Dorado9211ToggleClock(); 29571d7fec4Smrg Dorado9211ToggleClock(); 29671d7fec4Smrg Dorado9211ToggleClock(); 29771d7fec4Smrg Dorado9211ToggleClock(); 29871d7fec4Smrg Dorado9211ToggleClock(); 29971d7fec4Smrg 30071d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, 0x0); 30171d7fec4Smrg 30271d7fec4Smrg gfx_delay_milliseconds(100); 30371d7fec4Smrg gfx_delay_milliseconds(100); 30471d7fec4Smrg 30571d7fec4Smrg /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */ 30671d7fec4Smrg for (mode = 0; mode < NUM_92XX_MODES; mode++) { 30771d7fec4Smrg if ((FPModeParams[mode].xres == pstat->XRes) && 30871d7fec4Smrg (FPModeParams[mode].yres == pstat->YRes) && 30971d7fec4Smrg (FPModeParams[mode].bpp == pstat->Depth) && 31071d7fec4Smrg (FPModeParams[mode].panel_type == pstat->Type) && 31171d7fec4Smrg (FPModeParams[mode].color_type == pstat->MonoColor)) { 31271d7fec4Smrg 31371d7fec4Smrg /* SET THE 92xx FOR THE SELECTED MODE */ 31471d7fec4Smrg CS92xx_MODE *pMode = &FPModeParams[mode]; 31571d7fec4Smrg 31671d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING1, pMode->panel_timing1); 31771d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING2, pMode->panel_timing2); 31871d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_DITH_FR_CNTRL, 31971d7fec4Smrg pMode->rev_C_dither_frc); 32071d7fec4Smrg Dorado9211WriteReg(CS92xx_BLUE_LSFR_SEED, pMode->blue_lsfr_seed); 32171d7fec4Smrg Dorado9211WriteReg(CS92xx_RED_GREEN_LSFR_SEED, 32271d7fec4Smrg pMode->red_green_lsfr_seed); 32371d7fec4Smrg DoradoProgramFRMload(); 32471d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_MEM_CNTRL, pMode->memory_control); 32571d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, pMode->power_management); 32671d7fec4Smrg gfx_delay_milliseconds(100); 32771d7fec4Smrg gfx_delay_milliseconds(100); 32871d7fec4Smrg Dorado9211ClearCS(); 32971d7fec4Smrg 33071d7fec4Smrg /* This code is added to take care of Panel initialization. 33171d7fec4Smrg * Irrespective of Xpressrom is enabling the panel or not. 33271d7fec4Smrg */ 33371d7fec4Smrg orig_value = READ_VID32(0X04); 33471d7fec4Smrg WRITE_VID32(0x04, 0x00200141); 33571d7fec4Smrg gfx_delay_milliseconds(21); 33671d7fec4Smrg pm_value = gfx_ind(0x9030); 33771d7fec4Smrg 33871d7fec4Smrg pm_value |= 0x400; 33971d7fec4Smrg gfx_outd(0x9030, pm_value); 34071d7fec4Smrg gfx_delay_milliseconds(4); 34171d7fec4Smrg orig_value &= 0xfff1ffff; 34271d7fec4Smrg WRITE_VID32(0X4, orig_value); 34371d7fec4Smrg return; 34471d7fec4Smrg } /*end if() */ 34571d7fec4Smrg } /*end for() */ 34671d7fec4Smrg 34771d7fec4Smrg} 34871d7fec4Smrg 34971d7fec4Smrgvoid 35071d7fec4SmrgDorado9211SetCS(void) 35171d7fec4Smrg{ 35271d7fec4Smrg unsigned long value; 35371d7fec4Smrg 35471d7fec4Smrg value = gfx_ind(DRD_CSP9211IN); 35571d7fec4Smrg gfx_outd(DRD_CSP9211OUT, value | DRD_CS9211); 35671d7fec4Smrg} 35771d7fec4Smrg 35871d7fec4Smrgvoid 35971d7fec4SmrgDorado9211ClearCS(void) 36071d7fec4Smrg{ 36171d7fec4Smrg unsigned long value; 36271d7fec4Smrg 36371d7fec4Smrg value = gfx_ind(DRD_CSP9211IN); 36471d7fec4Smrg gfx_outd(DRD_CSP9211OUT, value & (~DRD_CS9211)); 36571d7fec4Smrg} 36671d7fec4Smrg 36771d7fec4Smrgvoid 36871d7fec4SmrgDorado9211SetDataOut(void) 36971d7fec4Smrg{ 37071d7fec4Smrg unsigned long value; 37171d7fec4Smrg 37271d7fec4Smrg value = gfx_ind(DRD_DATAOUTP9211IN); 37371d7fec4Smrg gfx_outd(DRD_DATAOUTP9211OUT, value | DRD_DATAIN9211); 37471d7fec4Smrg} 37571d7fec4Smrg 37671d7fec4Smrgvoid 37771d7fec4SmrgDorado9211ClearDataOut(void) 37871d7fec4Smrg{ 37971d7fec4Smrg unsigned long value; 38071d7fec4Smrg 38171d7fec4Smrg value = gfx_ind(DRD_DATAOUTP9211IN); 38271d7fec4Smrg gfx_outd(DRD_DATAOUTP9211OUT, value & (~DRD_DATAIN9211)); 38371d7fec4Smrg} 38471d7fec4Smrg 38571d7fec4Smrgunsigned char 38671d7fec4SmrgDorado9211ReadDataIn(void) 38771d7fec4Smrg{ 38871d7fec4Smrg unsigned char readdata = 0; 38971d7fec4Smrg unsigned long value; 39071d7fec4Smrg 39171d7fec4Smrg /* why to read 4 times ??? */ 39271d7fec4Smrg value = gfx_ind(DRD_DATAINP9211IN); 39371d7fec4Smrg value = gfx_ind(DRD_DATAINP9211IN); 39471d7fec4Smrg value = gfx_ind(DRD_DATAINP9211IN); 39571d7fec4Smrg value = gfx_ind(DRD_DATAINP9211IN); 39671d7fec4Smrg if (value & DRD_DATAOUT9211) 39771d7fec4Smrg readdata = 1; 39871d7fec4Smrg return (readdata); 39971d7fec4Smrg} 40071d7fec4Smrg 40171d7fec4Smrgvoid 40271d7fec4SmrgDorado9211ToggleClock(void) 40371d7fec4Smrg{ 40471d7fec4Smrg Dorado9211SetClock(); 40571d7fec4Smrg Dorado9211ClearClock(); 40671d7fec4Smrg} 40771d7fec4Smrg 40871d7fec4Smrgvoid 40971d7fec4SmrgDorado9211SetClock(void) 41071d7fec4Smrg{ 41171d7fec4Smrg unsigned long value; 41271d7fec4Smrg 41371d7fec4Smrg value = gfx_ind(DRD_CLOCKP9211IN); 41471d7fec4Smrg gfx_outd(DRD_CLOCKP9211OUT, value | DRD_CLOCK9211); 41571d7fec4Smrg} 41671d7fec4Smrg 41771d7fec4Smrgvoid 41871d7fec4SmrgDorado9211ClearClock(void) 41971d7fec4Smrg{ 42071d7fec4Smrg unsigned long value; 42171d7fec4Smrg 42271d7fec4Smrg value = gfx_ind(DRD_CLOCKP9211IN); 42371d7fec4Smrg gfx_outd(DRD_CLOCKP9211OUT, value & (~DRD_CLOCK9211)); 42471d7fec4Smrg} 42571d7fec4Smrg 42671d7fec4Smrgvoid 42771d7fec4SmrgDorado9211GpioInit(void) 42871d7fec4Smrg{ 42971d7fec4Smrg unsigned long value; 43071d7fec4Smrg 43171d7fec4Smrg /* set output enable on gpio 7, 9, 11 */ 43271d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_CLOCK9211CFG); 43371d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 3); 43471d7fec4Smrg /* set output enable on gpio 7, 9, 11 */ 43571d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_CS9211CFG); 43671d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 3); 43771d7fec4Smrg /* set output enable on gpio 7, 9, 18 */ 43871d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_DATAIN9211CFG); 43971d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 3); 44071d7fec4Smrg /* disable on gpio 11 - This is the output from the 9211 */ 44171d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_DATAOUT9211CFG); 44271d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 0); 44371d7fec4Smrg /* Set all PINS low */ 44471d7fec4Smrg value = gfx_ind(DRD_GEODE_GPIO_BASE + DRD_GEODE_GPDI0); 44571d7fec4Smrg value &= ~(DRD_CS9211 | DRD_CLOCK9211 | DRD_DATAIN9211); 44671d7fec4Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPDO0), value); 44771d7fec4Smrg} 44871d7fec4Smrg 44971d7fec4Smrgunsigned long 45071d7fec4SmrgDorado9211ReadReg(unsigned short index) 45171d7fec4Smrg{ 45271d7fec4Smrg 45371d7fec4Smrg unsigned char i, readbit; 45471d7fec4Smrg unsigned long data; 45571d7fec4Smrg 45671d7fec4Smrg Dorado9211ClearDataOut(); 45771d7fec4Smrg 45871d7fec4Smrg Dorado9211SetCS(); 45971d7fec4Smrg Dorado9211ToggleClock(); 46071d7fec4Smrg 46171d7fec4Smrg Dorado9211SetDataOut(); 46271d7fec4Smrg Dorado9211ToggleClock(); 46371d7fec4Smrg 46471d7fec4Smrg for (i = 0; i < 12; i++) { 46571d7fec4Smrg if (index & 0x1) { 46671d7fec4Smrg Dorado9211SetDataOut(); 46771d7fec4Smrg } else { 46871d7fec4Smrg Dorado9211ClearDataOut(); 46971d7fec4Smrg } 47071d7fec4Smrg Dorado9211ToggleClock(); 47171d7fec4Smrg index >>= 1; 47271d7fec4Smrg } 47371d7fec4Smrg 47471d7fec4Smrg Dorado9211ClearDataOut(); 47571d7fec4Smrg Dorado9211ToggleClock(); 47671d7fec4Smrg 47771d7fec4Smrg /* Idle clock, 7 clocks, no data set */ 47871d7fec4Smrg 47971d7fec4Smrg Dorado9211ToggleClock(); 48071d7fec4Smrg Dorado9211ToggleClock(); 48171d7fec4Smrg Dorado9211ToggleClock(); 48271d7fec4Smrg Dorado9211ToggleClock(); 48371d7fec4Smrg Dorado9211ToggleClock(); 48471d7fec4Smrg Dorado9211ToggleClock(); 48571d7fec4Smrg Dorado9211ToggleClock(); 48671d7fec4Smrg 48771d7fec4Smrg data = 0; 48871d7fec4Smrg for (i = 0; i < 32; i++) { 48971d7fec4Smrg Dorado9211ToggleClock(); 49071d7fec4Smrg readbit = Dorado9211ReadDataIn(); 49171d7fec4Smrg data |= (((unsigned long)readbit) << i); 49271d7fec4Smrg } 49371d7fec4Smrg 49471d7fec4Smrg Dorado9211ClearCS(); 49571d7fec4Smrg Dorado9211ToggleClock(); 49671d7fec4Smrg return (data); 49771d7fec4Smrg 49871d7fec4Smrg} 49971d7fec4Smrg 50071d7fec4Smrgvoid 50171d7fec4SmrgDorado9211WriteReg(unsigned short index, unsigned long data) 50271d7fec4Smrg{ 50371d7fec4Smrg 50471d7fec4Smrg unsigned char i; 50571d7fec4Smrg 50671d7fec4Smrg Dorado9211ClearDataOut(); 50771d7fec4Smrg Dorado9211SetDataOut(); 50871d7fec4Smrg Dorado9211SetCS(); 50971d7fec4Smrg Dorado9211ToggleClock(); 51071d7fec4Smrg Dorado9211SetDataOut(); 51171d7fec4Smrg Dorado9211ToggleClock(); 51271d7fec4Smrg 51371d7fec4Smrg for (i = 0; i < 12; i++) { 51471d7fec4Smrg if (index & 0x1) { 51571d7fec4Smrg Dorado9211SetDataOut(); 51671d7fec4Smrg } else { 51771d7fec4Smrg Dorado9211ClearDataOut(); 51871d7fec4Smrg } 51971d7fec4Smrg Dorado9211ToggleClock(); 52071d7fec4Smrg index >>= 1; 52171d7fec4Smrg } 52271d7fec4Smrg 52371d7fec4Smrg Dorado9211SetDataOut(); 52471d7fec4Smrg Dorado9211ToggleClock(); 52571d7fec4Smrg 52671d7fec4Smrg for (i = 0; i < 32; i++) { 52771d7fec4Smrg if (data & 0x1) { 52871d7fec4Smrg Dorado9211SetDataOut(); 52971d7fec4Smrg } else { 53071d7fec4Smrg Dorado9211ClearDataOut(); 53171d7fec4Smrg } 53271d7fec4Smrg Dorado9211ToggleClock(); 53371d7fec4Smrg data >>= 1; 53471d7fec4Smrg } 53571d7fec4Smrg 53671d7fec4Smrg Dorado9211ClearCS(); 53771d7fec4Smrg 53871d7fec4Smrg Dorado9211ToggleClock(); 53971d7fec4Smrg Dorado9211ToggleClock(); 54071d7fec4Smrg Dorado9211ToggleClock(); 54171d7fec4Smrg Dorado9211ToggleClock(); 54271d7fec4Smrg} 54371d7fec4Smrg 54471d7fec4Smrgvoid 54571d7fec4SmrgDoradoProgramFRMload(void) 54671d7fec4Smrg{ 54771d7fec4Smrg unsigned long DoradoFRMtable[] = { 54871d7fec4Smrg 54971d7fec4Smrg 0x00000000, 55071d7fec4Smrg 0x00000000, 55171d7fec4Smrg 0x01000100, 55271d7fec4Smrg 0x01000100, 55371d7fec4Smrg 0x01010101, 55471d7fec4Smrg 0x01010101, 55571d7fec4Smrg 0x02081041, 55671d7fec4Smrg 0x02081041, 55771d7fec4Smrg 0x10111111, 55871d7fec4Smrg 0x11111101, 55971d7fec4Smrg 0x49249241, 56071d7fec4Smrg 0x12412492, 56171d7fec4Smrg 0x92244891, 56271d7fec4Smrg 0x92244891, 56371d7fec4Smrg 0x22252525, 56471d7fec4Smrg 0x22252525, 56571d7fec4Smrg 0x528294a5, 56671d7fec4Smrg 0x2528494a, 56771d7fec4Smrg 0x294a5295, 56871d7fec4Smrg 0x294a5295, 56971d7fec4Smrg 0x54a54a95, 57071d7fec4Smrg 0x2952a52a, 57171d7fec4Smrg 0x2a552a55, 57271d7fec4Smrg 0x2a552a55, 57371d7fec4Smrg 0x554aa955, 57471d7fec4Smrg 0x2a9552aa, 57571d7fec4Smrg 0x2aaa5555, 57671d7fec4Smrg 0x2aaa5555, 57771d7fec4Smrg 0x55555555, 57871d7fec4Smrg 0x2aaaaaaa, 57971d7fec4Smrg 0x55555555, 58071d7fec4Smrg 0x55555555, 58171d7fec4Smrg 0xaaaaaaab, 58271d7fec4Smrg 0x55555555, 58371d7fec4Smrg 0x5555aaab, 58471d7fec4Smrg 0x5555aaab, 58571d7fec4Smrg 0xaab556ab, 58671d7fec4Smrg 0x556aad55, 58771d7fec4Smrg 0x55ab55ab, 58871d7fec4Smrg 0x55ab55ab, 58971d7fec4Smrg 0xab5ab56b, 59071d7fec4Smrg 0x56ad5ad5, 59171d7fec4Smrg 0x56b5ad6b, 59271d7fec4Smrg 0x56b5ad6b, 59371d7fec4Smrg 0xad6d6b5b, 59471d7fec4Smrg 0x5ad6b6b6, 59571d7fec4Smrg 0x5b5b5b5b, 59671d7fec4Smrg 0x5b5b5b5b, 59771d7fec4Smrg 0x5F6db6db, 59871d7fec4Smrg 0x5F6db6db, 59971d7fec4Smrg 0xF776F776, 60071d7fec4Smrg 0xF776F776, 60171d7fec4Smrg 0xFBDEFBDE, 60271d7fec4Smrg 0xFBDEFBDE, 60371d7fec4Smrg 0x7eFFBFF7, 60471d7fec4Smrg 0x7eFFBFF7, 60571d7fec4Smrg 0xFF7FF7F7, 60671d7fec4Smrg 0xFF7FF7F7, 60771d7fec4Smrg 0xFF7FFF7F, 60871d7fec4Smrg 0xFF7FFF7F, 60971d7fec4Smrg 0xFFF7FFFF, 61071d7fec4Smrg 0xFFF7FFFF, 61171d7fec4Smrg 0xFFFFFFFF, 61271d7fec4Smrg 0xFFFFFFFF, 61371d7fec4Smrg }; 61471d7fec4Smrg 61571d7fec4Smrg unsigned char i; 61671d7fec4Smrg unsigned short index; 61771d7fec4Smrg unsigned long data; 61871d7fec4Smrg 61971d7fec4Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_INDEX, 0); 62071d7fec4Smrg index = CS92xx_FRM_MEMORY_DATA; 62171d7fec4Smrg for (i = 0; i < 64; i += 2) { 62271d7fec4Smrg data = DoradoFRMtable[i]; 62371d7fec4Smrg Dorado9211WriteReg(index, data); 62471d7fec4Smrg data = DoradoFRMtable[i + 1]; 62571d7fec4Smrg Dorado9211WriteReg(index, data); 62671d7fec4Smrg } 62771d7fec4Smrg 62871d7fec4Smrg/* 62971d7fec4Smrg * The first FRM location (64 bits) does not program correctly. 63071d7fec4Smrg * This location always reads back with the last value programmed. 63171d7fec4Smrg * ie. If 32 64-bit values are programmed, location 0 reads back as the 32nd 63271d7fec4Smrg * If 30 locations are programmed, location 0 reads back as the 30th, etc. 63371d7fec4Smrg * Fix this by re-writing location 0 after programming all 64 in the writeFRM 63471d7fec4Smrg * loop in RevCFrmload() in CS9211. 63571d7fec4Smrg */ 63671d7fec4Smrg 63771d7fec4Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_INDEX, 0); 63871d7fec4Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_DATA, 0); 63971d7fec4Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_DATA, 0); 64071d7fec4Smrg 64171d7fec4Smrg} 64271d7fec4Smrg 64371d7fec4Smrg/****************************************************************************** 64471d7fec4Smrg * void Dorado_Enable_Power((void); 64571d7fec4Smrg * Enables the power of the CX9211 on Dorado board. 64671d7fec4Smrg ****************************************************************************** 64771d7fec4Smrg */ 64871d7fec4Smrg 64971d7fec4Smrgvoid 65071d7fec4SmrgDorado_Power_Up(void) 65171d7fec4Smrg{ 65271d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, 0x01000000); 65371d7fec4Smrg return; 65471d7fec4Smrg 65571d7fec4Smrg} /* disable_Centaurus_Power */ 65671d7fec4Smrg 65771d7fec4Smrg/****************************************************************************** 65871d7fec4Smrg * void Dorado_Disable_Power((void); 65971d7fec4Smrg * Disables the power of the CX9211 on Dorado board. 66071d7fec4Smrg ***************************************************************************** 66171d7fec4Smrg */ 66271d7fec4Smrg 66371d7fec4Smrgvoid 66471d7fec4SmrgDorado_Power_Down(void) 66571d7fec4Smrg{ 66671d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, 0x0); 66771d7fec4Smrg return; 66871d7fec4Smrg 66971d7fec4Smrg} /* disable_Centaurus_Power */ 67071d7fec4Smrg 67171d7fec4Smrgvoid 67271d7fec4SmrgDorado_Save_Panel_State(void) 67371d7fec4Smrg{ 67471d7fec4Smrg 67571d7fec4Smrg /* set 9211 registers using the desired panel settings */ 67671d7fec4Smrg cs9211_regs.panel_timing1 = Dorado9211ReadReg(CS92xx_LCD_PAN_TIMING1); 67771d7fec4Smrg cs9211_regs.panel_timing2 = Dorado9211ReadReg(CS92xx_LCD_PAN_TIMING2); 67871d7fec4Smrg 67971d7fec4Smrg cs9211_regs.dither_frc_ctrl = Dorado9211ReadReg(CS92xx_LCD_DITH_FR_CNTRL); 68071d7fec4Smrg cs9211_regs.blue_lsfr_seed = Dorado9211ReadReg(CS92xx_BLUE_LSFR_SEED); 68171d7fec4Smrg cs9211_regs.red_green_lsfr_seed = 68271d7fec4Smrg Dorado9211ReadReg(CS92xx_RED_GREEN_LSFR_SEED); 68371d7fec4Smrg 68471d7fec4Smrg /* CentaurusProgramFRMload(); */ 68571d7fec4Smrg cs9211_regs.memory_control = Dorado9211ReadReg(CS92xx_LCD_MEM_CNTRL); 68671d7fec4Smrg 68771d7fec4Smrg /* Set the power register last. This will turn the panel on at the 9211. */ 68871d7fec4Smrg cs9211_regs.power_management = Dorado9211ReadReg(CS92xx_LCD_PWR_MAN); 68971d7fec4Smrg cs9211_regs.panel_state = cs9211_regs.power_management; 69071d7fec4Smrg} 69171d7fec4Smrg 69271d7fec4Smrgvoid 69371d7fec4SmrgDorado_Restore_Panel_State(void) 69471d7fec4Smrg{ 69571d7fec4Smrg unsigned long off_data = 0; 69671d7fec4Smrg 69771d7fec4Smrg /* Before restoring the 9211 registers, power off the 9211. */ 69871d7fec4Smrg 69971d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, off_data); 70071d7fec4Smrg 70171d7fec4Smrg /* set 9211 registers using the desired panel settings */ 70271d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING1, cs9211_regs.panel_timing1); 70371d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING2, cs9211_regs.panel_timing2); 70471d7fec4Smrg /* load the LSFR seeds */ 70571d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_DITH_FR_CNTRL, cs9211_regs.dither_frc_ctrl); 70671d7fec4Smrg Dorado9211WriteReg(CS92xx_BLUE_LSFR_SEED, cs9211_regs.blue_lsfr_seed); 70771d7fec4Smrg Dorado9211WriteReg(CS92xx_RED_GREEN_LSFR_SEED, 70871d7fec4Smrg cs9211_regs.red_green_lsfr_seed); 70971d7fec4Smrg 71071d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_MEM_CNTRL, cs9211_regs.memory_control); 71171d7fec4Smrg /* Set the power register last. This will turn the panel on at the 9211. */ 71271d7fec4Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, cs9211_regs.power_management); 71371d7fec4Smrg} 714