xref: /rk3399_rockchip-uboot/board/ve8313/ve8313.c (revision 0e00a84cdedf7a1949486746225b35984b351eca)
14e43b2e8SHeiko Schocher /*
24e43b2e8SHeiko Schocher  * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
34e43b2e8SHeiko Schocher  *
44e43b2e8SHeiko Schocher  * Author: Scott Wood <scottwood@freescale.com>
54e43b2e8SHeiko Schocher  *
64e43b2e8SHeiko Schocher  * (C) Copyright 2010
74e43b2e8SHeiko Schocher  * Heiko Schocher, DENX Software Engineering, hs@denx.de.
84e43b2e8SHeiko Schocher  *
91a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
104e43b2e8SHeiko Schocher  */
114e43b2e8SHeiko Schocher 
124e43b2e8SHeiko Schocher #include <common.h>
13*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
144e43b2e8SHeiko Schocher #include <pci.h>
154e43b2e8SHeiko Schocher #include <mpc83xx.h>
164e43b2e8SHeiko Schocher #include <ns16550.h>
174e43b2e8SHeiko Schocher #include <nand.h>
184e43b2e8SHeiko Schocher 
194e43b2e8SHeiko Schocher #include <asm/bitops.h>
204e43b2e8SHeiko Schocher #include <asm/io.h>
214e43b2e8SHeiko Schocher 
224e43b2e8SHeiko Schocher DECLARE_GLOBAL_DATA_PTR;
234e43b2e8SHeiko Schocher 
244e43b2e8SHeiko Schocher extern void disable_addr_trans (void);
254e43b2e8SHeiko Schocher extern void enable_addr_trans (void);
264e43b2e8SHeiko Schocher 
checkboard(void)274e43b2e8SHeiko Schocher int checkboard(void)
284e43b2e8SHeiko Schocher {
294e43b2e8SHeiko Schocher 	puts("Board: ve8313\n");
304e43b2e8SHeiko Schocher 	return 0;
314e43b2e8SHeiko Schocher }
324e43b2e8SHeiko Schocher 
fixed_sdram(void)334e43b2e8SHeiko Schocher static long fixed_sdram(void)
344e43b2e8SHeiko Schocher {
354e43b2e8SHeiko Schocher 	u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024;
364e43b2e8SHeiko Schocher 
374e43b2e8SHeiko Schocher #ifndef CONFIG_SYS_RAMBOOT
384e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
394e43b2e8SHeiko Schocher 	u32 msize_log2 = __ilog2(msize);
404e43b2e8SHeiko Schocher 
414e43b2e8SHeiko Schocher 	out_be32(&im->sysconf.ddrlaw[0].bar,
424e43b2e8SHeiko Schocher 		(CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000));
434e43b2e8SHeiko Schocher 	out_be32(&im->sysconf.ddrlaw[0].ar, (LBLAWAR_EN | (msize_log2 - 1)));
444e43b2e8SHeiko Schocher 	out_be32(&im->sysconf.ddrcdr, CONFIG_SYS_DDRCDR_VALUE);
454e43b2e8SHeiko Schocher 
464e43b2e8SHeiko Schocher 	/*
474e43b2e8SHeiko Schocher 	 * Erratum DDR3 requires a 50ms delay after clearing DDRCDR[DDR_cfg],
484e43b2e8SHeiko Schocher 	 * or the DDR2 controller may fail to initialize correctly.
494e43b2e8SHeiko Schocher 	 */
504e43b2e8SHeiko Schocher 	__udelay(50000);
514e43b2e8SHeiko Schocher 
522e651b24SJoe Hershberger #if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0)
532e651b24SJoe Hershberger #warning Chip select bounds is only configurable in 16MB increments
542e651b24SJoe Hershberger #endif
552e651b24SJoe Hershberger 	out_be32(&im->ddr.csbnds[0].csbnds,
562e651b24SJoe Hershberger 		((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) |
572e651b24SJoe Hershberger 		(((CONFIG_SYS_DDR_SDRAM_BASE + msize - 1) >> CSBNDS_EA_SHIFT) &
582e651b24SJoe Hershberger 			CSBNDS_EA));
592e651b24SJoe Hershberger 	out_be32(&im->ddr.cs_config[0], CONFIG_SYS_DDR_CS0_CONFIG);
604e43b2e8SHeiko Schocher 
614e43b2e8SHeiko Schocher 	/* Currently we use only one CS, so disable the other bank. */
624e43b2e8SHeiko Schocher 	out_be32(&im->ddr.cs_config[1], 0);
634e43b2e8SHeiko Schocher 
644e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_clk_cntl, CONFIG_SYS_DDR_CLK_CNTL);
654e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_3, CONFIG_SYS_DDR_TIMING_3);
664e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_1, CONFIG_SYS_DDR_TIMING_1);
674e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_2, CONFIG_SYS_DDR_TIMING_2);
684e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_0, CONFIG_SYS_DDR_TIMING_0);
694e43b2e8SHeiko Schocher 
704e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_cfg, CONFIG_SYS_SDRAM_CFG);
714e43b2e8SHeiko Schocher 
724e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_cfg2, CONFIG_SYS_SDRAM_CFG2);
734e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_mode, CONFIG_SYS_DDR_MODE);
744e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_mode2, CONFIG_SYS_DDR_MODE_2);
754e43b2e8SHeiko Schocher 
764e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_interval, CONFIG_SYS_DDR_INTERVAL);
774e43b2e8SHeiko Schocher 	sync();
784e43b2e8SHeiko Schocher 
794e43b2e8SHeiko Schocher 	/* enable DDR controller */
804e43b2e8SHeiko Schocher 	setbits_be32(&im->ddr.sdram_cfg, SDRAM_CFG_MEM_EN);
814e43b2e8SHeiko Schocher 
824e43b2e8SHeiko Schocher 	/* now check the real size */
834e43b2e8SHeiko Schocher 	disable_addr_trans ();
844e43b2e8SHeiko Schocher 	msize = get_ram_size (CONFIG_SYS_DDR_BASE, msize);
854e43b2e8SHeiko Schocher 	enable_addr_trans ();
864e43b2e8SHeiko Schocher #endif
874e43b2e8SHeiko Schocher 
884e43b2e8SHeiko Schocher 	return msize;
894e43b2e8SHeiko Schocher }
904e43b2e8SHeiko Schocher 
dram_init(void)91f1683aa7SSimon Glass int dram_init(void)
924e43b2e8SHeiko Schocher {
934e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
94a2243b84SKumar Gala 	volatile fsl_lbc_t *lbc = &im->im_lbc;
954e43b2e8SHeiko Schocher 	u32 msize;
964e43b2e8SHeiko Schocher 
974e43b2e8SHeiko Schocher 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
984e43b2e8SHeiko Schocher 		return -1;
994e43b2e8SHeiko Schocher 
1004e43b2e8SHeiko Schocher 	/* DDR SDRAM - Main SODIMM */
1014e43b2e8SHeiko Schocher 	msize = fixed_sdram();
1024e43b2e8SHeiko Schocher 
1034e43b2e8SHeiko Schocher 	/* Local Bus setup lbcr and mrtpr */
1044e43b2e8SHeiko Schocher 	out_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR);
1054e43b2e8SHeiko Schocher 	out_be32(&lbc->mrtpr, CONFIG_SYS_LBC_MRTPR);
1064e43b2e8SHeiko Schocher 	sync();
1074e43b2e8SHeiko Schocher 
1084e43b2e8SHeiko Schocher 	/* return total bus SDRAM size(bytes)  -- DDR */
109088454cdSSimon Glass 	gd->ram_size = msize;
110088454cdSSimon Glass 
111088454cdSSimon Glass 	return 0;
1124e43b2e8SHeiko Schocher }
1134e43b2e8SHeiko Schocher 
1144e43b2e8SHeiko Schocher #define VE8313_WDT_EN	0x00020000
1154e43b2e8SHeiko Schocher #define VE8313_WDT_TRIG	0x00040000
1164e43b2e8SHeiko Schocher 
board_early_init_f(void)1174e43b2e8SHeiko Schocher int board_early_init_f (void)
1184e43b2e8SHeiko Schocher {
1194e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
1204e43b2e8SHeiko Schocher 	volatile gpio83xx_t *gpio = (volatile gpio83xx_t *)im->gpio;
1214e43b2e8SHeiko Schocher 
1224e43b2e8SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG)
1234e43b2e8SHeiko Schocher 	/* enable WDT */
1244e43b2e8SHeiko Schocher 	clrbits_be32(&gpio->dat, VE8313_WDT_EN | VE8313_WDT_TRIG);
1254e43b2e8SHeiko Schocher #else
1264e43b2e8SHeiko Schocher 	/* disable WDT */
1274e43b2e8SHeiko Schocher 	setbits_be32(&gpio->dat, VE8313_WDT_EN | VE8313_WDT_TRIG);
1284e43b2e8SHeiko Schocher #endif
1294e43b2e8SHeiko Schocher 	/* set WDT pins as output */
1304e43b2e8SHeiko Schocher 	setbits_be32(&gpio->dir, VE8313_WDT_EN | VE8313_WDT_TRIG);
1314e43b2e8SHeiko Schocher 
1324e43b2e8SHeiko Schocher 	return 0;
1334e43b2e8SHeiko Schocher }
1344e43b2e8SHeiko Schocher 
1354e43b2e8SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG)
hw_watchdog_reset(void)1364e43b2e8SHeiko Schocher void hw_watchdog_reset(void)
1374e43b2e8SHeiko Schocher {
1384e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
1394e43b2e8SHeiko Schocher 	volatile gpio83xx_t *gpio = (volatile gpio83xx_t *)im->gpio;
1404e43b2e8SHeiko Schocher 	unsigned long reg;
1414e43b2e8SHeiko Schocher 
1424e43b2e8SHeiko Schocher 	reg = in_be32(&gpio->dat);
1434e43b2e8SHeiko Schocher 	if (reg & VE8313_WDT_TRIG)
1444e43b2e8SHeiko Schocher 		clrbits_be32(&gpio->dat, VE8313_WDT_TRIG);
1454e43b2e8SHeiko Schocher 	else
1464e43b2e8SHeiko Schocher 		setbits_be32(&gpio->dat, VE8313_WDT_TRIG);
1474e43b2e8SHeiko Schocher }
1484e43b2e8SHeiko Schocher #endif
1494e43b2e8SHeiko Schocher 
1504e43b2e8SHeiko Schocher 
1514e43b2e8SHeiko Schocher #if defined(CONFIG_PCI)
1524e43b2e8SHeiko Schocher static struct pci_region pci_regions[] = {
1534e43b2e8SHeiko Schocher 	{
1544e43b2e8SHeiko Schocher 		bus_start: CONFIG_SYS_PCI1_MEM_BASE,
1554e43b2e8SHeiko Schocher 		phys_start: CONFIG_SYS_PCI1_MEM_PHYS,
1564e43b2e8SHeiko Schocher 		size: CONFIG_SYS_PCI1_MEM_SIZE,
1574e43b2e8SHeiko Schocher 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
1584e43b2e8SHeiko Schocher 	},
1594e43b2e8SHeiko Schocher 	{
1604e43b2e8SHeiko Schocher 		bus_start: CONFIG_SYS_PCI1_MMIO_BASE,
1614e43b2e8SHeiko Schocher 		phys_start: CONFIG_SYS_PCI1_MMIO_PHYS,
1624e43b2e8SHeiko Schocher 		size: CONFIG_SYS_PCI1_MMIO_SIZE,
1634e43b2e8SHeiko Schocher 		flags: PCI_REGION_MEM
1644e43b2e8SHeiko Schocher 	},
1654e43b2e8SHeiko Schocher 	{
1664e43b2e8SHeiko Schocher 		bus_start: CONFIG_SYS_PCI1_IO_BASE,
1674e43b2e8SHeiko Schocher 		phys_start: CONFIG_SYS_PCI1_IO_PHYS,
1684e43b2e8SHeiko Schocher 		size: CONFIG_SYS_PCI1_IO_SIZE,
1694e43b2e8SHeiko Schocher 		flags: PCI_REGION_IO
1704e43b2e8SHeiko Schocher 	}
1714e43b2e8SHeiko Schocher };
1724e43b2e8SHeiko Schocher 
pci_init_board(void)1734e43b2e8SHeiko Schocher void pci_init_board(void)
1744e43b2e8SHeiko Schocher {
1754e43b2e8SHeiko Schocher 	volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
1764e43b2e8SHeiko Schocher 	volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
1774e43b2e8SHeiko Schocher 	volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
1784e43b2e8SHeiko Schocher 	struct pci_region *reg[] = { pci_regions };
1794e43b2e8SHeiko Schocher 
1804e43b2e8SHeiko Schocher 	/* Enable all 3 PCI_CLK_OUTPUTs. */
1814e43b2e8SHeiko Schocher 	setbits_be32(&clk->occr, 0xe0000000);
1824e43b2e8SHeiko Schocher 
1834e43b2e8SHeiko Schocher 	/*
1844e43b2e8SHeiko Schocher 	 * Configure PCI Local Access Windows
1854e43b2e8SHeiko Schocher 	 */
1864e43b2e8SHeiko Schocher 	out_be32(&pci_law[0].bar, CONFIG_SYS_PCI1_MEM_PHYS & LAWBAR_BAR);
1874e43b2e8SHeiko Schocher 	out_be32(&pci_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB);
1884e43b2e8SHeiko Schocher 
1894e43b2e8SHeiko Schocher 	out_be32(&pci_law[1].bar, CONFIG_SYS_PCI1_IO_PHYS & LAWBAR_BAR);
1904e43b2e8SHeiko Schocher 	out_be32(&pci_law[1].ar, LBLAWAR_EN | LBLAWAR_1MB);
1914e43b2e8SHeiko Schocher 
1926aa3d3bfSPeter Tyser 	mpc83xx_pci_init(1, reg);
1934e43b2e8SHeiko Schocher }
1944e43b2e8SHeiko Schocher #endif
1954e43b2e8SHeiko Schocher 
1964e43b2e8SHeiko Schocher #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)197e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
1984e43b2e8SHeiko Schocher {
1994e43b2e8SHeiko Schocher 	ft_cpu_setup(blob, bd);
2004e43b2e8SHeiko Schocher #ifdef CONFIG_PCI
2014e43b2e8SHeiko Schocher 	ft_pci_setup(blob, bd);
2024e43b2e8SHeiko Schocher #endif
203e895a4b0SSimon Glass 
204e895a4b0SSimon Glass 	return 0;
2054e43b2e8SHeiko Schocher }
2064e43b2e8SHeiko Schocher #endif
207