1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2000-2009 4 * Viresh Kumar, ST Microelectronics, viresh.kumar@st.com 5 * Vipin Kumar, ST Microelectronics, vipin.kumar@st.com 6 */ 7 8 #include <common.h> 9 #include <asm/hardware.h> 10 #include <asm/io.h> 11 #include <asm/arch/spr_misc.h> 12 #include <asm/arch/spr_defs.h> 13 14 void spear_late_init(void) 15 { 16 struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE; 17 18 writel(0x80000007, &misc_p->arb_icm_ml1); 19 writel(0x80000007, &misc_p->arb_icm_ml2); 20 writel(0x80000007, &misc_p->arb_icm_ml3); 21 writel(0x80000007, &misc_p->arb_icm_ml4); 22 writel(0x80000007, &misc_p->arb_icm_ml5); 23 writel(0x80000007, &misc_p->arb_icm_ml6); 24 writel(0x80000007, &misc_p->arb_icm_ml7); 25 writel(0x80000007, &misc_p->arb_icm_ml8); 26 writel(0x80000007, &misc_p->arb_icm_ml9); 27 } 28 29 static void sel_1v8(void) 30 { 31 struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE; 32 u32 ddr1v8, ddr2v5; 33 34 ddr2v5 = readl(&misc_p->ddr_2v5_compensation); 35 ddr2v5 &= 0x8080ffc0; 36 ddr2v5 |= 0x78000003; 37 writel(ddr2v5, &misc_p->ddr_2v5_compensation); 38 39 ddr1v8 = readl(&misc_p->ddr_1v8_compensation); 40 ddr1v8 &= 0x8080ffc0; 41 ddr1v8 |= 0x78000010; 42 writel(ddr1v8, &misc_p->ddr_1v8_compensation); 43 44 while (!(readl(&misc_p->ddr_1v8_compensation) & DDR_COMP_ACCURATE)) 45 ; 46 } 47 48 static void sel_2v5(void) 49 { 50 struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE; 51 u32 ddr1v8, ddr2v5; 52 53 ddr1v8 = readl(&misc_p->ddr_1v8_compensation); 54 ddr1v8 &= 0x8080ffc0; 55 ddr1v8 |= 0x78000003; 56 writel(ddr1v8, &misc_p->ddr_1v8_compensation); 57 58 ddr2v5 = readl(&misc_p->ddr_2v5_compensation); 59 ddr2v5 &= 0x8080ffc0; 60 ddr2v5 |= 0x78000010; 61 writel(ddr2v5, &misc_p->ddr_2v5_compensation); 62 63 while (!(readl(&misc_p->ddr_2v5_compensation) & DDR_COMP_ACCURATE)) 64 ; 65 } 66 67 /* 68 * plat_ddr_init: 69 */ 70 void plat_ddr_init(void) 71 { 72 struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE; 73 u32 ddrpad; 74 u32 core3v3, ddr1v8, ddr2v5; 75 76 /* DDR pad register configurations */ 77 ddrpad = readl(&misc_p->ddr_pad); 78 ddrpad &= ~DDR_PAD_CNF_MSK; 79 80 #if (CONFIG_DDR_HCLK) 81 ddrpad |= 0xEAAB; 82 #elif (CONFIG_DDR_2HCLK) 83 ddrpad |= 0xEAAD; 84 #elif (CONFIG_DDR_PLL2) 85 ddrpad |= 0xEAAD; 86 #endif 87 writel(ddrpad, &misc_p->ddr_pad); 88 89 /* Compensation register configurations */ 90 core3v3 = readl(&misc_p->core_3v3_compensation); 91 core3v3 &= 0x8080ffe0; 92 core3v3 |= 0x78000002; 93 writel(core3v3, &misc_p->core_3v3_compensation); 94 95 ddr1v8 = readl(&misc_p->ddr_1v8_compensation); 96 ddr1v8 &= 0x8080ffc0; 97 ddr1v8 |= 0x78000004; 98 writel(ddr1v8, &misc_p->ddr_1v8_compensation); 99 100 ddr2v5 = readl(&misc_p->ddr_2v5_compensation); 101 ddr2v5 &= 0x8080ffc0; 102 ddr2v5 |= 0x78000004; 103 writel(ddr2v5, &misc_p->ddr_2v5_compensation); 104 105 if ((readl(&misc_p->ddr_pad) & DDR_PAD_SW_CONF) == DDR_PAD_SW_CONF) { 106 /* Software memory configuration */ 107 if (readl(&misc_p->ddr_pad) & DDR_PAD_SSTL_SEL) 108 sel_1v8(); 109 else 110 sel_2v5(); 111 } else { 112 /* Hardware memory configuration */ 113 if (readl(&misc_p->ddr_pad) & DDR_PAD_DRAM_TYPE) 114 sel_1v8(); 115 else 116 sel_2v5(); 117 } 118 } 119 120 /* 121 * xxx_boot_selected: 122 * 123 * return true if the particular booting option is selected 124 * return false otherwise 125 */ 126 static u32 read_bootstrap(void) 127 { 128 return (readl(CONFIG_SPEAR_BOOTSTRAPCFG) >> CONFIG_SPEAR_BOOTSTRAPSHFT) 129 & CONFIG_SPEAR_BOOTSTRAPMASK; 130 } 131 132 int snor_boot_selected(void) 133 { 134 u32 bootstrap = read_bootstrap(); 135 136 if (SNOR_BOOT_SUPPORTED) { 137 /* Check whether SNOR boot is selected */ 138 if ((bootstrap & CONFIG_SPEAR_ONLYSNORBOOT) == 139 CONFIG_SPEAR_ONLYSNORBOOT) 140 return true; 141 142 if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) == 143 CONFIG_SPEAR_NORNAND8BOOT) 144 return true; 145 146 if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) == 147 CONFIG_SPEAR_NORNAND16BOOT) 148 return true; 149 } 150 151 return false; 152 } 153 154 int nand_boot_selected(void) 155 { 156 u32 bootstrap = read_bootstrap(); 157 158 if (NAND_BOOT_SUPPORTED) { 159 /* Check whether NAND boot is selected */ 160 if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) == 161 CONFIG_SPEAR_NORNAND8BOOT) 162 return true; 163 164 if ((bootstrap & CONFIG_SPEAR_NORNANDBOOT) == 165 CONFIG_SPEAR_NORNAND16BOOT) 166 return true; 167 } 168 169 return false; 170 } 171 172 int pnor_boot_selected(void) 173 { 174 /* Parallel NOR boot is not selected in any SPEAr600 revision */ 175 return false; 176 } 177 178 int usb_boot_selected(void) 179 { 180 u32 bootstrap = read_bootstrap(); 181 182 if (USB_BOOT_SUPPORTED) { 183 /* Check whether USB boot is selected */ 184 if (!(bootstrap & CONFIG_SPEAR_USBBOOT)) 185 return true; 186 } 187 188 return false; 189 } 190 191 int tftp_boot_selected(void) 192 { 193 /* TFTP boot is not selected in any SPEAr600 revision */ 194 return false; 195 } 196 197 int uart_boot_selected(void) 198 { 199 /* UART boot is not selected in any SPEAr600 revision */ 200 return false; 201 } 202 203 int spi_boot_selected(void) 204 { 205 /* SPI boot is not selected in any SPEAr600 revision */ 206 return false; 207 } 208 209 int i2c_boot_selected(void) 210 { 211 /* I2C boot is not selected in any SPEAr600 revision */ 212 return false; 213 } 214 215 int mmc_boot_selected(void) 216 { 217 return false; 218 } 219 220 void plat_late_init(void) 221 { 222 spear_late_init(); 223 } 224