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