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