Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6

* 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6:
PCMCIA: resource, fix lock imbalance
pcmcia: add important if statement
pcmcia: re-route Cardbus IRQ to ISA on ti1130 bridges if necessary
pcmcia: allow for cb_irq to differ from pci_dev's irq in yenta_socket
pcmcia: honor saved flags in yenta_socket's I365_CSCINT register
pcmcia: revert "irq probe can be done without risking an IRQ storm"
pcmcia: pd6729, i82092: use parent (PCI) resources
pcmcia/vrc4171: use local spinlock for device local lock.

+86 -42
+1
drivers/pcmcia/i82092.c
··· 133 133 sockets[i].socket.map_size = 0x1000; 134 134 sockets[i].socket.irq_mask = 0; 135 135 sockets[i].socket.pci_irq = dev->irq; 136 + sockets[i].socket.cb_dev = dev; 136 137 sockets[i].socket.owner = THIS_MODULE; 137 138 138 139 sockets[i].number = i;
+1
drivers/pcmcia/i82365.h
··· 95 95 #define I365_CSC_DETECT 0x08 96 96 #define I365_CSC_ANY 0x0F 97 97 #define I365_CSC_GPI 0x10 98 + #define I365_CSC_IRQ_MASK 0xF0 98 99 99 100 /* Flags for I365_ADDRWIN */ 100 101 #define I365_ENA_IO(map) (0x40 << (map))
+16 -20
drivers/pcmcia/pcmcia_resource.c
··· 256 256 { 257 257 struct pcmcia_socket *s; 258 258 config_t *c; 259 + int ret; 259 260 260 261 s = p_dev->socket; 261 262 ··· 265 264 266 265 if (!(s->state & SOCKET_PRESENT)) { 267 266 dev_dbg(&s->dev, "No card present\n"); 268 - mutex_unlock(&s->ops_mutex); 269 - return -ENODEV; 267 + ret = -ENODEV; 268 + goto unlock; 270 269 } 271 270 if (!(c->state & CONFIG_LOCKED)) { 272 271 dev_dbg(&s->dev, "Configuration isnt't locked\n"); 273 - mutex_unlock(&s->ops_mutex); 274 - return -EACCES; 272 + ret = -EACCES; 273 + goto unlock; 275 274 } 276 275 277 276 if (mod->Attributes & CONF_IRQ_CHANGE_VALID) { ··· 287 286 288 287 if (mod->Attributes & CONF_VCC_CHANGE_VALID) { 289 288 dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); 290 - return -EINVAL; 289 + ret = -EINVAL; 290 + goto unlock; 291 291 } 292 292 293 293 /* We only allow changing Vpp1 and Vpp2 to the same value */ ··· 296 294 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { 297 295 if (mod->Vpp1 != mod->Vpp2) { 298 296 dev_dbg(&s->dev, "Vpp1 and Vpp2 must be the same\n"); 299 - mutex_unlock(&s->ops_mutex); 300 - return -EINVAL; 297 + ret = -EINVAL; 298 + goto unlock; 301 299 } 302 300 s->socket.Vpp = mod->Vpp1; 303 301 if (s->ops->set_socket(s, &s->socket)) { 304 - mutex_unlock(&s->ops_mutex); 305 302 dev_printk(KERN_WARNING, &s->dev, 306 303 "Unable to set VPP\n"); 307 - return -EIO; 304 + ret = -EIO; 305 + goto unlock; 308 306 } 309 307 } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) || 310 308 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { 311 309 dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); 312 - mutex_unlock(&s->ops_mutex); 313 - return -EINVAL; 310 + ret = -EINVAL; 311 + goto unlock; 314 312 } 315 313 316 314 if (mod->Attributes & CONF_IO_CHANGE_WIDTH) { ··· 334 332 s->ops->set_io_map(s, &io_on); 335 333 } 336 334 } 335 + ret = 0; 336 + unlock: 337 337 mutex_unlock(&s->ops_mutex); 338 338 339 - return 0; 339 + return ret; 340 340 } /* modify_configuration */ 341 341 EXPORT_SYMBOL(pcmcia_modify_configuration); 342 342 ··· 755 751 printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n"); 756 752 757 753 #ifdef CONFIG_PCMCIA_PROBE 758 - 759 - #ifdef IRQ_NOAUTOEN 760 - /* if the underlying IRQ infrastructure allows for it, only allocate 761 - * the IRQ, but do not enable it 762 - */ 763 - if (!(req->Handler)) 764 - type |= IRQ_NOAUTOEN; 765 - #endif /* IRQ_NOAUTOEN */ 766 754 767 755 if (s->irq.AssignedIRQ != 0) { 768 756 /* If the interrupt is already assigned, it must be the same */
+1
drivers/pcmcia/pd6729.c
··· 671 671 socket[i].socket.map_size = 0x1000; 672 672 socket[i].socket.irq_mask = mask; 673 673 socket[i].socket.pci_irq = dev->irq; 674 + socket[i].socket.cb_dev = dev; 674 675 socket[i].socket.owner = THIS_MODULE; 675 676 676 677 socket[i].number = i;
+35 -2
drivers/pcmcia/ti113x.h
··· 296 296 u8 new, reg = exca_readb(socket, I365_INTCTL); 297 297 298 298 new = reg & ~I365_INTR_ENA; 299 - if (socket->cb_irq) 299 + if (socket->dev->irq) 300 300 new |= I365_INTR_ENA; 301 301 if (new != reg) 302 302 exca_writeb(socket, I365_INTCTL, new); ··· 316 316 return 0; 317 317 } 318 318 319 + static void ti113x_use_isa_irq(struct yenta_socket *socket) 320 + { 321 + int isa_irq = -1; 322 + u8 intctl; 323 + u32 isa_irq_mask = 0; 324 + 325 + if (!isa_probe) 326 + return; 327 + 328 + /* get a free isa int */ 329 + isa_irq_mask = yenta_probe_irq(socket, isa_interrupts); 330 + if (!isa_irq_mask) 331 + return; /* no useable isa irq found */ 332 + 333 + /* choose highest available */ 334 + for (; isa_irq_mask; isa_irq++) 335 + isa_irq_mask >>= 1; 336 + socket->cb_irq = isa_irq; 337 + 338 + exca_writeb(socket, I365_CSCINT, (isa_irq << 4)); 339 + 340 + intctl = exca_readb(socket, I365_INTCTL); 341 + intctl &= ~(I365_INTR_ENA | I365_IRQ_MASK); /* CSC Enable */ 342 + exca_writeb(socket, I365_INTCTL, intctl); 343 + 344 + dev_info(&socket->dev->dev, 345 + "Yenta TI113x: using isa irq %d for CardBus\n", isa_irq); 346 + } 347 + 348 + 319 349 static int ti113x_override(struct yenta_socket *socket) 320 350 { 321 351 u8 cardctl; 322 352 323 353 cardctl = config_readb(socket, TI113X_CARD_CONTROL); 324 354 cardctl &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC); 325 - if (socket->cb_irq) 355 + if (socket->dev->irq) 326 356 cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ; 357 + else 358 + ti113x_use_isa_irq(socket); 359 + 327 360 config_writeb(socket, TI113X_CARD_CONTROL, cardctl); 328 361 329 362 return ti_override(socket);
+3 -2
drivers/pcmcia/vrc4171_card.c
··· 105 105 char name[24]; 106 106 int csc_irq; 107 107 int io_irq; 108 + spinlock_t lock; 108 109 } vrc4171_socket_t; 109 110 110 111 static vrc4171_socket_t vrc4171_sockets[CARD_MAX_SLOTS]; ··· 328 327 slot = sock->sock; 329 328 socket = &vrc4171_sockets[slot]; 330 329 331 - spin_lock_irq(&sock->lock); 330 + spin_lock_irq(&socket->lock); 332 331 333 332 voltage = set_Vcc_value(state->Vcc); 334 333 exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage); ··· 371 370 cscint |= I365_CSC_DETECT; 372 371 exca_write_byte(slot, I365_CSCINT, cscint); 373 372 374 - spin_unlock_irq(&sock->lock); 373 + spin_unlock_irq(&socket->lock); 375 374 376 375 return 0; 377 376 }
+28 -18
drivers/pcmcia/yenta_socket.c
··· 42 42 MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' " 43 43 "or 'default' (uses recommended behaviour for the detected bridge)"); 44 44 45 + /* 46 + * Only probe "regular" interrupts, don't 47 + * touch dangerous spots like the mouse irq, 48 + * because there are mice that apparently 49 + * get really confused if they get fondled 50 + * too intimately. 51 + * 52 + * Default to 11, 10, 9, 7, 6, 5, 4, 3. 53 + */ 54 + static u32 isa_interrupts = 0x0ef8; 55 + 56 + 45 57 #define debug(x, s, args...) dev_dbg(&s->dev->dev, x, ##args) 46 58 47 59 /* Don't ask.. */ ··· 66 54 */ 67 55 #ifdef CONFIG_YENTA_TI 68 56 static int yenta_probe_cb_irq(struct yenta_socket *socket); 57 + static unsigned int yenta_probe_irq(struct yenta_socket *socket, 58 + u32 isa_irq_mask); 69 59 #endif 70 60 71 61 ··· 343 329 /* ISA interrupt control? */ 344 330 intr = exca_readb(socket, I365_INTCTL); 345 331 intr = (intr & ~0xf); 346 - if (!socket->cb_irq) { 347 - intr |= state->io_irq; 332 + if (!socket->dev->irq) { 333 + intr |= socket->cb_irq ? socket->cb_irq : state->io_irq; 348 334 bridge |= CB_BRIDGE_INTR; 349 335 } 350 336 exca_writeb(socket, I365_INTCTL, intr); ··· 354 340 reg = exca_readb(socket, I365_INTCTL) & (I365_RING_ENA | I365_INTR_ENA); 355 341 reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; 356 342 reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; 357 - if (state->io_irq != socket->cb_irq) { 343 + if (state->io_irq != socket->dev->irq) { 358 344 reg |= state->io_irq; 359 345 bridge |= CB_BRIDGE_INTR; 360 346 } ··· 370 356 exca_writeb(socket, I365_POWER, reg); 371 357 372 358 /* CSC interrupt: no ISA irq for CSC */ 373 - reg = I365_CSC_DETECT; 359 + reg = exca_readb(socket, I365_CSCINT); 360 + reg &= I365_CSC_IRQ_MASK; 361 + reg |= I365_CSC_DETECT; 374 362 if (state->flags & SS_IOCARD) { 375 363 if (state->csc_mask & SS_STSCHG) 376 364 reg |= I365_CSC_STSCHG; ··· 912 896 }; 913 897 914 898 915 - /* 916 - * Only probe "regular" interrupts, don't 917 - * touch dangerous spots like the mouse irq, 918 - * because there are mice that apparently 919 - * get really confused if they get fondled 920 - * too intimately. 921 - * 922 - * Default to 11, 10, 9, 7, 6, 5, 4, 3. 923 - */ 924 - static u32 isa_interrupts = 0x0ef8; 925 - 926 899 static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mask) 927 900 { 928 901 int i; 929 902 unsigned long val; 930 903 u32 mask; 904 + u8 reg; 931 905 932 906 /* 933 907 * Probe for usable interrupts using the force ··· 925 919 */ 926 920 cb_writel(socket, CB_SOCKET_EVENT, -1); 927 921 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); 922 + reg = exca_readb(socket, I365_CSCINT); 928 923 exca_writeb(socket, I365_CSCINT, 0); 929 924 val = probe_irq_on() & isa_irq_mask; 930 925 for (i = 1; i < 16; i++) { ··· 937 930 cb_writel(socket, CB_SOCKET_EVENT, -1); 938 931 } 939 932 cb_writel(socket, CB_SOCKET_MASK, 0); 940 - exca_writeb(socket, I365_CSCINT, 0); 933 + exca_writeb(socket, I365_CSCINT, reg); 941 934 942 935 mask = probe_irq_mask(val) & 0xffff; 943 936 ··· 974 967 /* probes the PCI interrupt, use only on override functions */ 975 968 static int yenta_probe_cb_irq(struct yenta_socket *socket) 976 969 { 970 + u8 reg; 971 + 977 972 if (!socket->cb_irq) 978 973 return -1; 979 974 ··· 988 979 } 989 980 990 981 /* generate interrupt, wait */ 991 - exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG); 982 + reg = exca_readb(socket, I365_CSCINT); 983 + exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); 992 984 cb_writel(socket, CB_SOCKET_EVENT, -1); 993 985 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); 994 986 cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); ··· 998 988 999 989 /* disable interrupts */ 1000 990 cb_writel(socket, CB_SOCKET_MASK, 0); 1001 - exca_writeb(socket, I365_CSCINT, 0); 991 + exca_writeb(socket, I365_CSCINT, reg); 1002 992 cb_writel(socket, CB_SOCKET_EVENT, -1); 1003 993 exca_readb(socket, I365_CSC); 1004 994
+1
drivers/scsi/pcmcia/nsp_cs.c
··· 1717 1717 cfg_mem->data = data; 1718 1718 1719 1719 ret = pcmcia_loop_config(link, nsp_cs_config_check, cfg_mem); 1720 + if (ret) 1720 1721 goto cs_failed; 1721 1722 1722 1723 if (link->conf.Attributes & CONF_ENABLE_IRQ) {