diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pcmcia/ti113x.h | 37 | ||||
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 25 |
2 files changed, 49 insertions, 13 deletions
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/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 51ee68dbc613..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 | ||
@@ -898,17 +912,6 @@ static struct cardbus_type cardbus_type[] = { | |||
898 | }; | 912 | }; |
899 | 913 | ||
900 | 914 | ||
901 | /* | ||
902 | * Only probe "regular" interrupts, don't | ||
903 | * touch dangerous spots like the mouse irq, | ||
904 | * because there are mice that apparently | ||
905 | * get really confused if they get fondled | ||
906 | * too intimately. | ||
907 | * | ||
908 | * Default to 11, 10, 9, 7, 6, 5, 4, 3. | ||
909 | */ | ||
910 | static u32 isa_interrupts = 0x0ef8; | ||
911 | |||
912 | 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) |
913 | { | 916 | { |
914 | int i; | 917 | int i; |