xref: /rk3399_rockchip-uboot/board/socrates/socrates.c (revision dfcd7f21607fd847236b04bb1a8d59a7c10ab99c)
15d108ac8SSergei Poselenov /*
25d108ac8SSergei Poselenov  * (C) Copyright 2008
35d108ac8SSergei Poselenov  * Sergei Poselenov, Emcraft Systems, sposelenov@emcraft.com.
45d108ac8SSergei Poselenov  *
55d108ac8SSergei Poselenov  * Copyright 2004 Freescale Semiconductor.
65d108ac8SSergei Poselenov  * (C) Copyright 2002,2003, Motorola Inc.
75d108ac8SSergei Poselenov  * Xianghua Xiao, (X.Xiao@motorola.com)
85d108ac8SSergei Poselenov  *
95d108ac8SSergei Poselenov  * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
105d108ac8SSergei Poselenov  *
115d108ac8SSergei Poselenov  * See file CREDITS for list of people who contributed to this
125d108ac8SSergei Poselenov  * project.
135d108ac8SSergei Poselenov  *
145d108ac8SSergei Poselenov  * This program is free software; you can redistribute it and/or
155d108ac8SSergei Poselenov  * modify it under the terms of the GNU General Public License as
165d108ac8SSergei Poselenov  * published by the Free Software Foundation; either version 2 of
175d108ac8SSergei Poselenov  * the License, or (at your option) any later version.
185d108ac8SSergei Poselenov  *
195d108ac8SSergei Poselenov  * This program is distributed in the hope that it will be useful,
205d108ac8SSergei Poselenov  * but WITHOUT ANY WARRANTY; without even the implied warranty of
215d108ac8SSergei Poselenov  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
225d108ac8SSergei Poselenov  * GNU General Public License for more details.
235d108ac8SSergei Poselenov  *
245d108ac8SSergei Poselenov  * You should have received a copy of the GNU General Public License
255d108ac8SSergei Poselenov  * along with this program; if not, write to the Free Software
265d108ac8SSergei Poselenov  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
275d108ac8SSergei Poselenov  * MA 02111-1307 USA
285d108ac8SSergei Poselenov  */
295d108ac8SSergei Poselenov 
305d108ac8SSergei Poselenov #include <common.h>
315d108ac8SSergei Poselenov #include <pci.h>
325d108ac8SSergei Poselenov #include <asm/processor.h>
335d108ac8SSergei Poselenov #include <asm/immap_85xx.h>
345d108ac8SSergei Poselenov #include <ioports.h>
355d108ac8SSergei Poselenov #include <flash.h>
36e18575d5SSergei Poselenov #include <libfdt.h>
37e18575d5SSergei Poselenov #include <fdt_support.h>
38e1eb0e25SAndy Fleming #include <asm/io.h>
39fb661ea4Su-boot@bugs.denx.de #include <i2c.h>
40fb661ea4Su-boot@bugs.denx.de #include <mb862xx.h>
41fb661ea4Su-boot@bugs.denx.de #include <video_fb.h>
4259abd15bSSergei Poselenov #include "upm_table.h"
433e79b588SDetlev Zundel 
445d108ac8SSergei Poselenov DECLARE_GLOBAL_DATA_PTR;
455d108ac8SSergei Poselenov 
465d108ac8SSergei Poselenov extern flash_info_t flash_info[];	/* FLASH chips info */
47fb661ea4Su-boot@bugs.denx.de extern GraphicDevice mb862xx;
485d108ac8SSergei Poselenov 
495d108ac8SSergei Poselenov void local_bus_init (void);
505d108ac8SSergei Poselenov ulong flash_get_size (ulong base, int banknum);
515d108ac8SSergei Poselenov 
525d108ac8SSergei Poselenov int checkboard (void)
535d108ac8SSergei Poselenov {
546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
553e79b588SDetlev Zundel 
565e1882dfSSergei Poselenov 	char *src;
575e1882dfSSergei Poselenov 	int f;
585d108ac8SSergei Poselenov 	char *s = getenv("serial#");
595d108ac8SSergei Poselenov 
605d108ac8SSergei Poselenov 	puts("Board: Socrates");
615d108ac8SSergei Poselenov 	if (s != NULL) {
625d108ac8SSergei Poselenov 		puts(", serial# ");
635d108ac8SSergei Poselenov 		puts(s);
645d108ac8SSergei Poselenov 	}
655d108ac8SSergei Poselenov 	putc('\n');
665d108ac8SSergei Poselenov 
675d108ac8SSergei Poselenov #ifdef CONFIG_PCI
68e1eb0e25SAndy Fleming 	/* Check the PCI_clk sel bit */
69e1eb0e25SAndy Fleming 	if (in_be32(&gur->porpllsr) & (1<<15)) {
705e1882dfSSergei Poselenov 		src = "SYSCLK";
715e1882dfSSergei Poselenov 		f = CONFIG_SYS_CLK_FREQ;
725e1882dfSSergei Poselenov 	} else {
735e1882dfSSergei Poselenov 		src = "PCI_CLK";
745e1882dfSSergei Poselenov 		f = CONFIG_PCI_CLK_FREQ;
755e1882dfSSergei Poselenov 	}
765e1882dfSSergei Poselenov 	printf ("PCI1:  32 bit, %d MHz (%s)\n",	f/1000000, src);
775d108ac8SSergei Poselenov #else
785d108ac8SSergei Poselenov 	printf ("PCI1:  disabled\n");
795d108ac8SSergei Poselenov #endif
805d108ac8SSergei Poselenov 
815d108ac8SSergei Poselenov 	/*
825d108ac8SSergei Poselenov 	 * Initialize local bus.
835d108ac8SSergei Poselenov 	 */
845d108ac8SSergei Poselenov 	local_bus_init ();
855d108ac8SSergei Poselenov 	return 0;
865d108ac8SSergei Poselenov }
875d108ac8SSergei Poselenov 
885d108ac8SSergei Poselenov int misc_init_r (void)
895d108ac8SSergei Poselenov {
906d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile ccsr_lbc_t *memctl = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR);
915d108ac8SSergei Poselenov 
925d108ac8SSergei Poselenov 	/*
935d108ac8SSergei Poselenov 	 * Adjust flash start and offset to detected values
945d108ac8SSergei Poselenov 	 */
955d108ac8SSergei Poselenov 	gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
965d108ac8SSergei Poselenov 	gd->bd->bi_flashoffset = 0;
975d108ac8SSergei Poselenov 
985d108ac8SSergei Poselenov 	/*
995d108ac8SSergei Poselenov 	 * Check if boot FLASH isn't max size
1005d108ac8SSergei Poselenov 	 */
1016d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (gd->bd->bi_flashsize < (0 - CONFIG_SYS_FLASH0)) {
1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		memctl->or0 = gd->bd->bi_flashstart | (CONFIG_SYS_OR0_PRELIM & 0x00007fff);
1036d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		memctl->br0 = gd->bd->bi_flashstart | (CONFIG_SYS_BR0_PRELIM & 0x00007fff);
1045d108ac8SSergei Poselenov 
1055d108ac8SSergei Poselenov 		/*
1065d108ac8SSergei Poselenov 		 * Re-check to get correct base address
1075d108ac8SSergei Poselenov 		 */
1086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		flash_get_size(gd->bd->bi_flashstart, CONFIG_SYS_MAX_FLASH_BANKS - 1);
1095d108ac8SSergei Poselenov 	}
1105d108ac8SSergei Poselenov 
1115d108ac8SSergei Poselenov 	/*
1125d108ac8SSergei Poselenov 	 * Check if only one FLASH bank is available
1135d108ac8SSergei Poselenov 	 */
1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (gd->bd->bi_flashsize != CONFIG_SYS_MAX_FLASH_BANKS * (0 - CONFIG_SYS_FLASH0)) {
1155d108ac8SSergei Poselenov 		memctl->or1 = 0;
1165d108ac8SSergei Poselenov 		memctl->br1 = 0;
1175d108ac8SSergei Poselenov 
1185d108ac8SSergei Poselenov 		/*
1195d108ac8SSergei Poselenov 		 * Re-do flash protection upon new addresses
1205d108ac8SSergei Poselenov 		 */
1215d108ac8SSergei Poselenov 		flash_protect (FLAG_PROTECT_CLEAR,
1225d108ac8SSergei Poselenov 			       gd->bd->bi_flashstart, 0xffffffff,
1236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			       &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]);
1245d108ac8SSergei Poselenov 
1255d108ac8SSergei Poselenov 		/* Monitor protection ON by default */
1265d108ac8SSergei Poselenov 		flash_protect (FLAG_PROTECT_SET,
1276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			       CONFIG_SYS_MONITOR_BASE, CONFIG_SYS_MONITOR_BASE + monitor_flash_len - 1,
1286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			       &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]);
1295d108ac8SSergei Poselenov 
1305d108ac8SSergei Poselenov 		/* Environment protection ON by default */
1315d108ac8SSergei Poselenov 		flash_protect (FLAG_PROTECT_SET,
1320e8d1586SJean-Christophe PLAGNIOL-VILLARD 			       CONFIG_ENV_ADDR,
1330e8d1586SJean-Christophe PLAGNIOL-VILLARD 			       CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
1346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			       &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]);
1355d108ac8SSergei Poselenov 
1365d108ac8SSergei Poselenov 		/* Redundant environment protection ON by default */
1375d108ac8SSergei Poselenov 		flash_protect (FLAG_PROTECT_SET,
1380e8d1586SJean-Christophe PLAGNIOL-VILLARD 			       CONFIG_ENV_ADDR_REDUND,
139*dfcd7f21SWolfgang Denk 			       CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1,
1406d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			       &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]);
1415d108ac8SSergei Poselenov 	}
1425d108ac8SSergei Poselenov 
1435d108ac8SSergei Poselenov 	return 0;
1445d108ac8SSergei Poselenov }
1455d108ac8SSergei Poselenov 
1465d108ac8SSergei Poselenov /*
1475d108ac8SSergei Poselenov  * Initialize Local Bus
1485d108ac8SSergei Poselenov  */
1495d108ac8SSergei Poselenov void local_bus_init (void)
1505d108ac8SSergei Poselenov {
1516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR);
1526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR);
1533e79b588SDetlev Zundel 	sys_info_t sysinfo;
1543e79b588SDetlev Zundel 	uint clkdiv;
1553e79b588SDetlev Zundel 	uint lbc_mhz;
1566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	uint lcrr = CONFIG_SYS_LBC_LCRR;
1575d108ac8SSergei Poselenov 
1583e79b588SDetlev Zundel 	get_sys_info (&sysinfo);
159a5d212a2STrent Piepho 	clkdiv = lbc->lcrr & LCRR_CLKDIV;
1603e79b588SDetlev Zundel 	lbc_mhz = sysinfo.freqSystemBus / 1000000 / clkdiv;
1615d108ac8SSergei Poselenov 
1623e79b588SDetlev Zundel 	/* Disable PLL bypass for Local Bus Clock >= 66 MHz */
1633e79b588SDetlev Zundel 	if (lbc_mhz >= 66)
1643e79b588SDetlev Zundel 		lcrr &= ~LCRR_DBYP;	/* DLL Enabled */
1653e79b588SDetlev Zundel 	else
1663e79b588SDetlev Zundel 		lcrr |= LCRR_DBYP;	/* DLL Bypass */
1673e79b588SDetlev Zundel 
1683e79b588SDetlev Zundel 	out_be32 (&lbc->lcrr, lcrr);
1693e79b588SDetlev Zundel 	asm ("sync;isync;msync");
1703e79b588SDetlev Zundel 
1713e79b588SDetlev Zundel 	out_be32 (&lbc->ltesr, 0xffffffff);	/* Clear LBC error interrupts */
1723e79b588SDetlev Zundel 	out_be32 (&lbc->lteir, 0xffffffff);	/* Enable LBC error interrupts */
1733e79b588SDetlev Zundel 	out_be32 (&ecm->eedr, 0xffffffff);	/* Clear ecm errors */
1743e79b588SDetlev Zundel 	out_be32 (&ecm->eeer, 0xffffffff);	/* Enable ecm errors */
1753e79b588SDetlev Zundel 
1763e79b588SDetlev Zundel 	/* Init UPMA for FPGA access */
1773e79b588SDetlev Zundel 	out_be32 (&lbc->mamr, 0x44440); /* Use a customer-supplied value */
1783e79b588SDetlev Zundel 	upmconfig (UPMA, (uint *)UPMTableA, sizeof(UPMTableA)/sizeof(int));
179e64987a8SAnatolij Gustschin 
180e64987a8SAnatolij Gustschin 	/* Init UPMB for Lime controller access */
181e64987a8SAnatolij Gustschin 	out_be32 (&lbc->mbmr, 0x444440); /* Use a customer-supplied value */
182e64987a8SAnatolij Gustschin 	upmconfig (UPMB, (uint *)UPMTableB, sizeof(UPMTableB)/sizeof(int));
183e64987a8SAnatolij Gustschin }
1845d108ac8SSergei Poselenov 
1855d108ac8SSergei Poselenov #if defined(CONFIG_PCI)
1865d108ac8SSergei Poselenov /*
1875d108ac8SSergei Poselenov  * Initialize PCI Devices, report devices found.
1885d108ac8SSergei Poselenov  */
1895d108ac8SSergei Poselenov 
1905d108ac8SSergei Poselenov #ifndef CONFIG_PCI_PNP
1915d108ac8SSergei Poselenov static struct pci_config_table pci_mpc85xxads_config_table[] = {
1925d108ac8SSergei Poselenov 	{PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
1935d108ac8SSergei Poselenov 	 PCI_IDSEL_NUMBER, PCI_ANY_ID,
1945d108ac8SSergei Poselenov 	 pci_cfgfunc_config_device, {PCI_ENET0_IOADDR,
1955d108ac8SSergei Poselenov 				     PCI_ENET0_MEMADDR,
1965d108ac8SSergei Poselenov 				     PCI_COMMAND_MEMORY |
1975d108ac8SSergei Poselenov 				     PCI_COMMAND_MASTER}},
1985d108ac8SSergei Poselenov 	{}
1995d108ac8SSergei Poselenov };
2005d108ac8SSergei Poselenov #endif
2015d108ac8SSergei Poselenov 
2025d108ac8SSergei Poselenov 
2035d108ac8SSergei Poselenov static struct pci_controller hose = {
2045d108ac8SSergei Poselenov #ifndef CONFIG_PCI_PNP
2055d108ac8SSergei Poselenov 	config_table:pci_mpc85xxads_config_table,
2065d108ac8SSergei Poselenov #endif
2075d108ac8SSergei Poselenov };
2085d108ac8SSergei Poselenov 
2095d108ac8SSergei Poselenov #endif /* CONFIG_PCI */
2105d108ac8SSergei Poselenov 
2115d108ac8SSergei Poselenov 
2125d108ac8SSergei Poselenov void pci_init_board (void)
2135d108ac8SSergei Poselenov {
2145d108ac8SSergei Poselenov #ifdef CONFIG_PCI
2155d108ac8SSergei Poselenov 	pci_mpc85xx_init (&hose);
2165d108ac8SSergei Poselenov #endif /* CONFIG_PCI */
2175d108ac8SSergei Poselenov }
2185d108ac8SSergei Poselenov 
2195d108ac8SSergei Poselenov #ifdef CONFIG_BOARD_EARLY_INIT_R
2205d108ac8SSergei Poselenov int board_early_init_r (void)
2215d108ac8SSergei Poselenov {
2226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
2233e79b588SDetlev Zundel 
2243e79b588SDetlev Zundel 	/* set and reset the GPIO pin 2 which will reset the W83782G chip */
2253e79b588SDetlev Zundel 	out_8((unsigned char*)&gur->gpoutdr, 0x3F );
2263e79b588SDetlev Zundel 	out_be32((unsigned int*)&gur->gpiocr, 0x200 );	/* enable GPOut */
2273e79b588SDetlev Zundel 	udelay(200);
2283e79b588SDetlev Zundel 	out_8( (unsigned char*)&gur->gpoutdr, 0x1F );
2293e79b588SDetlev Zundel 
2305d108ac8SSergei Poselenov 	return (0);
2315d108ac8SSergei Poselenov }
2325d108ac8SSergei Poselenov #endif /* CONFIG_BOARD_EARLY_INIT_R */
233e18575d5SSergei Poselenov 
234e18575d5SSergei Poselenov #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
235e18575d5SSergei Poselenov void
236e18575d5SSergei Poselenov ft_board_setup(void *blob, bd_t *bd)
237e18575d5SSergei Poselenov {
2383e79b588SDetlev Zundel 	u32 val[12];
2393e79b588SDetlev Zundel 	int rc, i = 0;
240e18575d5SSergei Poselenov 
241e18575d5SSergei Poselenov 	ft_cpu_setup(blob, bd);
242e18575d5SSergei Poselenov 
2433e79b588SDetlev Zundel 	/* Fixup NOR FLASH mapping */
2443e79b588SDetlev Zundel 	val[i++] = 0;				/* chip select number */
2453e79b588SDetlev Zundel 	val[i++] = 0;				/* always 0 */
2463e79b588SDetlev Zundel 	val[i++] = gd->bd->bi_flashstart;
2473e79b588SDetlev Zundel 	val[i++] = gd->bd->bi_flashsize;
2483e79b588SDetlev Zundel 
2496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (mb862xx.frameAdrs == CONFIG_SYS_LIME_BASE) {
250e64987a8SAnatolij Gustschin 		/* Fixup LIME mapping */
251e64987a8SAnatolij Gustschin 		val[i++] = 2;			/* chip select number */
252e64987a8SAnatolij Gustschin 		val[i++] = 0;			/* always 0 */
2536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		val[i++] = CONFIG_SYS_LIME_BASE;
2546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		val[i++] = CONFIG_SYS_LIME_SIZE;
255e64987a8SAnatolij Gustschin 	}
256e64987a8SAnatolij Gustschin 
2573e79b588SDetlev Zundel 	/* Fixup FPGA mapping */
2583e79b588SDetlev Zundel 	val[i++] = 3;				/* chip select number */
2593e79b588SDetlev Zundel 	val[i++] = 0;				/* always 0 */
2606d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	val[i++] = CONFIG_SYS_FPGA_BASE;
2616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	val[i++] = CONFIG_SYS_FPGA_SIZE;
262e18575d5SSergei Poselenov 
263e18575d5SSergei Poselenov 	rc = fdt_find_and_setprop(blob, "/localbus", "ranges",
2643e79b588SDetlev Zundel 				  val, i * sizeof(u32), 1);
265e18575d5SSergei Poselenov 	if (rc)
2663e79b588SDetlev Zundel 		printf("Unable to update localbus ranges, err=%s\n",
267e18575d5SSergei Poselenov 		       fdt_strerror(rc));
268e18575d5SSergei Poselenov }
269e18575d5SSergei Poselenov #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
270e64987a8SAnatolij Gustschin 
2716d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_SRST		((CONFIG_SYS_LIME_BASE) + 0x01FC002C)
2726d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CCF		((CONFIG_SYS_LIME_BASE) + 0x01FC0038)
2736d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_MMR		((CONFIG_SYS_LIME_BASE) + 0x01FCFFFC)
274e64987a8SAnatolij Gustschin /* Lime clock frequency */
2756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CLK_100MHZ	0x00000
2766d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CLK_133MHZ	0x10000
277e64987a8SAnatolij Gustschin /* SDRAM parameter */
2786d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_MMR_VALUE	0x4157BA63
279e64987a8SAnatolij Gustschin 
280e64987a8SAnatolij Gustschin #define DISPLAY_WIDTH		800
281e64987a8SAnatolij Gustschin #define DISPLAY_HEIGHT		480
282e64987a8SAnatolij Gustschin #define DEFAULT_BRIGHTNESS	25
283e64987a8SAnatolij Gustschin #define BACKLIGHT_ENABLE	(1 << 31)
284e64987a8SAnatolij Gustschin 
285e64987a8SAnatolij Gustschin static const gdc_regs init_regs [] =
286e64987a8SAnatolij Gustschin {
287e64987a8SAnatolij Gustschin 	{0x0100, 0x00010f00},
288e64987a8SAnatolij Gustschin 	{0x0020, 0x801901df},
289e64987a8SAnatolij Gustschin 	{0x0024, 0x00000000},
290e64987a8SAnatolij Gustschin 	{0x0028, 0x00000000},
291e64987a8SAnatolij Gustschin 	{0x002c, 0x00000000},
292e64987a8SAnatolij Gustschin 	{0x0110, 0x00000000},
293e64987a8SAnatolij Gustschin 	{0x0114, 0x00000000},
294e64987a8SAnatolij Gustschin 	{0x0118, 0x01df0320},
295e64987a8SAnatolij Gustschin 	{0x0004, 0x041f0000},
296e64987a8SAnatolij Gustschin 	{0x0008, 0x031f031f},
297e64987a8SAnatolij Gustschin 	{0x000c, 0x017f0349},
298e64987a8SAnatolij Gustschin 	{0x0010, 0x020c0000},
299e64987a8SAnatolij Gustschin 	{0x0014, 0x01df01e9},
300e64987a8SAnatolij Gustschin 	{0x0018, 0x00000000},
301e64987a8SAnatolij Gustschin 	{0x001c, 0x01e00320},
302e64987a8SAnatolij Gustschin 	{0x0100, 0x80010f00},
303e64987a8SAnatolij Gustschin 	{0x0, 0x0}
304e64987a8SAnatolij Gustschin };
305e64987a8SAnatolij Gustschin 
306e64987a8SAnatolij Gustschin const gdc_regs *board_get_regs (void)
307e64987a8SAnatolij Gustschin {
308e64987a8SAnatolij Gustschin 	return init_regs;
309e64987a8SAnatolij Gustschin }
310e64987a8SAnatolij Gustschin 
3116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CID		((CONFIG_SYS_LIME_BASE) + 0x01FC00F0)
3126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_REV		((CONFIG_SYS_LIME_BASE) + 0x01FF8084)
313fb661ea4Su-boot@bugs.denx.de int lime_probe(void)
314fb661ea4Su-boot@bugs.denx.de {
3156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile ccsr_lbc_t *memctl = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR);
316fb661ea4Su-boot@bugs.denx.de 	uint cfg_br2;
317fb661ea4Su-boot@bugs.denx.de 	uint cfg_or2;
318fb661ea4Su-boot@bugs.denx.de 	uint reg;
319fb661ea4Su-boot@bugs.denx.de 
320fb661ea4Su-boot@bugs.denx.de 	cfg_br2 = memctl->br2;
321fb661ea4Su-boot@bugs.denx.de 	cfg_or2 = memctl->or2;
322fb661ea4Su-boot@bugs.denx.de 
323fb661ea4Su-boot@bugs.denx.de 	/* Configure GPCM for CS2 */
324fb661ea4Su-boot@bugs.denx.de 	memctl->br2 = 0;
325fb661ea4Su-boot@bugs.denx.de 	memctl->or2 = 0xfc000410;
3266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	memctl->br2 = (CONFIG_SYS_LIME_BASE) | 0x00001901;
327fb661ea4Su-boot@bugs.denx.de 
328fb661ea4Su-boot@bugs.denx.de 	/* Try to access GDC ID/Revision registers */
3296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	reg = in_be32((void *)CONFIG_SYS_LIME_CID);
3306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	reg = in_be32((void *)CONFIG_SYS_LIME_CID);
331fb661ea4Su-boot@bugs.denx.de 	if (reg == 0x303) {
3326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		reg = in_be32((void *)CONFIG_SYS_LIME_REV);
3336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		reg = in_be32((void *)CONFIG_SYS_LIME_REV);
334fb661ea4Su-boot@bugs.denx.de 		reg = ((reg & ~0xff) == 0x20050100) ? 1 : 0;
335fb661ea4Su-boot@bugs.denx.de 	} else
336fb661ea4Su-boot@bugs.denx.de 		reg = 0;
337fb661ea4Su-boot@bugs.denx.de 
338fb661ea4Su-boot@bugs.denx.de 	/* Restore previous CS2 configuration */
339fb661ea4Su-boot@bugs.denx.de 	memctl->br2 = 0;
340fb661ea4Su-boot@bugs.denx.de 	memctl->or2 = cfg_or2;
341fb661ea4Su-boot@bugs.denx.de 	memctl->br2 = cfg_br2;
342fb661ea4Su-boot@bugs.denx.de 	return reg;
343fb661ea4Su-boot@bugs.denx.de }
344fb661ea4Su-boot@bugs.denx.de 
345e64987a8SAnatolij Gustschin /* Returns Lime base address */
346e64987a8SAnatolij Gustschin unsigned int board_video_init (void)
347e64987a8SAnatolij Gustschin {
348fb661ea4Su-boot@bugs.denx.de 	if (!lime_probe())
349e64987a8SAnatolij Gustschin 		return 0;
350e64987a8SAnatolij Gustschin 
351e64987a8SAnatolij Gustschin 	/*
352e64987a8SAnatolij Gustschin 	 * Reset Lime controller
353e64987a8SAnatolij Gustschin 	 */
3546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	out_be32((void *)CONFIG_SYS_LIME_SRST, 0x1);
355e64987a8SAnatolij Gustschin 	udelay(200);
356e64987a8SAnatolij Gustschin 
357e64987a8SAnatolij Gustschin 	/* Set Lime clock to 133MHz */
3586d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	out_be32((void *)CONFIG_SYS_LIME_CCF, CONFIG_SYS_LIME_CLK_133MHZ);
359e64987a8SAnatolij Gustschin 	/* Delay required */
360e64987a8SAnatolij Gustschin 	udelay(300);
361e64987a8SAnatolij Gustschin 	/* Set memory parameters */
3626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	out_be32((void *)CONFIG_SYS_LIME_MMR, CONFIG_SYS_LIME_MMR_VALUE);
363e64987a8SAnatolij Gustschin 
364e64987a8SAnatolij Gustschin 	mb862xx.winSizeX = DISPLAY_WIDTH;
365e64987a8SAnatolij Gustschin 	mb862xx.winSizeY = DISPLAY_HEIGHT;
366e64987a8SAnatolij Gustschin 	mb862xx.gdfIndex = GDF_15BIT_555RGB;
367e64987a8SAnatolij Gustschin 	mb862xx.gdfBytesPP = 2;
368e64987a8SAnatolij Gustschin 
3696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	return CONFIG_SYS_LIME_BASE;
370e64987a8SAnatolij Gustschin }
371e64987a8SAnatolij Gustschin 
372e64987a8SAnatolij Gustschin #define W83782D_REG_CFG		0x40
373e64987a8SAnatolij Gustschin #define W83782D_REG_BANK_SEL	0x4e
374e64987a8SAnatolij Gustschin #define W83782D_REG_ADCCLK	0x4b
375e64987a8SAnatolij Gustschin #define W83782D_REG_BEEP_CTRL	0x4d
376e64987a8SAnatolij Gustschin #define W83782D_REG_BEEP_CTRL2	0x57
377e64987a8SAnatolij Gustschin #define W83782D_REG_PWMOUT1	0x5b
378e64987a8SAnatolij Gustschin #define W83782D_REG_VBAT	0x5d
379e64987a8SAnatolij Gustschin 
380e64987a8SAnatolij Gustschin static int w83782d_hwmon_init(void)
381e64987a8SAnatolij Gustschin {
382e64987a8SAnatolij Gustschin 	u8 buf;
383e64987a8SAnatolij Gustschin 
3846d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 1, &buf, 1))
385e64987a8SAnatolij Gustschin 		return -1;
386e64987a8SAnatolij Gustschin 
3876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 0x80);
3886d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BANK_SEL, 0);
3896d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_ADCCLK, 0x40);
390e64987a8SAnatolij Gustschin 
3916d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	buf = i2c_reg_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL);
3926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL,
393e64987a8SAnatolij Gustschin 		      buf | 0x80);
3946d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL2, 0);
3956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_PWMOUT1, 0x47);
3966d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_VBAT, 0x01);
397e64987a8SAnatolij Gustschin 
3986d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	buf = i2c_reg_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG);
3996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG,
400e64987a8SAnatolij Gustschin 		      (buf & 0xf4) | 0x01);
401e64987a8SAnatolij Gustschin 	return 0;
402e64987a8SAnatolij Gustschin }
403e64987a8SAnatolij Gustschin 
404e64987a8SAnatolij Gustschin static void board_backlight_brightness(int br)
405e64987a8SAnatolij Gustschin {
406e64987a8SAnatolij Gustschin 	u32 reg;
407e64987a8SAnatolij Gustschin 	u8 buf;
408e64987a8SAnatolij Gustschin 	u8 old_buf;
409e64987a8SAnatolij Gustschin 
410e64987a8SAnatolij Gustschin 	/* Select bank 0 */
4116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &old_buf, 1))
412e64987a8SAnatolij Gustschin 		goto err;
413e64987a8SAnatolij Gustschin 	else
414e64987a8SAnatolij Gustschin 		buf = old_buf & 0xf8;
415e64987a8SAnatolij Gustschin 
4166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &buf, 1))
417e64987a8SAnatolij Gustschin 		goto err;
418e64987a8SAnatolij Gustschin 
419e64987a8SAnatolij Gustschin 	if (br > 0) {
420e64987a8SAnatolij Gustschin 		/* PWMOUT1 duty cycle ctrl */
421e64987a8SAnatolij Gustschin 		buf = 255 / (100 / br);
4226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x5b, 1, &buf, 1))
423e64987a8SAnatolij Gustschin 			goto err;
424e64987a8SAnatolij Gustschin 
425e64987a8SAnatolij Gustschin 		/* LEDs on */
4266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		reg = in_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c));
427e64987a8SAnatolij Gustschin 		if (!(reg & BACKLIGHT_ENABLE));
4286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			out_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c),
429e64987a8SAnatolij Gustschin 				 reg | BACKLIGHT_ENABLE);
430e64987a8SAnatolij Gustschin 	} else {
431e64987a8SAnatolij Gustschin 		buf = 0;
4326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x5b, 1, &buf, 1))
433e64987a8SAnatolij Gustschin 			goto err;
434e64987a8SAnatolij Gustschin 
435e64987a8SAnatolij Gustschin 		/* LEDs off */
4366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		reg = in_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c));
437e64987a8SAnatolij Gustschin 		reg &= ~BACKLIGHT_ENABLE;
4386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		out_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c), reg);
439e64987a8SAnatolij Gustschin 	}
440e64987a8SAnatolij Gustschin 	/* Restore previous bank setting */
4416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &old_buf, 1))
442e64987a8SAnatolij Gustschin 		goto err;
443e64987a8SAnatolij Gustschin 
444e64987a8SAnatolij Gustschin 	return;
445e64987a8SAnatolij Gustschin err:
446e64987a8SAnatolij Gustschin 	printf("W83782G I2C access failed\n");
447e64987a8SAnatolij Gustschin }
448e64987a8SAnatolij Gustschin 
449e64987a8SAnatolij Gustschin void board_backlight_switch (int flag)
450e64987a8SAnatolij Gustschin {
451e64987a8SAnatolij Gustschin 	char * param;
452e64987a8SAnatolij Gustschin 	int rc;
453e64987a8SAnatolij Gustschin 
454e64987a8SAnatolij Gustschin 	if (w83782d_hwmon_init())
455e64987a8SAnatolij Gustschin 		printf ("hwmon IC init failed\n");
456e64987a8SAnatolij Gustschin 
457e64987a8SAnatolij Gustschin 	if (flag) {
458e64987a8SAnatolij Gustschin 		param = getenv("brightness");
459e64987a8SAnatolij Gustschin 		rc = param ? simple_strtol(param, NULL, 10) : -1;
460e64987a8SAnatolij Gustschin 		if (rc < 0)
461e64987a8SAnatolij Gustschin 			rc = DEFAULT_BRIGHTNESS;
462e64987a8SAnatolij Gustschin 	} else {
463e64987a8SAnatolij Gustschin 		rc = 0;
464e64987a8SAnatolij Gustschin 	}
465e64987a8SAnatolij Gustschin 	board_backlight_brightness(rc);
466e64987a8SAnatolij Gustschin }
467e64987a8SAnatolij Gustschin 
468e64987a8SAnatolij Gustschin #if defined(CONFIG_CONSOLE_EXTRA_INFO)
469e64987a8SAnatolij Gustschin /*
470e64987a8SAnatolij Gustschin  * Return text to be printed besides the logo.
471e64987a8SAnatolij Gustschin  */
472e64987a8SAnatolij Gustschin void video_get_info_str (int line_number, char *info)
473e64987a8SAnatolij Gustschin {
474e64987a8SAnatolij Gustschin 	if (line_number == 1) {
475e64987a8SAnatolij Gustschin 		strcpy (info, " Board: Socrates");
476e64987a8SAnatolij Gustschin 	} else {
477e64987a8SAnatolij Gustschin 		info [0] = '\0';
478e64987a8SAnatolij Gustschin 	}
479e64987a8SAnatolij Gustschin }
480e64987a8SAnatolij Gustschin #endif
481