diff options
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/i82092.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/i82365.h | 1 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 36 | ||||
-rw-r--r-- | drivers/pcmcia/pd6729.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/ti113x.h | 37 | ||||
-rw-r--r-- | drivers/pcmcia/vrc4171_card.c | 5 | ||||
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 46 |
7 files changed, 85 insertions, 42 deletions
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index a04f21c8170f..f5da62653313 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c | |||
@@ -133,6 +133,7 @@ static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_de | |||
133 | sockets[i].socket.map_size = 0x1000; | 133 | sockets[i].socket.map_size = 0x1000; |
134 | sockets[i].socket.irq_mask = 0; | 134 | sockets[i].socket.irq_mask = 0; |
135 | sockets[i].socket.pci_irq = dev->irq; | 135 | sockets[i].socket.pci_irq = dev->irq; |
136 | sockets[i].socket.cb_dev = dev; | ||
136 | sockets[i].socket.owner = THIS_MODULE; | 137 | sockets[i].socket.owner = THIS_MODULE; |
137 | 138 | ||
138 | sockets[i].number = i; | 139 | sockets[i].number = i; |
diff --git a/drivers/pcmcia/i82365.h b/drivers/pcmcia/i82365.h index 849ef1b5d687..3f84d7a2dc84 100644 --- a/drivers/pcmcia/i82365.h +++ b/drivers/pcmcia/i82365.h | |||
@@ -95,6 +95,7 @@ | |||
95 | #define I365_CSC_DETECT 0x08 | 95 | #define I365_CSC_DETECT 0x08 |
96 | #define I365_CSC_ANY 0x0F | 96 | #define I365_CSC_ANY 0x0F |
97 | #define I365_CSC_GPI 0x10 | 97 | #define I365_CSC_GPI 0x10 |
98 | #define I365_CSC_IRQ_MASK 0xF0 | ||
98 | 99 | ||
99 | /* Flags for I365_ADDRWIN */ | 100 | /* Flags for I365_ADDRWIN */ |
100 | #define I365_ENA_IO(map) (0x40 << (map)) | 101 | #define I365_ENA_IO(map) (0x40 << (map)) |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index b2df04199a21..c4612c52e4cb 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -256,6 +256,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, | |||
256 | { | 256 | { |
257 | struct pcmcia_socket *s; | 257 | struct pcmcia_socket *s; |
258 | config_t *c; | 258 | config_t *c; |
259 | int ret; | ||
259 | 260 | ||
260 | s = p_dev->socket; | 261 | s = p_dev->socket; |
261 | 262 | ||
@@ -264,13 +265,13 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, | |||
264 | 265 | ||
265 | if (!(s->state & SOCKET_PRESENT)) { | 266 | if (!(s->state & SOCKET_PRESENT)) { |
266 | dev_dbg(&s->dev, "No card present\n"); | 267 | dev_dbg(&s->dev, "No card present\n"); |
267 | mutex_unlock(&s->ops_mutex); | 268 | ret = -ENODEV; |
268 | return -ENODEV; | 269 | goto unlock; |
269 | } | 270 | } |
270 | if (!(c->state & CONFIG_LOCKED)) { | 271 | if (!(c->state & CONFIG_LOCKED)) { |
271 | dev_dbg(&s->dev, "Configuration isnt't locked\n"); | 272 | dev_dbg(&s->dev, "Configuration isnt't locked\n"); |
272 | mutex_unlock(&s->ops_mutex); | 273 | ret = -EACCES; |
273 | return -EACCES; | 274 | goto unlock; |
274 | } | 275 | } |
275 | 276 | ||
276 | if (mod->Attributes & CONF_IRQ_CHANGE_VALID) { | 277 | if (mod->Attributes & CONF_IRQ_CHANGE_VALID) { |
@@ -286,7 +287,8 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, | |||
286 | 287 | ||
287 | if (mod->Attributes & CONF_VCC_CHANGE_VALID) { | 288 | if (mod->Attributes & CONF_VCC_CHANGE_VALID) { |
288 | dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); | 289 | dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); |
289 | return -EINVAL; | 290 | ret = -EINVAL; |
291 | goto unlock; | ||
290 | } | 292 | } |
291 | 293 | ||
292 | /* We only allow changing Vpp1 and Vpp2 to the same value */ | 294 | /* We only allow changing Vpp1 and Vpp2 to the same value */ |
@@ -294,21 +296,21 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, | |||
294 | (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { | 296 | (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { |
295 | if (mod->Vpp1 != mod->Vpp2) { | 297 | if (mod->Vpp1 != mod->Vpp2) { |
296 | dev_dbg(&s->dev, "Vpp1 and Vpp2 must be the same\n"); | 298 | dev_dbg(&s->dev, "Vpp1 and Vpp2 must be the same\n"); |
297 | mutex_unlock(&s->ops_mutex); | 299 | ret = -EINVAL; |
298 | return -EINVAL; | 300 | goto unlock; |
299 | } | 301 | } |
300 | s->socket.Vpp = mod->Vpp1; | 302 | s->socket.Vpp = mod->Vpp1; |
301 | if (s->ops->set_socket(s, &s->socket)) { | 303 | if (s->ops->set_socket(s, &s->socket)) { |
302 | mutex_unlock(&s->ops_mutex); | ||
303 | dev_printk(KERN_WARNING, &s->dev, | 304 | dev_printk(KERN_WARNING, &s->dev, |
304 | "Unable to set VPP\n"); | 305 | "Unable to set VPP\n"); |
305 | return -EIO; | 306 | ret = -EIO; |
307 | goto unlock; | ||
306 | } | 308 | } |
307 | } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) || | 309 | } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) || |
308 | (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { | 310 | (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { |
309 | dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); | 311 | dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); |
310 | mutex_unlock(&s->ops_mutex); | 312 | ret = -EINVAL; |
311 | return -EINVAL; | 313 | goto unlock; |
312 | } | 314 | } |
313 | 315 | ||
314 | if (mod->Attributes & CONF_IO_CHANGE_WIDTH) { | 316 | if (mod->Attributes & CONF_IO_CHANGE_WIDTH) { |
@@ -332,9 +334,11 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, | |||
332 | s->ops->set_io_map(s, &io_on); | 334 | s->ops->set_io_map(s, &io_on); |
333 | } | 335 | } |
334 | } | 336 | } |
337 | ret = 0; | ||
338 | unlock: | ||
335 | mutex_unlock(&s->ops_mutex); | 339 | mutex_unlock(&s->ops_mutex); |
336 | 340 | ||
337 | return 0; | 341 | return ret; |
338 | } /* modify_configuration */ | 342 | } /* modify_configuration */ |
339 | EXPORT_SYMBOL(pcmcia_modify_configuration); | 343 | EXPORT_SYMBOL(pcmcia_modify_configuration); |
340 | 344 | ||
@@ -752,14 +756,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
752 | 756 | ||
753 | #ifdef CONFIG_PCMCIA_PROBE | 757 | #ifdef CONFIG_PCMCIA_PROBE |
754 | 758 | ||
755 | #ifdef IRQ_NOAUTOEN | ||
756 | /* if the underlying IRQ infrastructure allows for it, only allocate | ||
757 | * the IRQ, but do not enable it | ||
758 | */ | ||
759 | if (!(req->Handler)) | ||
760 | type |= IRQ_NOAUTOEN; | ||
761 | #endif /* IRQ_NOAUTOEN */ | ||
762 | |||
763 | if (s->irq.AssignedIRQ != 0) { | 759 | if (s->irq.AssignedIRQ != 0) { |
764 | /* If the interrupt is already assigned, it must be the same */ | 760 | /* If the interrupt is already assigned, it must be the same */ |
765 | irq = s->irq.AssignedIRQ; | 761 | irq = s->irq.AssignedIRQ; |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 7c204910a777..7ba57a565cd7 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
@@ -671,6 +671,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
671 | socket[i].socket.map_size = 0x1000; | 671 | socket[i].socket.map_size = 0x1000; |
672 | socket[i].socket.irq_mask = mask; | 672 | socket[i].socket.irq_mask = mask; |
673 | socket[i].socket.pci_irq = dev->irq; | 673 | socket[i].socket.pci_irq = dev->irq; |
674 | socket[i].socket.cb_dev = dev; | ||
674 | socket[i].socket.owner = THIS_MODULE; | 675 | socket[i].socket.owner = THIS_MODULE; |
675 | 676 | ||
676 | socket[i].number = i; | 677 | socket[i].number = i; |
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index aaa70227bfb0..9ffa97d0b16c 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h | |||
@@ -296,7 +296,7 @@ static int ti_init(struct yenta_socket *socket) | |||
296 | u8 new, reg = exca_readb(socket, I365_INTCTL); | 296 | u8 new, reg = exca_readb(socket, I365_INTCTL); |
297 | 297 | ||
298 | new = reg & ~I365_INTR_ENA; | 298 | new = reg & ~I365_INTR_ENA; |
299 | if (socket->cb_irq) | 299 | if (socket->dev->irq) |
300 | new |= I365_INTR_ENA; | 300 | new |= I365_INTR_ENA; |
301 | if (new != reg) | 301 | if (new != reg) |
302 | exca_writeb(socket, I365_INTCTL, new); | 302 | exca_writeb(socket, I365_INTCTL, new); |
@@ -316,14 +316,47 @@ static int ti_override(struct yenta_socket *socket) | |||
316 | return 0; | 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 | static int ti113x_override(struct yenta_socket *socket) | 349 | static int ti113x_override(struct yenta_socket *socket) |
320 | { | 350 | { |
321 | u8 cardctl; | 351 | u8 cardctl; |
322 | 352 | ||
323 | cardctl = config_readb(socket, TI113X_CARD_CONTROL); | 353 | cardctl = config_readb(socket, TI113X_CARD_CONTROL); |
324 | cardctl &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC); | 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 | cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ; | 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 | config_writeb(socket, TI113X_CARD_CONTROL, cardctl); | 360 | config_writeb(socket, TI113X_CARD_CONTROL, cardctl); |
328 | 361 | ||
329 | return ti_override(socket); | 362 | return ti_override(socket); |
diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c index c9fcbdc164ea..aaccdb9f4ba1 100644 --- a/drivers/pcmcia/vrc4171_card.c +++ b/drivers/pcmcia/vrc4171_card.c | |||
@@ -105,6 +105,7 @@ typedef struct vrc4171_socket { | |||
105 | char name[24]; | 105 | char name[24]; |
106 | int csc_irq; | 106 | int csc_irq; |
107 | int io_irq; | 107 | int io_irq; |
108 | spinlock_t lock; | ||
108 | } vrc4171_socket_t; | 109 | } vrc4171_socket_t; |
109 | 110 | ||
110 | static vrc4171_socket_t vrc4171_sockets[CARD_MAX_SLOTS]; | 111 | static vrc4171_socket_t vrc4171_sockets[CARD_MAX_SLOTS]; |
@@ -327,7 +328,7 @@ static int pccard_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
327 | slot = sock->sock; | 328 | slot = sock->sock; |
328 | socket = &vrc4171_sockets[slot]; | 329 | socket = &vrc4171_sockets[slot]; |
329 | 330 | ||
330 | spin_lock_irq(&sock->lock); | 331 | spin_lock_irq(&socket->lock); |
331 | 332 | ||
332 | voltage = set_Vcc_value(state->Vcc); | 333 | voltage = set_Vcc_value(state->Vcc); |
333 | exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage); | 334 | exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage); |
@@ -370,7 +371,7 @@ static int pccard_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
370 | cscint |= I365_CSC_DETECT; | 371 | cscint |= I365_CSC_DETECT; |
371 | exca_write_byte(slot, I365_CSCINT, cscint); | 372 | exca_write_byte(slot, I365_CSCINT, cscint); |
372 | 373 | ||
373 | spin_unlock_irq(&sock->lock); | 374 | spin_unlock_irq(&socket->lock); |
374 | 375 | ||
375 | return 0; | 376 | return 0; |
376 | } | 377 | } |
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 967c766f53ba..418988ab6edf 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -42,6 +42,18 @@ module_param_string(o2_speedup, o2_speedup, sizeof(o2_speedup), 0444); | |||
42 | MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' " | 42 | MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' " |
43 | "or 'default' (uses recommended behaviour for the detected bridge)"); | 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 | #define debug(x, s, args...) dev_dbg(&s->dev->dev, x, ##args) | 57 | #define debug(x, s, args...) dev_dbg(&s->dev->dev, x, ##args) |
46 | 58 | ||
47 | /* Don't ask.. */ | 59 | /* Don't ask.. */ |
@@ -54,6 +66,8 @@ MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' " | |||
54 | */ | 66 | */ |
55 | #ifdef CONFIG_YENTA_TI | 67 | #ifdef CONFIG_YENTA_TI |
56 | static int yenta_probe_cb_irq(struct yenta_socket *socket); | 68 | static int yenta_probe_cb_irq(struct yenta_socket *socket); |
69 | static unsigned int yenta_probe_irq(struct yenta_socket *socket, | ||
70 | u32 isa_irq_mask); | ||
57 | #endif | 71 | #endif |
58 | 72 | ||
59 | 73 | ||
@@ -329,8 +343,8 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
329 | /* ISA interrupt control? */ | 343 | /* ISA interrupt control? */ |
330 | intr = exca_readb(socket, I365_INTCTL); | 344 | intr = exca_readb(socket, I365_INTCTL); |
331 | intr = (intr & ~0xf); | 345 | intr = (intr & ~0xf); |
332 | if (!socket->cb_irq) { | 346 | if (!socket->dev->irq) { |
333 | intr |= state->io_irq; | 347 | intr |= socket->cb_irq ? socket->cb_irq : state->io_irq; |
334 | bridge |= CB_BRIDGE_INTR; | 348 | bridge |= CB_BRIDGE_INTR; |
335 | } | 349 | } |
336 | exca_writeb(socket, I365_INTCTL, intr); | 350 | exca_writeb(socket, I365_INTCTL, intr); |
@@ -340,7 +354,7 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
340 | reg = exca_readb(socket, I365_INTCTL) & (I365_RING_ENA | I365_INTR_ENA); | 354 | reg = exca_readb(socket, I365_INTCTL) & (I365_RING_ENA | I365_INTR_ENA); |
341 | reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; | 355 | reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; |
342 | reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; | 356 | reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; |
343 | if (state->io_irq != socket->cb_irq) { | 357 | if (state->io_irq != socket->dev->irq) { |
344 | reg |= state->io_irq; | 358 | reg |= state->io_irq; |
345 | bridge |= CB_BRIDGE_INTR; | 359 | bridge |= CB_BRIDGE_INTR; |
346 | } | 360 | } |
@@ -356,7 +370,9 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
356 | exca_writeb(socket, I365_POWER, reg); | 370 | exca_writeb(socket, I365_POWER, reg); |
357 | 371 | ||
358 | /* CSC interrupt: no ISA irq for CSC */ | 372 | /* CSC interrupt: no ISA irq for CSC */ |
359 | reg = I365_CSC_DETECT; | 373 | reg = exca_readb(socket, I365_CSCINT); |
374 | reg &= I365_CSC_IRQ_MASK; | ||
375 | reg |= I365_CSC_DETECT; | ||
360 | if (state->flags & SS_IOCARD) { | 376 | if (state->flags & SS_IOCARD) { |
361 | if (state->csc_mask & SS_STSCHG) | 377 | if (state->csc_mask & SS_STSCHG) |
362 | reg |= I365_CSC_STSCHG; | 378 | reg |= I365_CSC_STSCHG; |
@@ -896,22 +912,12 @@ static struct cardbus_type cardbus_type[] = { | |||
896 | }; | 912 | }; |
897 | 913 | ||
898 | 914 | ||
899 | /* | ||
900 | * Only probe "regular" interrupts, don't | ||
901 | * touch dangerous spots like the mouse irq, | ||
902 | * because there are mice that apparently | ||
903 | * get really confused if they get fondled | ||
904 | * too intimately. | ||
905 | * | ||
906 | * Default to 11, 10, 9, 7, 6, 5, 4, 3. | ||
907 | */ | ||
908 | static u32 isa_interrupts = 0x0ef8; | ||
909 | |||
910 | static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mask) | 915 | static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mask) |
911 | { | 916 | { |
912 | int i; | 917 | int i; |
913 | unsigned long val; | 918 | unsigned long val; |
914 | u32 mask; | 919 | u32 mask; |
920 | u8 reg; | ||
915 | 921 | ||
916 | /* | 922 | /* |
917 | * Probe for usable interrupts using the force | 923 | * Probe for usable interrupts using the force |
@@ -919,6 +925,7 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas | |||
919 | */ | 925 | */ |
920 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 926 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
921 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); | 927 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); |
928 | reg = exca_readb(socket, I365_CSCINT); | ||
922 | exca_writeb(socket, I365_CSCINT, 0); | 929 | exca_writeb(socket, I365_CSCINT, 0); |
923 | val = probe_irq_on() & isa_irq_mask; | 930 | val = probe_irq_on() & isa_irq_mask; |
924 | for (i = 1; i < 16; i++) { | 931 | for (i = 1; i < 16; i++) { |
@@ -930,7 +937,7 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas | |||
930 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 937 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
931 | } | 938 | } |
932 | cb_writel(socket, CB_SOCKET_MASK, 0); | 939 | cb_writel(socket, CB_SOCKET_MASK, 0); |
933 | exca_writeb(socket, I365_CSCINT, 0); | 940 | exca_writeb(socket, I365_CSCINT, reg); |
934 | 941 | ||
935 | mask = probe_irq_mask(val) & 0xffff; | 942 | mask = probe_irq_mask(val) & 0xffff; |
936 | 943 | ||
@@ -967,6 +974,8 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id) | |||
967 | /* probes the PCI interrupt, use only on override functions */ | 974 | /* probes the PCI interrupt, use only on override functions */ |
968 | static int yenta_probe_cb_irq(struct yenta_socket *socket) | 975 | static int yenta_probe_cb_irq(struct yenta_socket *socket) |
969 | { | 976 | { |
977 | u8 reg; | ||
978 | |||
970 | if (!socket->cb_irq) | 979 | if (!socket->cb_irq) |
971 | return -1; | 980 | return -1; |
972 | 981 | ||
@@ -979,7 +988,8 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) | |||
979 | } | 988 | } |
980 | 989 | ||
981 | /* generate interrupt, wait */ | 990 | /* generate interrupt, wait */ |
982 | exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG); | 991 | reg = exca_readb(socket, I365_CSCINT); |
992 | exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); | ||
983 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 993 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
984 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); | 994 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); |
985 | cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); | 995 | cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); |
@@ -988,7 +998,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) | |||
988 | 998 | ||
989 | /* disable interrupts */ | 999 | /* disable interrupts */ |
990 | cb_writel(socket, CB_SOCKET_MASK, 0); | 1000 | cb_writel(socket, CB_SOCKET_MASK, 0); |
991 | exca_writeb(socket, I365_CSCINT, 0); | 1001 | exca_writeb(socket, I365_CSCINT, reg); |
992 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 1002 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
993 | exca_readb(socket, I365_CSC); | 1003 | exca_readb(socket, I365_CSC); |
994 | 1004 | ||