dora9211.c revision f29dbc25
1f29dbc25Smrg/* Copyright (c) 2005 Advanced Micro Devices, Inc. 2f29dbc25Smrg * 3f29dbc25Smrg * Permission is hereby granted, free of charge, to any person obtaining a copy 4f29dbc25Smrg * of this software and associated documentation files (the "Software"), to 5f29dbc25Smrg * deal in the Software without restriction, including without limitation the 6f29dbc25Smrg * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7f29dbc25Smrg * sell copies of the Software, and to permit persons to whom the Software is 8f29dbc25Smrg * furnished to do so, subject to the following conditions: 9f29dbc25Smrg * 10f29dbc25Smrg * The above copyright notice and this permission notice shall be included in 11f29dbc25Smrg * all copies or substantial portions of the Software. 12f29dbc25Smrg * 13f29dbc25Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14f29dbc25Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15f29dbc25Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16f29dbc25Smrg * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17f29dbc25Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18f29dbc25Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19f29dbc25Smrg * IN THE SOFTWARE. 20f29dbc25Smrg * 21f29dbc25Smrg * Neither the name of the Advanced Micro Devices, Inc. nor the names of its 22f29dbc25Smrg * contributors may be used to endorse or promote products derived from this 23f29dbc25Smrg * software without specific prior written permission. 24f29dbc25Smrg * */ 25f29dbc25Smrg 26f29dbc25Smrg/* 27f29dbc25Smrg * File Contents: This file contains the panel functions to interface 28f29dbc25Smrg * the dorado platform. 29f29dbc25Smrg * 30f29dbc25Smrg * SubModule: Geode FlatPanel library 31f29dbc25Smrg * */ 32f29dbc25Smrg 33f29dbc25Smrg#include "dora9211.h" 34f29dbc25Smrg 35f29dbc25Smrgvoid 36f29dbc25SmrgDorado_Get_9211_Details(unsigned long flags, Pnl_PanelParams * pParam) 37f29dbc25Smrg{ 38f29dbc25Smrg unsigned long DPanelType; 39f29dbc25Smrg int i; 40f29dbc25Smrg 41f29dbc25Smrg for (i = 0; i < 0x7fff; i++) { 42f29dbc25Smrg } 43f29dbc25Smrg 44f29dbc25Smrg Dorado9211GpioInit(); 45f29dbc25Smrg 46f29dbc25Smrg for (i = 0; i < 5; i++) 47f29dbc25Smrg toggle_Centaurus_9211_clock(); 48f29dbc25Smrg 49f29dbc25Smrg if (flags & PNL_PANELCHIP) { 50f29dbc25Smrg DPanelType = Dorado9211ReadReg(0x430); 51f29dbc25Smrg 52f29dbc25Smrg if ((DPanelType & 0xFFFF0000) == 0x92110000) { /* found 9211 */ 53f29dbc25Smrg /* check the values for revision ID */ 54f29dbc25Smrg if (DPanelType >= 0x92110301) 55f29dbc25Smrg pParam->PanelChip = PNL_9211_C; 56f29dbc25Smrg else if ((DPanelType >= 0x92110101) && (DPanelType < 0x92110301)) 57f29dbc25Smrg pParam->PanelChip = PNL_9211_A; 58f29dbc25Smrg else 59f29dbc25Smrg pParam->PanelChip = PNL_UNKNOWN_CHIP; 60f29dbc25Smrg } else { /* no 9211 present */ 61f29dbc25Smrg pParam->PanelChip = PNL_UNKNOWN_CHIP; 62f29dbc25Smrg } 63f29dbc25Smrg } 64f29dbc25Smrg 65f29dbc25Smrg if ((pParam->PanelChip != PNL_UNKNOWN_CHIP) && (flags & PNL_PANELSTAT)) { 66f29dbc25Smrg unsigned long PanelTypeOrg; 67f29dbc25Smrg unsigned char Panel_2Byte; 68f29dbc25Smrg 69f29dbc25Smrg DPanelType = Dorado9211ReadReg(0x438); 70f29dbc25Smrg DPanelType &= 0x00e8e8e8; 71f29dbc25Smrg DPanelType |= 0x00170000; 72f29dbc25Smrg Dorado9211WriteReg(0x438, DPanelType); 73f29dbc25Smrg DPanelType = 0; 74f29dbc25Smrg 75f29dbc25Smrg DPanelType = Dorado9211ReadReg(0x434); 76f29dbc25Smrg DPanelType = (DPanelType >> (DRD_LCDRESGPIO1 + 1)); 77f29dbc25Smrg PanelTypeOrg = DPanelType >> 8; 78f29dbc25Smrg Panel_2Byte = (unsigned char)PanelTypeOrg; 79f29dbc25Smrg Panel_2Byte = 80f29dbc25Smrg (Panel_2Byte >> (DRD_LCDRESGPIO2 - DRD_LCDRESGPIO1 - 1)); 81f29dbc25Smrg DPanelType = (DPanelType | ((unsigned int)Panel_2Byte << 8)); 82f29dbc25Smrg DPanelType = DPanelType >> 1; 83f29dbc25Smrg PanelTypeOrg = DPanelType >> 8; 84f29dbc25Smrg Panel_2Byte = (unsigned char)PanelTypeOrg; 85f29dbc25Smrg Panel_2Byte = 86f29dbc25Smrg (Panel_2Byte >> (DRD_LCDRESGPIO3 - DRD_LCDRESGPIO2 - 1)); 87f29dbc25Smrg DPanelType = (DPanelType | ((unsigned int)Panel_2Byte << 8)); 88f29dbc25Smrg DPanelType = DPanelType >> 1; 89f29dbc25Smrg PanelTypeOrg = DPanelType >> 8; 90f29dbc25Smrg Panel_2Byte = (unsigned char)PanelTypeOrg; 91f29dbc25Smrg Panel_2Byte = 92f29dbc25Smrg (Panel_2Byte >> (DRD_LCDRESGPIO4 - DRD_LCDRESGPIO3 - 1)); 93f29dbc25Smrg DPanelType = (DPanelType | ((unsigned int)Panel_2Byte << 8)); 94f29dbc25Smrg DPanelType = DPanelType >> 5; 95f29dbc25Smrg DPanelType &= 0xf; 96f29dbc25Smrg 97f29dbc25Smrg switch (DPanelType) { 98f29dbc25Smrg case 8: 99f29dbc25Smrg pParam->PanelStat.XRes = 800; 100f29dbc25Smrg pParam->PanelStat.YRes = 600; 101f29dbc25Smrg pParam->PanelStat.Depth = 18; 102f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 103f29dbc25Smrg pParam->PanelStat.Type = PNL_TFT; 104f29dbc25Smrg break; 105f29dbc25Smrg 106f29dbc25Smrg case 9: 107f29dbc25Smrg pParam->PanelStat.XRes = 640; 108f29dbc25Smrg pParam->PanelStat.YRes = 480; 109f29dbc25Smrg pParam->PanelStat.Depth = 8; 110f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 111f29dbc25Smrg pParam->PanelStat.Type = PNL_SSTN; 112f29dbc25Smrg break; 113f29dbc25Smrg 114f29dbc25Smrg case 10: 115f29dbc25Smrg pParam->PanelStat.XRes = 1024; 116f29dbc25Smrg pParam->PanelStat.YRes = 768; 117f29dbc25Smrg pParam->PanelStat.Depth = 18; 118f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 119f29dbc25Smrg pParam->PanelStat.Type = PNL_TFT; 120f29dbc25Smrg break; 121f29dbc25Smrg case 0: 122f29dbc25Smrg case 1: 123f29dbc25Smrg case 2: 124f29dbc25Smrg case 3: 125f29dbc25Smrg case 4: 126f29dbc25Smrg case 5: 127f29dbc25Smrg case 6: 128f29dbc25Smrg case 7: 129f29dbc25Smrg case 11: 130f29dbc25Smrg pParam->PanelStat.XRes = 640; 131f29dbc25Smrg pParam->PanelStat.YRes = 480; 132f29dbc25Smrg pParam->PanelStat.Depth = 16; 133f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 134f29dbc25Smrg pParam->PanelStat.Type = PNL_DSTN; 135f29dbc25Smrg break; 136f29dbc25Smrg case 12: 137f29dbc25Smrg pParam->PanelStat.XRes = 640; 138f29dbc25Smrg pParam->PanelStat.YRes = 480; 139f29dbc25Smrg pParam->PanelStat.Depth = 18; 140f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 141f29dbc25Smrg pParam->PanelStat.Type = PNL_TFT; 142f29dbc25Smrg break; 143f29dbc25Smrg case 13: 144f29dbc25Smrg pParam->PanelStat.XRes = 1024; 145f29dbc25Smrg pParam->PanelStat.YRes = 768; 146f29dbc25Smrg pParam->PanelStat.Depth = 24; 147f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 148f29dbc25Smrg pParam->PanelStat.Type = PNL_DSTN; 149f29dbc25Smrg break; 150f29dbc25Smrg case 14: 151f29dbc25Smrg pParam->PanelStat.XRes = 640; 152f29dbc25Smrg pParam->PanelStat.YRes = 480; 153f29dbc25Smrg pParam->PanelStat.Depth = 8; 154f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_MONO_PANEL; 155f29dbc25Smrg pParam->PanelStat.Type = PNL_DSTN; 156f29dbc25Smrg break; 157f29dbc25Smrg case 15: 158f29dbc25Smrg pParam->PanelStat.XRes = 800; 159f29dbc25Smrg pParam->PanelStat.YRes = 600; 160f29dbc25Smrg pParam->PanelStat.Depth = 16; 161f29dbc25Smrg pParam->PanelStat.MonoColor = PNL_COLOR_PANEL; 162f29dbc25Smrg pParam->PanelStat.Type = PNL_DSTN; 163f29dbc25Smrg break; 164f29dbc25Smrg default: 165f29dbc25Smrg break; 166f29dbc25Smrg } 167f29dbc25Smrg } 168f29dbc25Smrg /* if block end */ 169f29dbc25Smrg} 170f29dbc25Smrg 171f29dbc25Smrgvoid 172f29dbc25SmrgDorado9211Init(Pnl_PanelStat * pstat) 173f29dbc25Smrg{ 174f29dbc25Smrg int mode; 175f29dbc25Smrg unsigned long orig_value, pm_value; 176f29dbc25Smrg 177f29dbc25Smrg gfx_delay_milliseconds(100); 178f29dbc25Smrg Dorado9211GpioInit(); 179f29dbc25Smrg 180f29dbc25Smrg Dorado9211ToggleClock(); 181f29dbc25Smrg Dorado9211ToggleClock(); 182f29dbc25Smrg Dorado9211ToggleClock(); 183f29dbc25Smrg Dorado9211ToggleClock(); 184f29dbc25Smrg Dorado9211ToggleClock(); 185f29dbc25Smrg 186f29dbc25Smrg gfx_delay_milliseconds(100); 187f29dbc25Smrg 188f29dbc25Smrg Dorado9211ToggleClock(); 189f29dbc25Smrg Dorado9211ToggleClock(); 190f29dbc25Smrg Dorado9211ToggleClock(); 191f29dbc25Smrg Dorado9211ToggleClock(); 192f29dbc25Smrg Dorado9211ToggleClock(); 193f29dbc25Smrg 194f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, 0x0); 195f29dbc25Smrg 196f29dbc25Smrg gfx_delay_milliseconds(100); 197f29dbc25Smrg gfx_delay_milliseconds(100); 198f29dbc25Smrg 199f29dbc25Smrg /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */ 200f29dbc25Smrg for (mode = 0; mode < NUM_92XX_MODES; mode++) { 201f29dbc25Smrg if ((FPModeParams[mode].xres == pstat->XRes) && 202f29dbc25Smrg (FPModeParams[mode].yres == pstat->YRes) && 203f29dbc25Smrg (FPModeParams[mode].bpp == pstat->Depth) && 204f29dbc25Smrg (FPModeParams[mode].panel_type == pstat->Type) && 205f29dbc25Smrg (FPModeParams[mode].color_type == pstat->MonoColor)) { 206f29dbc25Smrg 207f29dbc25Smrg /* SET THE 92xx FOR THE SELECTED MODE */ 208f29dbc25Smrg CS92xx_MODE *pMode = &FPModeParams[mode]; 209f29dbc25Smrg 210f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING1, pMode->panel_timing1); 211f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING2, pMode->panel_timing2); 212f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_DITH_FR_CNTRL, 213f29dbc25Smrg pMode->rev_C_dither_frc); 214f29dbc25Smrg Dorado9211WriteReg(CS92xx_BLUE_LSFR_SEED, pMode->blue_lsfr_seed); 215f29dbc25Smrg Dorado9211WriteReg(CS92xx_RED_GREEN_LSFR_SEED, 216f29dbc25Smrg pMode->red_green_lsfr_seed); 217f29dbc25Smrg DoradoProgramFRMload(); 218f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_MEM_CNTRL, pMode->memory_control); 219f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, pMode->power_management); 220f29dbc25Smrg gfx_delay_milliseconds(100); 221f29dbc25Smrg gfx_delay_milliseconds(100); 222f29dbc25Smrg Dorado9211ClearCS(); 223f29dbc25Smrg 224f29dbc25Smrg /* This code is added to take care of Panel initialization. 225f29dbc25Smrg * Irrespective of Xpressrom is enabling the panel or not. 226f29dbc25Smrg */ 227f29dbc25Smrg orig_value = READ_VID32(0X04); 228f29dbc25Smrg WRITE_VID32(0x04, 0x00200141); 229f29dbc25Smrg gfx_delay_milliseconds(21); 230f29dbc25Smrg pm_value = gfx_ind(0x9030); 231f29dbc25Smrg 232f29dbc25Smrg pm_value |= 0x400; 233f29dbc25Smrg gfx_outd(0x9030, pm_value); 234f29dbc25Smrg gfx_delay_milliseconds(4); 235f29dbc25Smrg orig_value &= 0xfff1ffff; 236f29dbc25Smrg WRITE_VID32(0X4, orig_value); 237f29dbc25Smrg return; 238f29dbc25Smrg } /*end if() */ 239f29dbc25Smrg } /*end for() */ 240f29dbc25Smrg 241f29dbc25Smrg} 242f29dbc25Smrg 243f29dbc25Smrgvoid 244f29dbc25SmrgDorado9211SetCS(void) 245f29dbc25Smrg{ 246f29dbc25Smrg unsigned long value; 247f29dbc25Smrg 248f29dbc25Smrg value = gfx_ind(DRD_CSP9211IN); 249f29dbc25Smrg gfx_outd(DRD_CSP9211OUT, value | DRD_CS9211); 250f29dbc25Smrg} 251f29dbc25Smrg 252f29dbc25Smrgvoid 253f29dbc25SmrgDorado9211ClearCS(void) 254f29dbc25Smrg{ 255f29dbc25Smrg unsigned long value; 256f29dbc25Smrg 257f29dbc25Smrg value = gfx_ind(DRD_CSP9211IN); 258f29dbc25Smrg gfx_outd(DRD_CSP9211OUT, value & (~DRD_CS9211)); 259f29dbc25Smrg} 260f29dbc25Smrg 261f29dbc25Smrgvoid 262f29dbc25SmrgDorado9211SetDataOut(void) 263f29dbc25Smrg{ 264f29dbc25Smrg unsigned long value; 265f29dbc25Smrg 266f29dbc25Smrg value = gfx_ind(DRD_DATAOUTP9211IN); 267f29dbc25Smrg gfx_outd(DRD_DATAOUTP9211OUT, value | DRD_DATAIN9211); 268f29dbc25Smrg} 269f29dbc25Smrg 270f29dbc25Smrgvoid 271f29dbc25SmrgDorado9211ClearDataOut(void) 272f29dbc25Smrg{ 273f29dbc25Smrg unsigned long value; 274f29dbc25Smrg 275f29dbc25Smrg value = gfx_ind(DRD_DATAOUTP9211IN); 276f29dbc25Smrg gfx_outd(DRD_DATAOUTP9211OUT, value & (~DRD_DATAIN9211)); 277f29dbc25Smrg} 278f29dbc25Smrg 279f29dbc25Smrgunsigned char 280f29dbc25SmrgDorado9211ReadDataIn(void) 281f29dbc25Smrg{ 282f29dbc25Smrg unsigned char readdata = 0; 283f29dbc25Smrg unsigned long value; 284f29dbc25Smrg 285f29dbc25Smrg /* why to read 4 times ??? */ 286f29dbc25Smrg value = gfx_ind(DRD_DATAINP9211IN); 287f29dbc25Smrg value = gfx_ind(DRD_DATAINP9211IN); 288f29dbc25Smrg value = gfx_ind(DRD_DATAINP9211IN); 289f29dbc25Smrg value = gfx_ind(DRD_DATAINP9211IN); 290f29dbc25Smrg if (value & DRD_DATAOUT9211) 291f29dbc25Smrg readdata = 1; 292f29dbc25Smrg return (readdata); 293f29dbc25Smrg} 294f29dbc25Smrg 295f29dbc25Smrgvoid 296f29dbc25SmrgDorado9211ToggleClock(void) 297f29dbc25Smrg{ 298f29dbc25Smrg Dorado9211SetClock(); 299f29dbc25Smrg Dorado9211ClearClock(); 300f29dbc25Smrg} 301f29dbc25Smrg 302f29dbc25Smrgvoid 303f29dbc25SmrgDorado9211SetClock(void) 304f29dbc25Smrg{ 305f29dbc25Smrg unsigned long value; 306f29dbc25Smrg 307f29dbc25Smrg value = gfx_ind(DRD_CLOCKP9211IN); 308f29dbc25Smrg gfx_outd(DRD_CLOCKP9211OUT, value | DRD_CLOCK9211); 309f29dbc25Smrg} 310f29dbc25Smrg 311f29dbc25Smrgvoid 312f29dbc25SmrgDorado9211ClearClock(void) 313f29dbc25Smrg{ 314f29dbc25Smrg unsigned long value; 315f29dbc25Smrg 316f29dbc25Smrg value = gfx_ind(DRD_CLOCKP9211IN); 317f29dbc25Smrg gfx_outd(DRD_CLOCKP9211OUT, value & (~DRD_CLOCK9211)); 318f29dbc25Smrg} 319f29dbc25Smrg 320f29dbc25Smrgvoid 321f29dbc25SmrgDorado9211GpioInit(void) 322f29dbc25Smrg{ 323f29dbc25Smrg unsigned long value; 324f29dbc25Smrg 325f29dbc25Smrg /* set output enable on gpio 7, 9, 11 */ 326f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_CLOCK9211CFG); 327f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 3); 328f29dbc25Smrg /* set output enable on gpio 7, 9, 11 */ 329f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_CS9211CFG); 330f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 3); 331f29dbc25Smrg /* set output enable on gpio 7, 9, 18 */ 332f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_DATAIN9211CFG); 333f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 3); 334f29dbc25Smrg /* disable on gpio 11 - This is the output from the 9211 */ 335f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_SEL), DRD_DATAOUT9211CFG); 336f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPPIN_CFG), 0); 337f29dbc25Smrg /* Set all PINS low */ 338f29dbc25Smrg value = gfx_ind(DRD_GEODE_GPIO_BASE + DRD_GEODE_GPDI0); 339f29dbc25Smrg value &= ~(DRD_CS9211 | DRD_CLOCK9211 | DRD_DATAIN9211); 340f29dbc25Smrg gfx_outd((DRD_GEODE_GPIO_BASE + DRD_GEODE_GPDO0), value); 341f29dbc25Smrg} 342f29dbc25Smrg 343f29dbc25Smrgunsigned long 344f29dbc25SmrgDorado9211ReadReg(unsigned short index) 345f29dbc25Smrg{ 346f29dbc25Smrg 347f29dbc25Smrg unsigned char i, readbit; 348f29dbc25Smrg unsigned long data; 349f29dbc25Smrg 350f29dbc25Smrg Dorado9211ClearDataOut(); 351f29dbc25Smrg 352f29dbc25Smrg Dorado9211SetCS(); 353f29dbc25Smrg Dorado9211ToggleClock(); 354f29dbc25Smrg 355f29dbc25Smrg Dorado9211SetDataOut(); 356f29dbc25Smrg Dorado9211ToggleClock(); 357f29dbc25Smrg 358f29dbc25Smrg for (i = 0; i < 12; i++) { 359f29dbc25Smrg if (index & 0x1) { 360f29dbc25Smrg Dorado9211SetDataOut(); 361f29dbc25Smrg } else { 362f29dbc25Smrg Dorado9211ClearDataOut(); 363f29dbc25Smrg } 364f29dbc25Smrg Dorado9211ToggleClock(); 365f29dbc25Smrg index >>= 1; 366f29dbc25Smrg } 367f29dbc25Smrg 368f29dbc25Smrg Dorado9211ClearDataOut(); 369f29dbc25Smrg Dorado9211ToggleClock(); 370f29dbc25Smrg 371f29dbc25Smrg /* Idle clock, 7 clocks, no data set */ 372f29dbc25Smrg 373f29dbc25Smrg Dorado9211ToggleClock(); 374f29dbc25Smrg Dorado9211ToggleClock(); 375f29dbc25Smrg Dorado9211ToggleClock(); 376f29dbc25Smrg Dorado9211ToggleClock(); 377f29dbc25Smrg Dorado9211ToggleClock(); 378f29dbc25Smrg Dorado9211ToggleClock(); 379f29dbc25Smrg Dorado9211ToggleClock(); 380f29dbc25Smrg 381f29dbc25Smrg data = 0; 382f29dbc25Smrg for (i = 0; i < 32; i++) { 383f29dbc25Smrg Dorado9211ToggleClock(); 384f29dbc25Smrg readbit = Dorado9211ReadDataIn(); 385f29dbc25Smrg data |= (((unsigned long)readbit) << i); 386f29dbc25Smrg } 387f29dbc25Smrg 388f29dbc25Smrg Dorado9211ClearCS(); 389f29dbc25Smrg Dorado9211ToggleClock(); 390f29dbc25Smrg return (data); 391f29dbc25Smrg 392f29dbc25Smrg} 393f29dbc25Smrg 394f29dbc25Smrgvoid 395f29dbc25SmrgDorado9211WriteReg(unsigned short index, unsigned long data) 396f29dbc25Smrg{ 397f29dbc25Smrg 398f29dbc25Smrg unsigned char i; 399f29dbc25Smrg 400f29dbc25Smrg Dorado9211ClearDataOut(); 401f29dbc25Smrg Dorado9211SetDataOut(); 402f29dbc25Smrg Dorado9211SetCS(); 403f29dbc25Smrg Dorado9211ToggleClock(); 404f29dbc25Smrg Dorado9211SetDataOut(); 405f29dbc25Smrg Dorado9211ToggleClock(); 406f29dbc25Smrg 407f29dbc25Smrg for (i = 0; i < 12; i++) { 408f29dbc25Smrg if (index & 0x1) { 409f29dbc25Smrg Dorado9211SetDataOut(); 410f29dbc25Smrg } else { 411f29dbc25Smrg Dorado9211ClearDataOut(); 412f29dbc25Smrg } 413f29dbc25Smrg Dorado9211ToggleClock(); 414f29dbc25Smrg index >>= 1; 415f29dbc25Smrg } 416f29dbc25Smrg 417f29dbc25Smrg Dorado9211SetDataOut(); 418f29dbc25Smrg Dorado9211ToggleClock(); 419f29dbc25Smrg 420f29dbc25Smrg for (i = 0; i < 32; i++) { 421f29dbc25Smrg if (data & 0x1) { 422f29dbc25Smrg Dorado9211SetDataOut(); 423f29dbc25Smrg } else { 424f29dbc25Smrg Dorado9211ClearDataOut(); 425f29dbc25Smrg } 426f29dbc25Smrg Dorado9211ToggleClock(); 427f29dbc25Smrg data >>= 1; 428f29dbc25Smrg } 429f29dbc25Smrg 430f29dbc25Smrg Dorado9211ClearCS(); 431f29dbc25Smrg 432f29dbc25Smrg Dorado9211ToggleClock(); 433f29dbc25Smrg Dorado9211ToggleClock(); 434f29dbc25Smrg Dorado9211ToggleClock(); 435f29dbc25Smrg Dorado9211ToggleClock(); 436f29dbc25Smrg} 437f29dbc25Smrg 438f29dbc25Smrgvoid 439f29dbc25SmrgDoradoProgramFRMload(void) 440f29dbc25Smrg{ 441f29dbc25Smrg unsigned long DoradoFRMtable[] = { 442f29dbc25Smrg 443f29dbc25Smrg 0x00000000, 444f29dbc25Smrg 0x00000000, 445f29dbc25Smrg 0x01000100, 446f29dbc25Smrg 0x01000100, 447f29dbc25Smrg 0x01010101, 448f29dbc25Smrg 0x01010101, 449f29dbc25Smrg 0x02081041, 450f29dbc25Smrg 0x02081041, 451f29dbc25Smrg 0x10111111, 452f29dbc25Smrg 0x11111101, 453f29dbc25Smrg 0x49249241, 454f29dbc25Smrg 0x12412492, 455f29dbc25Smrg 0x92244891, 456f29dbc25Smrg 0x92244891, 457f29dbc25Smrg 0x22252525, 458f29dbc25Smrg 0x22252525, 459f29dbc25Smrg 0x528294a5, 460f29dbc25Smrg 0x2528494a, 461f29dbc25Smrg 0x294a5295, 462f29dbc25Smrg 0x294a5295, 463f29dbc25Smrg 0x54a54a95, 464f29dbc25Smrg 0x2952a52a, 465f29dbc25Smrg 0x2a552a55, 466f29dbc25Smrg 0x2a552a55, 467f29dbc25Smrg 0x554aa955, 468f29dbc25Smrg 0x2a9552aa, 469f29dbc25Smrg 0x2aaa5555, 470f29dbc25Smrg 0x2aaa5555, 471f29dbc25Smrg 0x55555555, 472f29dbc25Smrg 0x2aaaaaaa, 473f29dbc25Smrg 0x55555555, 474f29dbc25Smrg 0x55555555, 475f29dbc25Smrg 0xaaaaaaab, 476f29dbc25Smrg 0x55555555, 477f29dbc25Smrg 0x5555aaab, 478f29dbc25Smrg 0x5555aaab, 479f29dbc25Smrg 0xaab556ab, 480f29dbc25Smrg 0x556aad55, 481f29dbc25Smrg 0x55ab55ab, 482f29dbc25Smrg 0x55ab55ab, 483f29dbc25Smrg 0xab5ab56b, 484f29dbc25Smrg 0x56ad5ad5, 485f29dbc25Smrg 0x56b5ad6b, 486f29dbc25Smrg 0x56b5ad6b, 487f29dbc25Smrg 0xad6d6b5b, 488f29dbc25Smrg 0x5ad6b6b6, 489f29dbc25Smrg 0x5b5b5b5b, 490f29dbc25Smrg 0x5b5b5b5b, 491f29dbc25Smrg 0x5F6db6db, 492f29dbc25Smrg 0x5F6db6db, 493f29dbc25Smrg 0xF776F776, 494f29dbc25Smrg 0xF776F776, 495f29dbc25Smrg 0xFBDEFBDE, 496f29dbc25Smrg 0xFBDEFBDE, 497f29dbc25Smrg 0x7eFFBFF7, 498f29dbc25Smrg 0x7eFFBFF7, 499f29dbc25Smrg 0xFF7FF7F7, 500f29dbc25Smrg 0xFF7FF7F7, 501f29dbc25Smrg 0xFF7FFF7F, 502f29dbc25Smrg 0xFF7FFF7F, 503f29dbc25Smrg 0xFFF7FFFF, 504f29dbc25Smrg 0xFFF7FFFF, 505f29dbc25Smrg 0xFFFFFFFF, 506f29dbc25Smrg 0xFFFFFFFF, 507f29dbc25Smrg }; 508f29dbc25Smrg 509f29dbc25Smrg unsigned char i; 510f29dbc25Smrg unsigned short index; 511f29dbc25Smrg unsigned long data; 512f29dbc25Smrg 513f29dbc25Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_INDEX, 0); 514f29dbc25Smrg index = CS92xx_FRM_MEMORY_DATA; 515f29dbc25Smrg for (i = 0; i < 64; i += 2) { 516f29dbc25Smrg data = DoradoFRMtable[i]; 517f29dbc25Smrg Dorado9211WriteReg(index, data); 518f29dbc25Smrg data = DoradoFRMtable[i + 1]; 519f29dbc25Smrg Dorado9211WriteReg(index, data); 520f29dbc25Smrg } 521f29dbc25Smrg 522f29dbc25Smrg/* 523f29dbc25Smrg * The first FRM location (64 bits) does not program correctly. 524f29dbc25Smrg * This location always reads back with the last value programmed. 525f29dbc25Smrg * ie. If 32 64-bit values are programmed, location 0 reads back as the 32nd 526f29dbc25Smrg * If 30 locations are programmed, location 0 reads back as the 30th, etc. 527f29dbc25Smrg * Fix this by re-writing location 0 after programming all 64 in the writeFRM 528f29dbc25Smrg * loop in RevCFrmload() in CS9211. 529f29dbc25Smrg */ 530f29dbc25Smrg 531f29dbc25Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_INDEX, 0); 532f29dbc25Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_DATA, 0); 533f29dbc25Smrg Dorado9211WriteReg(CS92xx_FRM_MEMORY_DATA, 0); 534f29dbc25Smrg 535f29dbc25Smrg} 536f29dbc25Smrg 537f29dbc25Smrg/***************************************************************************** 538f29dbc25Smrg * void Dorado_Enable_Power((void); 539f29dbc25Smrg * Enables the power of the CX9211 on Dorado board. 540f29dbc25Smrg ***************************************************************************** 541f29dbc25Smrg */ 542f29dbc25Smrg 543f29dbc25Smrgvoid 544f29dbc25SmrgDorado_Power_Up(void) 545f29dbc25Smrg{ 546f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, 0x01000000); 547f29dbc25Smrg return; 548f29dbc25Smrg 549f29dbc25Smrg} /* disable_Centaurus_Power */ 550f29dbc25Smrg 551f29dbc25Smrg/***************************************************************************** 552f29dbc25Smrg * void Dorado_Disable_Power((void); 553f29dbc25Smrg * Disables the power of the CX9211 on Dorado board. 554f29dbc25Smrg ***************************************************************************** 555f29dbc25Smrg */ 556f29dbc25Smrg 557f29dbc25Smrgvoid 558f29dbc25SmrgDorado_Power_Down(void) 559f29dbc25Smrg{ 560f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, 0x0); 561f29dbc25Smrg return; 562f29dbc25Smrg 563f29dbc25Smrg} /* disable_Centaurus_Power */ 564f29dbc25Smrg 565f29dbc25Smrgvoid 566f29dbc25SmrgDorado_Save_Panel_State(void) 567f29dbc25Smrg{ 568f29dbc25Smrg 569f29dbc25Smrg /* set 9211 registers using the desired panel settings */ 570f29dbc25Smrg cs9211_regs.panel_timing1 = Dorado9211ReadReg(CS92xx_LCD_PAN_TIMING1); 571f29dbc25Smrg cs9211_regs.panel_timing2 = Dorado9211ReadReg(CS92xx_LCD_PAN_TIMING2); 572f29dbc25Smrg 573f29dbc25Smrg cs9211_regs.dither_frc_ctrl = Dorado9211ReadReg(CS92xx_LCD_DITH_FR_CNTRL); 574f29dbc25Smrg cs9211_regs.blue_lsfr_seed = Dorado9211ReadReg(CS92xx_BLUE_LSFR_SEED); 575f29dbc25Smrg cs9211_regs.red_green_lsfr_seed = 576f29dbc25Smrg Dorado9211ReadReg(CS92xx_RED_GREEN_LSFR_SEED); 577f29dbc25Smrg 578f29dbc25Smrg /* CentaurusProgramFRMload(); */ 579f29dbc25Smrg cs9211_regs.memory_control = Dorado9211ReadReg(CS92xx_LCD_MEM_CNTRL); 580f29dbc25Smrg 581f29dbc25Smrg /* Set the power register last. This will turn the panel on at the 9211 */ 582f29dbc25Smrg cs9211_regs.power_management = Dorado9211ReadReg(CS92xx_LCD_PWR_MAN); 583f29dbc25Smrg cs9211_regs.panel_state = cs9211_regs.power_management; 584f29dbc25Smrg} 585f29dbc25Smrg 586f29dbc25Smrgvoid 587f29dbc25SmrgDorado_Restore_Panel_State(void) 588f29dbc25Smrg{ 589f29dbc25Smrg unsigned long off_data = 0; 590f29dbc25Smrg 591f29dbc25Smrg /* Before restoring the 9211 registers, power off the 9211. */ 592f29dbc25Smrg 593f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, off_data); 594f29dbc25Smrg 595f29dbc25Smrg /* set 9211 registers using the desired panel settings */ 596f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING1, cs9211_regs.panel_timing1); 597f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PAN_TIMING2, cs9211_regs.panel_timing2); 598f29dbc25Smrg /* load the LSFR seeds */ 599f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_DITH_FR_CNTRL, cs9211_regs.dither_frc_ctrl); 600f29dbc25Smrg Dorado9211WriteReg(CS92xx_BLUE_LSFR_SEED, cs9211_regs.blue_lsfr_seed); 601f29dbc25Smrg Dorado9211WriteReg(CS92xx_RED_GREEN_LSFR_SEED, 602f29dbc25Smrg cs9211_regs.red_green_lsfr_seed); 603f29dbc25Smrg 604f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_MEM_CNTRL, cs9211_regs.memory_control); 605f29dbc25Smrg /* Set the power register last. This will turn the panel on at the 9211 */ 606f29dbc25Smrg Dorado9211WriteReg(CS92xx_LCD_PWR_MAN, cs9211_regs.power_management); 607f29dbc25Smrg} 608