xref: /openbmc/u-boot/drivers/video/pxa_lcd.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
20698095aSJeroen Hofstee /*
30698095aSJeroen Hofstee  * PXA LCD Controller
40698095aSJeroen Hofstee  *
50698095aSJeroen Hofstee  * (C) Copyright 2001-2002
60698095aSJeroen Hofstee  * Wolfgang Denk, DENX Software Engineering -- wd@denx.de
70698095aSJeroen Hofstee  */
80698095aSJeroen Hofstee 
90698095aSJeroen Hofstee /************************************************************************/
100698095aSJeroen Hofstee /* ** HEADER FILES							*/
110698095aSJeroen Hofstee /************************************************************************/
120698095aSJeroen Hofstee 
130698095aSJeroen Hofstee #include <common.h>
140698095aSJeroen Hofstee #include <asm/arch/pxa-regs.h>
150698095aSJeroen Hofstee #include <asm/io.h>
16ab9272f9SMarcel Ziswiler #include <lcd.h>
17ab9272f9SMarcel Ziswiler #include <linux/types.h>
18ab9272f9SMarcel Ziswiler #include <stdarg.h>
19ab9272f9SMarcel Ziswiler #include <stdio_dev.h>
200698095aSJeroen Hofstee 
210698095aSJeroen Hofstee /* #define DEBUG */
220698095aSJeroen Hofstee 
230698095aSJeroen Hofstee #ifdef CONFIG_LCD
240698095aSJeroen Hofstee 
250698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
260698095aSJeroen Hofstee /*
270698095aSJeroen Hofstee  * Define panel bpp, LCCR0, LCCR3 and panel_info video struct for
280698095aSJeroen Hofstee  * your display.
290698095aSJeroen Hofstee  */
300698095aSJeroen Hofstee 
310698095aSJeroen Hofstee #ifdef CONFIG_PXA_VGA
320698095aSJeroen Hofstee /* LCD outputs connected to a video DAC  */
330698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
340698095aSJeroen Hofstee 
350698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
360698095aSJeroen Hofstee # define REG_LCCR0	0x003008f8
370698095aSJeroen Hofstee # define REG_LCCR3	0x0300FF01
380698095aSJeroen Hofstee 
390698095aSJeroen Hofstee /* 640x480x16 @ 61 Hz */
400698095aSJeroen Hofstee vidinfo_t panel_info = {
410698095aSJeroen Hofstee 	.vl_col		= 640,
420698095aSJeroen Hofstee 	.vl_row		= 480,
430698095aSJeroen Hofstee 	.vl_width	= 640,
440698095aSJeroen Hofstee 	.vl_height	= 480,
450698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
460698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_HIGH,
470698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_HIGH,
480698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_HIGH,
490698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
500698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
510698095aSJeroen Hofstee 	.vl_lbw		= 0,
520698095aSJeroen Hofstee 	.vl_splt	= 0,
530698095aSJeroen Hofstee 	.vl_clor	= 0,
540698095aSJeroen Hofstee 	.vl_tft		= 1,
550698095aSJeroen Hofstee 	.vl_hpw		= 40,
560698095aSJeroen Hofstee 	.vl_blw		= 56,
570698095aSJeroen Hofstee 	.vl_elw		= 56,
580698095aSJeroen Hofstee 	.vl_vpw		= 20,
590698095aSJeroen Hofstee 	.vl_bfw		= 8,
600698095aSJeroen Hofstee 	.vl_efw		= 8,
610698095aSJeroen Hofstee };
620698095aSJeroen Hofstee #endif /* CONFIG_PXA_VIDEO */
630698095aSJeroen Hofstee 
640698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
650698095aSJeroen Hofstee #ifdef CONFIG_SHARP_LM8V31
660698095aSJeroen Hofstee 
670698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
680698095aSJeroen Hofstee # define LCD_INVERT_COLORS	/* Needed for colors to be correct, but why?	*/
690698095aSJeroen Hofstee 
700698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
710698095aSJeroen Hofstee # define REG_LCCR0	0x0030087C
720698095aSJeroen Hofstee # define REG_LCCR3	0x0340FF08
730698095aSJeroen Hofstee 
740698095aSJeroen Hofstee vidinfo_t panel_info = {
750698095aSJeroen Hofstee 	.vl_col		= 640,
760698095aSJeroen Hofstee 	.vl_row		= 480,
770698095aSJeroen Hofstee 	.vl_width	= 157,
780698095aSJeroen Hofstee 	.vl_height	= 118,
790698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
800698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_HIGH,
810698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_HIGH,
820698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_HIGH,
830698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
840698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
850698095aSJeroen Hofstee 	.vl_lbw		= 0,
860698095aSJeroen Hofstee 	.vl_splt	= 1,
870698095aSJeroen Hofstee 	.vl_clor	= 1,
880698095aSJeroen Hofstee 	.vl_tft		= 0,
890698095aSJeroen Hofstee 	.vl_hpw		= 1,
900698095aSJeroen Hofstee 	.vl_blw		= 3,
910698095aSJeroen Hofstee 	.vl_elw		= 3,
920698095aSJeroen Hofstee 	.vl_vpw		= 1,
930698095aSJeroen Hofstee 	.vl_bfw		= 0,
940698095aSJeroen Hofstee 	.vl_efw		= 0,
950698095aSJeroen Hofstee };
960698095aSJeroen Hofstee #endif /* CONFIG_SHARP_LM8V31 */
970698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
980698095aSJeroen Hofstee #ifdef CONFIG_VOIPAC_LCD
990698095aSJeroen Hofstee 
1000698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
1010698095aSJeroen Hofstee # define LCD_INVERT_COLORS
1020698095aSJeroen Hofstee 
1030698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
1040698095aSJeroen Hofstee # define REG_LCCR0	0x043008f8
1050698095aSJeroen Hofstee # define REG_LCCR3	0x0340FF08
1060698095aSJeroen Hofstee 
1070698095aSJeroen Hofstee vidinfo_t panel_info = {
1080698095aSJeroen Hofstee 	.vl_col		= 640,
1090698095aSJeroen Hofstee 	.vl_row		= 480,
1100698095aSJeroen Hofstee 	.vl_width	= 157,
1110698095aSJeroen Hofstee 	.vl_height	= 118,
1120698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
1130698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_HIGH,
1140698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_HIGH,
1150698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_HIGH,
1160698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
1170698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
1180698095aSJeroen Hofstee 	.vl_lbw		= 0,
1190698095aSJeroen Hofstee 	.vl_splt	= 1,
1200698095aSJeroen Hofstee 	.vl_clor	= 1,
1210698095aSJeroen Hofstee 	.vl_tft		= 1,
1220698095aSJeroen Hofstee 	.vl_hpw		= 32,
1230698095aSJeroen Hofstee 	.vl_blw		= 144,
1240698095aSJeroen Hofstee 	.vl_elw		= 32,
1250698095aSJeroen Hofstee 	.vl_vpw		= 2,
1260698095aSJeroen Hofstee 	.vl_bfw		= 13,
1270698095aSJeroen Hofstee 	.vl_efw		= 30,
1280698095aSJeroen Hofstee };
1290698095aSJeroen Hofstee #endif /* CONFIG_VOIPAC_LCD */
1300698095aSJeroen Hofstee 
1310698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
1320698095aSJeroen Hofstee #ifdef CONFIG_HITACHI_SX14
1330698095aSJeroen Hofstee /* Hitachi SX14Q004-ZZA color STN LCD */
1340698095aSJeroen Hofstee #define LCD_BPP		LCD_COLOR8
1350698095aSJeroen Hofstee 
1360698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
1370698095aSJeroen Hofstee #define REG_LCCR0	0x00301079
1380698095aSJeroen Hofstee #define REG_LCCR3	0x0340FF20
1390698095aSJeroen Hofstee 
1400698095aSJeroen Hofstee vidinfo_t panel_info = {
1410698095aSJeroen Hofstee 	.vl_col		= 320,
1420698095aSJeroen Hofstee 	.vl_row		= 240,
1430698095aSJeroen Hofstee 	.vl_width	= 167,
1440698095aSJeroen Hofstee 	.vl_height	= 109,
1450698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
1460698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_HIGH,
1470698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_HIGH,
1480698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_HIGH,
1490698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
1500698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
1510698095aSJeroen Hofstee 	.vl_lbw		= 1,
1520698095aSJeroen Hofstee 	.vl_splt	= 0,
1530698095aSJeroen Hofstee 	.vl_clor	= 1,
1540698095aSJeroen Hofstee 	.vl_tft		= 0,
1550698095aSJeroen Hofstee 	.vl_hpw		= 1,
1560698095aSJeroen Hofstee 	.vl_blw		= 1,
1570698095aSJeroen Hofstee 	.vl_elw		= 1,
1580698095aSJeroen Hofstee 	.vl_vpw		= 7,
1590698095aSJeroen Hofstee 	.vl_bfw		= 0,
1600698095aSJeroen Hofstee 	.vl_efw		= 0,
1610698095aSJeroen Hofstee };
1620698095aSJeroen Hofstee #endif /* CONFIG_HITACHI_SX14 */
1630698095aSJeroen Hofstee 
1640698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
1650698095aSJeroen Hofstee #ifdef CONFIG_LMS283GF05
1660698095aSJeroen Hofstee 
1670698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
16809bffbf6STom Rini /*# define LCD_INVERT_COLORS*/
1690698095aSJeroen Hofstee 
1700698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
1710698095aSJeroen Hofstee # define REG_LCCR0	0x043008f8
1720698095aSJeroen Hofstee # define REG_LCCR3	0x03b00009
1730698095aSJeroen Hofstee 
1740698095aSJeroen Hofstee vidinfo_t panel_info = {
1750698095aSJeroen Hofstee 	.vl_col		= 240,
1760698095aSJeroen Hofstee 	.vl_row		= 320,
17759fa089bSVasily Khoruzhick 	.vl_rot		= 3,
1780698095aSJeroen Hofstee 	.vl_width	= 240,
1790698095aSJeroen Hofstee 	.vl_height	= 320,
1800698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
1810698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_LOW,
1820698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_LOW,
1830698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_LOW,
1840698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
1850698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
1860698095aSJeroen Hofstee 	.vl_lbw		= 0,
1870698095aSJeroen Hofstee 	.vl_splt	= 1,
1880698095aSJeroen Hofstee 	.vl_clor	= 1,
1890698095aSJeroen Hofstee 	.vl_tft		= 1,
1900698095aSJeroen Hofstee 	.vl_hpw		= 4,
1910698095aSJeroen Hofstee 	.vl_blw		= 4,
1920698095aSJeroen Hofstee 	.vl_elw		= 8,
1930698095aSJeroen Hofstee 	.vl_vpw		= 4,
1940698095aSJeroen Hofstee 	.vl_bfw		= 4,
1950698095aSJeroen Hofstee 	.vl_efw		= 8,
1960698095aSJeroen Hofstee };
1970698095aSJeroen Hofstee #endif /* CONFIG_LMS283GF05 */
1980698095aSJeroen Hofstee 
1990698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
2000698095aSJeroen Hofstee 
2010698095aSJeroen Hofstee #ifdef CONFIG_ACX517AKN
2020698095aSJeroen Hofstee 
2030698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
2040698095aSJeroen Hofstee 
2050698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
2060698095aSJeroen Hofstee # define REG_LCCR0	0x003008f9
2070698095aSJeroen Hofstee # define REG_LCCR3	0x03700006
2080698095aSJeroen Hofstee 
2090698095aSJeroen Hofstee vidinfo_t panel_info = {
2100698095aSJeroen Hofstee 	.vl_col		= 320,
2110698095aSJeroen Hofstee 	.vl_row		= 320,
2120698095aSJeroen Hofstee 	.vl_width	= 320,
2130698095aSJeroen Hofstee 	.vl_height	= 320,
2140698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
2150698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_LOW,
2160698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_LOW,
2170698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_LOW,
2180698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
2190698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
2200698095aSJeroen Hofstee 	.vl_lbw		= 0,
2210698095aSJeroen Hofstee 	.vl_splt	= 1,
2220698095aSJeroen Hofstee 	.vl_clor	= 1,
2230698095aSJeroen Hofstee 	.vl_tft		= 1,
2240698095aSJeroen Hofstee 	.vl_hpw		= 0x04,
2250698095aSJeroen Hofstee 	.vl_blw		= 0x1c,
2260698095aSJeroen Hofstee 	.vl_elw		= 0x08,
2270698095aSJeroen Hofstee 	.vl_vpw		= 0x01,
2280698095aSJeroen Hofstee 	.vl_bfw		= 0x07,
2290698095aSJeroen Hofstee 	.vl_efw		= 0x08,
2300698095aSJeroen Hofstee };
2310698095aSJeroen Hofstee #endif /* CONFIG_ACX517AKN */
2320698095aSJeroen Hofstee 
23398eda338SMike Dunn #ifdef CONFIG_ACX544AKN
23498eda338SMike Dunn 
23598eda338SMike Dunn # define LCD_BPP	LCD_COLOR16
23698eda338SMike Dunn 
23798eda338SMike Dunn /* you have to set lccr0 and lccr3 (including pcd) */
23898eda338SMike Dunn # define REG_LCCR0	0x003008f9
23998eda338SMike Dunn # define REG_LCCR3	0x04700007 /* 16bpp */
24098eda338SMike Dunn 
24198eda338SMike Dunn vidinfo_t panel_info = {
24298eda338SMike Dunn 	.vl_col		= 320,
24398eda338SMike Dunn 	.vl_row		= 320,
24498eda338SMike Dunn 	.vl_width	= 320,
24598eda338SMike Dunn 	.vl_height	= 320,
24698eda338SMike Dunn 	.vl_clkp	= CONFIG_SYS_LOW,
24798eda338SMike Dunn 	.vl_oep		= CONFIG_SYS_LOW,
24898eda338SMike Dunn 	.vl_hsp		= CONFIG_SYS_LOW,
24998eda338SMike Dunn 	.vl_vsp		= CONFIG_SYS_LOW,
25098eda338SMike Dunn 	.vl_dp		= CONFIG_SYS_LOW,
25198eda338SMike Dunn 	.vl_bpix	= LCD_BPP,
25298eda338SMike Dunn 	.vl_lbw		= 0,
25398eda338SMike Dunn 	.vl_splt	= 0,
25498eda338SMike Dunn 	.vl_clor	= 1,
25598eda338SMike Dunn 	.vl_tft		= 1,
25698eda338SMike Dunn 	.vl_hpw		= 0x05,
25798eda338SMike Dunn 	.vl_blw		= 0x13,
25898eda338SMike Dunn 	.vl_elw		= 0x08,
25998eda338SMike Dunn 	.vl_vpw		= 0x02,
26098eda338SMike Dunn 	.vl_bfw		= 0x07,
26198eda338SMike Dunn 	.vl_efw		= 0x05,
26298eda338SMike Dunn };
26398eda338SMike Dunn #endif /* CONFIG_ACX544AKN */
26498eda338SMike Dunn 
2650698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
2660698095aSJeroen Hofstee 
2670698095aSJeroen Hofstee #ifdef CONFIG_LQ038J7DH53
2680698095aSJeroen Hofstee 
2690698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
2700698095aSJeroen Hofstee 
2710698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
2720698095aSJeroen Hofstee # define REG_LCCR0	0x003008f9
2730698095aSJeroen Hofstee # define REG_LCCR3	0x03700004
2740698095aSJeroen Hofstee 
2750698095aSJeroen Hofstee vidinfo_t panel_info = {
2760698095aSJeroen Hofstee 	.vl_col		= 320,
2770698095aSJeroen Hofstee 	.vl_row		= 480,
2780698095aSJeroen Hofstee 	.vl_width	= 320,
2790698095aSJeroen Hofstee 	.vl_height	= 480,
2800698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
2810698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_LOW,
2820698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_LOW,
2830698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_LOW,
2840698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
2850698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
2860698095aSJeroen Hofstee 	.vl_lbw		= 0,
2870698095aSJeroen Hofstee 	.vl_splt	= 1,
2880698095aSJeroen Hofstee 	.vl_clor	= 1,
2890698095aSJeroen Hofstee 	.vl_tft		= 1,
2900698095aSJeroen Hofstee 	.vl_hpw		= 0x04,
2910698095aSJeroen Hofstee 	.vl_blw		= 0x20,
2920698095aSJeroen Hofstee 	.vl_elw		= 0x01,
2930698095aSJeroen Hofstee 	.vl_vpw		= 0x01,
2940698095aSJeroen Hofstee 	.vl_bfw		= 0x04,
2950698095aSJeroen Hofstee 	.vl_efw		= 0x01,
2960698095aSJeroen Hofstee };
2970698095aSJeroen Hofstee #endif /* CONFIG_ACX517AKN */
2980698095aSJeroen Hofstee 
2990698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
3000698095aSJeroen Hofstee 
3010698095aSJeroen Hofstee #ifdef CONFIG_LITTLETON_LCD
3020698095aSJeroen Hofstee # define LCD_BPP	LCD_COLOR8
3030698095aSJeroen Hofstee 
3040698095aSJeroen Hofstee /* you have to set lccr0 and lccr3 (including pcd) */
3050698095aSJeroen Hofstee # define REG_LCCR0	0x003008f8
3060698095aSJeroen Hofstee # define REG_LCCR3	0x0300FF04
3070698095aSJeroen Hofstee 
3080698095aSJeroen Hofstee vidinfo_t panel_info = {
3090698095aSJeroen Hofstee 	.vl_col		= 480,
3100698095aSJeroen Hofstee 	.vl_row		= 640,
3110698095aSJeroen Hofstee 	.vl_width	= 480,
3120698095aSJeroen Hofstee 	.vl_height	= 640,
3130698095aSJeroen Hofstee 	.vl_clkp	= CONFIG_SYS_HIGH,
3140698095aSJeroen Hofstee 	.vl_oep		= CONFIG_SYS_HIGH,
3150698095aSJeroen Hofstee 	.vl_hsp		= CONFIG_SYS_HIGH,
3160698095aSJeroen Hofstee 	.vl_vsp		= CONFIG_SYS_HIGH,
3170698095aSJeroen Hofstee 	.vl_dp		= CONFIG_SYS_HIGH,
3180698095aSJeroen Hofstee 	.vl_bpix	= LCD_BPP,
3190698095aSJeroen Hofstee 	.vl_lbw		= 0,
3200698095aSJeroen Hofstee 	.vl_splt	= 0,
3210698095aSJeroen Hofstee 	.vl_clor	= 0,
3220698095aSJeroen Hofstee 	.vl_tft		= 1,
3230698095aSJeroen Hofstee 	.vl_hpw		= 9,
3240698095aSJeroen Hofstee 	.vl_blw		= 8,
3250698095aSJeroen Hofstee 	.vl_elw		= 24,
3260698095aSJeroen Hofstee 	.vl_vpw		= 2,
3270698095aSJeroen Hofstee 	.vl_bfw		= 2,
3280698095aSJeroen Hofstee 	.vl_efw		= 4,
3290698095aSJeroen Hofstee };
3300698095aSJeroen Hofstee #endif /* CONFIG_LITTLETON_LCD */
3310698095aSJeroen Hofstee 
3320698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
3330698095aSJeroen Hofstee 
3340698095aSJeroen Hofstee static int pxafb_init_mem (void *lcdbase, vidinfo_t *vid);
3350698095aSJeroen Hofstee static void pxafb_setup_gpio (vidinfo_t *vid);
3360698095aSJeroen Hofstee static void pxafb_enable_controller (vidinfo_t *vid);
3370698095aSJeroen Hofstee static int pxafb_init (vidinfo_t *vid);
3380698095aSJeroen Hofstee 
3390698095aSJeroen Hofstee /************************************************************************/
3400698095aSJeroen Hofstee /* ---------------  PXA chipset specific functions  ------------------- */
3410698095aSJeroen Hofstee /************************************************************************/
3420698095aSJeroen Hofstee 
configuration_get_cmap(void)34338b55087SNikita Kiryanov ushort *configuration_get_cmap(void)
34438b55087SNikita Kiryanov {
34538b55087SNikita Kiryanov 	struct pxafb_info *fbi = &panel_info.pxa;
34638b55087SNikita Kiryanov 	return (ushort *)fbi->palette;
34738b55087SNikita Kiryanov }
34838b55087SNikita Kiryanov 
lcd_ctrl_init(void * lcdbase)3490698095aSJeroen Hofstee void lcd_ctrl_init (void *lcdbase)
3500698095aSJeroen Hofstee {
3510698095aSJeroen Hofstee 	pxafb_init_mem(lcdbase, &panel_info);
3520698095aSJeroen Hofstee 	pxafb_init(&panel_info);
3530698095aSJeroen Hofstee 	pxafb_setup_gpio(&panel_info);
3540698095aSJeroen Hofstee 	pxafb_enable_controller(&panel_info);
3550698095aSJeroen Hofstee }
3560698095aSJeroen Hofstee 
3570698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
3580698095aSJeroen Hofstee #if LCD_BPP == LCD_COLOR8
3590698095aSJeroen Hofstee void
lcd_setcolreg(ushort regno,ushort red,ushort green,ushort blue)3600698095aSJeroen Hofstee lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue)
3610698095aSJeroen Hofstee {
3620698095aSJeroen Hofstee 	struct pxafb_info *fbi = &panel_info.pxa;
3630698095aSJeroen Hofstee 	unsigned short *palette = (unsigned short *)fbi->palette;
3640698095aSJeroen Hofstee 	u_int val;
3650698095aSJeroen Hofstee 
3660698095aSJeroen Hofstee 	if (regno < fbi->palette_size) {
3670698095aSJeroen Hofstee 		val = ((red << 8) & 0xf800);
3680698095aSJeroen Hofstee 		val |= ((green << 4) & 0x07e0);
3690698095aSJeroen Hofstee 		val |= (blue & 0x001f);
3700698095aSJeroen Hofstee 
3710698095aSJeroen Hofstee #ifdef LCD_INVERT_COLORS
3720698095aSJeroen Hofstee 		palette[regno] = ~val;
3730698095aSJeroen Hofstee #else
3740698095aSJeroen Hofstee 		palette[regno] = val;
3750698095aSJeroen Hofstee #endif
3760698095aSJeroen Hofstee 	}
3770698095aSJeroen Hofstee 
3780698095aSJeroen Hofstee 	debug ("setcolreg: reg %2d @ %p: R=%02X G=%02X B=%02X => %04X\n",
3790698095aSJeroen Hofstee 		regno, &palette[regno],
3800698095aSJeroen Hofstee 		red, green, blue,
3810698095aSJeroen Hofstee 		palette[regno]);
3820698095aSJeroen Hofstee }
3830698095aSJeroen Hofstee #endif /* LCD_COLOR8 */
3840698095aSJeroen Hofstee 
3850698095aSJeroen Hofstee /*----------------------------------------------------------------------*/
lcd_enable(void)38686e929e8SMike Dunn __weak void lcd_enable(void)
3870698095aSJeroen Hofstee {
3880698095aSJeroen Hofstee }
3890698095aSJeroen Hofstee 
3900698095aSJeroen Hofstee /************************************************************************/
3910698095aSJeroen Hofstee /* ** PXA255 specific routines						*/
3920698095aSJeroen Hofstee /************************************************************************/
3930698095aSJeroen Hofstee 
3940698095aSJeroen Hofstee /*
3950698095aSJeroen Hofstee  * Calculate fb size for VIDEOLFB_ATAG. Size returned contains fb,
3960698095aSJeroen Hofstee  * descriptors and palette areas.
3970698095aSJeroen Hofstee  */
calc_fbsize(void)3980698095aSJeroen Hofstee ulong calc_fbsize (void)
3990698095aSJeroen Hofstee {
4000698095aSJeroen Hofstee 	ulong size;
4010698095aSJeroen Hofstee 	int line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
4020698095aSJeroen Hofstee 
4030698095aSJeroen Hofstee 	size = line_length * panel_info.vl_row;
4040698095aSJeroen Hofstee 	size += PAGE_SIZE;
4050698095aSJeroen Hofstee 
4060698095aSJeroen Hofstee 	return size;
4070698095aSJeroen Hofstee }
4080698095aSJeroen Hofstee 
pxafb_init_mem(void * lcdbase,vidinfo_t * vid)4090698095aSJeroen Hofstee static int pxafb_init_mem (void *lcdbase, vidinfo_t *vid)
4100698095aSJeroen Hofstee {
4110698095aSJeroen Hofstee 	u_long palette_mem_size;
4120698095aSJeroen Hofstee 	struct pxafb_info *fbi = &vid->pxa;
4130698095aSJeroen Hofstee 	int fb_size = vid->vl_row * (vid->vl_col * NBITS (vid->vl_bpix)) / 8;
4140698095aSJeroen Hofstee 
4150698095aSJeroen Hofstee 	fbi->screen = (u_long)lcdbase;
4160698095aSJeroen Hofstee 
4170698095aSJeroen Hofstee 	fbi->palette_size = NBITS(vid->vl_bpix) == 8 ? 256 : 16;
4180698095aSJeroen Hofstee 	palette_mem_size = fbi->palette_size * sizeof(u16);
4190698095aSJeroen Hofstee 
4200698095aSJeroen Hofstee 	debug("palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size);
4210698095aSJeroen Hofstee 	/* locate palette and descs at end of page following fb */
4220698095aSJeroen Hofstee 	fbi->palette = (u_long)lcdbase + fb_size + PAGE_SIZE - palette_mem_size;
4230698095aSJeroen Hofstee 
4240698095aSJeroen Hofstee 	return 0;
4250698095aSJeroen Hofstee }
4260698095aSJeroen Hofstee #ifdef	CONFIG_CPU_MONAHANS
pxafb_setup_gpio(vidinfo_t * vid)4270698095aSJeroen Hofstee static inline void pxafb_setup_gpio (vidinfo_t *vid) {}
4280698095aSJeroen Hofstee #else
pxafb_setup_gpio(vidinfo_t * vid)4290698095aSJeroen Hofstee static void pxafb_setup_gpio (vidinfo_t *vid)
4300698095aSJeroen Hofstee {
4310698095aSJeroen Hofstee 	u_long lccr0;
4320698095aSJeroen Hofstee 
4330698095aSJeroen Hofstee 	/*
4340698095aSJeroen Hofstee 	 * setup is based on type of panel supported
4350698095aSJeroen Hofstee 	 */
4360698095aSJeroen Hofstee 
4370698095aSJeroen Hofstee 	lccr0 = vid->pxa.reg_lccr0;
4380698095aSJeroen Hofstee 
4390698095aSJeroen Hofstee 	/* 4 bit interface */
4400698095aSJeroen Hofstee 	if ((lccr0 & LCCR0_CMS) && (lccr0 & LCCR0_SDS) && !(lccr0 & LCCR0_DPD))
4410698095aSJeroen Hofstee 	{
4420698095aSJeroen Hofstee 		debug("Setting GPIO for 4 bit data\n");
4430698095aSJeroen Hofstee 		/* bits 58-61 */
4440698095aSJeroen Hofstee 		writel(readl(GPDR1) | (0xf << 26), GPDR1);
4450698095aSJeroen Hofstee 		writel((readl(GAFR1_U) & ~(0xff << 20)) | (0xaa << 20),
4460698095aSJeroen Hofstee 			GAFR1_U);
4470698095aSJeroen Hofstee 
4480698095aSJeroen Hofstee 		/* bits 74-77 */
4490698095aSJeroen Hofstee 		writel(readl(GPDR2) | (0xf << 10), GPDR2);
4500698095aSJeroen Hofstee 		writel((readl(GAFR2_L) & ~(0xff << 20)) | (0xaa << 20),
4510698095aSJeroen Hofstee 			GAFR2_L);
4520698095aSJeroen Hofstee 	}
4530698095aSJeroen Hofstee 
4540698095aSJeroen Hofstee 	/* 8 bit interface */
4550698095aSJeroen Hofstee 	else if (((lccr0 & LCCR0_CMS) && ((lccr0 & LCCR0_SDS) || (lccr0 & LCCR0_DPD))) ||
4560698095aSJeroen Hofstee 		(!(lccr0 & LCCR0_CMS) && !(lccr0 & LCCR0_PAS) && !(lccr0 & LCCR0_SDS)))
4570698095aSJeroen Hofstee 	{
4580698095aSJeroen Hofstee 		debug("Setting GPIO for 8 bit data\n");
4590698095aSJeroen Hofstee 		/* bits 58-65 */
4600698095aSJeroen Hofstee 		writel(readl(GPDR1) | (0x3f << 26), GPDR1);
4610698095aSJeroen Hofstee 		writel(readl(GPDR2) | (0x3), GPDR2);
4620698095aSJeroen Hofstee 
4630698095aSJeroen Hofstee 		writel((readl(GAFR1_U) & ~(0xfff << 20)) | (0xaaa << 20),
4640698095aSJeroen Hofstee 			GAFR1_U);
4650698095aSJeroen Hofstee 		writel((readl(GAFR2_L) & ~0xf) | (0xa), GAFR2_L);
4660698095aSJeroen Hofstee 
4670698095aSJeroen Hofstee 		/* bits 74-77 */
4680698095aSJeroen Hofstee 		writel(readl(GPDR2) | (0xf << 10), GPDR2);
4690698095aSJeroen Hofstee 		writel((readl(GAFR2_L) & ~(0xff << 20)) | (0xaa << 20),
4700698095aSJeroen Hofstee 			GAFR2_L);
4710698095aSJeroen Hofstee 	}
4720698095aSJeroen Hofstee 
4730698095aSJeroen Hofstee 	/* 16 bit interface */
4740698095aSJeroen Hofstee 	else if (!(lccr0 & LCCR0_CMS) && ((lccr0 & LCCR0_SDS) || (lccr0 & LCCR0_PAS)))
4750698095aSJeroen Hofstee 	{
4760698095aSJeroen Hofstee 		debug("Setting GPIO for 16 bit data\n");
4770698095aSJeroen Hofstee 		/* bits 58-77 */
4780698095aSJeroen Hofstee 		writel(readl(GPDR1) | (0x3f << 26), GPDR1);
4790698095aSJeroen Hofstee 		writel(readl(GPDR2) | 0x00003fff, GPDR2);
4800698095aSJeroen Hofstee 
4810698095aSJeroen Hofstee 		writel((readl(GAFR1_U) & ~(0xfff << 20)) | (0xaaa << 20),
4820698095aSJeroen Hofstee 			GAFR1_U);
4830698095aSJeroen Hofstee 		writel((readl(GAFR2_L) & 0xf0000000) | 0x0aaaaaaa, GAFR2_L);
4840698095aSJeroen Hofstee 	}
4850698095aSJeroen Hofstee 	else
4860698095aSJeroen Hofstee 	{
4870698095aSJeroen Hofstee 		printf("pxafb_setup_gpio: unable to determine bits per pixel\n");
4880698095aSJeroen Hofstee 	}
4890698095aSJeroen Hofstee }
4900698095aSJeroen Hofstee #endif
4910698095aSJeroen Hofstee 
pxafb_enable_controller(vidinfo_t * vid)4920698095aSJeroen Hofstee static void pxafb_enable_controller (vidinfo_t *vid)
4930698095aSJeroen Hofstee {
4940698095aSJeroen Hofstee 	debug("Enabling LCD controller\n");
4950698095aSJeroen Hofstee 
4960698095aSJeroen Hofstee 	/* Sequence from 11.7.10 */
4970698095aSJeroen Hofstee 	writel(vid->pxa.reg_lccr3, LCCR3);
4980698095aSJeroen Hofstee 	writel(vid->pxa.reg_lccr2, LCCR2);
4990698095aSJeroen Hofstee 	writel(vid->pxa.reg_lccr1, LCCR1);
5000698095aSJeroen Hofstee 	writel(vid->pxa.reg_lccr0 & ~LCCR0_ENB, LCCR0);
5010698095aSJeroen Hofstee 	writel(vid->pxa.fdadr0, FDADR0);
5020698095aSJeroen Hofstee 	writel(vid->pxa.fdadr1, FDADR1);
5030698095aSJeroen Hofstee 	writel(readl(LCCR0) | LCCR0_ENB, LCCR0);
5040698095aSJeroen Hofstee 
5050698095aSJeroen Hofstee #ifdef	CONFIG_CPU_MONAHANS
5060698095aSJeroen Hofstee 	writel(readl(CKENA) | CKENA_1_LCD, CKENA);
5070698095aSJeroen Hofstee #else
5080698095aSJeroen Hofstee 	writel(readl(CKEN) | CKEN16_LCD, CKEN);
5090698095aSJeroen Hofstee #endif
5100698095aSJeroen Hofstee 
5110698095aSJeroen Hofstee 	debug("FDADR0 = 0x%08x\n", readl(FDADR0));
5120698095aSJeroen Hofstee 	debug("FDADR1 = 0x%08x\n", readl(FDADR1));
5130698095aSJeroen Hofstee 	debug("LCCR0 = 0x%08x\n", readl(LCCR0));
5140698095aSJeroen Hofstee 	debug("LCCR1 = 0x%08x\n", readl(LCCR1));
5150698095aSJeroen Hofstee 	debug("LCCR2 = 0x%08x\n", readl(LCCR2));
5160698095aSJeroen Hofstee 	debug("LCCR3 = 0x%08x\n", readl(LCCR3));
5170698095aSJeroen Hofstee }
5180698095aSJeroen Hofstee 
pxafb_init(vidinfo_t * vid)5190698095aSJeroen Hofstee static int pxafb_init (vidinfo_t *vid)
5200698095aSJeroen Hofstee {
5210698095aSJeroen Hofstee 	struct pxafb_info *fbi = &vid->pxa;
5220698095aSJeroen Hofstee 
5230698095aSJeroen Hofstee 	debug("Configuring PXA LCD\n");
5240698095aSJeroen Hofstee 
5250698095aSJeroen Hofstee 	fbi->reg_lccr0 = REG_LCCR0;
5260698095aSJeroen Hofstee 	fbi->reg_lccr3 = REG_LCCR3;
5270698095aSJeroen Hofstee 
5280698095aSJeroen Hofstee 	debug("vid: vl_col=%d hslen=%d lm=%d rm=%d\n",
5290698095aSJeroen Hofstee 		vid->vl_col, vid->vl_hpw,
5300698095aSJeroen Hofstee 		vid->vl_blw, vid->vl_elw);
5310698095aSJeroen Hofstee 	debug("vid: vl_row=%d vslen=%d um=%d bm=%d\n",
5320698095aSJeroen Hofstee 		vid->vl_row, vid->vl_vpw,
5330698095aSJeroen Hofstee 		vid->vl_bfw, vid->vl_efw);
5340698095aSJeroen Hofstee 
5350698095aSJeroen Hofstee 	fbi->reg_lccr1 =
5360698095aSJeroen Hofstee 		LCCR1_DisWdth(vid->vl_col) +
5370698095aSJeroen Hofstee 		LCCR1_HorSnchWdth(vid->vl_hpw) +
5380698095aSJeroen Hofstee 		LCCR1_BegLnDel(vid->vl_blw) +
5390698095aSJeroen Hofstee 		LCCR1_EndLnDel(vid->vl_elw);
5400698095aSJeroen Hofstee 
5410698095aSJeroen Hofstee 	fbi->reg_lccr2 =
5420698095aSJeroen Hofstee 		LCCR2_DisHght(vid->vl_row) +
5430698095aSJeroen Hofstee 		LCCR2_VrtSnchWdth(vid->vl_vpw) +
5440698095aSJeroen Hofstee 		LCCR2_BegFrmDel(vid->vl_bfw) +
5450698095aSJeroen Hofstee 		LCCR2_EndFrmDel(vid->vl_efw);
5460698095aSJeroen Hofstee 
5470698095aSJeroen Hofstee 	fbi->reg_lccr3 = REG_LCCR3 & ~(LCCR3_HSP | LCCR3_VSP);
5480698095aSJeroen Hofstee 	fbi->reg_lccr3 |= (vid->vl_hsp ? LCCR3_HorSnchL : LCCR3_HorSnchH)
5490698095aSJeroen Hofstee 			| (vid->vl_vsp ? LCCR3_VrtSnchL : LCCR3_VrtSnchH);
5500698095aSJeroen Hofstee 
5510698095aSJeroen Hofstee 
5520698095aSJeroen Hofstee 	/* setup dma descriptors */
5530698095aSJeroen Hofstee 	fbi->dmadesc_fblow = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette - 3*16);
5540698095aSJeroen Hofstee 	fbi->dmadesc_fbhigh = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette - 2*16);
5550698095aSJeroen Hofstee 	fbi->dmadesc_palette = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette - 1*16);
5560698095aSJeroen Hofstee 
5570698095aSJeroen Hofstee 	#define BYTES_PER_PANEL	((fbi->reg_lccr0 & LCCR0_SDS) ? \
5580698095aSJeroen Hofstee 		(vid->vl_col * vid->vl_row * NBITS(vid->vl_bpix) / 8 / 2) : \
5590698095aSJeroen Hofstee 		(vid->vl_col * vid->vl_row * NBITS(vid->vl_bpix) / 8))
5600698095aSJeroen Hofstee 
5610698095aSJeroen Hofstee 	/* populate descriptors */
5620698095aSJeroen Hofstee 	fbi->dmadesc_fblow->fdadr = (u_long)fbi->dmadesc_fblow;
5630698095aSJeroen Hofstee 	fbi->dmadesc_fblow->fsadr = fbi->screen + BYTES_PER_PANEL;
5640698095aSJeroen Hofstee 	fbi->dmadesc_fblow->fidr  = 0;
5650698095aSJeroen Hofstee 	fbi->dmadesc_fblow->ldcmd = BYTES_PER_PANEL;
5660698095aSJeroen Hofstee 
5670698095aSJeroen Hofstee 	fbi->fdadr1 = (u_long)fbi->dmadesc_fblow; /* only used in dual-panel mode */
5680698095aSJeroen Hofstee 
5690698095aSJeroen Hofstee 	fbi->dmadesc_fbhigh->fsadr = fbi->screen;
5700698095aSJeroen Hofstee 	fbi->dmadesc_fbhigh->fidr = 0;
5710698095aSJeroen Hofstee 	fbi->dmadesc_fbhigh->ldcmd = BYTES_PER_PANEL;
5720698095aSJeroen Hofstee 
5730698095aSJeroen Hofstee 	fbi->dmadesc_palette->fsadr = fbi->palette;
5740698095aSJeroen Hofstee 	fbi->dmadesc_palette->fidr  = 0;
5750698095aSJeroen Hofstee 	fbi->dmadesc_palette->ldcmd = (fbi->palette_size * 2) | LDCMD_PAL;
5760698095aSJeroen Hofstee 
5770698095aSJeroen Hofstee 	if( NBITS(vid->vl_bpix) < 12)
5780698095aSJeroen Hofstee 	{
5790698095aSJeroen Hofstee 		/* assume any mode with <12 bpp is palette driven */
5800698095aSJeroen Hofstee 		fbi->dmadesc_palette->fdadr = (u_long)fbi->dmadesc_fbhigh;
5810698095aSJeroen Hofstee 		fbi->dmadesc_fbhigh->fdadr = (u_long)fbi->dmadesc_palette;
5820698095aSJeroen Hofstee 		/* flips back and forth between pal and fbhigh */
5830698095aSJeroen Hofstee 		fbi->fdadr0 = (u_long)fbi->dmadesc_palette;
5840698095aSJeroen Hofstee 	}
5850698095aSJeroen Hofstee 	else
5860698095aSJeroen Hofstee 	{
5870698095aSJeroen Hofstee 		/* palette shouldn't be loaded in true-color mode */
5880698095aSJeroen Hofstee 		fbi->dmadesc_fbhigh->fdadr = (u_long)fbi->dmadesc_fbhigh;
5890698095aSJeroen Hofstee 		fbi->fdadr0 = (u_long)fbi->dmadesc_fbhigh; /* no pal just fbhigh */
5900698095aSJeroen Hofstee 	}
5910698095aSJeroen Hofstee 
5920698095aSJeroen Hofstee 	debug("fbi->dmadesc_fblow = 0x%lx\n", (u_long)fbi->dmadesc_fblow);
5930698095aSJeroen Hofstee 	debug("fbi->dmadesc_fbhigh = 0x%lx\n", (u_long)fbi->dmadesc_fbhigh);
5940698095aSJeroen Hofstee 	debug("fbi->dmadesc_palette = 0x%lx\n", (u_long)fbi->dmadesc_palette);
5950698095aSJeroen Hofstee 
5960698095aSJeroen Hofstee 	debug("fbi->dmadesc_fblow->fdadr = 0x%lx\n", fbi->dmadesc_fblow->fdadr);
5970698095aSJeroen Hofstee 	debug("fbi->dmadesc_fbhigh->fdadr = 0x%lx\n", fbi->dmadesc_fbhigh->fdadr);
5980698095aSJeroen Hofstee 	debug("fbi->dmadesc_palette->fdadr = 0x%lx\n", fbi->dmadesc_palette->fdadr);
5990698095aSJeroen Hofstee 
6000698095aSJeroen Hofstee 	debug("fbi->dmadesc_fblow->fsadr = 0x%lx\n", fbi->dmadesc_fblow->fsadr);
6010698095aSJeroen Hofstee 	debug("fbi->dmadesc_fbhigh->fsadr = 0x%lx\n", fbi->dmadesc_fbhigh->fsadr);
6020698095aSJeroen Hofstee 	debug("fbi->dmadesc_palette->fsadr = 0x%lx\n", fbi->dmadesc_palette->fsadr);
6030698095aSJeroen Hofstee 
6040698095aSJeroen Hofstee 	debug("fbi->dmadesc_fblow->ldcmd = 0x%lx\n", fbi->dmadesc_fblow->ldcmd);
6050698095aSJeroen Hofstee 	debug("fbi->dmadesc_fbhigh->ldcmd = 0x%lx\n", fbi->dmadesc_fbhigh->ldcmd);
6060698095aSJeroen Hofstee 	debug("fbi->dmadesc_palette->ldcmd = 0x%lx\n", fbi->dmadesc_palette->ldcmd);
6070698095aSJeroen Hofstee 
6080698095aSJeroen Hofstee 	return 0;
6090698095aSJeroen Hofstee }
6100698095aSJeroen Hofstee 
6110698095aSJeroen Hofstee /************************************************************************/
6120698095aSJeroen Hofstee /************************************************************************/
6130698095aSJeroen Hofstee 
6140698095aSJeroen Hofstee #endif /* CONFIG_LCD */
615