xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm926ejs/spear/spear600.c (revision 2fbdbda1c7c48aa622812054633afc6cdff91eab)
14ae8bc43SStefan Roese /*
24ae8bc43SStefan Roese  * (C) Copyright 2000-2009
34ae8bc43SStefan Roese  * Viresh Kumar, ST Microelectronics, viresh.kumar@st.com
44ae8bc43SStefan Roese  * Vipin Kumar, ST Microelectronics, vipin.kumar@st.com
54ae8bc43SStefan Roese  *
61a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
74ae8bc43SStefan Roese  */
84ae8bc43SStefan Roese 
94ae8bc43SStefan Roese #include <common.h>
104ae8bc43SStefan Roese #include <asm/hardware.h>
114ae8bc43SStefan Roese #include <asm/io.h>
124ae8bc43SStefan Roese #include <asm/arch/spr_misc.h>
134ae8bc43SStefan Roese #include <asm/arch/spr_defs.h>
144ae8bc43SStefan Roese 
spear_late_init(void)15*2fbdbda1SStefan Roese void spear_late_init(void)
16*2fbdbda1SStefan Roese {
17*2fbdbda1SStefan Roese 	struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
18*2fbdbda1SStefan Roese 
19*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml1);
20*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml2);
21*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml3);
22*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml4);
23*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml5);
24*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml6);
25*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml7);
26*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml8);
27*2fbdbda1SStefan Roese 	writel(0x80000007, &misc_p->arb_icm_ml9);
28*2fbdbda1SStefan Roese }
29*2fbdbda1SStefan Roese 
sel_1v8(void)304ae8bc43SStefan Roese static void sel_1v8(void)
314ae8bc43SStefan Roese {
324ae8bc43SStefan Roese 	struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
334ae8bc43SStefan Roese 	u32 ddr1v8, ddr2v5;
344ae8bc43SStefan Roese 
354ae8bc43SStefan Roese 	ddr2v5 = readl(&misc_p->ddr_2v5_compensation);
364ae8bc43SStefan Roese 	ddr2v5 &= 0x8080ffc0;
374ae8bc43SStefan Roese 	ddr2v5 |= 0x78000003;
384ae8bc43SStefan Roese 	writel(ddr2v5, &misc_p->ddr_2v5_compensation);
394ae8bc43SStefan Roese 
404ae8bc43SStefan Roese 	ddr1v8 = readl(&misc_p->ddr_1v8_compensation);
414ae8bc43SStefan Roese 	ddr1v8 &= 0x8080ffc0;
424ae8bc43SStefan Roese 	ddr1v8 |= 0x78000010;
434ae8bc43SStefan Roese 	writel(ddr1v8, &misc_p->ddr_1v8_compensation);
444ae8bc43SStefan Roese 
454ae8bc43SStefan Roese 	while (!(readl(&misc_p->ddr_1v8_compensation) & DDR_COMP_ACCURATE))
464ae8bc43SStefan Roese 		;
474ae8bc43SStefan Roese }
484ae8bc43SStefan Roese 
sel_2v5(void)494ae8bc43SStefan Roese static void sel_2v5(void)
504ae8bc43SStefan Roese {
514ae8bc43SStefan Roese 	struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
524ae8bc43SStefan Roese 	u32 ddr1v8, ddr2v5;
534ae8bc43SStefan Roese 
544ae8bc43SStefan Roese 	ddr1v8 = readl(&misc_p->ddr_1v8_compensation);
554ae8bc43SStefan Roese 	ddr1v8 &= 0x8080ffc0;
564ae8bc43SStefan Roese 	ddr1v8 |= 0x78000003;
574ae8bc43SStefan Roese 	writel(ddr1v8, &misc_p->ddr_1v8_compensation);
584ae8bc43SStefan Roese 
594ae8bc43SStefan Roese 	ddr2v5 = readl(&misc_p->ddr_2v5_compensation);
604ae8bc43SStefan Roese 	ddr2v5 &= 0x8080ffc0;
614ae8bc43SStefan Roese 	ddr2v5 |= 0x78000010;
624ae8bc43SStefan Roese 	writel(ddr2v5, &misc_p->ddr_2v5_compensation);
634ae8bc43SStefan Roese 
644ae8bc43SStefan Roese 	while (!(readl(&misc_p->ddr_2v5_compensation) & DDR_COMP_ACCURATE))
654ae8bc43SStefan Roese 		;
664ae8bc43SStefan Roese }
674ae8bc43SStefan Roese 
684ae8bc43SStefan Roese /*
694ae8bc43SStefan Roese  * plat_ddr_init:
704ae8bc43SStefan Roese  */
plat_ddr_init(void)714ae8bc43SStefan Roese void plat_ddr_init(void)
724ae8bc43SStefan Roese {
734ae8bc43SStefan Roese 	struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
744ae8bc43SStefan Roese 	u32 ddrpad;
754ae8bc43SStefan Roese 	u32 core3v3, ddr1v8, ddr2v5;
764ae8bc43SStefan Roese 
774ae8bc43SStefan Roese 	/* DDR pad register configurations */
784ae8bc43SStefan Roese 	ddrpad = readl(&misc_p->ddr_pad);
794ae8bc43SStefan Roese 	ddrpad &= ~DDR_PAD_CNF_MSK;
804ae8bc43SStefan Roese 
814ae8bc43SStefan Roese #if (CONFIG_DDR_HCLK)
824ae8bc43SStefan Roese 	ddrpad |= 0xEAAB;
834ae8bc43SStefan Roese #elif (CONFIG_DDR_2HCLK)
844ae8bc43SStefan Roese 	ddrpad |= 0xEAAD;
854ae8bc43SStefan Roese #elif (CONFIG_DDR_PLL2)
864ae8bc43SStefan Roese 	ddrpad |= 0xEAAD;
874ae8bc43SStefan Roese #endif
884ae8bc43SStefan Roese 	writel(ddrpad, &misc_p->ddr_pad);
894ae8bc43SStefan Roese 
904ae8bc43SStefan Roese 	/* Compensation register configurations */
914ae8bc43SStefan Roese 	core3v3 = readl(&misc_p->core_3v3_compensation);
924ae8bc43SStefan Roese 	core3v3 &= 0x8080ffe0;
934ae8bc43SStefan Roese 	core3v3 |= 0x78000002;
944ae8bc43SStefan Roese 	writel(core3v3, &misc_p->core_3v3_compensation);
954ae8bc43SStefan Roese 
964ae8bc43SStefan Roese 	ddr1v8 = readl(&misc_p->ddr_1v8_compensation);
974ae8bc43SStefan Roese 	ddr1v8 &= 0x8080ffc0;
984ae8bc43SStefan Roese 	ddr1v8 |= 0x78000004;
994ae8bc43SStefan Roese 	writel(ddr1v8, &misc_p->ddr_1v8_compensation);
1004ae8bc43SStefan Roese 
1014ae8bc43SStefan Roese 	ddr2v5 = readl(&misc_p->ddr_2v5_compensation);
1024ae8bc43SStefan Roese 	ddr2v5 &= 0x8080ffc0;
1034ae8bc43SStefan Roese 	ddr2v5 |= 0x78000004;
1044ae8bc43SStefan Roese 	writel(ddr2v5, &misc_p->ddr_2v5_compensation);
1054ae8bc43SStefan Roese 
1064ae8bc43SStefan Roese 	if ((readl(&misc_p->ddr_pad) & DDR_PAD_SW_CONF) == DDR_PAD_SW_CONF) {
1074ae8bc43SStefan Roese 		/* Software memory configuration */
1084ae8bc43SStefan Roese 		if (readl(&misc_p->ddr_pad) & DDR_PAD_SSTL_SEL)
1094ae8bc43SStefan Roese 			sel_1v8();
1104ae8bc43SStefan Roese 		else
1114ae8bc43SStefan Roese 			sel_2v5();
1124ae8bc43SStefan Roese 	} else {
1134ae8bc43SStefan Roese 		/* Hardware memory configuration */
1144ae8bc43SStefan Roese 		if (readl(&misc_p->ddr_pad) & DDR_PAD_DRAM_TYPE)
1154ae8bc43SStefan Roese 			sel_1v8();
1164ae8bc43SStefan Roese 		else
1174ae8bc43SStefan Roese 			sel_2v5();
1184ae8bc43SStefan Roese 	}
1194ae8bc43SStefan Roese }
1204ae8bc43SStefan Roese 
1214ae8bc43SStefan Roese /*
1224ae8bc43SStefan Roese  * xxx_boot_selected:
1234ae8bc43SStefan Roese  *
124472d5460SYork Sun  * return true if the particular booting option is selected
125472d5460SYork Sun  * return false otherwise
1264ae8bc43SStefan Roese  */
read_bootstrap(void)1274ae8bc43SStefan Roese static u32 read_bootstrap(void)
1284ae8bc43SStefan Roese {
1294ae8bc43SStefan Roese 	return (readl(CONFIG_SPEAR_BOOTSTRAPCFG) >> CONFIG_SPEAR_BOOTSTRAPSHFT)
1304ae8bc43SStefan Roese 		& CONFIG_SPEAR_BOOTSTRAPMASK;
1314ae8bc43SStefan Roese }
1324ae8bc43SStefan Roese 
snor_boot_selected(void)1334ae8bc43SStefan Roese int snor_boot_selected(void)
1344ae8bc43SStefan Roese {
1354ae8bc43SStefan Roese 	u32 bootstrap = read_bootstrap();
1364ae8bc43SStefan Roese 
1374ae8bc43SStefan Roese 	if (SNOR_BOOT_SUPPORTED) {
1384ae8bc43SStefan Roese 		/* Check whether SNOR boot is selected */
1394ae8bc43SStefan Roese 		if ((bootstrap & CONFIG_SPEAR_ONLYSNORBOOT) ==
1404ae8bc43SStefan Roese 			CONFIG_SPEAR_ONLYSNORBOOT)
141472d5460SYork Sun 			return true;
1424ae8bc43SStefan Roese 
1434ae8bc43SStefan Roese 		if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) ==
1444ae8bc43SStefan Roese 			CONFIG_SPEAR_NORNAND8BOOT)
145472d5460SYork Sun 			return true;
1464ae8bc43SStefan Roese 
1474ae8bc43SStefan Roese 		if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) ==
1484ae8bc43SStefan Roese 			CONFIG_SPEAR_NORNAND16BOOT)
149472d5460SYork Sun 			return true;
1504ae8bc43SStefan Roese 	}
1514ae8bc43SStefan Roese 
152472d5460SYork Sun 	return false;
1534ae8bc43SStefan Roese }
1544ae8bc43SStefan Roese 
nand_boot_selected(void)1554ae8bc43SStefan Roese int nand_boot_selected(void)
1564ae8bc43SStefan Roese {
1574ae8bc43SStefan Roese 	u32 bootstrap = read_bootstrap();
1584ae8bc43SStefan Roese 
1594ae8bc43SStefan Roese 	if (NAND_BOOT_SUPPORTED) {
1604ae8bc43SStefan Roese 		/* Check whether NAND boot is selected */
1614ae8bc43SStefan Roese 		if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) ==
1624ae8bc43SStefan Roese 			CONFIG_SPEAR_NORNAND8BOOT)
163472d5460SYork Sun 			return true;
1644ae8bc43SStefan Roese 
1654ae8bc43SStefan Roese 		if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) ==
1664ae8bc43SStefan Roese 			CONFIG_SPEAR_NORNAND16BOOT)
167472d5460SYork Sun 			return true;
1684ae8bc43SStefan Roese 	}
1694ae8bc43SStefan Roese 
170472d5460SYork Sun 	return false;
1714ae8bc43SStefan Roese }
1724ae8bc43SStefan Roese 
pnor_boot_selected(void)1734ae8bc43SStefan Roese int pnor_boot_selected(void)
1744ae8bc43SStefan Roese {
1754ae8bc43SStefan Roese 	/* Parallel NOR boot is not selected in any SPEAr600 revision */
176472d5460SYork Sun 	return false;
1774ae8bc43SStefan Roese }
1784ae8bc43SStefan Roese 
usb_boot_selected(void)1794ae8bc43SStefan Roese int usb_boot_selected(void)
1804ae8bc43SStefan Roese {
1814ae8bc43SStefan Roese 	u32 bootstrap = read_bootstrap();
1824ae8bc43SStefan Roese 
1834ae8bc43SStefan Roese 	if (USB_BOOT_SUPPORTED) {
1844ae8bc43SStefan Roese 		/* Check whether USB boot is selected */
1854ae8bc43SStefan Roese 		if (!(bootstrap & CONFIG_SPEAR_USBBOOT))
186472d5460SYork Sun 			return true;
1874ae8bc43SStefan Roese 	}
1884ae8bc43SStefan Roese 
189472d5460SYork Sun 	return false;
1904ae8bc43SStefan Roese }
1914ae8bc43SStefan Roese 
tftp_boot_selected(void)1924ae8bc43SStefan Roese int tftp_boot_selected(void)
1934ae8bc43SStefan Roese {
1944ae8bc43SStefan Roese 	/* TFTP boot is not selected in any SPEAr600 revision */
195472d5460SYork Sun 	return false;
1964ae8bc43SStefan Roese }
1974ae8bc43SStefan Roese 
uart_boot_selected(void)1984ae8bc43SStefan Roese int uart_boot_selected(void)
1994ae8bc43SStefan Roese {
2004ae8bc43SStefan Roese 	/* UART boot is not selected in any SPEAr600 revision */
201472d5460SYork Sun 	return false;
2024ae8bc43SStefan Roese }
2034ae8bc43SStefan Roese 
spi_boot_selected(void)2044ae8bc43SStefan Roese int spi_boot_selected(void)
2054ae8bc43SStefan Roese {
2064ae8bc43SStefan Roese 	/* SPI boot is not selected in any SPEAr600 revision */
207472d5460SYork Sun 	return false;
2084ae8bc43SStefan Roese }
2094ae8bc43SStefan Roese 
i2c_boot_selected(void)2104ae8bc43SStefan Roese int i2c_boot_selected(void)
2114ae8bc43SStefan Roese {
2124ae8bc43SStefan Roese 	/* I2C boot is not selected in any SPEAr600 revision */
213472d5460SYork Sun 	return false;
2144ae8bc43SStefan Roese }
2154ae8bc43SStefan Roese 
mmc_boot_selected(void)2164ae8bc43SStefan Roese int mmc_boot_selected(void)
2174ae8bc43SStefan Roese {
218472d5460SYork Sun 	return false;
2194ae8bc43SStefan Roese }
2204ae8bc43SStefan Roese 
plat_late_init(void)2214ae8bc43SStefan Roese void plat_late_init(void)
2224ae8bc43SStefan Roese {
2234ae8bc43SStefan Roese 	spear_late_init();
2244ae8bc43SStefan Roese }
225