| 1 | --- a/drivers/pcmcia/yenta_socket.c |
| 2 | +++ b/drivers/pcmcia/yenta_socket.c |
| 3 | @@ -866,6 +866,8 @@ static unsigned int yenta_probe_irq(stru |
| 4 | * Probe for usable interrupts using the force |
| 5 | * register to generate bogus card status events. |
| 6 | */ |
| 7 | +#ifndef CONFIG_BCM47XX |
| 8 | + /* WRT54G3G does not like this */ |
| 9 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
| 10 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); |
| 11 | exca_writeb(socket, I365_CSCINT, 0); |
| 12 | @@ -880,6 +882,7 @@ static unsigned int yenta_probe_irq(stru |
| 13 | } |
| 14 | cb_writel(socket, CB_SOCKET_MASK, 0); |
| 15 | exca_writeb(socket, I365_CSCINT, 0); |
| 16 | +#endif |
| 17 | |
| 18 | mask = probe_irq_mask(val) & 0xffff; |
| 19 | |
| 20 | @@ -960,6 +963,10 @@ static void yenta_get_socket_capabilitie |
| 21 | else |
| 22 | socket->socket.irq_mask = 0; |
| 23 | |
| 24 | + /* irq mask probing is broken for the WRT54G3G */ |
| 25 | + if (socket->socket.irq_mask == 0) |
| 26 | + socket->socket.irq_mask = 0x6f8; |
| 27 | + |
| 28 | dev_printk(KERN_INFO, &socket->dev->dev, |
| 29 | "ISA IRQ mask 0x%04x, PCI irq %d\n", |
| 30 | socket->socket.irq_mask, socket->cb_irq); |
| 31 | @@ -1198,6 +1205,15 @@ static int __devinit yenta_probe (struct |
| 32 | dev_printk(KERN_INFO, &dev->dev, |
| 33 | "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); |
| 34 | |
| 35 | + /* Generate an interrupt on card insert/remove */ |
| 36 | + config_writew(socket, CB_SOCKET_MASK, CB_CSTSMASK | CB_CDMASK); |
| 37 | + |
| 38 | + /* Set up Multifunction Routing Status Register */ |
| 39 | + config_writew(socket, 0x8C, 0x1000 /* MFUNC3 to GPIO3 */ | 0x2 /* MFUNC0 to INTA */); |
| 40 | + |
| 41 | + /* Switch interrupts to parallelized */ |
| 42 | + config_writeb(socket, 0x92, 0x64); |
| 43 | + |
| 44 | yenta_fixup_parent_bridge(dev->subordinate); |
| 45 | |
| 46 | /* Register it with the pcmcia layer.. */ |
| 47 | |