dora9211.c revision 71d7fec4
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