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