qlcnic: release device resources during interface down
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / pcmcia / i82365.c
blob9e2a15628de57af889115628a3c9e4aaca7e4a60
1 /*======================================================================
3 Device driver for Intel 82365 and compatible PC Card controllers.
5 i82365.c 1.265 1999/11/10 18:36:21
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in which
23 case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
32 ======================================================================*/
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/init.h>
37 #include <linux/types.h>
38 #include <linux/fcntl.h>
39 #include <linux/string.h>
40 #include <linux/kernel.h>
41 #include <linux/errno.h>
42 #include <linux/timer.h>
43 #include <linux/ioport.h>
44 #include <linux/delay.h>
45 #include <linux/workqueue.h>
46 #include <linux/interrupt.h>
47 #include <linux/platform_device.h>
48 #include <linux/bitops.h>
49 #include <asm/irq.h>
50 #include <asm/io.h>
51 #include <asm/system.h>
53 #include <pcmcia/cs_types.h>
54 #include <pcmcia/ss.h>
55 #include <pcmcia/cs.h>
57 #include <linux/isapnp.h>
59 /* ISA-bus controllers */
60 #include "i82365.h"
61 #include "cirrus.h"
62 #include "vg468.h"
63 #include "ricoh.h"
66 static irqreturn_t i365_count_irq(int, void *);
67 static inline int _check_irq(int irq, int flags)
69 if (request_irq(irq, i365_count_irq, flags, "x", i365_count_irq) != 0)
70 return -1;
71 free_irq(irq, i365_count_irq);
72 return 0;
75 /*====================================================================*/
77 /* Parameters that can be set with 'insmod' */
79 /* Default base address for i82365sl and other ISA chips */
80 static unsigned long i365_base = 0x3e0;
81 /* Should we probe at 0x3e2 for an extra ISA controller? */
82 static int extra_sockets = 0;
83 /* Specify a socket number to ignore */
84 static int ignore = -1;
85 /* Bit map or list of interrupts to choose from */
86 static u_int irq_mask = 0xffff;
87 static int irq_list[16];
88 static unsigned int irq_list_count;
89 /* The card status change interrupt -- 0 means autoselect */
90 static int cs_irq = 0;
92 /* Probe for safe interrupts? */
93 static int do_scan = 1;
94 /* Poll status interval -- 0 means default to interrupt */
95 static int poll_interval = 0;
96 /* External clock time, in nanoseconds. 120 ns = 8.33 MHz */
97 static int cycle_time = 120;
99 /* Cirrus options */
100 static int has_dma = -1;
101 static int has_led = -1;
102 static int has_ring = -1;
103 static int dynamic_mode = 0;
104 static int freq_bypass = -1;
105 static int setup_time = -1;
106 static int cmd_time = -1;
107 static int recov_time = -1;
109 /* Vadem options */
110 static int async_clock = -1;
111 static int cable_mode = -1;
112 static int wakeup = 0;
114 module_param(i365_base, ulong, 0444);
115 module_param(ignore, int, 0444);
116 module_param(extra_sockets, int, 0444);
117 module_param(irq_mask, int, 0444);
118 module_param_array(irq_list, int, &irq_list_count, 0444);
119 module_param(cs_irq, int, 0444);
120 module_param(async_clock, int, 0444);
121 module_param(cable_mode, int, 0444);
122 module_param(wakeup, int, 0444);
124 module_param(do_scan, int, 0444);
125 module_param(poll_interval, int, 0444);
126 module_param(cycle_time, int, 0444);
127 module_param(has_dma, int, 0444);
128 module_param(has_led, int, 0444);
129 module_param(has_ring, int, 0444);
130 module_param(dynamic_mode, int, 0444);
131 module_param(freq_bypass, int, 0444);
132 module_param(setup_time, int, 0444);
133 module_param(cmd_time, int, 0444);
134 module_param(recov_time, int, 0444);
136 /*====================================================================*/
138 typedef struct cirrus_state_t {
139 u_char misc1, misc2;
140 u_char timer[6];
141 } cirrus_state_t;
143 typedef struct vg46x_state_t {
144 u_char ctl, ema;
145 } vg46x_state_t;
147 struct i82365_socket {
148 u_short type, flags;
149 struct pcmcia_socket socket;
150 unsigned int number;
151 unsigned int ioaddr;
152 u_short psock;
153 u_char cs_irq, intr;
154 union {
155 cirrus_state_t cirrus;
156 vg46x_state_t vg46x;
157 } state;
160 /* Where we keep track of our sockets... */
161 static int sockets = 0;
162 static struct i82365_socket socket[8] = {
163 { 0, }, /* ... */
166 /* Default ISA interrupt mask */
167 #define I365_MASK 0xdeb8 /* irq 15,14,12,11,10,9,7,5,4,3 */
169 static int grab_irq;
170 static DEFINE_SPINLOCK(isa_lock);
171 #define ISA_LOCK(n, f) spin_lock_irqsave(&isa_lock, f)
172 #define ISA_UNLOCK(n, f) spin_unlock_irqrestore(&isa_lock, f)
174 static struct timer_list poll_timer;
176 /*====================================================================*/
178 /* These definitions must match the pcic table! */
179 typedef enum pcic_id {
180 IS_I82365A, IS_I82365B, IS_I82365DF,
181 IS_IBM, IS_RF5Cx96, IS_VLSI, IS_VG468, IS_VG469,
182 IS_PD6710, IS_PD672X, IS_VT83C469,
183 } pcic_id;
185 /* Flags for classifying groups of controllers */
186 #define IS_VADEM 0x0001
187 #define IS_CIRRUS 0x0002
188 #define IS_VIA 0x0010
189 #define IS_UNKNOWN 0x0400
190 #define IS_VG_PWR 0x0800
191 #define IS_DF_PWR 0x1000
192 #define IS_REGISTERED 0x2000
193 #define IS_ALIVE 0x8000
195 typedef struct pcic_t {
196 char *name;
197 u_short flags;
198 } pcic_t;
200 static pcic_t pcic[] = {
201 { "Intel i82365sl A step", 0 },
202 { "Intel i82365sl B step", 0 },
203 { "Intel i82365sl DF", IS_DF_PWR },
204 { "IBM Clone", 0 },
205 { "Ricoh RF5C296/396", 0 },
206 { "VLSI 82C146", 0 },
207 { "Vadem VG-468", IS_VADEM },
208 { "Vadem VG-469", IS_VADEM|IS_VG_PWR },
209 { "Cirrus PD6710", IS_CIRRUS },
210 { "Cirrus PD672x", IS_CIRRUS },
211 { "VIA VT83C469", IS_CIRRUS|IS_VIA },
214 #define PCIC_COUNT (sizeof(pcic)/sizeof(pcic_t))
216 /*====================================================================*/
218 static DEFINE_SPINLOCK(bus_lock);
220 static u_char i365_get(u_short sock, u_short reg)
222 unsigned long flags;
223 spin_lock_irqsave(&bus_lock,flags);
225 unsigned int port = socket[sock].ioaddr;
226 u_char val;
227 reg = I365_REG(socket[sock].psock, reg);
228 outb(reg, port); val = inb(port+1);
229 spin_unlock_irqrestore(&bus_lock,flags);
230 return val;
234 static void i365_set(u_short sock, u_short reg, u_char data)
236 unsigned long flags;
237 spin_lock_irqsave(&bus_lock,flags);
239 unsigned int port = socket[sock].ioaddr;
240 u_char val = I365_REG(socket[sock].psock, reg);
241 outb(val, port); outb(data, port+1);
242 spin_unlock_irqrestore(&bus_lock,flags);
246 static void i365_bset(u_short sock, u_short reg, u_char mask)
248 u_char d = i365_get(sock, reg);
249 d |= mask;
250 i365_set(sock, reg, d);
253 static void i365_bclr(u_short sock, u_short reg, u_char mask)
255 u_char d = i365_get(sock, reg);
256 d &= ~mask;
257 i365_set(sock, reg, d);
260 static void i365_bflip(u_short sock, u_short reg, u_char mask, int b)
262 u_char d = i365_get(sock, reg);
263 if (b)
264 d |= mask;
265 else
266 d &= ~mask;
267 i365_set(sock, reg, d);
270 static u_short i365_get_pair(u_short sock, u_short reg)
272 u_short a, b;
273 a = i365_get(sock, reg);
274 b = i365_get(sock, reg+1);
275 return (a + (b<<8));
278 static void i365_set_pair(u_short sock, u_short reg, u_short data)
280 i365_set(sock, reg, data & 0xff);
281 i365_set(sock, reg+1, data >> 8);
284 /*======================================================================
286 Code to save and restore global state information for Cirrus
287 PD67xx controllers, and to set and report global configuration
288 options.
290 The VIA controllers also use these routines, as they are mostly
291 Cirrus lookalikes, without the timing registers.
293 ======================================================================*/
295 #define flip(v,b,f) (v = ((f)<0) ? v : ((f) ? ((v)|(b)) : ((v)&(~b))))
297 static void cirrus_get_state(u_short s)
299 int i;
300 cirrus_state_t *p = &socket[s].state.cirrus;
301 p->misc1 = i365_get(s, PD67_MISC_CTL_1);
302 p->misc1 &= (PD67_MC1_MEDIA_ENA | PD67_MC1_INPACK_ENA);
303 p->misc2 = i365_get(s, PD67_MISC_CTL_2);
304 for (i = 0; i < 6; i++)
305 p->timer[i] = i365_get(s, PD67_TIME_SETUP(0)+i);
308 static void cirrus_set_state(u_short s)
310 int i;
311 u_char misc;
312 cirrus_state_t *p = &socket[s].state.cirrus;
314 misc = i365_get(s, PD67_MISC_CTL_2);
315 i365_set(s, PD67_MISC_CTL_2, p->misc2);
316 if (misc & PD67_MC2_SUSPEND) mdelay(50);
317 misc = i365_get(s, PD67_MISC_CTL_1);
318 misc &= ~(PD67_MC1_MEDIA_ENA | PD67_MC1_INPACK_ENA);
319 i365_set(s, PD67_MISC_CTL_1, misc | p->misc1);
320 for (i = 0; i < 6; i++)
321 i365_set(s, PD67_TIME_SETUP(0)+i, p->timer[i]);
324 static u_int __init cirrus_set_opts(u_short s, char *buf)
326 struct i82365_socket *t = &socket[s];
327 cirrus_state_t *p = &socket[s].state.cirrus;
328 u_int mask = 0xffff;
330 if (has_ring == -1) has_ring = 1;
331 flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring);
332 flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode);
333 flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
334 if (p->misc2 & PD67_MC2_IRQ15_RI)
335 strcat(buf, " [ring]");
336 if (p->misc2 & PD67_MC2_DYNAMIC_MODE)
337 strcat(buf, " [dyn mode]");
338 if (p->misc2 & PD67_MC2_FREQ_BYPASS)
339 strcat(buf, " [freq bypass]");
340 if (p->misc1 & PD67_MC1_INPACK_ENA)
341 strcat(buf, " [inpack]");
342 if (p->misc2 & PD67_MC2_IRQ15_RI)
343 mask &= ~0x8000;
344 if (has_led > 0) {
345 strcat(buf, " [led]");
346 mask &= ~0x1000;
348 if (has_dma > 0) {
349 strcat(buf, " [dma]");
350 mask &= ~0x0600;
352 if (!(t->flags & IS_VIA)) {
353 if (setup_time >= 0)
354 p->timer[0] = p->timer[3] = setup_time;
355 if (cmd_time > 0) {
356 p->timer[1] = cmd_time;
357 p->timer[4] = cmd_time*2+4;
359 if (p->timer[1] == 0) {
360 p->timer[1] = 6; p->timer[4] = 16;
361 if (p->timer[0] == 0)
362 p->timer[0] = p->timer[3] = 1;
364 if (recov_time >= 0)
365 p->timer[2] = p->timer[5] = recov_time;
366 buf += strlen(buf);
367 sprintf(buf, " [%d/%d/%d] [%d/%d/%d]", p->timer[0], p->timer[1],
368 p->timer[2], p->timer[3], p->timer[4], p->timer[5]);
370 return mask;
373 /*======================================================================
375 Code to save and restore global state information for Vadem VG468
376 and VG469 controllers, and to set and report global configuration
377 options.
379 ======================================================================*/
381 static void vg46x_get_state(u_short s)
383 vg46x_state_t *p = &socket[s].state.vg46x;
384 p->ctl = i365_get(s, VG468_CTL);
385 if (socket[s].type == IS_VG469)
386 p->ema = i365_get(s, VG469_EXT_MODE);
389 static void vg46x_set_state(u_short s)
391 vg46x_state_t *p = &socket[s].state.vg46x;
392 i365_set(s, VG468_CTL, p->ctl);
393 if (socket[s].type == IS_VG469)
394 i365_set(s, VG469_EXT_MODE, p->ema);
397 static u_int __init vg46x_set_opts(u_short s, char *buf)
399 vg46x_state_t *p = &socket[s].state.vg46x;
401 flip(p->ctl, VG468_CTL_ASYNC, async_clock);
402 flip(p->ema, VG469_MODE_CABLE, cable_mode);
403 if (p->ctl & VG468_CTL_ASYNC)
404 strcat(buf, " [async]");
405 if (p->ctl & VG468_CTL_INPACK)
406 strcat(buf, " [inpack]");
407 if (socket[s].type == IS_VG469) {
408 u_char vsel = i365_get(s, VG469_VSELECT);
409 if (vsel & VG469_VSEL_EXT_STAT) {
410 strcat(buf, " [ext mode]");
411 if (vsel & VG469_VSEL_EXT_BUS)
412 strcat(buf, " [isa buf]");
414 if (p->ema & VG469_MODE_CABLE)
415 strcat(buf, " [cable]");
416 if (p->ema & VG469_MODE_COMPAT)
417 strcat(buf, " [c step]");
419 return 0xffff;
422 /*======================================================================
424 Generic routines to get and set controller options
426 ======================================================================*/
428 static void get_bridge_state(u_short s)
430 struct i82365_socket *t = &socket[s];
431 if (t->flags & IS_CIRRUS)
432 cirrus_get_state(s);
433 else if (t->flags & IS_VADEM)
434 vg46x_get_state(s);
437 static void set_bridge_state(u_short s)
439 struct i82365_socket *t = &socket[s];
440 if (t->flags & IS_CIRRUS)
441 cirrus_set_state(s);
442 else {
443 i365_set(s, I365_GBLCTL, 0x00);
444 i365_set(s, I365_GENCTL, 0x00);
446 i365_bflip(s, I365_INTCTL, I365_INTR_ENA, t->intr);
447 if (t->flags & IS_VADEM)
448 vg46x_set_state(s);
451 static u_int __init set_bridge_opts(u_short s, u_short ns)
453 u_short i;
454 u_int m = 0xffff;
455 char buf[128];
457 for (i = s; i < s+ns; i++) {
458 if (socket[i].flags & IS_ALIVE) {
459 printk(KERN_INFO " host opts [%d]: already alive!\n", i);
460 continue;
462 buf[0] = '\0';
463 get_bridge_state(i);
464 if (socket[i].flags & IS_CIRRUS)
465 m = cirrus_set_opts(i, buf);
466 else if (socket[i].flags & IS_VADEM)
467 m = vg46x_set_opts(i, buf);
468 set_bridge_state(i);
469 printk(KERN_INFO " host opts [%d]:%s\n", i,
470 (*buf) ? buf : " none");
472 return m;
475 /*======================================================================
477 Interrupt testing code, for ISA and PCI interrupts
479 ======================================================================*/
481 static volatile u_int irq_hits;
482 static u_short irq_sock;
484 static irqreturn_t i365_count_irq(int irq, void *dev)
486 i365_get(irq_sock, I365_CSC);
487 irq_hits++;
488 pr_debug("i82365: -> hit on irq %d\n", irq);
489 return IRQ_HANDLED;
492 static u_int __init test_irq(u_short sock, int irq)
494 pr_debug("i82365: testing ISA irq %d\n", irq);
495 if (request_irq(irq, i365_count_irq, IRQF_PROBE_SHARED, "scan",
496 i365_count_irq) != 0)
497 return 1;
498 irq_hits = 0; irq_sock = sock;
499 msleep(10);
500 if (irq_hits) {
501 free_irq(irq, i365_count_irq);
502 pr_debug("i82365: spurious hit!\n");
503 return 1;
506 /* Generate one interrupt */
507 i365_set(sock, I365_CSCINT, I365_CSC_DETECT | (irq << 4));
508 i365_bset(sock, I365_GENCTL, I365_CTL_SW_IRQ);
509 udelay(1000);
511 free_irq(irq, i365_count_irq);
513 /* mask all interrupts */
514 i365_set(sock, I365_CSCINT, 0);
515 pr_debug("i82365: hits = %d\n", irq_hits);
517 return (irq_hits != 1);
520 static u_int __init isa_scan(u_short sock, u_int mask0)
522 u_int mask1 = 0;
523 int i;
525 #ifdef __alpha__
526 #define PIC 0x4d0
527 /* Don't probe level-triggered interrupts -- reserved for PCI */
528 mask0 &= ~(inb(PIC) | (inb(PIC+1) << 8));
529 #endif
531 if (do_scan) {
532 set_bridge_state(sock);
533 i365_set(sock, I365_CSCINT, 0);
534 for (i = 0; i < 16; i++)
535 if ((mask0 & (1 << i)) && (test_irq(sock, i) == 0))
536 mask1 |= (1 << i);
537 for (i = 0; i < 16; i++)
538 if ((mask1 & (1 << i)) && (test_irq(sock, i) != 0))
539 mask1 ^= (1 << i);
542 printk(KERN_INFO " ISA irqs (");
543 if (mask1) {
544 printk("scanned");
545 } else {
546 /* Fallback: just find interrupts that aren't in use */
547 for (i = 0; i < 16; i++)
548 if ((mask0 & (1 << i)) && (_check_irq(i, IRQF_PROBE_SHARED) == 0))
549 mask1 |= (1 << i);
550 printk("default");
551 /* If scan failed, default to polled status */
552 if (!cs_irq && (poll_interval == 0)) poll_interval = HZ;
554 printk(") = ");
556 for (i = 0; i < 16; i++)
557 if (mask1 & (1<<i))
558 printk("%s%d", ((mask1 & ((1<<i)-1)) ? "," : ""), i);
559 if (mask1 == 0) printk("none!");
561 return mask1;
564 /*====================================================================*/
566 /* Time conversion functions */
568 static int to_cycles(int ns)
570 return ns/cycle_time;
573 /*====================================================================*/
575 static int __init identify(unsigned int port, u_short sock)
577 u_char val;
578 int type = -1;
580 /* Use the next free entry in the socket table */
581 socket[sockets].ioaddr = port;
582 socket[sockets].psock = sock;
584 /* Wake up a sleepy Cirrus controller */
585 if (wakeup) {
586 i365_bclr(sockets, PD67_MISC_CTL_2, PD67_MC2_SUSPEND);
587 /* Pause at least 50 ms */
588 mdelay(50);
591 if ((val = i365_get(sockets, I365_IDENT)) & 0x70)
592 return -1;
593 switch (val) {
594 case 0x82:
595 type = IS_I82365A; break;
596 case 0x83:
597 type = IS_I82365B; break;
598 case 0x84:
599 type = IS_I82365DF; break;
600 case 0x88: case 0x89: case 0x8a:
601 type = IS_IBM; break;
604 /* Check for Vadem VG-468 chips */
605 outb(0x0e, port);
606 outb(0x37, port);
607 i365_bset(sockets, VG468_MISC, VG468_MISC_VADEMREV);
608 val = i365_get(sockets, I365_IDENT);
609 if (val & I365_IDENT_VADEM) {
610 i365_bclr(sockets, VG468_MISC, VG468_MISC_VADEMREV);
611 type = ((val & 7) >= 4) ? IS_VG469 : IS_VG468;
614 /* Check for Ricoh chips */
615 val = i365_get(sockets, RF5C_CHIP_ID);
616 if ((val == RF5C_CHIP_RF5C296) || (val == RF5C_CHIP_RF5C396))
617 type = IS_RF5Cx96;
619 /* Check for Cirrus CL-PD67xx chips */
620 i365_set(sockets, PD67_CHIP_INFO, 0);
621 val = i365_get(sockets, PD67_CHIP_INFO);
622 if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
623 val = i365_get(sockets, PD67_CHIP_INFO);
624 if ((val & PD67_INFO_CHIP_ID) == 0) {
625 type = (val & PD67_INFO_SLOTS) ? IS_PD672X : IS_PD6710;
626 i365_set(sockets, PD67_EXT_INDEX, 0xe5);
627 if (i365_get(sockets, PD67_EXT_INDEX) != 0xe5)
628 type = IS_VT83C469;
631 return type;
632 } /* identify */
634 /*======================================================================
636 See if a card is present, powered up, in IO mode, and already
637 bound to a (non PC Card) Linux driver. We leave these alone.
639 We make an exception for cards that seem to be serial devices.
641 ======================================================================*/
643 static int __init is_alive(u_short sock)
645 u_char stat;
646 unsigned int start, stop;
648 stat = i365_get(sock, I365_STATUS);
649 start = i365_get_pair(sock, I365_IO(0)+I365_W_START);
650 stop = i365_get_pair(sock, I365_IO(0)+I365_W_STOP);
651 if ((stat & I365_CS_DETECT) && (stat & I365_CS_POWERON) &&
652 (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD) &&
653 (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(0)) &&
654 ((start & 0xfeef) != 0x02e8)) {
655 if (!request_region(start, stop-start+1, "i82365"))
656 return 1;
657 release_region(start, stop-start+1);
660 return 0;
663 /*====================================================================*/
665 static void __init add_socket(unsigned int port, int psock, int type)
667 socket[sockets].ioaddr = port;
668 socket[sockets].psock = psock;
669 socket[sockets].type = type;
670 socket[sockets].flags = pcic[type].flags;
671 if (is_alive(sockets))
672 socket[sockets].flags |= IS_ALIVE;
673 sockets++;
676 static void __init add_pcic(int ns, int type)
678 u_int mask = 0, i, base;
679 int isa_irq = 0;
680 struct i82365_socket *t = &socket[sockets-ns];
682 base = sockets-ns;
683 if (base == 0) printk("\n");
684 printk(KERN_INFO " %s", pcic[type].name);
685 printk(" ISA-to-PCMCIA at port %#x ofs 0x%02x",
686 t->ioaddr, t->psock*0x40);
687 printk(", %d socket%s\n", ns, ((ns > 1) ? "s" : ""));
689 /* Set host options, build basic interrupt mask */
690 if (irq_list_count == 0)
691 mask = irq_mask;
692 else
693 for (i = mask = 0; i < irq_list_count; i++)
694 mask |= (1<<irq_list[i]);
695 mask &= I365_MASK & set_bridge_opts(base, ns);
696 /* Scan for ISA interrupts */
697 mask = isa_scan(base, mask);
699 /* Poll if only two interrupts available */
700 if (!poll_interval) {
701 u_int tmp = (mask & 0xff20);
702 tmp = tmp & (tmp-1);
703 if ((tmp & (tmp-1)) == 0)
704 poll_interval = HZ;
706 /* Only try an ISA cs_irq if this is the first controller */
707 if (!grab_irq && (cs_irq || !poll_interval)) {
708 /* Avoid irq 12 unless it is explicitly requested */
709 u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
710 for (cs_irq = 15; cs_irq > 0; cs_irq--)
711 if ((cs_mask & (1 << cs_irq)) &&
712 (_check_irq(cs_irq, IRQF_PROBE_SHARED) == 0))
713 break;
714 if (cs_irq) {
715 grab_irq = 1;
716 isa_irq = cs_irq;
717 printk(" status change on irq %d\n", cs_irq);
721 if (!isa_irq) {
722 if (poll_interval == 0)
723 poll_interval = HZ;
724 printk(" polling interval = %d ms\n",
725 poll_interval * 1000 / HZ);
729 /* Update socket interrupt information, capabilities */
730 for (i = 0; i < ns; i++) {
731 t[i].socket.features |= SS_CAP_PCCARD;
732 t[i].socket.map_size = 0x1000;
733 t[i].socket.irq_mask = mask;
734 t[i].cs_irq = isa_irq;
737 } /* add_pcic */
739 /*====================================================================*/
741 #ifdef CONFIG_PNP
742 static struct isapnp_device_id id_table[] __initdata = {
743 { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
744 ISAPNP_FUNCTION(0x0e00), (unsigned long) "Intel 82365-Compatible" },
745 { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
746 ISAPNP_FUNCTION(0x0e01), (unsigned long) "Cirrus Logic CL-PD6720" },
747 { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
748 ISAPNP_FUNCTION(0x0e02), (unsigned long) "VLSI VL82C146" },
749 { 0 }
751 MODULE_DEVICE_TABLE(isapnp, id_table);
753 static struct pnp_dev *i82365_pnpdev;
754 #endif
756 static void __init isa_probe(void)
758 int i, j, sock, k, ns, id;
759 unsigned int port;
760 #ifdef CONFIG_PNP
761 struct isapnp_device_id *devid;
762 struct pnp_dev *dev;
764 for (devid = id_table; devid->vendor; devid++) {
765 if ((dev = pnp_find_dev(NULL, devid->vendor, devid->function, NULL))) {
767 if (pnp_device_attach(dev) < 0)
768 continue;
770 if (pnp_activate_dev(dev) < 0) {
771 printk("activate failed\n");
772 pnp_device_detach(dev);
773 break;
776 if (!pnp_port_valid(dev, 0)) {
777 printk("invalid resources ?\n");
778 pnp_device_detach(dev);
779 break;
781 i365_base = pnp_port_start(dev, 0);
782 i82365_pnpdev = dev;
783 break;
786 #endif
788 if (!request_region(i365_base, 2, "i82365")) {
789 if (sockets == 0)
790 printk("port conflict at %#lx\n", i365_base);
791 return;
794 id = identify(i365_base, 0);
795 if ((id == IS_I82365DF) && (identify(i365_base, 1) != id)) {
796 for (i = 0; i < 4; i++) {
797 if (i == ignore) continue;
798 port = i365_base + ((i & 1) << 2) + ((i & 2) << 1);
799 sock = (i & 1) << 1;
800 if (identify(port, sock) == IS_I82365DF) {
801 add_socket(port, sock, IS_VLSI);
802 add_pcic(1, IS_VLSI);
805 } else {
806 for (i = 0; i < 8; i += 2) {
807 if (sockets && !extra_sockets && (i == 4))
808 break;
809 port = i365_base + 2*(i>>2);
810 sock = (i & 3);
811 id = identify(port, sock);
812 if (id < 0) continue;
814 for (j = ns = 0; j < 2; j++) {
815 /* Does the socket exist? */
816 if ((ignore == i+j) || (identify(port, sock+j) < 0))
817 continue;
818 /* Check for bad socket decode */
819 for (k = 0; k <= sockets; k++)
820 i365_set(k, I365_MEM(0)+I365_W_OFF, k);
821 for (k = 0; k <= sockets; k++)
822 if (i365_get(k, I365_MEM(0)+I365_W_OFF) != k)
823 break;
824 if (k <= sockets) break;
825 add_socket(port, sock+j, id); ns++;
827 if (ns != 0) add_pcic(ns, id);
832 /*====================================================================*/
834 static irqreturn_t pcic_interrupt(int irq, void *dev)
836 int i, j, csc;
837 u_int events, active;
838 u_long flags = 0;
839 int handled = 0;
841 pr_debug("pcic_interrupt(%d)\n", irq);
843 for (j = 0; j < 20; j++) {
844 active = 0;
845 for (i = 0; i < sockets; i++) {
846 if (socket[i].cs_irq != irq)
847 continue;
848 handled = 1;
849 ISA_LOCK(i, flags);
850 csc = i365_get(i, I365_CSC);
851 if ((csc == 0) || (i365_get(i, I365_IDENT) & 0x70)) {
852 ISA_UNLOCK(i, flags);
853 continue;
855 events = (csc & I365_CSC_DETECT) ? SS_DETECT : 0;
857 if (i365_get(i, I365_INTCTL) & I365_PC_IOCARD)
858 events |= (csc & I365_CSC_STSCHG) ? SS_STSCHG : 0;
859 else {
860 events |= (csc & I365_CSC_BVD1) ? SS_BATDEAD : 0;
861 events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0;
862 events |= (csc & I365_CSC_READY) ? SS_READY : 0;
864 ISA_UNLOCK(i, flags);
865 pr_debug("socket %d event 0x%02x\n", i, events);
867 if (events)
868 pcmcia_parse_events(&socket[i].socket, events);
870 active |= events;
872 if (!active) break;
874 if (j == 20)
875 printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n");
877 pr_debug("pcic_interrupt done\n");
878 return IRQ_RETVAL(handled);
879 } /* pcic_interrupt */
881 static void pcic_interrupt_wrapper(u_long data)
883 pcic_interrupt(0, NULL);
884 poll_timer.expires = jiffies + poll_interval;
885 add_timer(&poll_timer);
888 /*====================================================================*/
890 static int i365_get_status(u_short sock, u_int *value)
892 u_int status;
894 status = i365_get(sock, I365_STATUS);
895 *value = ((status & I365_CS_DETECT) == I365_CS_DETECT)
896 ? SS_DETECT : 0;
898 if (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD)
899 *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG;
900 else {
901 *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD;
902 *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN;
904 *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0;
905 *value |= (status & I365_CS_READY) ? SS_READY : 0;
906 *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0;
908 if (socket[sock].type == IS_VG469) {
909 status = i365_get(sock, VG469_VSENSE);
910 if (socket[sock].psock & 1) {
911 *value |= (status & VG469_VSENSE_B_VS1) ? 0 : SS_3VCARD;
912 *value |= (status & VG469_VSENSE_B_VS2) ? 0 : SS_XVCARD;
913 } else {
914 *value |= (status & VG469_VSENSE_A_VS1) ? 0 : SS_3VCARD;
915 *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD;
919 pr_debug("GetStatus(%d) = %#4.4x\n", sock, *value);
920 return 0;
921 } /* i365_get_status */
923 /*====================================================================*/
925 static int i365_set_socket(u_short sock, socket_state_t *state)
927 struct i82365_socket *t = &socket[sock];
928 u_char reg;
930 pr_debug("SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
931 "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
932 state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
934 /* First set global controller options */
935 set_bridge_state(sock);
937 /* IO card, RESET flag, IO interrupt */
938 reg = t->intr;
939 reg |= state->io_irq;
940 reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
941 reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
942 i365_set(sock, I365_INTCTL, reg);
944 reg = I365_PWR_NORESET;
945 if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO;
946 if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT;
948 if (t->flags & IS_CIRRUS) {
949 if (state->Vpp != 0) {
950 if (state->Vpp == 120)
951 reg |= I365_VPP1_12V;
952 else if (state->Vpp == state->Vcc)
953 reg |= I365_VPP1_5V;
954 else return -EINVAL;
956 if (state->Vcc != 0) {
957 reg |= I365_VCC_5V;
958 if (state->Vcc == 33)
959 i365_bset(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
960 else if (state->Vcc == 50)
961 i365_bclr(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
962 else return -EINVAL;
964 } else if (t->flags & IS_VG_PWR) {
965 if (state->Vpp != 0) {
966 if (state->Vpp == 120)
967 reg |= I365_VPP1_12V;
968 else if (state->Vpp == state->Vcc)
969 reg |= I365_VPP1_5V;
970 else return -EINVAL;
972 if (state->Vcc != 0) {
973 reg |= I365_VCC_5V;
974 if (state->Vcc == 33)
975 i365_bset(sock, VG469_VSELECT, VG469_VSEL_VCC);
976 else if (state->Vcc == 50)
977 i365_bclr(sock, VG469_VSELECT, VG469_VSEL_VCC);
978 else return -EINVAL;
980 } else if (t->flags & IS_DF_PWR) {
981 switch (state->Vcc) {
982 case 0: break;
983 case 33: reg |= I365_VCC_3V; break;
984 case 50: reg |= I365_VCC_5V; break;
985 default: return -EINVAL;
987 switch (state->Vpp) {
988 case 0: break;
989 case 50: reg |= I365_VPP1_5V; break;
990 case 120: reg |= I365_VPP1_12V; break;
991 default: return -EINVAL;
993 } else {
994 switch (state->Vcc) {
995 case 0: break;
996 case 50: reg |= I365_VCC_5V; break;
997 default: return -EINVAL;
999 switch (state->Vpp) {
1000 case 0: break;
1001 case 50: reg |= I365_VPP1_5V | I365_VPP2_5V; break;
1002 case 120: reg |= I365_VPP1_12V | I365_VPP2_12V; break;
1003 default: return -EINVAL;
1007 if (reg != i365_get(sock, I365_POWER))
1008 i365_set(sock, I365_POWER, reg);
1010 /* Chipset-specific functions */
1011 if (t->flags & IS_CIRRUS) {
1012 /* Speaker control */
1013 i365_bflip(sock, PD67_MISC_CTL_1, PD67_MC1_SPKR_ENA,
1014 state->flags & SS_SPKR_ENA);
1017 /* Card status change interrupt mask */
1018 reg = t->cs_irq << 4;
1019 if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT;
1020 if (state->flags & SS_IOCARD) {
1021 if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG;
1022 } else {
1023 if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1;
1024 if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2;
1025 if (state->csc_mask & SS_READY) reg |= I365_CSC_READY;
1027 i365_set(sock, I365_CSCINT, reg);
1028 i365_get(sock, I365_CSC);
1030 return 0;
1031 } /* i365_set_socket */
1033 /*====================================================================*/
1035 static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
1037 u_char map, ioctl;
1039 pr_debug("SetIOMap(%d, %d, %#2.2x, %d ns, "
1040 "%#llx-%#llx)\n", sock, io->map, io->flags, io->speed,
1041 (unsigned long long)io->start, (unsigned long long)io->stop);
1042 map = io->map;
1043 if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
1044 (io->stop < io->start)) return -EINVAL;
1045 /* Turn off the window before changing anything */
1046 if (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(map))
1047 i365_bclr(sock, I365_ADDRWIN, I365_ENA_IO(map));
1048 i365_set_pair(sock, I365_IO(map)+I365_W_START, io->start);
1049 i365_set_pair(sock, I365_IO(map)+I365_W_STOP, io->stop);
1050 ioctl = i365_get(sock, I365_IOCTL) & ~I365_IOCTL_MASK(map);
1051 if (io->speed) ioctl |= I365_IOCTL_WAIT(map);
1052 if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
1053 if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
1054 if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
1055 i365_set(sock, I365_IOCTL, ioctl);
1056 /* Turn on the window if necessary */
1057 if (io->flags & MAP_ACTIVE)
1058 i365_bset(sock, I365_ADDRWIN, I365_ENA_IO(map));
1059 return 0;
1060 } /* i365_set_io_map */
1062 /*====================================================================*/
1064 static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
1066 u_short base, i;
1067 u_char map;
1069 pr_debug("SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, "
1070 "%#x)\n", sock, mem->map, mem->flags, mem->speed,
1071 (unsigned long long)mem->res->start,
1072 (unsigned long long)mem->res->end, mem->card_start);
1074 map = mem->map;
1075 if ((map > 4) || (mem->card_start > 0x3ffffff) ||
1076 (mem->res->start > mem->res->end) || (mem->speed > 1000))
1077 return -EINVAL;
1078 if ((mem->res->start > 0xffffff) || (mem->res->end > 0xffffff))
1079 return -EINVAL;
1081 /* Turn off the window before changing anything */
1082 if (i365_get(sock, I365_ADDRWIN) & I365_ENA_MEM(map))
1083 i365_bclr(sock, I365_ADDRWIN, I365_ENA_MEM(map));
1085 base = I365_MEM(map);
1086 i = (mem->res->start >> 12) & 0x0fff;
1087 if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT;
1088 if (mem->flags & MAP_0WS) i |= I365_MEM_0WS;
1089 i365_set_pair(sock, base+I365_W_START, i);
1091 i = (mem->res->end >> 12) & 0x0fff;
1092 switch (to_cycles(mem->speed)) {
1093 case 0: break;
1094 case 1: i |= I365_MEM_WS0; break;
1095 case 2: i |= I365_MEM_WS1; break;
1096 default: i |= I365_MEM_WS1 | I365_MEM_WS0; break;
1098 i365_set_pair(sock, base+I365_W_STOP, i);
1100 i = ((mem->card_start - mem->res->start) >> 12) & 0x3fff;
1101 if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT;
1102 if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG;
1103 i365_set_pair(sock, base+I365_W_OFF, i);
1105 /* Turn on the window if necessary */
1106 if (mem->flags & MAP_ACTIVE)
1107 i365_bset(sock, I365_ADDRWIN, I365_ENA_MEM(map));
1108 return 0;
1109 } /* i365_set_mem_map */
1111 #if 0 /* driver model ordering issue */
1112 /*======================================================================
1114 Routines for accessing socket information and register dumps via
1115 /sys/class/pcmcia_socket/...
1117 ======================================================================*/
1119 static ssize_t show_info(struct class_device *class_dev, char *buf)
1121 struct i82365_socket *s = container_of(class_dev, struct i82365_socket, socket.dev);
1122 return sprintf(buf, "type: %s\npsock: %d\n",
1123 pcic[s->type].name, s->psock);
1126 static ssize_t show_exca(struct class_device *class_dev, char *buf)
1128 struct i82365_socket *s = container_of(class_dev, struct i82365_socket, socket.dev);
1129 unsigned short sock;
1130 int i;
1131 ssize_t ret = 0;
1132 unsigned long flags = 0;
1134 sock = s->number;
1136 ISA_LOCK(sock, flags);
1137 for (i = 0; i < 0x40; i += 4) {
1138 ret += sprintf(buf, "%02x %02x %02x %02x%s",
1139 i365_get(sock,i), i365_get(sock,i+1),
1140 i365_get(sock,i+2), i365_get(sock,i+3),
1141 ((i % 16) == 12) ? "\n" : " ");
1142 buf += ret;
1144 ISA_UNLOCK(sock, flags);
1146 return ret;
1149 static CLASS_DEVICE_ATTR(exca, S_IRUGO, show_exca, NULL);
1150 static CLASS_DEVICE_ATTR(info, S_IRUGO, show_info, NULL);
1151 #endif
1153 /*====================================================================*/
1155 /* this is horribly ugly... proper locking needs to be done here at
1156 * some time... */
1157 #define LOCKED(x) do { \
1158 int retval; \
1159 unsigned long flags; \
1160 spin_lock_irqsave(&isa_lock, flags); \
1161 retval = x; \
1162 spin_unlock_irqrestore(&isa_lock, flags); \
1163 return retval; \
1164 } while (0)
1167 static int pcic_get_status(struct pcmcia_socket *s, u_int *value)
1169 unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1171 if (socket[sock].flags & IS_ALIVE) {
1172 *value = 0;
1173 return -EINVAL;
1176 LOCKED(i365_get_status(sock, value));
1179 static int pcic_set_socket(struct pcmcia_socket *s, socket_state_t *state)
1181 unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1183 if (socket[sock].flags & IS_ALIVE)
1184 return -EINVAL;
1186 LOCKED(i365_set_socket(sock, state));
1189 static int pcic_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
1191 unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1192 if (socket[sock].flags & IS_ALIVE)
1193 return -EINVAL;
1195 LOCKED(i365_set_io_map(sock, io));
1198 static int pcic_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
1200 unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1201 if (socket[sock].flags & IS_ALIVE)
1202 return -EINVAL;
1204 LOCKED(i365_set_mem_map(sock, mem));
1207 static int pcic_init(struct pcmcia_socket *s)
1209 int i;
1210 struct resource res = { .start = 0, .end = 0x1000 };
1211 pccard_io_map io = { 0, 0, 0, 0, 1 };
1212 pccard_mem_map mem = { .res = &res, };
1214 for (i = 0; i < 2; i++) {
1215 io.map = i;
1216 pcic_set_io_map(s, &io);
1218 for (i = 0; i < 5; i++) {
1219 mem.map = i;
1220 pcic_set_mem_map(s, &mem);
1222 return 0;
1226 static struct pccard_operations pcic_operations = {
1227 .init = pcic_init,
1228 .get_status = pcic_get_status,
1229 .set_socket = pcic_set_socket,
1230 .set_io_map = pcic_set_io_map,
1231 .set_mem_map = pcic_set_mem_map,
1234 /*====================================================================*/
1236 static struct platform_driver i82365_driver = {
1237 .driver = {
1238 .name = "i82365",
1239 .owner = THIS_MODULE,
1243 static struct platform_device *i82365_device;
1245 static int __init init_i82365(void)
1247 int i, ret;
1249 ret = platform_driver_register(&i82365_driver);
1250 if (ret)
1251 goto err_out;
1253 i82365_device = platform_device_alloc("i82365", 0);
1254 if (i82365_device) {
1255 ret = platform_device_add(i82365_device);
1256 if (ret)
1257 platform_device_put(i82365_device);
1258 } else
1259 ret = -ENOMEM;
1261 if (ret)
1262 goto err_driver_unregister;
1264 printk(KERN_INFO "Intel ISA PCIC probe: ");
1265 sockets = 0;
1267 isa_probe();
1269 if (sockets == 0) {
1270 printk("not found.\n");
1271 ret = -ENODEV;
1272 goto err_dev_unregister;
1275 /* Set up interrupt handler(s) */
1276 if (grab_irq != 0)
1277 ret = request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
1279 if (ret)
1280 goto err_socket_release;
1282 /* register sockets with the pcmcia core */
1283 for (i = 0; i < sockets; i++) {
1284 socket[i].socket.dev.parent = &i82365_device->dev;
1285 socket[i].socket.ops = &pcic_operations;
1286 socket[i].socket.resource_ops = &pccard_nonstatic_ops;
1287 socket[i].socket.owner = THIS_MODULE;
1288 socket[i].number = i;
1289 ret = pcmcia_register_socket(&socket[i].socket);
1290 if (!ret)
1291 socket[i].flags |= IS_REGISTERED;
1293 #if 0 /* driver model ordering issue */
1294 class_device_create_file(&socket[i].socket.dev,
1295 &class_device_attr_info);
1296 class_device_create_file(&socket[i].socket.dev,
1297 &class_device_attr_exca);
1298 #endif
1301 /* Finally, schedule a polling interrupt */
1302 if (poll_interval != 0) {
1303 poll_timer.function = pcic_interrupt_wrapper;
1304 poll_timer.data = 0;
1305 init_timer(&poll_timer);
1306 poll_timer.expires = jiffies + poll_interval;
1307 add_timer(&poll_timer);
1310 return 0;
1311 err_socket_release:
1312 for (i = 0; i < sockets; i++) {
1313 /* Turn off all interrupt sources! */
1314 i365_set(i, I365_CSCINT, 0);
1315 release_region(socket[i].ioaddr, 2);
1317 err_dev_unregister:
1318 platform_device_unregister(i82365_device);
1319 release_region(i365_base, 2);
1320 #ifdef CONFIG_PNP
1321 if (i82365_pnpdev)
1322 pnp_disable_dev(i82365_pnpdev);
1323 #endif
1324 err_driver_unregister:
1325 platform_driver_unregister(&i82365_driver);
1326 err_out:
1327 return ret;
1328 } /* init_i82365 */
1330 static void __exit exit_i82365(void)
1332 int i;
1334 for (i = 0; i < sockets; i++) {
1335 if (socket[i].flags & IS_REGISTERED)
1336 pcmcia_unregister_socket(&socket[i].socket);
1338 platform_device_unregister(i82365_device);
1339 if (poll_interval != 0)
1340 del_timer_sync(&poll_timer);
1341 if (grab_irq != 0)
1342 free_irq(cs_irq, pcic_interrupt);
1343 for (i = 0; i < sockets; i++) {
1344 /* Turn off all interrupt sources! */
1345 i365_set(i, I365_CSCINT, 0);
1346 release_region(socket[i].ioaddr, 2);
1348 release_region(i365_base, 2);
1349 #ifdef CONFIG_PNP
1350 if (i82365_pnpdev)
1351 pnp_disable_dev(i82365_pnpdev);
1352 #endif
1353 platform_driver_unregister(&i82365_driver);
1354 } /* exit_i82365 */
1356 module_init(init_i82365);
1357 module_exit(exit_i82365);
1358 MODULE_LICENSE("Dual MPL/GPL");
1359 /*====================================================================*/