1e7300d04SMaxime Bizon /*
2e7300d04SMaxime Bizon * This file is subject to the terms and conditions of the GNU General Public
3e7300d04SMaxime Bizon * License. See the file "COPYING" in the main directory of this archive
4e7300d04SMaxime Bizon * for more details.
5e7300d04SMaxime Bizon *
6e7300d04SMaxime Bizon * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
7e7300d04SMaxime Bizon * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org>
8e7300d04SMaxime Bizon */
9e7300d04SMaxime Bizon
10e7300d04SMaxime Bizon #include <linux/kernel.h>
1126dd3e4fSPaul Gortmaker #include <linux/export.h>
12e7300d04SMaxime Bizon #include <linux/cpu.h>
13602977b0SKevin Cernekee #include <asm/cpu.h>
142b5b9b78SFlorian Fainelli #include <asm/cpu-info.h>
15602977b0SKevin Cernekee #include <asm/mipsregs.h>
16e7300d04SMaxime Bizon #include <bcm63xx_cpu.h>
17e7300d04SMaxime Bizon #include <bcm63xx_regs.h>
18e7300d04SMaxime Bizon #include <bcm63xx_io.h>
19e7300d04SMaxime Bizon #include <bcm63xx_irq.h>
20e7300d04SMaxime Bizon
21e7300d04SMaxime Bizon const unsigned long *bcm63xx_regs_base;
22e7300d04SMaxime Bizon EXPORT_SYMBOL(bcm63xx_regs_base);
23e7300d04SMaxime Bizon
24e7300d04SMaxime Bizon const int *bcm63xx_irqs;
25e7300d04SMaxime Bizon EXPORT_SYMBOL(bcm63xx_irqs);
26e7300d04SMaxime Bizon
27e86ae9e2SJonas Gorski u16 bcm63xx_cpu_id __read_mostly;
28e86ae9e2SJonas Gorski EXPORT_SYMBOL(bcm63xx_cpu_id);
29e86ae9e2SJonas Gorski
306605428cSJonas Gorski static u8 bcm63xx_cpu_rev;
31e7300d04SMaxime Bizon static unsigned int bcm63xx_cpu_freq;
32e7300d04SMaxime Bizon static unsigned int bcm63xx_memory_size;
33e7300d04SMaxime Bizon
347b933421SFlorian Fainelli static const unsigned long bcm3368_regs_base[] = {
357b933421SFlorian Fainelli __GEN_CPU_REGS_TABLE(3368)
367b933421SFlorian Fainelli };
377b933421SFlorian Fainelli
387b933421SFlorian Fainelli static const int bcm3368_irqs[] = {
397b933421SFlorian Fainelli __GEN_CPU_IRQ_TABLE(3368)
407b933421SFlorian Fainelli };
417b933421SFlorian Fainelli
42e5766aeaSJonas Gorski static const unsigned long bcm6328_regs_base[] = {
43e5766aeaSJonas Gorski __GEN_CPU_REGS_TABLE(6328)
44e5766aeaSJonas Gorski };
45e5766aeaSJonas Gorski
46e5766aeaSJonas Gorski static const int bcm6328_irqs[] = {
47e5766aeaSJonas Gorski __GEN_CPU_IRQ_TABLE(6328)
48e5766aeaSJonas Gorski };
49e5766aeaSJonas Gorski
50ec68c520SMaxime Bizon static const unsigned long bcm6338_regs_base[] = {
51ec68c520SMaxime Bizon __GEN_CPU_REGS_TABLE(6338)
52e7300d04SMaxime Bizon };
53e7300d04SMaxime Bizon
54ec68c520SMaxime Bizon static const int bcm6338_irqs[] = {
55ec68c520SMaxime Bizon __GEN_CPU_IRQ_TABLE(6338)
56e7300d04SMaxime Bizon };
57e7300d04SMaxime Bizon
58ec68c520SMaxime Bizon static const unsigned long bcm6345_regs_base[] = {
59ec68c520SMaxime Bizon __GEN_CPU_REGS_TABLE(6345)
60e7300d04SMaxime Bizon };
61e7300d04SMaxime Bizon
62ec68c520SMaxime Bizon static const int bcm6345_irqs[] = {
63ec68c520SMaxime Bizon __GEN_CPU_IRQ_TABLE(6345)
64e7300d04SMaxime Bizon };
65e7300d04SMaxime Bizon
66ec68c520SMaxime Bizon static const unsigned long bcm6348_regs_base[] = {
67ec68c520SMaxime Bizon __GEN_CPU_REGS_TABLE(6348)
68e7300d04SMaxime Bizon };
69e7300d04SMaxime Bizon
70ec68c520SMaxime Bizon static const int bcm6348_irqs[] = {
71ec68c520SMaxime Bizon __GEN_CPU_IRQ_TABLE(6348)
72ec68c520SMaxime Bizon
73e7300d04SMaxime Bizon };
74e7300d04SMaxime Bizon
75ec68c520SMaxime Bizon static const unsigned long bcm6358_regs_base[] = {
76ec68c520SMaxime Bizon __GEN_CPU_REGS_TABLE(6358)
77e7300d04SMaxime Bizon };
78e7300d04SMaxime Bizon
79ec68c520SMaxime Bizon static const int bcm6358_irqs[] = {
80ec68c520SMaxime Bizon __GEN_CPU_IRQ_TABLE(6358)
81ec68c520SMaxime Bizon
82e7300d04SMaxime Bizon };
83e7300d04SMaxime Bizon
842c8aaf71SJonas Gorski static const unsigned long bcm6362_regs_base[] = {
852c8aaf71SJonas Gorski __GEN_CPU_REGS_TABLE(6362)
862c8aaf71SJonas Gorski };
872c8aaf71SJonas Gorski
882c8aaf71SJonas Gorski static const int bcm6362_irqs[] = {
892c8aaf71SJonas Gorski __GEN_CPU_IRQ_TABLE(6362)
902c8aaf71SJonas Gorski
912c8aaf71SJonas Gorski };
922c8aaf71SJonas Gorski
9304712f3fSMaxime Bizon static const unsigned long bcm6368_regs_base[] = {
9404712f3fSMaxime Bizon __GEN_CPU_REGS_TABLE(6368)
9504712f3fSMaxime Bizon };
9604712f3fSMaxime Bizon
9704712f3fSMaxime Bizon static const int bcm6368_irqs[] = {
9804712f3fSMaxime Bizon __GEN_CPU_IRQ_TABLE(6368)
9904712f3fSMaxime Bizon
10004712f3fSMaxime Bizon };
10104712f3fSMaxime Bizon
bcm63xx_get_cpu_rev(void)1026605428cSJonas Gorski u8 bcm63xx_get_cpu_rev(void)
103e7300d04SMaxime Bizon {
104e7300d04SMaxime Bizon return bcm63xx_cpu_rev;
105e7300d04SMaxime Bizon }
106e7300d04SMaxime Bizon
107e7300d04SMaxime Bizon EXPORT_SYMBOL(bcm63xx_get_cpu_rev);
108e7300d04SMaxime Bizon
bcm63xx_get_cpu_freq(void)109e7300d04SMaxime Bizon unsigned int bcm63xx_get_cpu_freq(void)
110e7300d04SMaxime Bizon {
111e7300d04SMaxime Bizon return bcm63xx_cpu_freq;
112e7300d04SMaxime Bizon }
113e7300d04SMaxime Bizon
bcm63xx_get_memory_size(void)114e7300d04SMaxime Bizon unsigned int bcm63xx_get_memory_size(void)
115e7300d04SMaxime Bizon {
116e7300d04SMaxime Bizon return bcm63xx_memory_size;
117e7300d04SMaxime Bizon }
118e7300d04SMaxime Bizon
detect_cpu_clock(void)119e7300d04SMaxime Bizon static unsigned int detect_cpu_clock(void)
120e7300d04SMaxime Bizon {
12117d97badSMarkos Chandras u16 cpu_id = bcm63xx_get_cpu_id();
12217d97badSMarkos Chandras
12317d97badSMarkos Chandras switch (cpu_id) {
1247b933421SFlorian Fainelli case BCM3368_CPU_ID:
1257b933421SFlorian Fainelli return 300000000;
1267b933421SFlorian Fainelli
127e5766aeaSJonas Gorski case BCM6328_CPU_ID:
128e5766aeaSJonas Gorski {
129e5766aeaSJonas Gorski unsigned int tmp, mips_pll_fcvo;
130e5766aeaSJonas Gorski
131e5766aeaSJonas Gorski tmp = bcm_misc_readl(MISC_STRAPBUS_6328_REG);
132e5766aeaSJonas Gorski mips_pll_fcvo = (tmp & STRAPBUS_6328_FCVO_MASK)
133e5766aeaSJonas Gorski >> STRAPBUS_6328_FCVO_SHIFT;
134e5766aeaSJonas Gorski
135e5766aeaSJonas Gorski switch (mips_pll_fcvo) {
136e5766aeaSJonas Gorski case 0x12:
137e5766aeaSJonas Gorski case 0x14:
138e5766aeaSJonas Gorski case 0x19:
139e5766aeaSJonas Gorski return 160000000;
140e5766aeaSJonas Gorski case 0x1c:
141e5766aeaSJonas Gorski return 192000000;
142e5766aeaSJonas Gorski case 0x13:
143e5766aeaSJonas Gorski case 0x15:
144e5766aeaSJonas Gorski return 200000000;
145e5766aeaSJonas Gorski case 0x1a:
146e5766aeaSJonas Gorski return 384000000;
147e5766aeaSJonas Gorski case 0x16:
148e5766aeaSJonas Gorski return 400000000;
149e5766aeaSJonas Gorski default:
150e5766aeaSJonas Gorski return 320000000;
151e5766aeaSJonas Gorski }
152e5766aeaSJonas Gorski
153e5766aeaSJonas Gorski }
15404712f3fSMaxime Bizon case BCM6338_CPU_ID:
155e7300d04SMaxime Bizon /* BCM6338 has a fixed 240 Mhz frequency */
156e7300d04SMaxime Bizon return 240000000;
157e7300d04SMaxime Bizon
15804712f3fSMaxime Bizon case BCM6345_CPU_ID:
159e7300d04SMaxime Bizon /* BCM6345 has a fixed 140Mhz frequency */
160e7300d04SMaxime Bizon return 140000000;
161e7300d04SMaxime Bizon
16204712f3fSMaxime Bizon case BCM6348_CPU_ID:
16304712f3fSMaxime Bizon {
16404712f3fSMaxime Bizon unsigned int tmp, n1, n2, m1;
16504712f3fSMaxime Bizon
166e7300d04SMaxime Bizon /* 16MHz * (N1 + 1) * (N2 + 2) / (M1_CPU + 1) */
167e7300d04SMaxime Bizon tmp = bcm_perf_readl(PERF_MIPSPLLCTL_REG);
168e7300d04SMaxime Bizon n1 = (tmp & MIPSPLLCTL_N1_MASK) >> MIPSPLLCTL_N1_SHIFT;
169e7300d04SMaxime Bizon n2 = (tmp & MIPSPLLCTL_N2_MASK) >> MIPSPLLCTL_N2_SHIFT;
170e7300d04SMaxime Bizon m1 = (tmp & MIPSPLLCTL_M1CPU_MASK) >> MIPSPLLCTL_M1CPU_SHIFT;
171e7300d04SMaxime Bizon n1 += 1;
172e7300d04SMaxime Bizon n2 += 2;
173e7300d04SMaxime Bizon m1 += 1;
17404712f3fSMaxime Bizon return (16 * 1000000 * n1 * n2) / m1;
175e7300d04SMaxime Bizon }
176e7300d04SMaxime Bizon
17704712f3fSMaxime Bizon case BCM6358_CPU_ID:
17804712f3fSMaxime Bizon {
17904712f3fSMaxime Bizon unsigned int tmp, n1, n2, m1;
18004712f3fSMaxime Bizon
181e7300d04SMaxime Bizon /* 16MHz * N1 * N2 / M1_CPU */
182e7300d04SMaxime Bizon tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_REG);
183e7300d04SMaxime Bizon n1 = (tmp & DMIPSPLLCFG_N1_MASK) >> DMIPSPLLCFG_N1_SHIFT;
184e7300d04SMaxime Bizon n2 = (tmp & DMIPSPLLCFG_N2_MASK) >> DMIPSPLLCFG_N2_SHIFT;
185e7300d04SMaxime Bizon m1 = (tmp & DMIPSPLLCFG_M1_MASK) >> DMIPSPLLCFG_M1_SHIFT;
18604712f3fSMaxime Bizon return (16 * 1000000 * n1 * n2) / m1;
187e7300d04SMaxime Bizon }
188e7300d04SMaxime Bizon
1892c8aaf71SJonas Gorski case BCM6362_CPU_ID:
1902c8aaf71SJonas Gorski {
1912c8aaf71SJonas Gorski unsigned int tmp, mips_pll_fcvo;
1922c8aaf71SJonas Gorski
1932c8aaf71SJonas Gorski tmp = bcm_misc_readl(MISC_STRAPBUS_6362_REG);
1942c8aaf71SJonas Gorski mips_pll_fcvo = (tmp & STRAPBUS_6362_FCVO_MASK)
1952c8aaf71SJonas Gorski >> STRAPBUS_6362_FCVO_SHIFT;
1962c8aaf71SJonas Gorski switch (mips_pll_fcvo) {
1972c8aaf71SJonas Gorski case 0x03:
1982c8aaf71SJonas Gorski case 0x0b:
1992c8aaf71SJonas Gorski case 0x13:
2002c8aaf71SJonas Gorski case 0x1b:
2012c8aaf71SJonas Gorski return 240000000;
2022c8aaf71SJonas Gorski case 0x04:
2032c8aaf71SJonas Gorski case 0x0c:
2042c8aaf71SJonas Gorski case 0x14:
2052c8aaf71SJonas Gorski case 0x1c:
2062c8aaf71SJonas Gorski return 160000000;
2072c8aaf71SJonas Gorski case 0x05:
2082c8aaf71SJonas Gorski case 0x0e:
2092c8aaf71SJonas Gorski case 0x16:
2102c8aaf71SJonas Gorski case 0x1e:
2112c8aaf71SJonas Gorski case 0x1f:
2122c8aaf71SJonas Gorski return 400000000;
2132c8aaf71SJonas Gorski case 0x06:
2142c8aaf71SJonas Gorski return 440000000;
2152c8aaf71SJonas Gorski case 0x07:
2162c8aaf71SJonas Gorski case 0x17:
2172c8aaf71SJonas Gorski return 384000000;
2182c8aaf71SJonas Gorski case 0x15:
2192c8aaf71SJonas Gorski case 0x1d:
2202c8aaf71SJonas Gorski return 200000000;
2212c8aaf71SJonas Gorski default:
2222c8aaf71SJonas Gorski return 320000000;
2232c8aaf71SJonas Gorski }
2242c8aaf71SJonas Gorski }
22504712f3fSMaxime Bizon case BCM6368_CPU_ID:
22604712f3fSMaxime Bizon {
22704712f3fSMaxime Bizon unsigned int tmp, p1, p2, ndiv, m1;
22804712f3fSMaxime Bizon
22904712f3fSMaxime Bizon /* (64MHz / P1) * P2 * NDIV / M1_CPU */
23004712f3fSMaxime Bizon tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_6368_REG);
23104712f3fSMaxime Bizon
23204712f3fSMaxime Bizon p1 = (tmp & DMIPSPLLCFG_6368_P1_MASK) >>
23304712f3fSMaxime Bizon DMIPSPLLCFG_6368_P1_SHIFT;
23404712f3fSMaxime Bizon
23504712f3fSMaxime Bizon p2 = (tmp & DMIPSPLLCFG_6368_P2_MASK) >>
23604712f3fSMaxime Bizon DMIPSPLLCFG_6368_P2_SHIFT;
23704712f3fSMaxime Bizon
23804712f3fSMaxime Bizon ndiv = (tmp & DMIPSPLLCFG_6368_NDIV_MASK) >>
23904712f3fSMaxime Bizon DMIPSPLLCFG_6368_NDIV_SHIFT;
24004712f3fSMaxime Bizon
24104712f3fSMaxime Bizon tmp = bcm_ddr_readl(DDR_DMIPSPLLDIV_6368_REG);
24204712f3fSMaxime Bizon m1 = (tmp & DMIPSPLLDIV_6368_MDIV_MASK) >>
24304712f3fSMaxime Bizon DMIPSPLLDIV_6368_MDIV_SHIFT;
24404712f3fSMaxime Bizon
24504712f3fSMaxime Bizon return (((64 * 1000000) / p1) * p2 * ndiv) / m1;
24604712f3fSMaxime Bizon }
24704712f3fSMaxime Bizon
24804712f3fSMaxime Bizon default:
24917d97badSMarkos Chandras panic("Failed to detect clock for CPU with id=%04X\n", cpu_id);
25004712f3fSMaxime Bizon }
251e7300d04SMaxime Bizon }
252e7300d04SMaxime Bizon
253e7300d04SMaxime Bizon /*
254e7300d04SMaxime Bizon * attempt to detect the amount of memory installed
255e7300d04SMaxime Bizon */
detect_memory_size(void)256e7300d04SMaxime Bizon static unsigned int detect_memory_size(void)
257e7300d04SMaxime Bizon {
258e7300d04SMaxime Bizon unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0;
259e7300d04SMaxime Bizon u32 val;
260e7300d04SMaxime Bizon
2612c8aaf71SJonas Gorski if (BCMCPU_IS_6328() || BCMCPU_IS_6362())
262e5766aeaSJonas Gorski return bcm_ddr_readl(DDR_CSEND_REG) << 24;
263e5766aeaSJonas Gorski
264d61fcfe2SFlorian Fainelli if (BCMCPU_IS_6345()) {
265d61fcfe2SFlorian Fainelli val = bcm_sdram_readl(SDRAM_MBASE_REG);
266635c9907SRalf Baechle return val * 8 * 1024 * 1024;
267d61fcfe2SFlorian Fainelli }
268e7300d04SMaxime Bizon
269e7300d04SMaxime Bizon if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) {
270e7300d04SMaxime Bizon val = bcm_sdram_readl(SDRAM_CFG_REG);
271e7300d04SMaxime Bizon rows = (val & SDRAM_CFG_ROW_MASK) >> SDRAM_CFG_ROW_SHIFT;
272e7300d04SMaxime Bizon cols = (val & SDRAM_CFG_COL_MASK) >> SDRAM_CFG_COL_SHIFT;
273e7300d04SMaxime Bizon is_32bits = (val & SDRAM_CFG_32B_MASK) ? 1 : 0;
274e7300d04SMaxime Bizon banks = (val & SDRAM_CFG_BANK_MASK) ? 2 : 1;
275e7300d04SMaxime Bizon }
276e7300d04SMaxime Bizon
2777b933421SFlorian Fainelli if (BCMCPU_IS_3368() || BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
278e7300d04SMaxime Bizon val = bcm_memc_readl(MEMC_CFG_REG);
279e7300d04SMaxime Bizon rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT;
280e7300d04SMaxime Bizon cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT;
281e7300d04SMaxime Bizon is_32bits = (val & MEMC_CFG_32B_MASK) ? 0 : 1;
282e7300d04SMaxime Bizon banks = 2;
283e7300d04SMaxime Bizon }
284e7300d04SMaxime Bizon
285e7300d04SMaxime Bizon /* 0 => 11 address bits ... 2 => 13 address bits */
286e7300d04SMaxime Bizon rows += 11;
287e7300d04SMaxime Bizon
288e7300d04SMaxime Bizon /* 0 => 8 address bits ... 2 => 10 address bits */
289e7300d04SMaxime Bizon cols += 8;
290e7300d04SMaxime Bizon
291e7300d04SMaxime Bizon return 1 << (cols + rows + (is_32bits + 1) + banks);
292e7300d04SMaxime Bizon }
293e7300d04SMaxime Bizon
bcm63xx_cpu_init(void)294e7300d04SMaxime Bizon void __init bcm63xx_cpu_init(void)
295e7300d04SMaxime Bizon {
29613be798cSJonas Gorski unsigned int tmp;
2972b5b9b78SFlorian Fainelli unsigned int cpu = smp_processor_id();
29813be798cSJonas Gorski u32 chipid_reg;
299e7300d04SMaxime Bizon
300e7300d04SMaxime Bizon /* soc registers location depends on cpu type */
30113be798cSJonas Gorski chipid_reg = 0;
302e7300d04SMaxime Bizon
303d7b12056SWu Zhangjin switch (current_cpu_type()) {
304602977b0SKevin Cernekee case CPU_BMIPS3300:
3058ff374b9SMaciej W. Rozycki if ((read_c0_prid() & PRID_IMP_MASK) != PRID_IMP_BMIPS3300_ALT)
3062b5b9b78SFlorian Fainelli __cpu_name[cpu] = "Broadcom BCM6338";
307*c9b02990SLiangliang Huang fallthrough;
308602977b0SKevin Cernekee case CPU_BMIPS32:
30913be798cSJonas Gorski chipid_reg = BCM_6345_PERF_BASE;
310e7300d04SMaxime Bizon break;
311602977b0SKevin Cernekee case CPU_BMIPS4350:
3128ff374b9SMaciej W. Rozycki switch ((read_c0_prid() & PRID_REV_MASK)) {
3137b933421SFlorian Fainelli case 0x04:
3147b933421SFlorian Fainelli chipid_reg = BCM_3368_PERF_BASE;
3157b933421SFlorian Fainelli break;
3167b933421SFlorian Fainelli case 0x10:
31713be798cSJonas Gorski chipid_reg = BCM_6345_PERF_BASE;
3187b933421SFlorian Fainelli break;
3197b933421SFlorian Fainelli default:
32013be798cSJonas Gorski chipid_reg = BCM_6368_PERF_BASE;
32104712f3fSMaxime Bizon break;
322e7300d04SMaxime Bizon }
3237b933421SFlorian Fainelli break;
3247b933421SFlorian Fainelli }
325e7300d04SMaxime Bizon
326e7300d04SMaxime Bizon /*
327e7300d04SMaxime Bizon * really early to panic, but delaying panic would not help since we
328e7300d04SMaxime Bizon * will never get any working console
329e7300d04SMaxime Bizon */
33013be798cSJonas Gorski if (!chipid_reg)
331e7300d04SMaxime Bizon panic("unsupported Broadcom CPU");
332e7300d04SMaxime Bizon
33313be798cSJonas Gorski /* read out CPU type */
33413be798cSJonas Gorski tmp = bcm_readl(chipid_reg);
335e7300d04SMaxime Bizon bcm63xx_cpu_id = (tmp & REV_CHIPID_MASK) >> REV_CHIPID_SHIFT;
336e7300d04SMaxime Bizon bcm63xx_cpu_rev = (tmp & REV_REVID_MASK) >> REV_REVID_SHIFT;
337e7300d04SMaxime Bizon
33813be798cSJonas Gorski switch (bcm63xx_cpu_id) {
3397b933421SFlorian Fainelli case BCM3368_CPU_ID:
3407b933421SFlorian Fainelli bcm63xx_regs_base = bcm3368_regs_base;
3417b933421SFlorian Fainelli bcm63xx_irqs = bcm3368_irqs;
3427b933421SFlorian Fainelli break;
34313be798cSJonas Gorski case BCM6328_CPU_ID:
34413be798cSJonas Gorski bcm63xx_regs_base = bcm6328_regs_base;
34513be798cSJonas Gorski bcm63xx_irqs = bcm6328_irqs;
34613be798cSJonas Gorski break;
34713be798cSJonas Gorski case BCM6338_CPU_ID:
34813be798cSJonas Gorski bcm63xx_regs_base = bcm6338_regs_base;
34913be798cSJonas Gorski bcm63xx_irqs = bcm6338_irqs;
35013be798cSJonas Gorski break;
35113be798cSJonas Gorski case BCM6345_CPU_ID:
35213be798cSJonas Gorski bcm63xx_regs_base = bcm6345_regs_base;
35313be798cSJonas Gorski bcm63xx_irqs = bcm6345_irqs;
35413be798cSJonas Gorski break;
35513be798cSJonas Gorski case BCM6348_CPU_ID:
35613be798cSJonas Gorski bcm63xx_regs_base = bcm6348_regs_base;
35713be798cSJonas Gorski bcm63xx_irqs = bcm6348_irqs;
35813be798cSJonas Gorski break;
35913be798cSJonas Gorski case BCM6358_CPU_ID:
36013be798cSJonas Gorski bcm63xx_regs_base = bcm6358_regs_base;
36113be798cSJonas Gorski bcm63xx_irqs = bcm6358_irqs;
36213be798cSJonas Gorski break;
3632c8aaf71SJonas Gorski case BCM6362_CPU_ID:
3642c8aaf71SJonas Gorski bcm63xx_regs_base = bcm6362_regs_base;
3652c8aaf71SJonas Gorski bcm63xx_irqs = bcm6362_irqs;
3662c8aaf71SJonas Gorski break;
36713be798cSJonas Gorski case BCM6368_CPU_ID:
36813be798cSJonas Gorski bcm63xx_regs_base = bcm6368_regs_base;
36913be798cSJonas Gorski bcm63xx_irqs = bcm6368_irqs;
37013be798cSJonas Gorski break;
37113be798cSJonas Gorski default:
37213be798cSJonas Gorski panic("unsupported broadcom CPU %x", bcm63xx_cpu_id);
37313be798cSJonas Gorski break;
37413be798cSJonas Gorski }
375e7300d04SMaxime Bizon
376e7300d04SMaxime Bizon bcm63xx_cpu_freq = detect_cpu_clock();
377e7300d04SMaxime Bizon bcm63xx_memory_size = detect_memory_size();
378e7300d04SMaxime Bizon
37963893ea5SGregory Fong pr_info("Detected Broadcom 0x%04x CPU revision %02x\n",
380e7300d04SMaxime Bizon bcm63xx_cpu_id, bcm63xx_cpu_rev);
38163893ea5SGregory Fong pr_info("CPU frequency is %u MHz\n",
382e7300d04SMaxime Bizon bcm63xx_cpu_freq / 1000000);
38363893ea5SGregory Fong pr_info("%uMB of RAM installed\n",
384e7300d04SMaxime Bizon bcm63xx_memory_size >> 20);
385e7300d04SMaxime Bizon }
386