1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Atheros AR71XX/AR724X/AR913X specific setup 4 * 5 * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com> 6 * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> 7 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 8 * 9 * Parts of this file are based on Atheros' 2.6.15/2.6.31 BSP 10 */ 11 12 #include <linux/kernel.h> 13 #include <linux/init.h> 14 #include <linux/io.h> 15 #include <linux/memblock.h> 16 #include <linux/err.h> 17 #include <linux/clk.h> 18 #include <linux/of_clk.h> 19 #include <linux/of_fdt.h> 20 #include <linux/irqchip.h> 21 22 #include <asm/bootinfo.h> 23 #include <asm/idle.h> 24 #include <asm/time.h> /* for mips_hpt_frequency */ 25 #include <asm/reboot.h> /* for _machine_{restart,halt} */ 26 #include <asm/prom.h> 27 #include <asm/fw/fw.h> 28 29 #include <asm/mach-ath79/ath79.h> 30 #include <asm/mach-ath79/ar71xx_regs.h> 31 #include "common.h" 32 33 #define ATH79_SYS_TYPE_LEN 64 34 35 static char ath79_sys_type[ATH79_SYS_TYPE_LEN]; 36 37 static void ath79_halt(void) 38 { 39 while (1) 40 cpu_wait(); 41 } 42 43 static void __init ath79_detect_sys_type(void) 44 { 45 char *chip = "????"; 46 u32 id; 47 u32 major; 48 u32 minor; 49 u32 rev = 0; 50 u32 ver = 1; 51 52 id = ath79_reset_rr(AR71XX_RESET_REG_REV_ID); 53 major = id & REV_ID_MAJOR_MASK; 54 55 switch (major) { 56 case REV_ID_MAJOR_AR71XX: 57 minor = id & AR71XX_REV_ID_MINOR_MASK; 58 rev = id >> AR71XX_REV_ID_REVISION_SHIFT; 59 rev &= AR71XX_REV_ID_REVISION_MASK; 60 switch (minor) { 61 case AR71XX_REV_ID_MINOR_AR7130: 62 ath79_soc = ATH79_SOC_AR7130; 63 chip = "7130"; 64 break; 65 66 case AR71XX_REV_ID_MINOR_AR7141: 67 ath79_soc = ATH79_SOC_AR7141; 68 chip = "7141"; 69 break; 70 71 case AR71XX_REV_ID_MINOR_AR7161: 72 ath79_soc = ATH79_SOC_AR7161; 73 chip = "7161"; 74 break; 75 } 76 break; 77 78 case REV_ID_MAJOR_AR7240: 79 ath79_soc = ATH79_SOC_AR7240; 80 chip = "7240"; 81 rev = id & AR724X_REV_ID_REVISION_MASK; 82 break; 83 84 case REV_ID_MAJOR_AR7241: 85 ath79_soc = ATH79_SOC_AR7241; 86 chip = "7241"; 87 rev = id & AR724X_REV_ID_REVISION_MASK; 88 break; 89 90 case REV_ID_MAJOR_AR7242: 91 ath79_soc = ATH79_SOC_AR7242; 92 chip = "7242"; 93 rev = id & AR724X_REV_ID_REVISION_MASK; 94 break; 95 96 case REV_ID_MAJOR_AR913X: 97 minor = id & AR913X_REV_ID_MINOR_MASK; 98 rev = id >> AR913X_REV_ID_REVISION_SHIFT; 99 rev &= AR913X_REV_ID_REVISION_MASK; 100 switch (minor) { 101 case AR913X_REV_ID_MINOR_AR9130: 102 ath79_soc = ATH79_SOC_AR9130; 103 chip = "9130"; 104 break; 105 106 case AR913X_REV_ID_MINOR_AR9132: 107 ath79_soc = ATH79_SOC_AR9132; 108 chip = "9132"; 109 break; 110 } 111 break; 112 113 case REV_ID_MAJOR_AR9330: 114 ath79_soc = ATH79_SOC_AR9330; 115 chip = "9330"; 116 rev = id & AR933X_REV_ID_REVISION_MASK; 117 break; 118 119 case REV_ID_MAJOR_AR9331: 120 ath79_soc = ATH79_SOC_AR9331; 121 chip = "9331"; 122 rev = id & AR933X_REV_ID_REVISION_MASK; 123 break; 124 125 case REV_ID_MAJOR_AR9341: 126 ath79_soc = ATH79_SOC_AR9341; 127 chip = "9341"; 128 rev = id & AR934X_REV_ID_REVISION_MASK; 129 break; 130 131 case REV_ID_MAJOR_AR9342: 132 ath79_soc = ATH79_SOC_AR9342; 133 chip = "9342"; 134 rev = id & AR934X_REV_ID_REVISION_MASK; 135 break; 136 137 case REV_ID_MAJOR_AR9344: 138 ath79_soc = ATH79_SOC_AR9344; 139 chip = "9344"; 140 rev = id & AR934X_REV_ID_REVISION_MASK; 141 break; 142 143 case REV_ID_MAJOR_QCA9533_V2: 144 ver = 2; 145 ath79_soc_rev = 2; 146 fallthrough; 147 case REV_ID_MAJOR_QCA9533: 148 ath79_soc = ATH79_SOC_QCA9533; 149 chip = "9533"; 150 rev = id & QCA953X_REV_ID_REVISION_MASK; 151 break; 152 153 case REV_ID_MAJOR_QCA9556: 154 ath79_soc = ATH79_SOC_QCA9556; 155 chip = "9556"; 156 rev = id & QCA955X_REV_ID_REVISION_MASK; 157 break; 158 159 case REV_ID_MAJOR_QCA9558: 160 ath79_soc = ATH79_SOC_QCA9558; 161 chip = "9558"; 162 rev = id & QCA955X_REV_ID_REVISION_MASK; 163 break; 164 165 case REV_ID_MAJOR_QCA956X: 166 ath79_soc = ATH79_SOC_QCA956X; 167 chip = "956X"; 168 rev = id & QCA956X_REV_ID_REVISION_MASK; 169 break; 170 171 case REV_ID_MAJOR_TP9343: 172 ath79_soc = ATH79_SOC_TP9343; 173 chip = "9343"; 174 rev = id & QCA956X_REV_ID_REVISION_MASK; 175 break; 176 177 default: 178 panic("ath79: unknown SoC, id:0x%08x", id); 179 } 180 181 if (ver == 1) 182 ath79_soc_rev = rev; 183 184 if (soc_is_qca953x() || soc_is_qca955x() || soc_is_qca956x()) 185 sprintf(ath79_sys_type, "Qualcomm Atheros QCA%s ver %u rev %u", 186 chip, ver, rev); 187 else if (soc_is_tp9343()) 188 sprintf(ath79_sys_type, "Qualcomm Atheros TP%s rev %u", 189 chip, rev); 190 else 191 sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev); 192 pr_info("SoC: %s\n", ath79_sys_type); 193 } 194 195 const char *get_system_type(void) 196 { 197 return ath79_sys_type; 198 } 199 200 unsigned int get_c0_compare_int(void) 201 { 202 return CP0_LEGACY_COMPARE_IRQ; 203 } 204 205 void __init plat_mem_setup(void) 206 { 207 void *dtb; 208 209 set_io_port_base(KSEG1); 210 211 /* Get the position of the FDT passed by the bootloader */ 212 dtb = (void *)fw_getenvl("fdt_start"); 213 if (dtb == NULL) 214 dtb = get_fdt(); 215 216 if (dtb) 217 __dt_setup_arch((void *)KSEG0ADDR(dtb)); 218 219 ath79_reset_base = ioremap(AR71XX_RESET_BASE, 220 AR71XX_RESET_SIZE); 221 ath79_pll_base = ioremap(AR71XX_PLL_BASE, 222 AR71XX_PLL_SIZE); 223 ath79_detect_sys_type(); 224 ath79_ddr_ctrl_init(); 225 226 detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX); 227 228 _machine_halt = ath79_halt; 229 pm_power_off = ath79_halt; 230 } 231 232 void __init plat_time_init(void) 233 { 234 struct device_node *np; 235 struct clk *clk; 236 unsigned long cpu_clk_rate; 237 238 of_clk_init(NULL); 239 240 np = of_get_cpu_node(0, NULL); 241 if (!np) { 242 pr_err("Failed to get CPU node\n"); 243 return; 244 } 245 246 clk = of_clk_get(np, 0); 247 if (IS_ERR(clk)) { 248 pr_err("Failed to get CPU clock: %ld\n", PTR_ERR(clk)); 249 return; 250 } 251 252 cpu_clk_rate = clk_get_rate(clk); 253 254 pr_info("CPU clock: %lu.%03lu MHz\n", 255 cpu_clk_rate / 1000000, (cpu_clk_rate / 1000) % 1000); 256 257 mips_hpt_frequency = cpu_clk_rate / 2; 258 259 clk_put(clk); 260 } 261 262 void __init arch_init_irq(void) 263 { 264 irqchip_init(); 265 } 266 267 void __init device_tree_init(void) 268 { 269 unflatten_and_copy_device_tree(); 270 } 271