xref: /rk3399_rockchip-uboot/board/freescale/mpc8315erdb/mpc8315erdb.c (revision 2e95004deb6e33e33bf1b8a92a38cd2115bac4c2)
18bd522ceSDave Liu /*
28bd522ceSDave Liu  * Copyright (C) 2007 Freescale Semiconductor, Inc.
38bd522ceSDave Liu  *
48bd522ceSDave Liu  * Author: Scott Wood <scottwood@freescale.com>
58bd522ceSDave Liu  *         Dave Liu <daveliu@freescale.com>
68bd522ceSDave Liu  *
78bd522ceSDave Liu  * See file CREDITS for list of people who contributed to this
88bd522ceSDave Liu  * project.
98bd522ceSDave Liu  *
108bd522ceSDave Liu  * This program is free software; you can redistribute it and/or
118bd522ceSDave Liu  * modify it under the terms of the GNU General Public License as
128bd522ceSDave Liu  * published by the Free Software Foundation; either version 2 of
138bd522ceSDave Liu  * the License, or (at your option) any later version.
148bd522ceSDave Liu  *
158bd522ceSDave Liu  * This program is distributed in the hope that it will be useful,
168bd522ceSDave Liu  * but WITHOUT ANY WARRANTY; without even the implied warranty of
178bd522ceSDave Liu  * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE.  See the
188bd522ceSDave Liu  * GNU General Public License for more details.
198bd522ceSDave Liu  *
208bd522ceSDave Liu  * You should have received a copy of the GNU General Public License
218bd522ceSDave Liu  * along with this program; if not, write to the Free Software
228bd522ceSDave Liu  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
238bd522ceSDave Liu  * MA 02111-1307 USA
248bd522ceSDave Liu  */
258bd522ceSDave Liu 
268bd522ceSDave Liu #include <common.h>
27b8b71ffbSAnton Vorontsov #include <hwconfig.h>
288bd522ceSDave Liu #include <i2c.h>
298bd522ceSDave Liu #include <libfdt.h>
3025f5f0d4SAnton Vorontsov #include <fdt_support.h>
318bd522ceSDave Liu #include <pci.h>
328bd522ceSDave Liu #include <mpc83xx.h>
3310efa024SBen Warren #include <netdev.h>
348f11e34bSAnton Vorontsov #include <asm/io.h>
35*2e95004dSAnton Vorontsov #include <ns16550.h>
36*2e95004dSAnton Vorontsov #include <nand.h>
378bd522ceSDave Liu 
388bd522ceSDave Liu DECLARE_GLOBAL_DATA_PTR;
398bd522ceSDave Liu 
408bd522ceSDave Liu int board_early_init_f(void)
418bd522ceSDave Liu {
426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
438bd522ceSDave Liu 
448bd522ceSDave Liu 	if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
458bd522ceSDave Liu 		gd->flags |= GD_FLG_SILENT;
468bd522ceSDave Liu 
478bd522ceSDave Liu 	return 0;
488bd522ceSDave Liu }
498bd522ceSDave Liu 
50*2e95004dSAnton Vorontsov #ifndef CONFIG_NAND_SPL
51*2e95004dSAnton Vorontsov 
528bd522ceSDave Liu static u8 read_board_info(void)
538bd522ceSDave Liu {
548bd522ceSDave Liu 	u8 val8;
558bd522ceSDave Liu 	i2c_set_bus_num(0);
568bd522ceSDave Liu 
576d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_PCF8574A_ADDR, 0, 0, &val8, 1) == 0)
588bd522ceSDave Liu 		return val8;
598bd522ceSDave Liu 	else
608bd522ceSDave Liu 		return 0;
618bd522ceSDave Liu }
628bd522ceSDave Liu 
638bd522ceSDave Liu int checkboard(void)
648bd522ceSDave Liu {
658bd522ceSDave Liu 	static const char * const rev_str[] = {
668bd522ceSDave Liu 		"0.0",
678bd522ceSDave Liu 		"0.1",
688bd522ceSDave Liu 		"1.0",
698bd522ceSDave Liu 		"1.1",
708bd522ceSDave Liu 		"<unknown>",
718bd522ceSDave Liu 	};
728bd522ceSDave Liu 	u8 info;
738bd522ceSDave Liu 	int i;
748bd522ceSDave Liu 
758bd522ceSDave Liu 	info = read_board_info();
768bd522ceSDave Liu 	i = (!info) ? 4: info & 0x03;
778bd522ceSDave Liu 
788bd522ceSDave Liu 	printf("Board: Freescale MPC8315ERDB Rev %s\n", rev_str[i]);
798bd522ceSDave Liu 
808bd522ceSDave Liu 	return 0;
818bd522ceSDave Liu }
828bd522ceSDave Liu 
838bd522ceSDave Liu static struct pci_region pci_regions[] = {
848bd522ceSDave Liu 	{
856d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI_MEM_BASE,
866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI_MEM_PHYS,
876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI_MEM_SIZE,
888bd522ceSDave Liu 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
898bd522ceSDave Liu 	},
908bd522ceSDave Liu 	{
916d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI_MMIO_BASE,
926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI_MMIO_PHYS,
936d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI_MMIO_SIZE,
948bd522ceSDave Liu 		flags: PCI_REGION_MEM
958bd522ceSDave Liu 	},
968bd522ceSDave Liu 	{
976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI_IO_BASE,
986d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI_IO_PHYS,
996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI_IO_SIZE,
1008bd522ceSDave Liu 		flags: PCI_REGION_IO
1018bd522ceSDave Liu 	}
1028bd522ceSDave Liu };
1038bd522ceSDave Liu 
1048f11e34bSAnton Vorontsov static struct pci_region pcie_regions_0[] = {
1058f11e34bSAnton Vorontsov 	{
1068f11e34bSAnton Vorontsov 		.bus_start = CONFIG_SYS_PCIE1_MEM_BASE,
1078f11e34bSAnton Vorontsov 		.phys_start = CONFIG_SYS_PCIE1_MEM_PHYS,
1088f11e34bSAnton Vorontsov 		.size = CONFIG_SYS_PCIE1_MEM_SIZE,
1098f11e34bSAnton Vorontsov 		.flags = PCI_REGION_MEM,
1108f11e34bSAnton Vorontsov 	},
1118f11e34bSAnton Vorontsov 	{
1128f11e34bSAnton Vorontsov 		.bus_start = CONFIG_SYS_PCIE1_IO_BASE,
1138f11e34bSAnton Vorontsov 		.phys_start = CONFIG_SYS_PCIE1_IO_PHYS,
1148f11e34bSAnton Vorontsov 		.size = CONFIG_SYS_PCIE1_IO_SIZE,
1158f11e34bSAnton Vorontsov 		.flags = PCI_REGION_IO,
1168f11e34bSAnton Vorontsov 	},
1178f11e34bSAnton Vorontsov };
1188f11e34bSAnton Vorontsov 
1198f11e34bSAnton Vorontsov static struct pci_region pcie_regions_1[] = {
1208f11e34bSAnton Vorontsov 	{
1218f11e34bSAnton Vorontsov 		.bus_start = CONFIG_SYS_PCIE2_MEM_BASE,
1228f11e34bSAnton Vorontsov 		.phys_start = CONFIG_SYS_PCIE2_MEM_PHYS,
1238f11e34bSAnton Vorontsov 		.size = CONFIG_SYS_PCIE2_MEM_SIZE,
1248f11e34bSAnton Vorontsov 		.flags = PCI_REGION_MEM,
1258f11e34bSAnton Vorontsov 	},
1268f11e34bSAnton Vorontsov 	{
1278f11e34bSAnton Vorontsov 		.bus_start = CONFIG_SYS_PCIE2_IO_BASE,
1288f11e34bSAnton Vorontsov 		.phys_start = CONFIG_SYS_PCIE2_IO_PHYS,
1298f11e34bSAnton Vorontsov 		.size = CONFIG_SYS_PCIE2_IO_SIZE,
1308f11e34bSAnton Vorontsov 		.flags = PCI_REGION_IO,
1318f11e34bSAnton Vorontsov 	},
1328f11e34bSAnton Vorontsov };
1338f11e34bSAnton Vorontsov 
1348bd522ceSDave Liu void pci_init_board(void)
1358bd522ceSDave Liu {
1366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
1378f11e34bSAnton Vorontsov 	volatile sysconf83xx_t *sysconf = &immr->sysconf;
1388bd522ceSDave Liu 	volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
1398bd522ceSDave Liu 	volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
1408f11e34bSAnton Vorontsov 	volatile law83xx_t *pcie_law = sysconf->pcielaw;
1418bd522ceSDave Liu 	struct pci_region *reg[] = { pci_regions };
1428f11e34bSAnton Vorontsov 	struct pci_region *pcie_reg[] = { pcie_regions_0, pcie_regions_1, };
1438bd522ceSDave Liu 	int warmboot;
1448bd522ceSDave Liu 
1458bd522ceSDave Liu 	/* Enable all 3 PCI_CLK_OUTPUTs. */
1468bd522ceSDave Liu 	clk->occr |= 0xe0000000;
1478bd522ceSDave Liu 
1488bd522ceSDave Liu 	/*
1498bd522ceSDave Liu 	 * Configure PCI Local Access Windows
1508bd522ceSDave Liu 	 */
1516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[0].bar = CONFIG_SYS_PCI_MEM_PHYS & LAWBAR_BAR;
1528bd522ceSDave Liu 	pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB;
1538bd522ceSDave Liu 
1546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[1].bar = CONFIG_SYS_PCI_IO_PHYS & LAWBAR_BAR;
1558bd522ceSDave Liu 	pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB;
1568bd522ceSDave Liu 
1578bd522ceSDave Liu 	warmboot = gd->bd->bi_bootflags & BOOTFLAG_WARM;
1588bd522ceSDave Liu 	warmboot |= immr->pmc.pmccr1 & PMCCR1_POWER_OFF;
1598bd522ceSDave Liu 
1608bd522ceSDave Liu 	mpc83xx_pci_init(1, reg, warmboot);
1618f11e34bSAnton Vorontsov 
1628f11e34bSAnton Vorontsov 	/* Configure the clock for PCIE controller */
1638f11e34bSAnton Vorontsov 	clrsetbits_be32(&clk->sccr, SCCR_PCIEXP1CM | SCCR_PCIEXP2CM,
1648f11e34bSAnton Vorontsov 				    SCCR_PCIEXP1CM_1 | SCCR_PCIEXP2CM_1);
1658f11e34bSAnton Vorontsov 
1668f11e34bSAnton Vorontsov 	/* Deassert the resets in the control register */
1678f11e34bSAnton Vorontsov 	out_be32(&sysconf->pecr1, 0xE0008000);
1688f11e34bSAnton Vorontsov 	out_be32(&sysconf->pecr2, 0xE0008000);
1698f11e34bSAnton Vorontsov 	udelay(2000);
1708f11e34bSAnton Vorontsov 
1718f11e34bSAnton Vorontsov 	/* Configure PCI Express Local Access Windows */
1728f11e34bSAnton Vorontsov 	out_be32(&pcie_law[0].bar, CONFIG_SYS_PCIE1_BASE & LAWBAR_BAR);
1738f11e34bSAnton Vorontsov 	out_be32(&pcie_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB);
1748f11e34bSAnton Vorontsov 
1758f11e34bSAnton Vorontsov 	out_be32(&pcie_law[1].bar, CONFIG_SYS_PCIE2_BASE & LAWBAR_BAR);
1768f11e34bSAnton Vorontsov 	out_be32(&pcie_law[1].ar, LBLAWAR_EN | LBLAWAR_512MB);
1778f11e34bSAnton Vorontsov 
1788f11e34bSAnton Vorontsov 	mpc83xx_pcie_init(2, pcie_reg, warmboot);
1798bd522ceSDave Liu }
1808bd522ceSDave Liu 
1818bd522ceSDave Liu #if defined(CONFIG_OF_BOARD_SETUP)
18225f5f0d4SAnton Vorontsov void fdt_tsec1_fixup(void *fdt, bd_t *bd)
18325f5f0d4SAnton Vorontsov {
18425f5f0d4SAnton Vorontsov 	const char disabled[] = "disabled";
18525f5f0d4SAnton Vorontsov 	const char *path;
18625f5f0d4SAnton Vorontsov 	int ret;
18725f5f0d4SAnton Vorontsov 
188b8b71ffbSAnton Vorontsov 	if (hwconfig_arg_cmp("board_type", "tsec1")) {
189021f6df6SAnton Vorontsov 		return;
190b8b71ffbSAnton Vorontsov 	} else if (!hwconfig_arg_cmp("board_type", "ulpi")) {
191b8b71ffbSAnton Vorontsov 		printf("NOTICE: No or unknown board_type hwconfig specified.\n"
192b8b71ffbSAnton Vorontsov 		       "        Assuming board with TSEC1.\n");
19325f5f0d4SAnton Vorontsov 		return;
19425f5f0d4SAnton Vorontsov 	}
19525f5f0d4SAnton Vorontsov 
19625f5f0d4SAnton Vorontsov 	ret = fdt_path_offset(fdt, "/aliases");
19725f5f0d4SAnton Vorontsov 	if (ret < 0) {
19825f5f0d4SAnton Vorontsov 		printf("WARNING: can't find /aliases node\n");
19925f5f0d4SAnton Vorontsov 		return;
20025f5f0d4SAnton Vorontsov 	}
20125f5f0d4SAnton Vorontsov 
20225f5f0d4SAnton Vorontsov 	path = fdt_getprop(fdt, ret, "ethernet0", NULL);
20325f5f0d4SAnton Vorontsov 	if (!path) {
20425f5f0d4SAnton Vorontsov 		printf("WARNING: can't find ethernet0 alias\n");
20525f5f0d4SAnton Vorontsov 		return;
20625f5f0d4SAnton Vorontsov 	}
20725f5f0d4SAnton Vorontsov 
20825f5f0d4SAnton Vorontsov 	do_fixup_by_path(fdt, path, "status", disabled, sizeof(disabled), 1);
20925f5f0d4SAnton Vorontsov }
21025f5f0d4SAnton Vorontsov 
2118bd522ceSDave Liu void ft_board_setup(void *blob, bd_t *bd)
2128bd522ceSDave Liu {
2138bd522ceSDave Liu 	ft_cpu_setup(blob, bd);
2148bd522ceSDave Liu #ifdef CONFIG_PCI
2158bd522ceSDave Liu 	ft_pci_setup(blob, bd);
2168bd522ceSDave Liu #endif
21725f5f0d4SAnton Vorontsov 	fdt_fixup_dr_usb(blob, bd);
21825f5f0d4SAnton Vorontsov 	fdt_tsec1_fixup(blob, bd);
2198bd522ceSDave Liu }
2208bd522ceSDave Liu #endif
22110efa024SBen Warren 
22210efa024SBen Warren int board_eth_init(bd_t *bis)
22310efa024SBen Warren {
22410efa024SBen Warren 	cpu_eth_init(bis);	/* Initialize TSECs first */
22510efa024SBen Warren 	return pci_eth_init(bis);
22610efa024SBen Warren }
227*2e95004dSAnton Vorontsov 
228*2e95004dSAnton Vorontsov #else /* CONFIG_NAND_SPL */
229*2e95004dSAnton Vorontsov 
230*2e95004dSAnton Vorontsov int checkboard(void)
231*2e95004dSAnton Vorontsov {
232*2e95004dSAnton Vorontsov 	puts("Board: Freescale MPC8315ERDB\n");
233*2e95004dSAnton Vorontsov 	return 0;
234*2e95004dSAnton Vorontsov }
235*2e95004dSAnton Vorontsov 
236*2e95004dSAnton Vorontsov void board_init_f(ulong bootflag)
237*2e95004dSAnton Vorontsov {
238*2e95004dSAnton Vorontsov 	board_early_init_f();
239*2e95004dSAnton Vorontsov 	NS16550_init((NS16550_t)(CONFIG_SYS_IMMR + 0x4500),
240*2e95004dSAnton Vorontsov 		     CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE);
241*2e95004dSAnton Vorontsov 	puts("NAND boot... ");
242*2e95004dSAnton Vorontsov 	init_timebase();
243*2e95004dSAnton Vorontsov 	initdram(0);
244*2e95004dSAnton Vorontsov 	relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000, (gd_t *)gd,
245*2e95004dSAnton Vorontsov 		      CONFIG_SYS_NAND_U_BOOT_RELOC);
246*2e95004dSAnton Vorontsov }
247*2e95004dSAnton Vorontsov 
248*2e95004dSAnton Vorontsov void board_init_r(gd_t *gd, ulong dest_addr)
249*2e95004dSAnton Vorontsov {
250*2e95004dSAnton Vorontsov 	nand_boot();
251*2e95004dSAnton Vorontsov }
252*2e95004dSAnton Vorontsov 
253*2e95004dSAnton Vorontsov void putc(char c)
254*2e95004dSAnton Vorontsov {
255*2e95004dSAnton Vorontsov 	if (gd->flags & GD_FLG_SILENT)
256*2e95004dSAnton Vorontsov 		return;
257*2e95004dSAnton Vorontsov 
258*2e95004dSAnton Vorontsov 	if (c == '\n')
259*2e95004dSAnton Vorontsov 		NS16550_putc((NS16550_t)(CONFIG_SYS_IMMR + 0x4500), '\r');
260*2e95004dSAnton Vorontsov 
261*2e95004dSAnton Vorontsov 	NS16550_putc((NS16550_t)(CONFIG_SYS_IMMR + 0x4500), c);
262*2e95004dSAnton Vorontsov }
263*2e95004dSAnton Vorontsov 
264*2e95004dSAnton Vorontsov #endif /* CONFIG_NAND_SPL */
265