xref: /OK3568_Linux_fs/kernel/drivers/bcma/driver_mips.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Broadcom specific AMBA
3*4882a593Smuzhiyun  * Broadcom MIPS32 74K core driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2009, Broadcom Corporation
6*4882a593Smuzhiyun  * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de>
7*4882a593Smuzhiyun  * Copyright 2010, Bernhard Loos <bernhardloos@googlemail.com>
8*4882a593Smuzhiyun  * Copyright 2011, Hauke Mehrtens <hauke@hauke-m.de>
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Licensed under the GNU/GPL. See COPYING for details.
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include "bcma_private.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/bcma/bcma.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/serial.h>
18*4882a593Smuzhiyun #include <linux/serial_core.h>
19*4882a593Smuzhiyun #include <linux/serial_reg.h>
20*4882a593Smuzhiyun #include <linux/time.h>
21*4882a593Smuzhiyun #ifdef CONFIG_BCM47XX
22*4882a593Smuzhiyun #include <linux/bcm47xx_nvram.h>
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun enum bcma_boot_dev {
26*4882a593Smuzhiyun 	BCMA_BOOT_DEV_UNK = 0,
27*4882a593Smuzhiyun 	BCMA_BOOT_DEV_ROM,
28*4882a593Smuzhiyun 	BCMA_BOOT_DEV_PARALLEL,
29*4882a593Smuzhiyun 	BCMA_BOOT_DEV_SERIAL,
30*4882a593Smuzhiyun 	BCMA_BOOT_DEV_NAND,
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* The 47162a0 hangs when reading MIPS DMP registers registers */
bcma_core_mips_bcm47162a0_quirk(struct bcma_device * dev)34*4882a593Smuzhiyun static inline bool bcma_core_mips_bcm47162a0_quirk(struct bcma_device *dev)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun 	return dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM47162 &&
37*4882a593Smuzhiyun 	       dev->bus->chipinfo.rev == 0 && dev->id.id == BCMA_CORE_MIPS_74K;
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /* The 5357b0 hangs when reading USB20H DMP registers */
bcma_core_mips_bcm5357b0_quirk(struct bcma_device * dev)41*4882a593Smuzhiyun static inline bool bcma_core_mips_bcm5357b0_quirk(struct bcma_device *dev)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	return (dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM5357 ||
44*4882a593Smuzhiyun 		dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM4749) &&
45*4882a593Smuzhiyun 	       dev->bus->chipinfo.pkg == 11 &&
46*4882a593Smuzhiyun 	       dev->id.id == BCMA_CORE_USB20_HOST;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
mips_read32(struct bcma_drv_mips * mcore,u16 offset)49*4882a593Smuzhiyun static inline u32 mips_read32(struct bcma_drv_mips *mcore,
50*4882a593Smuzhiyun 			      u16 offset)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun 	return bcma_read32(mcore->core, offset);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
mips_write32(struct bcma_drv_mips * mcore,u16 offset,u32 value)55*4882a593Smuzhiyun static inline void mips_write32(struct bcma_drv_mips *mcore,
56*4882a593Smuzhiyun 				u16 offset,
57*4882a593Smuzhiyun 				u32 value)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	bcma_write32(mcore->core, offset, value);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
bcma_core_mips_irqflag(struct bcma_device * dev)62*4882a593Smuzhiyun static u32 bcma_core_mips_irqflag(struct bcma_device *dev)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	u32 flag;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	if (bcma_core_mips_bcm47162a0_quirk(dev))
67*4882a593Smuzhiyun 		return dev->core_index;
68*4882a593Smuzhiyun 	if (bcma_core_mips_bcm5357b0_quirk(dev))
69*4882a593Smuzhiyun 		return dev->core_index;
70*4882a593Smuzhiyun 	flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30);
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	if (flag)
73*4882a593Smuzhiyun 		return flag & 0x1F;
74*4882a593Smuzhiyun 	else
75*4882a593Smuzhiyun 		return 0x3f;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /* Get the MIPS IRQ assignment for a specified device.
79*4882a593Smuzhiyun  * If unassigned, 0 is returned.
80*4882a593Smuzhiyun  * If disabled, 5 is returned.
81*4882a593Smuzhiyun  * If not supported, 6 is returned.
82*4882a593Smuzhiyun  */
bcma_core_mips_irq(struct bcma_device * dev)83*4882a593Smuzhiyun unsigned int bcma_core_mips_irq(struct bcma_device *dev)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	struct bcma_device *mdev = dev->bus->drv_mips.core;
86*4882a593Smuzhiyun 	u32 irqflag;
87*4882a593Smuzhiyun 	unsigned int irq;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	irqflag = bcma_core_mips_irqflag(dev);
90*4882a593Smuzhiyun 	if (irqflag == 0x3f)
91*4882a593Smuzhiyun 		return 6;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	for (irq = 0; irq <= 4; irq++)
94*4882a593Smuzhiyun 		if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) &
95*4882a593Smuzhiyun 		    (1 << irqflag))
96*4882a593Smuzhiyun 			return irq;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	return 5;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
bcma_core_mips_set_irq(struct bcma_device * dev,unsigned int irq)101*4882a593Smuzhiyun static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun 	unsigned int oldirq = bcma_core_mips_irq(dev);
104*4882a593Smuzhiyun 	struct bcma_bus *bus = dev->bus;
105*4882a593Smuzhiyun 	struct bcma_device *mdev = bus->drv_mips.core;
106*4882a593Smuzhiyun 	u32 irqflag;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	irqflag = bcma_core_mips_irqflag(dev);
109*4882a593Smuzhiyun 	BUG_ON(oldirq == 6);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	dev->irq = irq + 2;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	/* clear the old irq */
114*4882a593Smuzhiyun 	if (oldirq == 0)
115*4882a593Smuzhiyun 		bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
116*4882a593Smuzhiyun 			    bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) &
117*4882a593Smuzhiyun 			    ~(1 << irqflag));
118*4882a593Smuzhiyun 	else if (oldirq != 5)
119*4882a593Smuzhiyun 		bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	/* assign the new one */
122*4882a593Smuzhiyun 	if (irq == 0) {
123*4882a593Smuzhiyun 		bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
124*4882a593Smuzhiyun 			    bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) |
125*4882a593Smuzhiyun 			    (1 << irqflag));
126*4882a593Smuzhiyun 	} else {
127*4882a593Smuzhiyun 		u32 irqinitmask = bcma_read32(mdev,
128*4882a593Smuzhiyun 					      BCMA_MIPS_MIPS74K_INTMASK(irq));
129*4882a593Smuzhiyun 		if (irqinitmask) {
130*4882a593Smuzhiyun 			struct bcma_device *core;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 			/* backplane irq line is in use, find out who uses
133*4882a593Smuzhiyun 			 * it and set user to irq 0
134*4882a593Smuzhiyun 			 */
135*4882a593Smuzhiyun 			list_for_each_entry(core, &bus->cores, list) {
136*4882a593Smuzhiyun 				if ((1 << bcma_core_mips_irqflag(core)) ==
137*4882a593Smuzhiyun 				    irqinitmask) {
138*4882a593Smuzhiyun 					bcma_core_mips_set_irq(core, 0);
139*4882a593Smuzhiyun 					break;
140*4882a593Smuzhiyun 				}
141*4882a593Smuzhiyun 			}
142*4882a593Smuzhiyun 		}
143*4882a593Smuzhiyun 		bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq),
144*4882a593Smuzhiyun 			     1 << irqflag);
145*4882a593Smuzhiyun 	}
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	bcma_debug(bus, "set_irq: core 0x%04x, irq %d => %d\n",
148*4882a593Smuzhiyun 		   dev->id.id, oldirq <= 4 ? oldirq + 2 : 0, irq + 2);
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun 
bcma_core_mips_set_irq_name(struct bcma_bus * bus,unsigned int irq,u16 coreid,u8 unit)151*4882a593Smuzhiyun static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq,
152*4882a593Smuzhiyun 					u16 coreid, u8 unit)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	struct bcma_device *core;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	core = bcma_find_core_unit(bus, coreid, unit);
157*4882a593Smuzhiyun 	if (!core) {
158*4882a593Smuzhiyun 		bcma_warn(bus,
159*4882a593Smuzhiyun 			  "Can not find core (id: 0x%x, unit %i) for IRQ configuration.\n",
160*4882a593Smuzhiyun 			  coreid, unit);
161*4882a593Smuzhiyun 		return;
162*4882a593Smuzhiyun 	}
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	bcma_core_mips_set_irq(core, irq);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
bcma_core_mips_print_irq(struct bcma_device * dev,unsigned int irq)167*4882a593Smuzhiyun static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun 	int i;
170*4882a593Smuzhiyun 	static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"};
171*4882a593Smuzhiyun 	char interrupts[25];
172*4882a593Smuzhiyun 	char *ints = interrupts;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(irq_name); i++)
175*4882a593Smuzhiyun 		ints += sprintf(ints, " %s%c",
176*4882a593Smuzhiyun 				irq_name[i], i == irq ? '*' : ' ');
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	bcma_debug(dev->bus, "core 0x%04x, irq:%s\n", dev->id.id, interrupts);
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
bcma_core_mips_dump_irq(struct bcma_bus * bus)181*4882a593Smuzhiyun static void bcma_core_mips_dump_irq(struct bcma_bus *bus)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	struct bcma_device *core;
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	list_for_each_entry(core, &bus->cores, list) {
186*4882a593Smuzhiyun 		bcma_core_mips_print_irq(core, bcma_core_mips_irq(core));
187*4882a593Smuzhiyun 	}
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
bcma_cpu_clock(struct bcma_drv_mips * mcore)190*4882a593Smuzhiyun u32 bcma_cpu_clock(struct bcma_drv_mips *mcore)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun 	struct bcma_bus *bus = mcore->core->bus;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	if (bus->drv_cc.capabilities & BCMA_CC_CAP_PMU)
195*4882a593Smuzhiyun 		return bcma_pmu_get_cpu_clock(&bus->drv_cc);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	bcma_err(bus, "No PMU available, need this to get the cpu clock\n");
198*4882a593Smuzhiyun 	return 0;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun EXPORT_SYMBOL(bcma_cpu_clock);
201*4882a593Smuzhiyun 
bcma_boot_dev(struct bcma_bus * bus)202*4882a593Smuzhiyun static enum bcma_boot_dev bcma_boot_dev(struct bcma_bus *bus)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	struct bcma_drv_cc *cc = &bus->drv_cc;
205*4882a593Smuzhiyun 	u8 cc_rev = cc->core->id.rev;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	if (cc_rev == 42) {
208*4882a593Smuzhiyun 		struct bcma_device *core;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 		core = bcma_find_core(bus, BCMA_CORE_NS_ROM);
211*4882a593Smuzhiyun 		if (core) {
212*4882a593Smuzhiyun 			switch (bcma_aread32(core, BCMA_IOST) &
213*4882a593Smuzhiyun 				BCMA_NS_ROM_IOST_BOOT_DEV_MASK) {
214*4882a593Smuzhiyun 			case BCMA_NS_ROM_IOST_BOOT_DEV_NOR:
215*4882a593Smuzhiyun 				return BCMA_BOOT_DEV_SERIAL;
216*4882a593Smuzhiyun 			case BCMA_NS_ROM_IOST_BOOT_DEV_NAND:
217*4882a593Smuzhiyun 				return BCMA_BOOT_DEV_NAND;
218*4882a593Smuzhiyun 			case BCMA_NS_ROM_IOST_BOOT_DEV_ROM:
219*4882a593Smuzhiyun 			default:
220*4882a593Smuzhiyun 				return BCMA_BOOT_DEV_ROM;
221*4882a593Smuzhiyun 			}
222*4882a593Smuzhiyun 		}
223*4882a593Smuzhiyun 	} else {
224*4882a593Smuzhiyun 		if (cc_rev == 38) {
225*4882a593Smuzhiyun 			if (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT)
226*4882a593Smuzhiyun 				return BCMA_BOOT_DEV_NAND;
227*4882a593Smuzhiyun 			else if (cc->status & BIT(5))
228*4882a593Smuzhiyun 				return BCMA_BOOT_DEV_ROM;
229*4882a593Smuzhiyun 		}
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 		if ((cc->capabilities & BCMA_CC_CAP_FLASHT) ==
232*4882a593Smuzhiyun 		    BCMA_CC_FLASHT_PARA)
233*4882a593Smuzhiyun 			return BCMA_BOOT_DEV_PARALLEL;
234*4882a593Smuzhiyun 		else
235*4882a593Smuzhiyun 			return BCMA_BOOT_DEV_SERIAL;
236*4882a593Smuzhiyun 	}
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	return BCMA_BOOT_DEV_SERIAL;
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun 
bcma_core_mips_nvram_init(struct bcma_drv_mips * mcore)241*4882a593Smuzhiyun static void bcma_core_mips_nvram_init(struct bcma_drv_mips *mcore)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun 	struct bcma_bus *bus = mcore->core->bus;
244*4882a593Smuzhiyun 	enum bcma_boot_dev boot_dev;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	/* Determine flash type this SoC boots from */
247*4882a593Smuzhiyun 	boot_dev = bcma_boot_dev(bus);
248*4882a593Smuzhiyun 	switch (boot_dev) {
249*4882a593Smuzhiyun 	case BCMA_BOOT_DEV_PARALLEL:
250*4882a593Smuzhiyun 	case BCMA_BOOT_DEV_SERIAL:
251*4882a593Smuzhiyun #ifdef CONFIG_BCM47XX
252*4882a593Smuzhiyun 		bcm47xx_nvram_init_from_mem(BCMA_SOC_FLASH2,
253*4882a593Smuzhiyun 					    BCMA_SOC_FLASH2_SZ);
254*4882a593Smuzhiyun #endif
255*4882a593Smuzhiyun 		break;
256*4882a593Smuzhiyun 	case BCMA_BOOT_DEV_NAND:
257*4882a593Smuzhiyun #ifdef CONFIG_BCM47XX
258*4882a593Smuzhiyun 		bcm47xx_nvram_init_from_mem(BCMA_SOC_FLASH1,
259*4882a593Smuzhiyun 					    BCMA_SOC_FLASH1_SZ);
260*4882a593Smuzhiyun #endif
261*4882a593Smuzhiyun 		break;
262*4882a593Smuzhiyun 	default:
263*4882a593Smuzhiyun 		break;
264*4882a593Smuzhiyun 	}
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
bcma_core_mips_early_init(struct bcma_drv_mips * mcore)267*4882a593Smuzhiyun void bcma_core_mips_early_init(struct bcma_drv_mips *mcore)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 	struct bcma_bus *bus = mcore->core->bus;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	if (mcore->early_setup_done)
272*4882a593Smuzhiyun 		return;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	bcma_chipco_serial_init(&bus->drv_cc);
275*4882a593Smuzhiyun 	bcma_core_mips_nvram_init(mcore);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	mcore->early_setup_done = true;
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun 
bcma_fix_i2s_irqflag(struct bcma_bus * bus)280*4882a593Smuzhiyun static void bcma_fix_i2s_irqflag(struct bcma_bus *bus)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun 	struct bcma_device *cpu, *pcie, *i2s;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	/* Fixup the interrupts in 4716/4748 for i2s core (2010 Broadcom SDK)
285*4882a593Smuzhiyun 	 * (IRQ flags > 7 are ignored when setting the interrupt masks)
286*4882a593Smuzhiyun 	 */
287*4882a593Smuzhiyun 	if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4716 &&
288*4882a593Smuzhiyun 	    bus->chipinfo.id != BCMA_CHIP_ID_BCM4748)
289*4882a593Smuzhiyun 		return;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	cpu = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
292*4882a593Smuzhiyun 	pcie = bcma_find_core(bus, BCMA_CORE_PCIE);
293*4882a593Smuzhiyun 	i2s = bcma_find_core(bus, BCMA_CORE_I2S);
294*4882a593Smuzhiyun 	if (cpu && pcie && i2s &&
295*4882a593Smuzhiyun 	    bcma_aread32(cpu, BCMA_MIPS_OOBSELINA74) == 0x08060504 &&
296*4882a593Smuzhiyun 	    bcma_aread32(pcie, BCMA_MIPS_OOBSELINA74) == 0x08060504 &&
297*4882a593Smuzhiyun 	    bcma_aread32(i2s, BCMA_MIPS_OOBSELOUTA30) == 0x88) {
298*4882a593Smuzhiyun 		bcma_awrite32(cpu, BCMA_MIPS_OOBSELINA74, 0x07060504);
299*4882a593Smuzhiyun 		bcma_awrite32(pcie, BCMA_MIPS_OOBSELINA74, 0x07060504);
300*4882a593Smuzhiyun 		bcma_awrite32(i2s, BCMA_MIPS_OOBSELOUTA30, 0x87);
301*4882a593Smuzhiyun 		bcma_debug(bus,
302*4882a593Smuzhiyun 			   "Moved i2s interrupt to oob line 7 instead of 8\n");
303*4882a593Smuzhiyun 	}
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun 
bcma_core_mips_init(struct bcma_drv_mips * mcore)306*4882a593Smuzhiyun void bcma_core_mips_init(struct bcma_drv_mips *mcore)
307*4882a593Smuzhiyun {
308*4882a593Smuzhiyun 	struct bcma_bus *bus;
309*4882a593Smuzhiyun 	struct bcma_device *core;
310*4882a593Smuzhiyun 	bus = mcore->core->bus;
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	if (mcore->setup_done)
313*4882a593Smuzhiyun 		return;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	bcma_debug(bus, "Initializing MIPS core...\n");
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	bcma_core_mips_early_init(mcore);
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	bcma_fix_i2s_irqflag(bus);
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	switch (bus->chipinfo.id) {
322*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM4716:
323*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM4748:
324*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0);
325*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0);
326*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0);
327*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_PCIE, 0);
328*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0);
329*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0);
330*4882a593Smuzhiyun 		break;
331*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM5356:
332*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM47162:
333*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM53572:
334*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0);
335*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0);
336*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0);
337*4882a593Smuzhiyun 		break;
338*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM5357:
339*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM4749:
340*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0);
341*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0);
342*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0);
343*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0);
344*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0);
345*4882a593Smuzhiyun 		break;
346*4882a593Smuzhiyun 	case BCMA_CHIP_ID_BCM4706:
347*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_PCIE, 0);
348*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_4706_MAC_GBIT,
349*4882a593Smuzhiyun 					    0);
350*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_PCIE, 1);
351*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_USB20_HOST, 0);
352*4882a593Smuzhiyun 		bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_4706_CHIPCOMMON,
353*4882a593Smuzhiyun 					    0);
354*4882a593Smuzhiyun 		break;
355*4882a593Smuzhiyun 	default:
356*4882a593Smuzhiyun 		list_for_each_entry(core, &bus->cores, list) {
357*4882a593Smuzhiyun 			core->irq = bcma_core_irq(core, 0);
358*4882a593Smuzhiyun 		}
359*4882a593Smuzhiyun 		bcma_err(bus,
360*4882a593Smuzhiyun 			 "Unknown device (0x%x) found, can not configure IRQs\n",
361*4882a593Smuzhiyun 			 bus->chipinfo.id);
362*4882a593Smuzhiyun 	}
363*4882a593Smuzhiyun 	bcma_debug(bus, "IRQ reconfiguration done\n");
364*4882a593Smuzhiyun 	bcma_core_mips_dump_irq(bus);
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	mcore->setup_done = true;
367*4882a593Smuzhiyun }
368