Automerge with /usr/src/ntfs-2.6.git.
[linux-2.6] / drivers / pcmcia / i82365.c
1 /*======================================================================
2
3     Device driver for Intel 82365 and compatible PC Card controllers.
4
5     i82365.c 1.265 1999/11/10 18:36:21
6
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/
11
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.
16
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.
20
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.
31     
32 ======================================================================*/
33
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/init.h>
37 #include <linux/config.h>
38 #include <linux/types.h>
39 #include <linux/fcntl.h>
40 #include <linux/string.h>
41 #include <linux/kernel.h>
42 #include <linux/errno.h>
43 #include <linux/timer.h>
44 #include <linux/sched.h>
45 #include <linux/slab.h>
46 #include <linux/ioport.h>
47 #include <linux/delay.h>
48 #include <linux/workqueue.h>
49 #include <linux/interrupt.h>
50 #include <linux/device.h>
51 #include <linux/bitops.h>
52 #include <asm/irq.h>
53 #include <asm/io.h>
54 #include <asm/system.h>
55
56 #include <pcmcia/version.h>
57 #include <pcmcia/cs_types.h>
58 #include <pcmcia/ss.h>
59 #include <pcmcia/cs.h>
60
61 #include <linux/isapnp.h>
62
63 /* ISA-bus controllers */
64 #include "i82365.h"
65 #include "cirrus.h"
66 #include "vg468.h"
67 #include "ricoh.h"
68
69 #ifdef DEBUG
70 static const char version[] =
71 "i82365.c 1.265 1999/11/10 18:36:21 (David Hinds)";
72
73 static int pc_debug;
74
75 module_param(pc_debug, int, 0644);
76
77 #define debug(lvl, fmt, arg...) do {                            \
78         if (pc_debug > (lvl))                                   \
79                 printk(KERN_DEBUG "i82365: " fmt , ## arg);     \
80 } while (0)
81 #else
82 #define debug(lvl, fmt, arg...) do { } while (0)
83 #endif
84
85 static irqreturn_t i365_count_irq(int, void *, struct pt_regs *);
86 static inline int _check_irq(int irq, int flags)
87 {
88     if (request_irq(irq, i365_count_irq, flags, "x", i365_count_irq) != 0)
89         return -1;
90     free_irq(irq, i365_count_irq);
91     return 0;
92 }
93
94 /*====================================================================*/
95
96 /* Parameters that can be set with 'insmod' */
97
98 /* Default base address for i82365sl and other ISA chips */
99 static unsigned long i365_base = 0x3e0;
100 /* Should we probe at 0x3e2 for an extra ISA controller? */
101 static int extra_sockets = 0;
102 /* Specify a socket number to ignore */
103 static int ignore = -1;
104 /* Bit map or list of interrupts to choose from */
105 static u_int irq_mask = 0xffff;
106 static int irq_list[16];
107 static int irq_list_count;
108 /* The card status change interrupt -- 0 means autoselect */
109 static int cs_irq = 0;
110
111 /* Probe for safe interrupts? */
112 static int do_scan = 1;
113 /* Poll status interval -- 0 means default to interrupt */
114 static int poll_interval = 0;
115 /* External clock time, in nanoseconds.  120 ns = 8.33 MHz */
116 static int cycle_time = 120;
117
118 /* Cirrus options */
119 static int has_dma = -1;
120 static int has_led = -1;
121 static int has_ring = -1;
122 static int dynamic_mode = 0;
123 static int freq_bypass = -1;
124 static int setup_time = -1;
125 static int cmd_time = -1;
126 static int recov_time = -1;
127
128 /* Vadem options */
129 static int async_clock = -1;
130 static int cable_mode = -1;
131 static int wakeup = 0;
132
133 module_param(i365_base, ulong, 0444);
134 module_param(ignore, int, 0444);
135 module_param(extra_sockets, int, 0444);
136 module_param(irq_mask, int, 0444);
137 module_param_array(irq_list, int, &irq_list_count, 0444);
138 module_param(cs_irq, int, 0444);
139 module_param(async_clock, int, 0444);
140 module_param(cable_mode, int, 0444);
141 module_param(wakeup, int, 0444);
142
143 module_param(do_scan, int, 0444);
144 module_param(poll_interval, int, 0444);
145 module_param(cycle_time, int, 0444);
146 module_param(has_dma, int, 0444);
147 module_param(has_led, int, 0444);
148 module_param(has_ring, int, 0444);
149 module_param(dynamic_mode, int, 0444);
150 module_param(freq_bypass, int, 0444);
151 module_param(setup_time, int, 0444);
152 module_param(cmd_time, int, 0444);
153 module_param(recov_time, int, 0444);
154
155 /*====================================================================*/
156
157 typedef struct cirrus_state_t {
158     u_char              misc1, misc2;
159     u_char              timer[6];
160 } cirrus_state_t;
161
162 typedef struct vg46x_state_t {
163     u_char              ctl, ema;
164 } vg46x_state_t;
165
166 struct i82365_socket {
167     u_short             type, flags;
168     struct pcmcia_socket        socket;
169     unsigned int        number;
170     kio_addr_t          ioaddr;
171     u_short             psock;
172     u_char              cs_irq, intr;
173     union {
174         cirrus_state_t          cirrus;
175         vg46x_state_t           vg46x;
176     } state;
177 };
178
179 /* Where we keep track of our sockets... */
180 static int sockets = 0;
181 static struct i82365_socket socket[8] = {
182     { 0, }, /* ... */
183 };
184
185 /* Default ISA interrupt mask */
186 #define I365_MASK       0xdeb8  /* irq 15,14,12,11,10,9,7,5,4,3 */
187
188 static int grab_irq;
189 static DEFINE_SPINLOCK(isa_lock);
190 #define ISA_LOCK(n, f) spin_lock_irqsave(&isa_lock, f)
191 #define ISA_UNLOCK(n, f) spin_unlock_irqrestore(&isa_lock, f)
192
193 static struct timer_list poll_timer;
194
195 /*====================================================================*/
196
197 /* These definitions must match the pcic table! */
198 typedef enum pcic_id {
199     IS_I82365A, IS_I82365B, IS_I82365DF,
200     IS_IBM, IS_RF5Cx96, IS_VLSI, IS_VG468, IS_VG469,
201     IS_PD6710, IS_PD672X, IS_VT83C469,
202 } pcic_id;
203
204 /* Flags for classifying groups of controllers */
205 #define IS_VADEM        0x0001
206 #define IS_CIRRUS       0x0002
207 #define IS_VIA          0x0010
208 #define IS_UNKNOWN      0x0400
209 #define IS_VG_PWR       0x0800
210 #define IS_DF_PWR       0x1000
211 #define IS_REGISTERED   0x2000
212 #define IS_ALIVE        0x8000
213
214 typedef struct pcic_t {
215     char                *name;
216     u_short             flags;
217 } pcic_t;
218
219 static pcic_t pcic[] = {
220     { "Intel i82365sl A step", 0 },
221     { "Intel i82365sl B step", 0 },
222     { "Intel i82365sl DF", IS_DF_PWR },
223     { "IBM Clone", 0 },
224     { "Ricoh RF5C296/396", 0 },
225     { "VLSI 82C146", 0 },
226     { "Vadem VG-468", IS_VADEM },
227     { "Vadem VG-469", IS_VADEM|IS_VG_PWR },
228     { "Cirrus PD6710", IS_CIRRUS },
229     { "Cirrus PD672x", IS_CIRRUS },
230     { "VIA VT83C469", IS_CIRRUS|IS_VIA },
231 };
232
233 #define PCIC_COUNT      (sizeof(pcic)/sizeof(pcic_t))
234
235 /*====================================================================*/
236
237 static DEFINE_SPINLOCK(bus_lock);
238
239 static u_char i365_get(u_short sock, u_short reg)
240 {
241     unsigned long flags;
242     spin_lock_irqsave(&bus_lock,flags);
243     {
244         kio_addr_t port = socket[sock].ioaddr;
245         u_char val;
246         reg = I365_REG(socket[sock].psock, reg);
247         outb(reg, port); val = inb(port+1);
248         spin_unlock_irqrestore(&bus_lock,flags);
249         return val;
250     }
251 }
252
253 static void i365_set(u_short sock, u_short reg, u_char data)
254 {
255     unsigned long flags;
256     spin_lock_irqsave(&bus_lock,flags);
257     {
258         kio_addr_t port = socket[sock].ioaddr;
259         u_char val = I365_REG(socket[sock].psock, reg);
260         outb(val, port); outb(data, port+1);
261         spin_unlock_irqrestore(&bus_lock,flags);
262     }
263 }
264
265 static void i365_bset(u_short sock, u_short reg, u_char mask)
266 {
267     u_char d = i365_get(sock, reg);
268     d |= mask;
269     i365_set(sock, reg, d);
270 }
271
272 static void i365_bclr(u_short sock, u_short reg, u_char mask)
273 {
274     u_char d = i365_get(sock, reg);
275     d &= ~mask;
276     i365_set(sock, reg, d);
277 }
278
279 static void i365_bflip(u_short sock, u_short reg, u_char mask, int b)
280 {
281     u_char d = i365_get(sock, reg);
282     if (b)
283         d |= mask;
284     else
285         d &= ~mask;
286     i365_set(sock, reg, d);
287 }
288
289 static u_short i365_get_pair(u_short sock, u_short reg)
290 {
291     u_short a, b;
292     a = i365_get(sock, reg);
293     b = i365_get(sock, reg+1);
294     return (a + (b<<8));
295 }
296
297 static void i365_set_pair(u_short sock, u_short reg, u_short data)
298 {
299     i365_set(sock, reg, data & 0xff);
300     i365_set(sock, reg+1, data >> 8);
301 }
302
303 /*======================================================================
304
305     Code to save and restore global state information for Cirrus
306     PD67xx controllers, and to set and report global configuration
307     options.
308
309     The VIA controllers also use these routines, as they are mostly
310     Cirrus lookalikes, without the timing registers.
311     
312 ======================================================================*/
313
314 #define flip(v,b,f) (v = ((f)<0) ? v : ((f) ? ((v)|(b)) : ((v)&(~b))))
315
316 static void cirrus_get_state(u_short s)
317 {
318     int i;
319     cirrus_state_t *p = &socket[s].state.cirrus;
320     p->misc1 = i365_get(s, PD67_MISC_CTL_1);
321     p->misc1 &= (PD67_MC1_MEDIA_ENA | PD67_MC1_INPACK_ENA);
322     p->misc2 = i365_get(s, PD67_MISC_CTL_2);
323     for (i = 0; i < 6; i++)
324         p->timer[i] = i365_get(s, PD67_TIME_SETUP(0)+i);
325 }
326
327 static void cirrus_set_state(u_short s)
328 {
329     int i;
330     u_char misc;
331     cirrus_state_t *p = &socket[s].state.cirrus;
332
333     misc = i365_get(s, PD67_MISC_CTL_2);
334     i365_set(s, PD67_MISC_CTL_2, p->misc2);
335     if (misc & PD67_MC2_SUSPEND) mdelay(50);
336     misc = i365_get(s, PD67_MISC_CTL_1);
337     misc &= ~(PD67_MC1_MEDIA_ENA | PD67_MC1_INPACK_ENA);
338     i365_set(s, PD67_MISC_CTL_1, misc | p->misc1);
339     for (i = 0; i < 6; i++)
340         i365_set(s, PD67_TIME_SETUP(0)+i, p->timer[i]);
341 }
342
343 static u_int __init cirrus_set_opts(u_short s, char *buf)
344 {
345     struct i82365_socket *t = &socket[s];
346     cirrus_state_t *p = &socket[s].state.cirrus;
347     u_int mask = 0xffff;
348
349     if (has_ring == -1) has_ring = 1;
350     flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring);
351     flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode);
352     flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
353     if (p->misc2 & PD67_MC2_IRQ15_RI)
354         strcat(buf, " [ring]");
355     if (p->misc2 & PD67_MC2_DYNAMIC_MODE)
356         strcat(buf, " [dyn mode]");
357     if (p->misc2 & PD67_MC2_FREQ_BYPASS)
358         strcat(buf, " [freq bypass]");
359     if (p->misc1 & PD67_MC1_INPACK_ENA)
360         strcat(buf, " [inpack]");
361     if (p->misc2 & PD67_MC2_IRQ15_RI)
362         mask &= ~0x8000;
363     if (has_led > 0) {
364         strcat(buf, " [led]");
365         mask &= ~0x1000;
366     }
367     if (has_dma > 0) {
368         strcat(buf, " [dma]");
369         mask &= ~0x0600;
370     }
371     if (!(t->flags & IS_VIA)) {
372         if (setup_time >= 0)
373             p->timer[0] = p->timer[3] = setup_time;
374         if (cmd_time > 0) {
375             p->timer[1] = cmd_time;
376             p->timer[4] = cmd_time*2+4;
377         }
378         if (p->timer[1] == 0) {
379             p->timer[1] = 6; p->timer[4] = 16;
380             if (p->timer[0] == 0)
381                 p->timer[0] = p->timer[3] = 1;
382         }
383         if (recov_time >= 0)
384             p->timer[2] = p->timer[5] = recov_time;
385         buf += strlen(buf);
386         sprintf(buf, " [%d/%d/%d] [%d/%d/%d]", p->timer[0], p->timer[1],
387                 p->timer[2], p->timer[3], p->timer[4], p->timer[5]);
388     }
389     return mask;
390 }
391
392 /*======================================================================
393
394     Code to save and restore global state information for Vadem VG468
395     and VG469 controllers, and to set and report global configuration
396     options.
397     
398 ======================================================================*/
399
400 static void vg46x_get_state(u_short s)
401 {
402     vg46x_state_t *p = &socket[s].state.vg46x;
403     p->ctl = i365_get(s, VG468_CTL);
404     if (socket[s].type == IS_VG469)
405         p->ema = i365_get(s, VG469_EXT_MODE);
406 }
407
408 static void vg46x_set_state(u_short s)
409 {
410     vg46x_state_t *p = &socket[s].state.vg46x;
411     i365_set(s, VG468_CTL, p->ctl);
412     if (socket[s].type == IS_VG469)
413         i365_set(s, VG469_EXT_MODE, p->ema);
414 }
415
416 static u_int __init vg46x_set_opts(u_short s, char *buf)
417 {
418     vg46x_state_t *p = &socket[s].state.vg46x;
419     
420     flip(p->ctl, VG468_CTL_ASYNC, async_clock);
421     flip(p->ema, VG469_MODE_CABLE, cable_mode);
422     if (p->ctl & VG468_CTL_ASYNC)
423         strcat(buf, " [async]");
424     if (p->ctl & VG468_CTL_INPACK)
425         strcat(buf, " [inpack]");
426     if (socket[s].type == IS_VG469) {
427         u_char vsel = i365_get(s, VG469_VSELECT);
428         if (vsel & VG469_VSEL_EXT_STAT) {
429             strcat(buf, " [ext mode]");
430             if (vsel & VG469_VSEL_EXT_BUS)
431                 strcat(buf, " [isa buf]");
432         }
433         if (p->ema & VG469_MODE_CABLE)
434             strcat(buf, " [cable]");
435         if (p->ema & VG469_MODE_COMPAT)
436             strcat(buf, " [c step]");
437     }
438     return 0xffff;
439 }
440
441 /*======================================================================
442
443     Generic routines to get and set controller options
444     
445 ======================================================================*/
446
447 static void get_bridge_state(u_short s)
448 {
449     struct i82365_socket *t = &socket[s];
450     if (t->flags & IS_CIRRUS)
451         cirrus_get_state(s);
452     else if (t->flags & IS_VADEM)
453         vg46x_get_state(s);
454 }
455
456 static void set_bridge_state(u_short s)
457 {
458     struct i82365_socket *t = &socket[s];
459     if (t->flags & IS_CIRRUS)
460         cirrus_set_state(s);
461     else {
462         i365_set(s, I365_GBLCTL, 0x00);
463         i365_set(s, I365_GENCTL, 0x00);
464     }
465     i365_bflip(s, I365_INTCTL, I365_INTR_ENA, t->intr);
466     if (t->flags & IS_VADEM)
467         vg46x_set_state(s);
468 }
469
470 static u_int __init set_bridge_opts(u_short s, u_short ns)
471 {
472     u_short i;
473     u_int m = 0xffff;
474     char buf[128];
475
476     for (i = s; i < s+ns; i++) {
477         if (socket[i].flags & IS_ALIVE) {
478             printk(KERN_INFO "    host opts [%d]: already alive!\n", i);
479             continue;
480         }
481         buf[0] = '\0';
482         get_bridge_state(i);
483         if (socket[i].flags & IS_CIRRUS)
484             m = cirrus_set_opts(i, buf);
485         else if (socket[i].flags & IS_VADEM)
486             m = vg46x_set_opts(i, buf);
487         set_bridge_state(i);
488         printk(KERN_INFO "    host opts [%d]:%s\n", i,
489                (*buf) ? buf : " none");
490     }
491     return m;
492 }
493
494 /*======================================================================
495
496     Interrupt testing code, for ISA and PCI interrupts
497     
498 ======================================================================*/
499
500 static volatile u_int irq_hits;
501 static u_short irq_sock;
502
503 static irqreturn_t i365_count_irq(int irq, void *dev, struct pt_regs *regs)
504 {
505     i365_get(irq_sock, I365_CSC);
506     irq_hits++;
507     debug(2, "-> hit on irq %d\n", irq);
508     return IRQ_HANDLED;
509 }
510
511 static u_int __init test_irq(u_short sock, int irq)
512 {
513     debug(2, "  testing ISA irq %d\n", irq);
514     if (request_irq(irq, i365_count_irq, 0, "scan", i365_count_irq) != 0)
515         return 1;
516     irq_hits = 0; irq_sock = sock;
517     msleep(10);
518     if (irq_hits) {
519         free_irq(irq, i365_count_irq);
520         debug(2, "    spurious hit!\n");
521         return 1;
522     }
523
524     /* Generate one interrupt */
525     i365_set(sock, I365_CSCINT, I365_CSC_DETECT | (irq << 4));
526     i365_bset(sock, I365_GENCTL, I365_CTL_SW_IRQ);
527     udelay(1000);
528
529     free_irq(irq, i365_count_irq);
530
531     /* mask all interrupts */
532     i365_set(sock, I365_CSCINT, 0);
533     debug(2, "    hits = %d\n", irq_hits);
534     
535     return (irq_hits != 1);
536 }
537
538 static u_int __init isa_scan(u_short sock, u_int mask0)
539 {
540     u_int mask1 = 0;
541     int i;
542
543 #ifdef __alpha__
544 #define PIC 0x4d0
545     /* Don't probe level-triggered interrupts -- reserved for PCI */
546     mask0 &= ~(inb(PIC) | (inb(PIC+1) << 8));
547 #endif
548     
549     if (do_scan) {
550         set_bridge_state(sock);
551         i365_set(sock, I365_CSCINT, 0);
552         for (i = 0; i < 16; i++)
553             if ((mask0 & (1 << i)) && (test_irq(sock, i) == 0))
554                 mask1 |= (1 << i);
555         for (i = 0; i < 16; i++)
556             if ((mask1 & (1 << i)) && (test_irq(sock, i) != 0))
557                 mask1 ^= (1 << i);
558     }
559     
560     printk(KERN_INFO "    ISA irqs (");
561     if (mask1) {
562         printk("scanned");
563     } else {
564         /* Fallback: just find interrupts that aren't in use */
565         for (i = 0; i < 16; i++)
566             if ((mask0 & (1 << i)) && (_check_irq(i, 0) == 0))
567                 mask1 |= (1 << i);
568         printk("default");
569         /* If scan failed, default to polled status */
570         if (!cs_irq && (poll_interval == 0)) poll_interval = HZ;
571     }
572     printk(") = ");
573     
574     for (i = 0; i < 16; i++)
575         if (mask1 & (1<<i))
576             printk("%s%d", ((mask1 & ((1<<i)-1)) ? "," : ""), i);
577     if (mask1 == 0) printk("none!");
578     
579     return mask1;
580 }
581
582 /*====================================================================*/
583
584 /* Time conversion functions */
585
586 static int to_cycles(int ns)
587 {
588     return ns/cycle_time;
589 }
590
591 /*====================================================================*/
592
593 static int __init identify(kio_addr_t port, u_short sock)
594 {
595     u_char val;
596     int type = -1;
597
598     /* Use the next free entry in the socket table */
599     socket[sockets].ioaddr = port;
600     socket[sockets].psock = sock;
601     
602     /* Wake up a sleepy Cirrus controller */
603     if (wakeup) {
604         i365_bclr(sockets, PD67_MISC_CTL_2, PD67_MC2_SUSPEND);
605         /* Pause at least 50 ms */
606         mdelay(50);
607     }
608     
609     if ((val = i365_get(sockets, I365_IDENT)) & 0x70)
610         return -1;
611     switch (val) {
612     case 0x82:
613         type = IS_I82365A; break;
614     case 0x83:
615         type = IS_I82365B; break;
616     case 0x84:
617         type = IS_I82365DF; break;
618     case 0x88: case 0x89: case 0x8a:
619         type = IS_IBM; break;
620     }
621     
622     /* Check for Vadem VG-468 chips */
623     outb(0x0e, port);
624     outb(0x37, port);
625     i365_bset(sockets, VG468_MISC, VG468_MISC_VADEMREV);
626     val = i365_get(sockets, I365_IDENT);
627     if (val & I365_IDENT_VADEM) {
628         i365_bclr(sockets, VG468_MISC, VG468_MISC_VADEMREV);
629         type = ((val & 7) >= 4) ? IS_VG469 : IS_VG468;
630     }
631
632     /* Check for Ricoh chips */
633     val = i365_get(sockets, RF5C_CHIP_ID);
634     if ((val == RF5C_CHIP_RF5C296) || (val == RF5C_CHIP_RF5C396))
635         type = IS_RF5Cx96;
636     
637     /* Check for Cirrus CL-PD67xx chips */
638     i365_set(sockets, PD67_CHIP_INFO, 0);
639     val = i365_get(sockets, PD67_CHIP_INFO);
640     if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
641         val = i365_get(sockets, PD67_CHIP_INFO);
642         if ((val & PD67_INFO_CHIP_ID) == 0) {
643             type = (val & PD67_INFO_SLOTS) ? IS_PD672X : IS_PD6710;
644             i365_set(sockets, PD67_EXT_INDEX, 0xe5);
645             if (i365_get(sockets, PD67_EXT_INDEX) != 0xe5)
646                 type = IS_VT83C469;
647         }
648     }
649     return type;
650 } /* identify */
651
652 /*======================================================================
653
654     See if a card is present, powered up, in IO mode, and already
655     bound to a (non PC Card) Linux driver.  We leave these alone.
656
657     We make an exception for cards that seem to be serial devices.
658     
659 ======================================================================*/
660
661 static int __init is_alive(u_short sock)
662 {
663     u_char stat;
664     kio_addr_t start, stop;
665     
666     stat = i365_get(sock, I365_STATUS);
667     start = i365_get_pair(sock, I365_IO(0)+I365_W_START);
668     stop = i365_get_pair(sock, I365_IO(0)+I365_W_STOP);
669     if ((stat & I365_CS_DETECT) && (stat & I365_CS_POWERON) &&
670         (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD) &&
671         (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(0)) &&
672         ((start & 0xfeef) != 0x02e8)) {
673         if (!request_region(start, stop-start+1, "i82365"))
674             return 1;
675         release_region(start, stop-start+1);
676     }
677
678     return 0;
679 }
680
681 /*====================================================================*/
682
683 static void __init add_socket(kio_addr_t port, int psock, int type)
684 {
685     socket[sockets].ioaddr = port;
686     socket[sockets].psock = psock;
687     socket[sockets].type = type;
688     socket[sockets].flags = pcic[type].flags;
689     if (is_alive(sockets))
690         socket[sockets].flags |= IS_ALIVE;
691     sockets++;
692 }
693
694 static void __init add_pcic(int ns, int type)
695 {
696     u_int mask = 0, i, base;
697     int isa_irq = 0;
698     struct i82365_socket *t = &socket[sockets-ns];
699
700     base = sockets-ns;
701     if (t->ioaddr > 0) {
702         if (!request_region(t->ioaddr, 2, "i82365")) {
703             printk(KERN_ERR "i82365: IO region conflict at %#lx, not available\n",
704                         t->ioaddr);
705             return;
706         }
707     }
708     
709     if (base == 0) printk("\n");
710     printk(KERN_INFO "  %s", pcic[type].name);
711     printk(" ISA-to-PCMCIA at port %#lx ofs 0x%02x",
712                t->ioaddr, t->psock*0x40);
713     printk(", %d socket%s\n", ns, ((ns > 1) ? "s" : ""));
714
715     /* Set host options, build basic interrupt mask */
716     if (irq_list_count == 0)
717         mask = irq_mask;
718     else
719         for (i = mask = 0; i < irq_list_count; i++)
720             mask |= (1<<irq_list[i]);
721     mask &= I365_MASK & set_bridge_opts(base, ns);
722     /* Scan for ISA interrupts */
723     mask = isa_scan(base, mask);
724         
725     /* Poll if only two interrupts available */
726     if (!poll_interval) {
727         u_int tmp = (mask & 0xff20);
728         tmp = tmp & (tmp-1);
729         if ((tmp & (tmp-1)) == 0)
730             poll_interval = HZ;
731     }
732     /* Only try an ISA cs_irq if this is the first controller */
733     if (!grab_irq && (cs_irq || !poll_interval)) {
734         /* Avoid irq 12 unless it is explicitly requested */
735         u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
736         for (cs_irq = 15; cs_irq > 0; cs_irq--)
737             if ((cs_mask & (1 << cs_irq)) &&
738                 (_check_irq(cs_irq, 0) == 0))
739                 break;
740         if (cs_irq) {
741             grab_irq = 1;
742             isa_irq = cs_irq;
743             printk(" status change on irq %d\n", cs_irq);
744         }
745     }
746     
747     if (!isa_irq) {
748         if (poll_interval == 0)
749             poll_interval = HZ;
750         printk(" polling interval = %d ms\n",
751                poll_interval * 1000 / HZ);
752         
753     }
754     
755     /* Update socket interrupt information, capabilities */
756     for (i = 0; i < ns; i++) {
757         t[i].socket.features |= SS_CAP_PCCARD;
758         t[i].socket.map_size = 0x1000;
759         t[i].socket.irq_mask = mask;
760         t[i].cs_irq = isa_irq;
761     }
762
763 } /* add_pcic */
764
765 /*====================================================================*/
766
767 #ifdef CONFIG_PNP
768 static struct isapnp_device_id id_table[] __initdata = {
769         {       ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
770                 ISAPNP_FUNCTION(0x0e00), (unsigned long) "Intel 82365-Compatible" },
771         {       ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
772                 ISAPNP_FUNCTION(0x0e01), (unsigned long) "Cirrus Logic CL-PD6720" },
773         {       ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
774                 ISAPNP_FUNCTION(0x0e02), (unsigned long) "VLSI VL82C146" },
775         {       0 }
776 };
777 MODULE_DEVICE_TABLE(isapnp, id_table);
778
779 static struct pnp_dev *i82365_pnpdev;
780 #endif
781
782 static void __init isa_probe(void)
783 {
784     int i, j, sock, k, ns, id;
785     kio_addr_t port;
786 #ifdef CONFIG_PNP
787     struct isapnp_device_id *devid;
788     struct pnp_dev *dev;
789
790     for (devid = id_table; devid->vendor; devid++) {
791         if ((dev = pnp_find_dev(NULL, devid->vendor, devid->function, NULL))) {
792         
793             if (pnp_device_attach(dev) < 0)
794                 continue;
795
796             if (pnp_activate_dev(dev) < 0) {
797                 printk("activate failed\n");
798                 pnp_device_detach(dev);
799                 break;
800             }
801
802             if (!pnp_port_valid(dev, 0)) {
803                 printk("invalid resources ?\n");
804                 pnp_device_detach(dev);
805                 break;
806             }
807             i365_base = pnp_port_start(dev, 0);
808             i82365_pnpdev = dev;
809             break;
810         }
811     }
812 #endif
813
814     if (!request_region(i365_base, 2, "i82365")) {
815         if (sockets == 0)
816             printk("port conflict at %#lx\n", i365_base);
817         return;
818     }
819
820     id = identify(i365_base, 0);
821     if ((id == IS_I82365DF) && (identify(i365_base, 1) != id)) {
822         for (i = 0; i < 4; i++) {
823             if (i == ignore) continue;
824             port = i365_base + ((i & 1) << 2) + ((i & 2) << 1);
825             sock = (i & 1) << 1;
826             if (identify(port, sock) == IS_I82365DF) {
827                 add_socket(port, sock, IS_VLSI);
828                 add_pcic(1, IS_VLSI);
829             }
830         }
831     } else {
832         for (i = 0; i < 8; i += 2) {
833             if (sockets && !extra_sockets && (i == 4))
834                 break;
835             port = i365_base + 2*(i>>2);
836             sock = (i & 3);
837             id = identify(port, sock);
838             if (id < 0) continue;
839
840             for (j = ns = 0; j < 2; j++) {
841                 /* Does the socket exist? */
842                 if ((ignore == i+j) || (identify(port, sock+j) < 0))
843                     continue;
844                 /* Check for bad socket decode */
845                 for (k = 0; k <= sockets; k++)
846                     i365_set(k, I365_MEM(0)+I365_W_OFF, k);
847                 for (k = 0; k <= sockets; k++)
848                     if (i365_get(k, I365_MEM(0)+I365_W_OFF) != k)
849                         break;
850                 if (k <= sockets) break;
851                 add_socket(port, sock+j, id); ns++;
852             }
853             if (ns != 0) add_pcic(ns, id);
854         }
855     }
856 }
857
858 /*====================================================================*/
859
860 static irqreturn_t pcic_interrupt(int irq, void *dev,
861                                     struct pt_regs *regs)
862 {
863     int i, j, csc;
864     u_int events, active;
865     u_long flags = 0;
866     int handled = 0;
867
868     debug(4, "pcic_interrupt(%d)\n", irq);
869
870     for (j = 0; j < 20; j++) {
871         active = 0;
872         for (i = 0; i < sockets; i++) {
873             if (socket[i].cs_irq != irq)
874                 continue;
875             handled = 1;
876             ISA_LOCK(i, flags);
877             csc = i365_get(i, I365_CSC);
878             if ((csc == 0) || (i365_get(i, I365_IDENT) & 0x70)) {
879                 ISA_UNLOCK(i, flags);
880                 continue;
881             }
882             events = (csc & I365_CSC_DETECT) ? SS_DETECT : 0;
883
884             if (i365_get(i, I365_INTCTL) & I365_PC_IOCARD)
885                 events |= (csc & I365_CSC_STSCHG) ? SS_STSCHG : 0;
886             else {
887                 events |= (csc & I365_CSC_BVD1) ? SS_BATDEAD : 0;
888                 events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0;
889                 events |= (csc & I365_CSC_READY) ? SS_READY : 0;
890             }
891             ISA_UNLOCK(i, flags);
892             debug(2, "socket %d event 0x%02x\n", i, events);
893
894             if (events)
895                 pcmcia_parse_events(&socket[i].socket, events);
896
897             active |= events;
898         }
899         if (!active) break;
900     }
901     if (j == 20)
902         printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n");
903
904     debug(4, "interrupt done\n");
905     return IRQ_RETVAL(handled);
906 } /* pcic_interrupt */
907
908 static void pcic_interrupt_wrapper(u_long data)
909 {
910     pcic_interrupt(0, NULL, NULL);
911     poll_timer.expires = jiffies + poll_interval;
912     add_timer(&poll_timer);
913 }
914
915 /*====================================================================*/
916
917 static int i365_get_status(u_short sock, u_int *value)
918 {
919     u_int status;
920     
921     status = i365_get(sock, I365_STATUS);
922     *value = ((status & I365_CS_DETECT) == I365_CS_DETECT)
923         ? SS_DETECT : 0;
924         
925     if (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD)
926         *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG;
927     else {
928         *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD;
929         *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN;
930     }
931     *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0;
932     *value |= (status & I365_CS_READY) ? SS_READY : 0;
933     *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0;
934
935     if (socket[sock].type == IS_VG469) {
936         status = i365_get(sock, VG469_VSENSE);
937         if (socket[sock].psock & 1) {
938             *value |= (status & VG469_VSENSE_B_VS1) ? 0 : SS_3VCARD;
939             *value |= (status & VG469_VSENSE_B_VS2) ? 0 : SS_XVCARD;
940         } else {
941             *value |= (status & VG469_VSENSE_A_VS1) ? 0 : SS_3VCARD;
942             *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD;
943         }
944     }
945     
946     debug(1, "GetStatus(%d) = %#4.4x\n", sock, *value);
947     return 0;
948 } /* i365_get_status */
949
950 /*====================================================================*/
951
952 static int i365_get_socket(u_short sock, socket_state_t *state)
953 {
954     struct i82365_socket *t = &socket[sock];
955     u_char reg, vcc, vpp;
956     
957     reg = i365_get(sock, I365_POWER);
958     state->flags = (reg & I365_PWR_AUTO) ? SS_PWR_AUTO : 0;
959     state->flags |= (reg & I365_PWR_OUT) ? SS_OUTPUT_ENA : 0;
960     vcc = reg & I365_VCC_MASK; vpp = reg & I365_VPP1_MASK;
961     state->Vcc = state->Vpp = 0;
962     if (t->flags & IS_CIRRUS) {
963         if (i365_get(sock, PD67_MISC_CTL_1) & PD67_MC1_VCC_3V) {
964             if (reg & I365_VCC_5V) state->Vcc = 33;
965             if (vpp == I365_VPP1_5V) state->Vpp = 33;
966         } else {
967             if (reg & I365_VCC_5V) state->Vcc = 50;
968             if (vpp == I365_VPP1_5V) state->Vpp = 50;
969         }
970         if (vpp == I365_VPP1_12V) state->Vpp = 120;
971     } else if (t->flags & IS_VG_PWR) {
972         if (i365_get(sock, VG469_VSELECT) & VG469_VSEL_VCC) {
973             if (reg & I365_VCC_5V) state->Vcc = 33;
974             if (vpp == I365_VPP1_5V) state->Vpp = 33;
975         } else {
976             if (reg & I365_VCC_5V) state->Vcc = 50;
977             if (vpp == I365_VPP1_5V) state->Vpp = 50;
978         }
979         if (vpp == I365_VPP1_12V) state->Vpp = 120;
980     } else if (t->flags & IS_DF_PWR) {
981         if (vcc == I365_VCC_3V) state->Vcc = 33;
982         if (vcc == I365_VCC_5V) state->Vcc = 50;
983         if (vpp == I365_VPP1_5V) state->Vpp = 50;
984         if (vpp == I365_VPP1_12V) state->Vpp = 120;
985     } else {
986         if (reg & I365_VCC_5V) {
987             state->Vcc = 50;
988             if (vpp == I365_VPP1_5V) state->Vpp = 50;
989             if (vpp == I365_VPP1_12V) state->Vpp = 120;
990         }
991     }
992
993     /* IO card, RESET flags, IO interrupt */
994     reg = i365_get(sock, I365_INTCTL);
995     state->flags |= (reg & I365_PC_RESET) ? 0 : SS_RESET;
996     if (reg & I365_PC_IOCARD) state->flags |= SS_IOCARD;
997     state->io_irq = reg & I365_IRQ_MASK;
998     
999     /* speaker control */
1000     if (t->flags & IS_CIRRUS) {
1001         if (i365_get(sock, PD67_MISC_CTL_1) & PD67_MC1_SPKR_ENA)
1002             state->flags |= SS_SPKR_ENA;
1003     }
1004     
1005     /* Card status change mask */
1006     reg = i365_get(sock, I365_CSCINT);
1007     state->csc_mask = (reg & I365_CSC_DETECT) ? SS_DETECT : 0;
1008     if (state->flags & SS_IOCARD)
1009         state->csc_mask |= (reg & I365_CSC_STSCHG) ? SS_STSCHG : 0;
1010     else {
1011         state->csc_mask |= (reg & I365_CSC_BVD1) ? SS_BATDEAD : 0;
1012         state->csc_mask |= (reg & I365_CSC_BVD2) ? SS_BATWARN : 0;
1013         state->csc_mask |= (reg & I365_CSC_READY) ? SS_READY : 0;
1014     }
1015     
1016     debug(1, "GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
1017           "io_irq %d, csc_mask %#2.2x\n", sock, state->flags,
1018           state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
1019     return 0;
1020 } /* i365_get_socket */
1021
1022 /*====================================================================*/
1023
1024 static int i365_set_socket(u_short sock, socket_state_t *state)
1025 {
1026     struct i82365_socket *t = &socket[sock];
1027     u_char reg;
1028     
1029     debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
1030           "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
1031           state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
1032     
1033     /* First set global controller options */
1034     set_bridge_state(sock);
1035     
1036     /* IO card, RESET flag, IO interrupt */
1037     reg = t->intr;
1038     reg |= state->io_irq;
1039     reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
1040     reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
1041     i365_set(sock, I365_INTCTL, reg);
1042     
1043     reg = I365_PWR_NORESET;
1044     if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO;
1045     if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT;
1046
1047     if (t->flags & IS_CIRRUS) {
1048         if (state->Vpp != 0) {
1049             if (state->Vpp == 120)
1050                 reg |= I365_VPP1_12V;
1051             else if (state->Vpp == state->Vcc)
1052                 reg |= I365_VPP1_5V;
1053             else return -EINVAL;
1054         }
1055         if (state->Vcc != 0) {
1056             reg |= I365_VCC_5V;
1057             if (state->Vcc == 33)
1058                 i365_bset(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
1059             else if (state->Vcc == 50)
1060                 i365_bclr(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
1061             else return -EINVAL;
1062         }
1063     } else if (t->flags & IS_VG_PWR) {
1064         if (state->Vpp != 0) {
1065             if (state->Vpp == 120)
1066                 reg |= I365_VPP1_12V;
1067             else if (state->Vpp == state->Vcc)
1068                 reg |= I365_VPP1_5V;
1069             else return -EINVAL;
1070         }
1071         if (state->Vcc != 0) {
1072             reg |= I365_VCC_5V;
1073             if (state->Vcc == 33)
1074                 i365_bset(sock, VG469_VSELECT, VG469_VSEL_VCC);
1075             else if (state->Vcc == 50)
1076                 i365_bclr(sock, VG469_VSELECT, VG469_VSEL_VCC);
1077             else return -EINVAL;
1078         }
1079     } else if (t->flags & IS_DF_PWR) {
1080         switch (state->Vcc) {
1081         case 0:         break;
1082         case 33:        reg |= I365_VCC_3V; break;
1083         case 50:        reg |= I365_VCC_5V; break;
1084         default:        return -EINVAL;
1085         }
1086         switch (state->Vpp) {
1087         case 0:         break;
1088         case 50:        reg |= I365_VPP1_5V; break;
1089         case 120:       reg |= I365_VPP1_12V; break;
1090         default:        return -EINVAL;
1091         }
1092     } else {
1093         switch (state->Vcc) {
1094         case 0:         break;
1095         case 50:        reg |= I365_VCC_5V; break;
1096         default:        return -EINVAL;
1097         }
1098         switch (state->Vpp) {
1099         case 0:         break;
1100         case 50:        reg |= I365_VPP1_5V | I365_VPP2_5V; break;
1101         case 120:       reg |= I365_VPP1_12V | I365_VPP2_12V; break;
1102         default:        return -EINVAL;
1103         }
1104     }
1105     
1106     if (reg != i365_get(sock, I365_POWER))
1107         i365_set(sock, I365_POWER, reg);
1108
1109     /* Chipset-specific functions */
1110     if (t->flags & IS_CIRRUS) {
1111         /* Speaker control */
1112         i365_bflip(sock, PD67_MISC_CTL_1, PD67_MC1_SPKR_ENA,
1113                    state->flags & SS_SPKR_ENA);
1114     }
1115     
1116     /* Card status change interrupt mask */
1117     reg = t->cs_irq << 4;
1118     if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT;
1119     if (state->flags & SS_IOCARD) {
1120         if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG;
1121     } else {
1122         if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1;
1123         if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2;
1124         if (state->csc_mask & SS_READY) reg |= I365_CSC_READY;
1125     }
1126     i365_set(sock, I365_CSCINT, reg);
1127     i365_get(sock, I365_CSC);
1128     
1129     return 0;
1130 } /* i365_set_socket */
1131
1132 /*====================================================================*/
1133
1134 static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
1135 {
1136     u_char map, ioctl;
1137     
1138     debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, "
1139           "%#lx-%#lx)\n", sock, io->map, io->flags,
1140           io->speed, io->start, io->stop);
1141     map = io->map;
1142     if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
1143         (io->stop < io->start)) return -EINVAL;
1144     /* Turn off the window before changing anything */
1145     if (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(map))
1146         i365_bclr(sock, I365_ADDRWIN, I365_ENA_IO(map));
1147     i365_set_pair(sock, I365_IO(map)+I365_W_START, io->start);
1148     i365_set_pair(sock, I365_IO(map)+I365_W_STOP, io->stop);
1149     ioctl = i365_get(sock, I365_IOCTL) & ~I365_IOCTL_MASK(map);
1150     if (io->speed) ioctl |= I365_IOCTL_WAIT(map);
1151     if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
1152     if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
1153     if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
1154     i365_set(sock, I365_IOCTL, ioctl);
1155     /* Turn on the window if necessary */
1156     if (io->flags & MAP_ACTIVE)
1157         i365_bset(sock, I365_ADDRWIN, I365_ENA_IO(map));
1158     return 0;
1159 } /* i365_set_io_map */
1160
1161 /*====================================================================*/
1162
1163 static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
1164 {
1165     u_short base, i;
1166     u_char map;
1167     
1168     debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#lx-%#lx, "
1169           "%#x)\n", sock, mem->map, mem->flags, mem->speed,
1170           mem->res->start, mem->res->end, mem->card_start);
1171
1172     map = mem->map;
1173     if ((map > 4) || (mem->card_start > 0x3ffffff) ||
1174         (mem->res->start > mem->res->end) || (mem->speed > 1000))
1175         return -EINVAL;
1176     if ((mem->res->start > 0xffffff) || (mem->res->end > 0xffffff))
1177         return -EINVAL;
1178         
1179     /* Turn off the window before changing anything */
1180     if (i365_get(sock, I365_ADDRWIN) & I365_ENA_MEM(map))
1181         i365_bclr(sock, I365_ADDRWIN, I365_ENA_MEM(map));
1182     
1183     base = I365_MEM(map);
1184     i = (mem->res->start >> 12) & 0x0fff;
1185     if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT;
1186     if (mem->flags & MAP_0WS) i |= I365_MEM_0WS;
1187     i365_set_pair(sock, base+I365_W_START, i);
1188     
1189     i = (mem->res->end >> 12) & 0x0fff;
1190     switch (to_cycles(mem->speed)) {
1191     case 0:     break;
1192     case 1:     i |= I365_MEM_WS0; break;
1193     case 2:     i |= I365_MEM_WS1; break;
1194     default:    i |= I365_MEM_WS1 | I365_MEM_WS0; break;
1195     }
1196     i365_set_pair(sock, base+I365_W_STOP, i);
1197     
1198     i = ((mem->card_start - mem->res->start) >> 12) & 0x3fff;
1199     if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT;
1200     if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG;
1201     i365_set_pair(sock, base+I365_W_OFF, i);
1202     
1203     /* Turn on the window if necessary */
1204     if (mem->flags & MAP_ACTIVE)
1205         i365_bset(sock, I365_ADDRWIN, I365_ENA_MEM(map));
1206     return 0;
1207 } /* i365_set_mem_map */
1208
1209 #if 0 /* driver model ordering issue */
1210 /*======================================================================
1211
1212     Routines for accessing socket information and register dumps via
1213     /sys/class/pcmcia_socket/...
1214     
1215 ======================================================================*/
1216
1217 static ssize_t show_info(struct class_device *class_dev, char *buf)
1218 {
1219         struct i82365_socket *s = container_of(class_dev, struct i82365_socket, socket.dev);
1220         return sprintf(buf, "type:     %s\npsock:    %d\n",
1221                        pcic[s->type].name, s->psock);
1222 }
1223
1224 static ssize_t show_exca(struct class_device *class_dev, char *buf)
1225 {
1226         struct i82365_socket *s = container_of(class_dev, struct i82365_socket, socket.dev);
1227         unsigned short sock;
1228         int i;
1229         ssize_t ret = 0;
1230         unsigned long flags = 0;
1231
1232         sock = s->number;
1233
1234         ISA_LOCK(sock, flags);
1235         for (i = 0; i < 0x40; i += 4) {
1236                 ret += sprintf(buf, "%02x %02x %02x %02x%s",
1237                                i365_get(sock,i), i365_get(sock,i+1),
1238                                i365_get(sock,i+2), i365_get(sock,i+3),
1239                                ((i % 16) == 12) ? "\n" : " ");
1240                 buf += ret;
1241         }
1242         ISA_UNLOCK(sock, flags);
1243
1244         return ret;
1245 }
1246
1247 static CLASS_DEVICE_ATTR(exca, S_IRUGO, show_exca, NULL);
1248 static CLASS_DEVICE_ATTR(info, S_IRUGO, show_info, NULL);
1249 #endif
1250
1251 /*====================================================================*/
1252
1253 /* this is horribly ugly... proper locking needs to be done here at 
1254  * some time... */
1255 #define LOCKED(x) do { \
1256         int retval; \
1257         unsigned long flags; \
1258         spin_lock_irqsave(&isa_lock, flags); \
1259         retval = x; \
1260         spin_unlock_irqrestore(&isa_lock, flags); \
1261         return retval; \
1262 } while (0)
1263         
1264
1265 static int pcic_get_status(struct pcmcia_socket *s, u_int *value)
1266 {
1267         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1268
1269         if (socket[sock].flags & IS_ALIVE) {
1270                 *value = 0;
1271                 return -EINVAL;
1272         }
1273
1274         LOCKED(i365_get_status(sock, value));
1275 }
1276
1277 static int pcic_get_socket(struct pcmcia_socket *s, socket_state_t *state)
1278 {
1279         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1280
1281         if (socket[sock].flags & IS_ALIVE)
1282                 return -EINVAL;
1283
1284         LOCKED(i365_get_socket(sock, state));
1285 }
1286
1287 static int pcic_set_socket(struct pcmcia_socket *s, socket_state_t *state)
1288 {
1289         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1290
1291         if (socket[sock].flags & IS_ALIVE)
1292                 return -EINVAL;
1293
1294         LOCKED(i365_set_socket(sock, state));
1295 }
1296
1297 static int pcic_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
1298 {
1299         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1300         if (socket[sock].flags & IS_ALIVE)
1301                 return -EINVAL;
1302
1303         LOCKED(i365_set_io_map(sock, io));
1304 }
1305
1306 static int pcic_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
1307 {
1308         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1309         if (socket[sock].flags & IS_ALIVE)
1310                 return -EINVAL;
1311
1312         LOCKED(i365_set_mem_map(sock, mem));
1313 }
1314
1315 static int pcic_init(struct pcmcia_socket *s)
1316 {
1317         int i;
1318         struct resource res = { .start = 0, .end = 0x1000 };
1319         pccard_io_map io = { 0, 0, 0, 0, 1 };
1320         pccard_mem_map mem = { .res = &res, };
1321
1322         for (i = 0; i < 2; i++) {
1323                 io.map = i;
1324                 pcic_set_io_map(s, &io);
1325         }
1326         for (i = 0; i < 5; i++) {
1327                 mem.map = i;
1328                 pcic_set_mem_map(s, &mem);
1329         }
1330         return 0;
1331 }
1332
1333 static struct pccard_operations pcic_operations = {
1334         .init                   = pcic_init,
1335         .get_status             = pcic_get_status,
1336         .get_socket             = pcic_get_socket,
1337         .set_socket             = pcic_set_socket,
1338         .set_io_map             = pcic_set_io_map,
1339         .set_mem_map            = pcic_set_mem_map,
1340 };
1341
1342 /*====================================================================*/
1343
1344 static int i82365_suspend(struct device *dev, pm_message_t state, u32 level)
1345 {
1346         int ret = 0;
1347         if (level == SUSPEND_SAVE_STATE)
1348                 ret = pcmcia_socket_dev_suspend(dev, state);
1349         return ret;
1350 }
1351
1352 static int i82365_resume(struct device *dev, u32 level)
1353 {
1354         int ret = 0;
1355         if (level == RESUME_RESTORE_STATE)
1356                 ret = pcmcia_socket_dev_resume(dev);
1357         return ret;
1358 }
1359
1360 static struct device_driver i82365_driver = {
1361         .name = "i82365",
1362         .bus = &platform_bus_type,
1363         .suspend = i82365_suspend,
1364         .resume = i82365_resume,
1365 };
1366
1367 static struct platform_device i82365_device = {
1368         .name = "i82365",
1369         .id = 0,
1370 };
1371
1372 static int __init init_i82365(void)
1373 {
1374     int i, ret;
1375
1376     ret = driver_register(&i82365_driver);
1377     if (ret)
1378         return ret;
1379
1380     ret = platform_device_register(&i82365_device);
1381     if (ret) {
1382         driver_unregister(&i82365_driver);
1383         return ret;
1384     }
1385
1386     printk(KERN_INFO "Intel ISA PCIC probe: ");
1387     sockets = 0;
1388
1389     isa_probe();
1390
1391     if (sockets == 0) {
1392         printk("not found.\n");
1393         platform_device_unregister(&i82365_device);
1394         driver_unregister(&i82365_driver);
1395         return -ENODEV;
1396     }
1397
1398     /* Set up interrupt handler(s) */
1399     if (grab_irq != 0)
1400         request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
1401     
1402     /* register sockets with the pcmcia core */
1403     for (i = 0; i < sockets; i++) {
1404             socket[i].socket.dev.dev = &i82365_device.dev;
1405             socket[i].socket.ops = &pcic_operations;
1406             socket[i].socket.resource_ops = &pccard_nonstatic_ops;
1407             socket[i].socket.owner = THIS_MODULE;
1408             socket[i].number = i;
1409             ret = pcmcia_register_socket(&socket[i].socket);
1410             if (!ret)
1411                     socket[i].flags |= IS_REGISTERED;
1412
1413 #if 0 /* driver model ordering issue */
1414            class_device_create_file(&socket[i].socket.dev,
1415                                     &class_device_attr_info);
1416            class_device_create_file(&socket[i].socket.dev,
1417                                     &class_device_attr_exca);
1418 #endif
1419     }
1420
1421     /* Finally, schedule a polling interrupt */
1422     if (poll_interval != 0) {
1423         poll_timer.function = pcic_interrupt_wrapper;
1424         poll_timer.data = 0;
1425         init_timer(&poll_timer);
1426         poll_timer.expires = jiffies + poll_interval;
1427         add_timer(&poll_timer);
1428     }
1429     
1430     return 0;
1431     
1432 } /* init_i82365 */
1433
1434 static void __exit exit_i82365(void)
1435 {
1436     int i;
1437
1438     for (i = 0; i < sockets; i++) {
1439             if (socket[i].flags & IS_REGISTERED)
1440                     pcmcia_unregister_socket(&socket[i].socket);
1441     }
1442     platform_device_unregister(&i82365_device);
1443     if (poll_interval != 0)
1444         del_timer_sync(&poll_timer);
1445     if (grab_irq != 0)
1446         free_irq(cs_irq, pcic_interrupt);
1447     for (i = 0; i < sockets; i++) {
1448         /* Turn off all interrupt sources! */
1449         i365_set(i, I365_CSCINT, 0);
1450         release_region(socket[i].ioaddr, 2);
1451     }
1452     release_region(i365_base, 2);
1453 #ifdef CONFIG_PNP
1454     if (i82365_pnpdev)
1455                 pnp_disable_dev(i82365_pnpdev);
1456 #endif
1457     driver_unregister(&i82365_driver);
1458 } /* exit_i82365 */
1459
1460 module_init(init_i82365);
1461 module_exit(exit_i82365);
1462 MODULE_LICENSE("Dual MPL/GPL");
1463 /*====================================================================*/