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