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