]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/pcmcia/i82365.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[mv-sheeva.git] / 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/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>
52
53 #include <pcmcia/cs_types.h>
54 #include <pcmcia/ss.h>
55 #include <pcmcia/cs.h>
56
57 #include <linux/isapnp.h>
58
59 /* ISA-bus controllers */
60 #include "i82365.h"
61 #include "cirrus.h"
62 #include "vg468.h"
63 #include "ricoh.h"
64
65
66 static irqreturn_t i365_count_irq(int, void *);
67 static inline int _check_irq(int irq, int flags)
68 {
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;
73 }
74
75 /*====================================================================*/
76
77 /* Parameters that can be set with 'insmod' */
78
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;
91
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;
98
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;
108
109 /* Vadem options */
110 static int async_clock = -1;
111 static int cable_mode = -1;
112 static int wakeup = 0;
113
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);
123
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);
135
136 /*====================================================================*/
137
138 typedef struct cirrus_state_t {
139     u_char              misc1, misc2;
140     u_char              timer[6];
141 } cirrus_state_t;
142
143 typedef struct vg46x_state_t {
144     u_char              ctl, ema;
145 } vg46x_state_t;
146
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;
158 };
159
160 /* Where we keep track of our sockets... */
161 static int sockets = 0;
162 static struct i82365_socket socket[8] = {
163     { 0, }, /* ... */
164 };
165
166 /* Default ISA interrupt mask */
167 #define I365_MASK       0xdeb8  /* irq 15,14,12,11,10,9,7,5,4,3 */
168
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)
173
174 static struct timer_list poll_timer;
175
176 /*====================================================================*/
177
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;
184
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
194
195 typedef struct pcic_t {
196     char                *name;
197     u_short             flags;
198 } pcic_t;
199
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 },
212 };
213
214 #define PCIC_COUNT      (sizeof(pcic)/sizeof(pcic_t))
215
216 /*====================================================================*/
217
218 static DEFINE_SPINLOCK(bus_lock);
219
220 static u_char i365_get(u_short sock, u_short reg)
221 {
222     unsigned long flags;
223     spin_lock_irqsave(&bus_lock,flags);
224     {
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;
231     }
232 }
233
234 static void i365_set(u_short sock, u_short reg, u_char data)
235 {
236     unsigned long flags;
237     spin_lock_irqsave(&bus_lock,flags);
238     {
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);
243     }
244 }
245
246 static void i365_bset(u_short sock, u_short reg, u_char mask)
247 {
248     u_char d = i365_get(sock, reg);
249     d |= mask;
250     i365_set(sock, reg, d);
251 }
252
253 static void i365_bclr(u_short sock, u_short reg, u_char mask)
254 {
255     u_char d = i365_get(sock, reg);
256     d &= ~mask;
257     i365_set(sock, reg, d);
258 }
259
260 static void i365_bflip(u_short sock, u_short reg, u_char mask, int b)
261 {
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);
268 }
269
270 static u_short i365_get_pair(u_short sock, u_short reg)
271 {
272     u_short a, b;
273     a = i365_get(sock, reg);
274     b = i365_get(sock, reg+1);
275     return (a + (b<<8));
276 }
277
278 static void i365_set_pair(u_short sock, u_short reg, u_short data)
279 {
280     i365_set(sock, reg, data & 0xff);
281     i365_set(sock, reg+1, data >> 8);
282 }
283
284 /*======================================================================
285
286     Code to save and restore global state information for Cirrus
287     PD67xx controllers, and to set and report global configuration
288     options.
289
290     The VIA controllers also use these routines, as they are mostly
291     Cirrus lookalikes, without the timing registers.
292     
293 ======================================================================*/
294
295 #define flip(v,b,f) (v = ((f)<0) ? v : ((f) ? ((v)|(b)) : ((v)&(~b))))
296
297 static void cirrus_get_state(u_short s)
298 {
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);
306 }
307
308 static void cirrus_set_state(u_short s)
309 {
310     int i;
311     u_char misc;
312     cirrus_state_t *p = &socket[s].state.cirrus;
313
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]);
322 }
323
324 static u_int __init cirrus_set_opts(u_short s, char *buf)
325 {
326     struct i82365_socket *t = &socket[s];
327     cirrus_state_t *p = &socket[s].state.cirrus;
328     u_int mask = 0xffff;
329
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;
347     }
348     if (has_dma > 0) {
349         strcat(buf, " [dma]");
350         mask &= ~0x0600;
351     }
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;
358         }
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;
363         }
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]);
369     }
370     return mask;
371 }
372
373 /*======================================================================
374
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.
378     
379 ======================================================================*/
380
381 static void vg46x_get_state(u_short s)
382 {
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);
387 }
388
389 static void vg46x_set_state(u_short s)
390 {
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);
395 }
396
397 static u_int __init vg46x_set_opts(u_short s, char *buf)
398 {
399     vg46x_state_t *p = &socket[s].state.vg46x;
400     
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]");
413         }
414         if (p->ema & VG469_MODE_CABLE)
415             strcat(buf, " [cable]");
416         if (p->ema & VG469_MODE_COMPAT)
417             strcat(buf, " [c step]");
418     }
419     return 0xffff;
420 }
421
422 /*======================================================================
423
424     Generic routines to get and set controller options
425     
426 ======================================================================*/
427
428 static void get_bridge_state(u_short s)
429 {
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);
435 }
436
437 static void set_bridge_state(u_short s)
438 {
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);
445     }
446     i365_bflip(s, I365_INTCTL, I365_INTR_ENA, t->intr);
447     if (t->flags & IS_VADEM)
448         vg46x_set_state(s);
449 }
450
451 static u_int __init set_bridge_opts(u_short s, u_short ns)
452 {
453     u_short i;
454     u_int m = 0xffff;
455     char buf[128];
456
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;
461         }
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");
471     }
472     return m;
473 }
474
475 /*======================================================================
476
477     Interrupt testing code, for ISA and PCI interrupts
478     
479 ======================================================================*/
480
481 static volatile u_int irq_hits;
482 static u_short irq_sock;
483
484 static irqreturn_t i365_count_irq(int irq, void *dev)
485 {
486     i365_get(irq_sock, I365_CSC);
487     irq_hits++;
488     pr_debug("i82365: -> hit on irq %d\n", irq);
489     return IRQ_HANDLED;
490 }
491
492 static u_int __init test_irq(u_short sock, int irq)
493 {
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;
504     }
505
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);
510
511     free_irq(irq, i365_count_irq);
512
513     /* mask all interrupts */
514     i365_set(sock, I365_CSCINT, 0);
515     pr_debug("i82365:    hits = %d\n", irq_hits);
516     
517     return (irq_hits != 1);
518 }
519
520 static u_int __init isa_scan(u_short sock, u_int mask0)
521 {
522     u_int mask1 = 0;
523     int i;
524
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
530     
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);
540     }
541     
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;
553     }
554     printk(") = ");
555     
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!");
560     
561     return mask1;
562 }
563
564 /*====================================================================*/
565
566 /* Time conversion functions */
567
568 static int to_cycles(int ns)
569 {
570     return ns/cycle_time;
571 }
572
573 /*====================================================================*/
574
575 static int __init identify(unsigned int port, u_short sock)
576 {
577     u_char val;
578     int type = -1;
579
580     /* Use the next free entry in the socket table */
581     socket[sockets].ioaddr = port;
582     socket[sockets].psock = sock;
583     
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);
589     }
590     
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;
602     }
603     
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;
612     }
613
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;
618     
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;
629         }
630     }
631     return type;
632 } /* identify */
633
634 /*======================================================================
635
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.
638
639     We make an exception for cards that seem to be serial devices.
640     
641 ======================================================================*/
642
643 static int __init is_alive(u_short sock)
644 {
645     u_char stat;
646     unsigned int start, stop;
647     
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);
658     }
659
660     return 0;
661 }
662
663 /*====================================================================*/
664
665 static void __init add_socket(unsigned int port, int psock, int type)
666 {
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++;
674 }
675
676 static void __init add_pcic(int ns, int type)
677 {
678     u_int mask = 0, i, base;
679     int isa_irq = 0;
680     struct i82365_socket *t = &socket[sockets-ns];
681
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" : ""));
688
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);
698         
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;
705     }
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);
718         }
719     }
720     
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);
726         
727     }
728     
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;
735     }
736
737 } /* add_pcic */
738
739 /*====================================================================*/
740
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 }
750 };
751 MODULE_DEVICE_TABLE(isapnp, id_table);
752
753 static struct pnp_dev *i82365_pnpdev;
754 #endif
755
756 static void __init isa_probe(void)
757 {
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;
763
764     for (devid = id_table; devid->vendor; devid++) {
765         if ((dev = pnp_find_dev(NULL, devid->vendor, devid->function, NULL))) {
766         
767             if (pnp_device_attach(dev) < 0)
768                 continue;
769
770             if (pnp_activate_dev(dev) < 0) {
771                 printk("activate failed\n");
772                 pnp_device_detach(dev);
773                 break;
774             }
775
776             if (!pnp_port_valid(dev, 0)) {
777                 printk("invalid resources ?\n");
778                 pnp_device_detach(dev);
779                 break;
780             }
781             i365_base = pnp_port_start(dev, 0);
782             i82365_pnpdev = dev;
783             break;
784         }
785     }
786 #endif
787
788     if (!request_region(i365_base, 2, "i82365")) {
789         if (sockets == 0)
790             printk("port conflict at %#lx\n", i365_base);
791         return;
792     }
793
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);
803             }
804         }
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;
813
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++;
826             }
827             if (ns != 0) add_pcic(ns, id);
828         }
829     }
830 }
831
832 /*====================================================================*/
833
834 static irqreturn_t pcic_interrupt(int irq, void *dev)
835 {
836     int i, j, csc;
837     u_int events, active;
838     u_long flags = 0;
839     int handled = 0;
840
841     pr_debug("pcic_interrupt(%d)\n", irq);
842
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;
854             }
855             events = (csc & I365_CSC_DETECT) ? SS_DETECT : 0;
856
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;
863             }
864             ISA_UNLOCK(i, flags);
865             pr_debug("socket %d event 0x%02x\n", i, events);
866
867             if (events)
868                 pcmcia_parse_events(&socket[i].socket, events);
869
870             active |= events;
871         }
872         if (!active) break;
873     }
874     if (j == 20)
875         printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n");
876
877     pr_debug("pcic_interrupt done\n");
878     return IRQ_RETVAL(handled);
879 } /* pcic_interrupt */
880
881 static void pcic_interrupt_wrapper(u_long data)
882 {
883     pcic_interrupt(0, NULL);
884     poll_timer.expires = jiffies + poll_interval;
885     add_timer(&poll_timer);
886 }
887
888 /*====================================================================*/
889
890 static int i365_get_status(u_short sock, u_int *value)
891 {
892     u_int status;
893     
894     status = i365_get(sock, I365_STATUS);
895     *value = ((status & I365_CS_DETECT) == I365_CS_DETECT)
896         ? SS_DETECT : 0;
897         
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;
903     }
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;
907
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;
916         }
917     }
918     
919     pr_debug("GetStatus(%d) = %#4.4x\n", sock, *value);
920     return 0;
921 } /* i365_get_status */
922
923 /*====================================================================*/
924
925 static int i365_set_socket(u_short sock, socket_state_t *state)
926 {
927     struct i82365_socket *t = &socket[sock];
928     u_char reg;
929     
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);
933     
934     /* First set global controller options */
935     set_bridge_state(sock);
936     
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);
943     
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;
947
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;
955         }
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;
963         }
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;
971         }
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;
979         }
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;
986         }
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;
992         }
993     } else {
994         switch (state->Vcc) {
995         case 0:         break;
996         case 50:        reg |= I365_VCC_5V; break;
997         default:        return -EINVAL;
998         }
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;
1004         }
1005     }
1006     
1007     if (reg != i365_get(sock, I365_POWER))
1008         i365_set(sock, I365_POWER, reg);
1009
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);
1015     }
1016     
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;
1026     }
1027     i365_set(sock, I365_CSCINT, reg);
1028     i365_get(sock, I365_CSC);
1029     
1030     return 0;
1031 } /* i365_set_socket */
1032
1033 /*====================================================================*/
1034
1035 static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
1036 {
1037     u_char map, ioctl;
1038     
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 */
1061
1062 /*====================================================================*/
1063
1064 static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
1065 {
1066     u_short base, i;
1067     u_char map;
1068     
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);
1073
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;
1080         
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));
1084     
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);
1090     
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;
1097     }
1098     i365_set_pair(sock, base+I365_W_STOP, i);
1099     
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);
1104     
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 */
1110
1111 #if 0 /* driver model ordering issue */
1112 /*======================================================================
1113
1114     Routines for accessing socket information and register dumps via
1115     /sys/class/pcmcia_socket/...
1116     
1117 ======================================================================*/
1118
1119 static ssize_t show_info(struct class_device *class_dev, char *buf)
1120 {
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);
1124 }
1125
1126 static ssize_t show_exca(struct class_device *class_dev, char *buf)
1127 {
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;
1133
1134         sock = s->number;
1135
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;
1143         }
1144         ISA_UNLOCK(sock, flags);
1145
1146         return ret;
1147 }
1148
1149 static CLASS_DEVICE_ATTR(exca, S_IRUGO, show_exca, NULL);
1150 static CLASS_DEVICE_ATTR(info, S_IRUGO, show_info, NULL);
1151 #endif
1152
1153 /*====================================================================*/
1154
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)
1165         
1166
1167 static int pcic_get_status(struct pcmcia_socket *s, u_int *value)
1168 {
1169         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1170
1171         if (socket[sock].flags & IS_ALIVE) {
1172                 *value = 0;
1173                 return -EINVAL;
1174         }
1175
1176         LOCKED(i365_get_status(sock, value));
1177 }
1178
1179 static int pcic_set_socket(struct pcmcia_socket *s, socket_state_t *state)
1180 {
1181         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1182
1183         if (socket[sock].flags & IS_ALIVE)
1184                 return -EINVAL;
1185
1186         LOCKED(i365_set_socket(sock, state));
1187 }
1188
1189 static int pcic_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
1190 {
1191         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1192         if (socket[sock].flags & IS_ALIVE)
1193                 return -EINVAL;
1194
1195         LOCKED(i365_set_io_map(sock, io));
1196 }
1197
1198 static int pcic_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
1199 {
1200         unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
1201         if (socket[sock].flags & IS_ALIVE)
1202                 return -EINVAL;
1203
1204         LOCKED(i365_set_mem_map(sock, mem));
1205 }
1206
1207 static int pcic_init(struct pcmcia_socket *s)
1208 {
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, };
1213
1214         for (i = 0; i < 2; i++) {
1215                 io.map = i;
1216                 pcic_set_io_map(s, &io);
1217         }
1218         for (i = 0; i < 5; i++) {
1219                 mem.map = i;
1220                 pcic_set_mem_map(s, &mem);
1221         }
1222         return 0;
1223 }
1224
1225
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,
1232 };
1233
1234 /*====================================================================*/
1235
1236 static struct platform_driver i82365_driver = {
1237         .driver = {
1238                 .name = "i82365",
1239                 .owner          = THIS_MODULE,
1240         },
1241 };
1242
1243 static struct platform_device *i82365_device;
1244
1245 static int __init init_i82365(void)
1246 {
1247     int i, ret;
1248
1249     ret = platform_driver_register(&i82365_driver);
1250     if (ret)
1251         goto err_out;
1252
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;
1260
1261     if (ret)
1262         goto err_driver_unregister;
1263
1264     printk(KERN_INFO "Intel ISA PCIC probe: ");
1265     sockets = 0;
1266
1267     isa_probe();
1268
1269     if (sockets == 0) {
1270         printk("not found.\n");
1271         ret = -ENODEV;
1272         goto err_dev_unregister;
1273     }
1274
1275     /* Set up interrupt handler(s) */
1276     if (grab_irq != 0)
1277         ret = request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
1278
1279     if (ret)
1280         goto err_socket_release;
1281
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;
1292
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
1299     }
1300
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);
1308     }
1309     
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);
1316     }
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 */
1329
1330 static void __exit exit_i82365(void)
1331 {
1332     int i;
1333
1334     for (i = 0; i < sockets; i++) {
1335             if (socket[i].flags & IS_REGISTERED)
1336                     pcmcia_unregister_socket(&socket[i].socket);
1337     }
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);
1347     }
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 */
1355
1356 module_init(init_i82365);
1357 module_exit(exit_i82365);
1358 MODULE_LICENSE("Dual MPL/GPL");
1359 /*====================================================================*/