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