1f7018c21STomi Valkeinen /*
2f7018c21STomi Valkeinen * linux/drivers/video/kyro/STG4000Ramdac.c
3f7018c21STomi Valkeinen *
4f7018c21STomi Valkeinen * Copyright (C) 2002 STMicroelectronics
5f7018c21STomi Valkeinen *
6f7018c21STomi Valkeinen * This file is subject to the terms and conditions of the GNU General Public
7f7018c21STomi Valkeinen * License. See the file COPYING in the main directory of this archive
8f7018c21STomi Valkeinen * for more details.
9f7018c21STomi Valkeinen */
10f7018c21STomi Valkeinen
11f7018c21STomi Valkeinen #include <linux/kernel.h>
12f7018c21STomi Valkeinen #include <linux/errno.h>
13f7018c21STomi Valkeinen #include <linux/types.h>
14f7018c21STomi Valkeinen #include <video/kyro.h>
15f7018c21STomi Valkeinen
16f7018c21STomi Valkeinen #include "STG4000Reg.h"
17f7018c21STomi Valkeinen #include "STG4000Interface.h"
18f7018c21STomi Valkeinen
19f7018c21STomi Valkeinen static u32 STG_PIXEL_BUS_WIDTH = 128; /* 128 bit bus width */
20f7018c21STomi Valkeinen static u32 REF_CLOCK = 14318;
21f7018c21STomi Valkeinen
InitialiseRamdac(volatile STG4000REG __iomem * pSTGReg,u32 displayDepth,u32 displayWidth,u32 displayHeight,s32 HSyncPolarity,s32 VSyncPolarity,u32 * pixelClock)22f7018c21STomi Valkeinen int InitialiseRamdac(volatile STG4000REG __iomem * pSTGReg,
23f7018c21STomi Valkeinen u32 displayDepth,
24f7018c21STomi Valkeinen u32 displayWidth,
25f7018c21STomi Valkeinen u32 displayHeight,
26f7018c21STomi Valkeinen s32 HSyncPolarity,
27f7018c21STomi Valkeinen s32 VSyncPolarity, u32 * pixelClock)
28f7018c21STomi Valkeinen {
29f7018c21STomi Valkeinen u32 tmp = 0;
30f7018c21STomi Valkeinen u32 F = 0, R = 0, P = 0;
31f7018c21STomi Valkeinen u32 stride = 0;
32f7018c21STomi Valkeinen u32 ulPdiv = 0;
33f7018c21STomi Valkeinen u32 physicalPixelDepth = 0;
34f7018c21STomi Valkeinen /* Make sure DAC is in Reset */
35f7018c21STomi Valkeinen tmp = STG_READ_REG(SoftwareReset);
36f7018c21STomi Valkeinen
37f7018c21STomi Valkeinen if (tmp & 0x1) {
38f7018c21STomi Valkeinen CLEAR_BIT(1);
39f7018c21STomi Valkeinen STG_WRITE_REG(SoftwareReset, tmp);
40f7018c21STomi Valkeinen }
41f7018c21STomi Valkeinen
42f7018c21STomi Valkeinen /* Set Pixel Format */
43f7018c21STomi Valkeinen tmp = STG_READ_REG(DACPixelFormat);
44f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 2);
45f7018c21STomi Valkeinen
46f7018c21STomi Valkeinen /* Set LUT not used from 16bpp to 32 bpp ??? */
47f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(8, 9);
48f7018c21STomi Valkeinen
49f7018c21STomi Valkeinen switch (displayDepth) {
50f7018c21STomi Valkeinen case 16:
51f7018c21STomi Valkeinen {
52f7018c21STomi Valkeinen physicalPixelDepth = 16;
53f7018c21STomi Valkeinen tmp |= _16BPP;
54f7018c21STomi Valkeinen break;
55f7018c21STomi Valkeinen }
56f7018c21STomi Valkeinen case 32:
57f7018c21STomi Valkeinen {
58f7018c21STomi Valkeinen /* Set for 32 bits per pixel */
59f7018c21STomi Valkeinen physicalPixelDepth = 32;
60f7018c21STomi Valkeinen tmp |= _32BPP;
61f7018c21STomi Valkeinen break;
62f7018c21STomi Valkeinen }
63f7018c21STomi Valkeinen default:
64f7018c21STomi Valkeinen return -EINVAL;
65f7018c21STomi Valkeinen }
66f7018c21STomi Valkeinen
67f7018c21STomi Valkeinen STG_WRITE_REG(DACPixelFormat, tmp);
68f7018c21STomi Valkeinen
69f7018c21STomi Valkeinen /* Workout Bus transfer bandwidth according to pixel format */
70f7018c21STomi Valkeinen ulPdiv = STG_PIXEL_BUS_WIDTH / physicalPixelDepth;
71f7018c21STomi Valkeinen
72f7018c21STomi Valkeinen /* Get Screen Stride in pixels */
73f7018c21STomi Valkeinen stride = displayWidth;
74f7018c21STomi Valkeinen
75f7018c21STomi Valkeinen /* Set Primary size info */
76f7018c21STomi Valkeinen tmp = STG_READ_REG(DACPrimSize);
77f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 10);
78f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(12, 31);
79f7018c21STomi Valkeinen tmp |=
80f7018c21STomi Valkeinen ((((displayHeight - 1) << 12) | (((displayWidth / ulPdiv) -
81f7018c21STomi Valkeinen 1) << 23))
82f7018c21STomi Valkeinen | (stride / ulPdiv));
83f7018c21STomi Valkeinen STG_WRITE_REG(DACPrimSize, tmp);
84f7018c21STomi Valkeinen
85f7018c21STomi Valkeinen
86f7018c21STomi Valkeinen /* Set Pixel Clock */
87f7018c21STomi Valkeinen *pixelClock = ProgramClock(REF_CLOCK, *pixelClock, &F, &R, &P);
88f7018c21STomi Valkeinen
89f7018c21STomi Valkeinen /* Set DAC PLL Mode */
90f7018c21STomi Valkeinen tmp = STG_READ_REG(DACPLLMode);
91f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 15);
92f7018c21STomi Valkeinen /* tmp |= ((P-1) | ((F-2) << 2) | ((R-2) << 11)); */
93f7018c21STomi Valkeinen tmp |= ((P) | ((F - 2) << 2) | ((R - 2) << 11));
94f7018c21STomi Valkeinen STG_WRITE_REG(DACPLLMode, tmp);
95f7018c21STomi Valkeinen
96f7018c21STomi Valkeinen /* Set Prim Address */
97f7018c21STomi Valkeinen tmp = STG_READ_REG(DACPrimAddress);
98f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 20);
99f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(20, 31);
100f7018c21STomi Valkeinen STG_WRITE_REG(DACPrimAddress, tmp);
101f7018c21STomi Valkeinen
102f7018c21STomi Valkeinen /* Set Cursor details with HW Cursor disabled */
103f7018c21STomi Valkeinen tmp = STG_READ_REG(DACCursorCtrl);
104f7018c21STomi Valkeinen tmp &= ~SET_BIT(31);
105f7018c21STomi Valkeinen STG_WRITE_REG(DACCursorCtrl, tmp);
106f7018c21STomi Valkeinen
107f7018c21STomi Valkeinen tmp = STG_READ_REG(DACCursorAddr);
108f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 20);
109f7018c21STomi Valkeinen STG_WRITE_REG(DACCursorAddr, tmp);
110f7018c21STomi Valkeinen
111f7018c21STomi Valkeinen /* Set Video Window */
112f7018c21STomi Valkeinen tmp = STG_READ_REG(DACVidWinStart);
113f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 10);
114f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(16, 26);
115f7018c21STomi Valkeinen STG_WRITE_REG(DACVidWinStart, tmp);
116f7018c21STomi Valkeinen
117f7018c21STomi Valkeinen tmp = STG_READ_REG(DACVidWinEnd);
118f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 10);
119f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(16, 26);
120f7018c21STomi Valkeinen STG_WRITE_REG(DACVidWinEnd, tmp);
121f7018c21STomi Valkeinen
122f7018c21STomi Valkeinen /* Set DAC Border Color to default */
123f7018c21STomi Valkeinen tmp = STG_READ_REG(DACBorderColor);
124f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(0, 23);
125f7018c21STomi Valkeinen STG_WRITE_REG(DACBorderColor, tmp);
126f7018c21STomi Valkeinen
127f7018c21STomi Valkeinen /* Set Graphics and Overlay Burst Control */
128f7018c21STomi Valkeinen STG_WRITE_REG(DACBurstCtrl, 0x0404);
129f7018c21STomi Valkeinen
130f7018c21STomi Valkeinen /* Set CRC Trigger to default */
131f7018c21STomi Valkeinen tmp = STG_READ_REG(DACCrcTrigger);
132f7018c21STomi Valkeinen CLEAR_BIT(0);
133f7018c21STomi Valkeinen STG_WRITE_REG(DACCrcTrigger, tmp);
134f7018c21STomi Valkeinen
135f7018c21STomi Valkeinen /* Set Video Port Control to default */
136f7018c21STomi Valkeinen tmp = STG_READ_REG(DigVidPortCtrl);
137f7018c21STomi Valkeinen CLEAR_BIT(8);
138f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(16, 27);
139f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(1, 3);
140f7018c21STomi Valkeinen CLEAR_BITS_FRM_TO(10, 11);
141f7018c21STomi Valkeinen STG_WRITE_REG(DigVidPortCtrl, tmp);
142f7018c21STomi Valkeinen
143f7018c21STomi Valkeinen return 0;
144f7018c21STomi Valkeinen }
145f7018c21STomi Valkeinen
146f7018c21STomi Valkeinen /* Ramdac control, turning output to the screen on and off */
DisableRamdacOutput(volatile STG4000REG __iomem * pSTGReg)147f7018c21STomi Valkeinen void DisableRamdacOutput(volatile STG4000REG __iomem * pSTGReg)
148f7018c21STomi Valkeinen {
149f7018c21STomi Valkeinen u32 tmp;
150f7018c21STomi Valkeinen
151f7018c21STomi Valkeinen /* Disable DAC for Graphics Stream Control */
152f7018c21STomi Valkeinen tmp = (STG_READ_REG(DACStreamCtrl)) & ~SET_BIT(0);
153f7018c21STomi Valkeinen STG_WRITE_REG(DACStreamCtrl, tmp);
154f7018c21STomi Valkeinen }
155f7018c21STomi Valkeinen
EnableRamdacOutput(volatile STG4000REG __iomem * pSTGReg)156f7018c21STomi Valkeinen void EnableRamdacOutput(volatile STG4000REG __iomem * pSTGReg)
157f7018c21STomi Valkeinen {
158f7018c21STomi Valkeinen u32 tmp;
159f7018c21STomi Valkeinen
160f7018c21STomi Valkeinen /* Enable DAC for Graphics Stream Control */
161f7018c21STomi Valkeinen tmp = (STG_READ_REG(DACStreamCtrl)) | SET_BIT(0);
162f7018c21STomi Valkeinen STG_WRITE_REG(DACStreamCtrl, tmp);
163f7018c21STomi Valkeinen }
164