1 /*======================================================================
3 Device driver for Intel 82365 and compatible PC Card controllers.
5 i82365.c 1.265 1999/11/10 18:36:21
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in which
23 case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
32 ======================================================================*/
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/init.h>
37 #include <linux/types.h>
38 #include <linux/fcntl.h>
39 #include <linux/string.h>
40 #include <linux/kernel.h>
41 #include <linux/errno.h>
42 #include <linux/timer.h>
43 #include <linux/ioport.h>
44 #include <linux/delay.h>
45 #include <linux/workqueue.h>
46 #include <linux/interrupt.h>
47 #include <linux/platform_device.h>
48 #include <linux/bitops.h>
51 #include <asm/system.h>
53 #include <pcmcia/cs_types.h>
54 #include <pcmcia/ss.h>
55 #include <pcmcia/cs.h>
57 #include <linux/isapnp.h>
59 /* ISA-bus controllers */
66 static irqreturn_t
i365_count_irq(int, void *);
67 static inline int _check_irq(int irq
, int flags
)
69 if (request_irq(irq
, i365_count_irq
, flags
, "x", i365_count_irq
) != 0)
71 free_irq(irq
, i365_count_irq
);
75 /*====================================================================*/
77 /* Parameters that can be set with 'insmod' */
79 /* Default base address for i82365sl and other ISA chips */
80 static unsigned long i365_base
= 0x3e0;
81 /* Should we probe at 0x3e2 for an extra ISA controller? */
82 static int extra_sockets
= 0;
83 /* Specify a socket number to ignore */
84 static int ignore
= -1;
85 /* Bit map or list of interrupts to choose from */
86 static u_int irq_mask
= 0xffff;
87 static int irq_list
[16];
88 static unsigned int irq_list_count
;
89 /* The card status change interrupt -- 0 means autoselect */
90 static int cs_irq
= 0;
92 /* Probe for safe interrupts? */
93 static int do_scan
= 1;
94 /* Poll status interval -- 0 means default to interrupt */
95 static int poll_interval
= 0;
96 /* External clock time, in nanoseconds. 120 ns = 8.33 MHz */
97 static int cycle_time
= 120;
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;
110 static int async_clock
= -1;
111 static int cable_mode
= -1;
112 static int wakeup
= 0;
114 module_param(i365_base
, ulong
, 0444);
115 module_param(ignore
, int, 0444);
116 module_param(extra_sockets
, int, 0444);
117 module_param(irq_mask
, int, 0444);
118 module_param_array(irq_list
, int, &irq_list_count
, 0444);
119 module_param(cs_irq
, int, 0444);
120 module_param(async_clock
, int, 0444);
121 module_param(cable_mode
, int, 0444);
122 module_param(wakeup
, int, 0444);
124 module_param(do_scan
, int, 0444);
125 module_param(poll_interval
, int, 0444);
126 module_param(cycle_time
, int, 0444);
127 module_param(has_dma
, int, 0444);
128 module_param(has_led
, int, 0444);
129 module_param(has_ring
, int, 0444);
130 module_param(dynamic_mode
, int, 0444);
131 module_param(freq_bypass
, int, 0444);
132 module_param(setup_time
, int, 0444);
133 module_param(cmd_time
, int, 0444);
134 module_param(recov_time
, int, 0444);
136 /*====================================================================*/
138 typedef struct cirrus_state_t
{
143 typedef struct vg46x_state_t
{
147 struct i82365_socket
{
149 struct pcmcia_socket socket
;
155 cirrus_state_t cirrus
;
160 /* Where we keep track of our sockets... */
161 static int sockets
= 0;
162 static struct i82365_socket socket
[8] = {
166 /* Default ISA interrupt mask */
167 #define I365_MASK 0xdeb8 /* irq 15,14,12,11,10,9,7,5,4,3 */
170 static DEFINE_SPINLOCK(isa_lock
);
171 #define ISA_LOCK(n, f) spin_lock_irqsave(&isa_lock, f)
172 #define ISA_UNLOCK(n, f) spin_unlock_irqrestore(&isa_lock, f)
174 static struct timer_list poll_timer
;
176 /*====================================================================*/
178 /* These definitions must match the pcic table! */
179 typedef enum pcic_id
{
180 IS_I82365A
, IS_I82365B
, IS_I82365DF
,
181 IS_IBM
, IS_RF5Cx96
, IS_VLSI
, IS_VG468
, IS_VG469
,
182 IS_PD6710
, IS_PD672X
, IS_VT83C469
,
185 /* Flags for classifying groups of controllers */
186 #define IS_VADEM 0x0001
187 #define IS_CIRRUS 0x0002
188 #define IS_VIA 0x0010
189 #define IS_UNKNOWN 0x0400
190 #define IS_VG_PWR 0x0800
191 #define IS_DF_PWR 0x1000
192 #define IS_REGISTERED 0x2000
193 #define IS_ALIVE 0x8000
195 typedef struct pcic_t
{
200 static pcic_t pcic
[] = {
201 { "Intel i82365sl A step", 0 },
202 { "Intel i82365sl B step", 0 },
203 { "Intel i82365sl DF", IS_DF_PWR
},
205 { "Ricoh RF5C296/396", 0 },
206 { "VLSI 82C146", 0 },
207 { "Vadem VG-468", IS_VADEM
},
208 { "Vadem VG-469", IS_VADEM
|IS_VG_PWR
},
209 { "Cirrus PD6710", IS_CIRRUS
},
210 { "Cirrus PD672x", IS_CIRRUS
},
211 { "VIA VT83C469", IS_CIRRUS
|IS_VIA
},
214 #define PCIC_COUNT (sizeof(pcic)/sizeof(pcic_t))
216 /*====================================================================*/
218 static DEFINE_SPINLOCK(bus_lock
);
220 static u_char
i365_get(u_short sock
, u_short reg
)
223 spin_lock_irqsave(&bus_lock
,flags
);
225 unsigned int port
= socket
[sock
].ioaddr
;
227 reg
= I365_REG(socket
[sock
].psock
, reg
);
228 outb(reg
, port
); val
= inb(port
+1);
229 spin_unlock_irqrestore(&bus_lock
,flags
);
234 static void i365_set(u_short sock
, u_short reg
, u_char data
)
237 spin_lock_irqsave(&bus_lock
,flags
);
239 unsigned int port
= socket
[sock
].ioaddr
;
240 u_char val
= I365_REG(socket
[sock
].psock
, reg
);
241 outb(val
, port
); outb(data
, port
+1);
242 spin_unlock_irqrestore(&bus_lock
,flags
);
246 static void i365_bset(u_short sock
, u_short reg
, u_char mask
)
248 u_char d
= i365_get(sock
, reg
);
250 i365_set(sock
, reg
, d
);
253 static void i365_bclr(u_short sock
, u_short reg
, u_char mask
)
255 u_char d
= i365_get(sock
, reg
);
257 i365_set(sock
, reg
, d
);
260 static void i365_bflip(u_short sock
, u_short reg
, u_char mask
, int b
)
262 u_char d
= i365_get(sock
, reg
);
267 i365_set(sock
, reg
, d
);
270 static u_short
i365_get_pair(u_short sock
, u_short reg
)
273 a
= i365_get(sock
, reg
);
274 b
= i365_get(sock
, reg
+1);
278 static void i365_set_pair(u_short sock
, u_short reg
, u_short data
)
280 i365_set(sock
, reg
, data
& 0xff);
281 i365_set(sock
, reg
+1, data
>> 8);
284 /*======================================================================
286 Code to save and restore global state information for Cirrus
287 PD67xx controllers, and to set and report global configuration
290 The VIA controllers also use these routines, as they are mostly
291 Cirrus lookalikes, without the timing registers.
293 ======================================================================*/
295 #define flip(v,b,f) (v = ((f)<0) ? v : ((f) ? ((v)|(b)) : ((v)&(~b))))
297 static void cirrus_get_state(u_short s
)
300 cirrus_state_t
*p
= &socket
[s
].state
.cirrus
;
301 p
->misc1
= i365_get(s
, PD67_MISC_CTL_1
);
302 p
->misc1
&= (PD67_MC1_MEDIA_ENA
| PD67_MC1_INPACK_ENA
);
303 p
->misc2
= i365_get(s
, PD67_MISC_CTL_2
);
304 for (i
= 0; i
< 6; i
++)
305 p
->timer
[i
] = i365_get(s
, PD67_TIME_SETUP(0)+i
);
308 static void cirrus_set_state(u_short s
)
312 cirrus_state_t
*p
= &socket
[s
].state
.cirrus
;
314 misc
= i365_get(s
, PD67_MISC_CTL_2
);
315 i365_set(s
, PD67_MISC_CTL_2
, p
->misc2
);
316 if (misc
& PD67_MC2_SUSPEND
) mdelay(50);
317 misc
= i365_get(s
, PD67_MISC_CTL_1
);
318 misc
&= ~(PD67_MC1_MEDIA_ENA
| PD67_MC1_INPACK_ENA
);
319 i365_set(s
, PD67_MISC_CTL_1
, misc
| p
->misc1
);
320 for (i
= 0; i
< 6; i
++)
321 i365_set(s
, PD67_TIME_SETUP(0)+i
, p
->timer
[i
]);
324 static u_int __init
cirrus_set_opts(u_short s
, char *buf
)
326 struct i82365_socket
*t
= &socket
[s
];
327 cirrus_state_t
*p
= &socket
[s
].state
.cirrus
;
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
)
345 strcat(buf
, " [led]");
349 strcat(buf
, " [dma]");
352 if (!(t
->flags
& IS_VIA
)) {
354 p
->timer
[0] = p
->timer
[3] = setup_time
;
356 p
->timer
[1] = cmd_time
;
357 p
->timer
[4] = cmd_time
*2+4;
359 if (p
->timer
[1] == 0) {
360 p
->timer
[1] = 6; p
->timer
[4] = 16;
361 if (p
->timer
[0] == 0)
362 p
->timer
[0] = p
->timer
[3] = 1;
365 p
->timer
[2] = p
->timer
[5] = recov_time
;
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]);
373 /*======================================================================
375 Code to save and restore global state information for Vadem VG468
376 and VG469 controllers, and to set and report global configuration
379 ======================================================================*/
381 static void vg46x_get_state(u_short s
)
383 vg46x_state_t
*p
= &socket
[s
].state
.vg46x
;
384 p
->ctl
= i365_get(s
, VG468_CTL
);
385 if (socket
[s
].type
== IS_VG469
)
386 p
->ema
= i365_get(s
, VG469_EXT_MODE
);
389 static void vg46x_set_state(u_short s
)
391 vg46x_state_t
*p
= &socket
[s
].state
.vg46x
;
392 i365_set(s
, VG468_CTL
, p
->ctl
);
393 if (socket
[s
].type
== IS_VG469
)
394 i365_set(s
, VG469_EXT_MODE
, p
->ema
);
397 static u_int __init
vg46x_set_opts(u_short s
, char *buf
)
399 vg46x_state_t
*p
= &socket
[s
].state
.vg46x
;
401 flip(p
->ctl
, VG468_CTL_ASYNC
, async_clock
);
402 flip(p
->ema
, VG469_MODE_CABLE
, cable_mode
);
403 if (p
->ctl
& VG468_CTL_ASYNC
)
404 strcat(buf
, " [async]");
405 if (p
->ctl
& VG468_CTL_INPACK
)
406 strcat(buf
, " [inpack]");
407 if (socket
[s
].type
== IS_VG469
) {
408 u_char vsel
= i365_get(s
, VG469_VSELECT
);
409 if (vsel
& VG469_VSEL_EXT_STAT
) {
410 strcat(buf
, " [ext mode]");
411 if (vsel
& VG469_VSEL_EXT_BUS
)
412 strcat(buf
, " [isa buf]");
414 if (p
->ema
& VG469_MODE_CABLE
)
415 strcat(buf
, " [cable]");
416 if (p
->ema
& VG469_MODE_COMPAT
)
417 strcat(buf
, " [c step]");
422 /*======================================================================
424 Generic routines to get and set controller options
426 ======================================================================*/
428 static void get_bridge_state(u_short s
)
430 struct i82365_socket
*t
= &socket
[s
];
431 if (t
->flags
& IS_CIRRUS
)
433 else if (t
->flags
& IS_VADEM
)
437 static void set_bridge_state(u_short s
)
439 struct i82365_socket
*t
= &socket
[s
];
440 if (t
->flags
& IS_CIRRUS
)
443 i365_set(s
, I365_GBLCTL
, 0x00);
444 i365_set(s
, I365_GENCTL
, 0x00);
446 i365_bflip(s
, I365_INTCTL
, I365_INTR_ENA
, t
->intr
);
447 if (t
->flags
& IS_VADEM
)
451 static u_int __init
set_bridge_opts(u_short s
, u_short ns
)
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
);
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
);
469 printk(KERN_INFO
" host opts [%d]:%s\n", i
,
470 (*buf
) ? buf
: " none");
475 /*======================================================================
477 Interrupt testing code, for ISA and PCI interrupts
479 ======================================================================*/
481 static volatile u_int irq_hits
;
482 static u_short irq_sock
;
484 static irqreturn_t
i365_count_irq(int irq
, void *dev
)
486 i365_get(irq_sock
, I365_CSC
);
488 pr_debug("i82365: -> hit on irq %d\n", irq
);
492 static u_int __init
test_irq(u_short sock
, int irq
)
494 pr_debug("i82365: testing ISA irq %d\n", irq
);
495 if (request_irq(irq
, i365_count_irq
, IRQF_PROBE_SHARED
, "scan",
496 i365_count_irq
) != 0)
498 irq_hits
= 0; irq_sock
= sock
;
501 free_irq(irq
, i365_count_irq
);
502 pr_debug("i82365: spurious hit!\n");
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
);
511 free_irq(irq
, i365_count_irq
);
513 /* mask all interrupts */
514 i365_set(sock
, I365_CSCINT
, 0);
515 pr_debug("i82365: hits = %d\n", irq_hits
);
517 return (irq_hits
!= 1);
520 static u_int __init
isa_scan(u_short sock
, u_int mask0
)
527 /* Don't probe level-triggered interrupts -- reserved for PCI */
528 mask0
&= ~(inb(PIC
) | (inb(PIC
+1) << 8));
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))
537 for (i
= 0; i
< 16; i
++)
538 if ((mask1
& (1 << i
)) && (test_irq(sock
, i
) != 0))
542 printk(KERN_INFO
" ISA irqs (");
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))
551 /* If scan failed, default to polled status */
552 if (!cs_irq
&& (poll_interval
== 0)) poll_interval
= HZ
;
556 for (i
= 0; i
< 16; i
++)
558 printk("%s%d", ((mask1
& ((1<<i
)-1)) ? "," : ""), i
);
559 if (mask1
== 0) printk("none!");
564 /*====================================================================*/
566 /* Time conversion functions */
568 static int to_cycles(int ns
)
570 return ns
/cycle_time
;
573 /*====================================================================*/
575 static int __init
identify(unsigned int port
, u_short sock
)
580 /* Use the next free entry in the socket table */
581 socket
[sockets
].ioaddr
= port
;
582 socket
[sockets
].psock
= sock
;
584 /* Wake up a sleepy Cirrus controller */
586 i365_bclr(sockets
, PD67_MISC_CTL_2
, PD67_MC2_SUSPEND
);
587 /* Pause at least 50 ms */
591 if ((val
= i365_get(sockets
, I365_IDENT
)) & 0x70)
595 type
= IS_I82365A
; break;
597 type
= IS_I82365B
; break;
599 type
= IS_I82365DF
; break;
600 case 0x88: case 0x89: case 0x8a:
601 type
= IS_IBM
; break;
604 /* Check for Vadem VG-468 chips */
607 i365_bset(sockets
, VG468_MISC
, VG468_MISC_VADEMREV
);
608 val
= i365_get(sockets
, I365_IDENT
);
609 if (val
& I365_IDENT_VADEM
) {
610 i365_bclr(sockets
, VG468_MISC
, VG468_MISC_VADEMREV
);
611 type
= ((val
& 7) >= 4) ? IS_VG469
: IS_VG468
;
614 /* Check for Ricoh chips */
615 val
= i365_get(sockets
, RF5C_CHIP_ID
);
616 if ((val
== RF5C_CHIP_RF5C296
) || (val
== RF5C_CHIP_RF5C396
))
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)
634 /*======================================================================
636 See if a card is present, powered up, in IO mode, and already
637 bound to a (non PC Card) Linux driver. We leave these alone.
639 We make an exception for cards that seem to be serial devices.
641 ======================================================================*/
643 static int __init
is_alive(u_short sock
)
646 unsigned int start
, stop
;
648 stat
= i365_get(sock
, I365_STATUS
);
649 start
= i365_get_pair(sock
, I365_IO(0)+I365_W_START
);
650 stop
= i365_get_pair(sock
, I365_IO(0)+I365_W_STOP
);
651 if ((stat
& I365_CS_DETECT
) && (stat
& I365_CS_POWERON
) &&
652 (i365_get(sock
, I365_INTCTL
) & I365_PC_IOCARD
) &&
653 (i365_get(sock
, I365_ADDRWIN
) & I365_ENA_IO(0)) &&
654 ((start
& 0xfeef) != 0x02e8)) {
655 if (!request_region(start
, stop
-start
+1, "i82365"))
657 release_region(start
, stop
-start
+1);
663 /*====================================================================*/
665 static void __init
add_socket(unsigned int port
, int psock
, int type
)
667 socket
[sockets
].ioaddr
= port
;
668 socket
[sockets
].psock
= psock
;
669 socket
[sockets
].type
= type
;
670 socket
[sockets
].flags
= pcic
[type
].flags
;
671 if (is_alive(sockets
))
672 socket
[sockets
].flags
|= IS_ALIVE
;
676 static void __init
add_pcic(int ns
, int type
)
678 u_int mask
= 0, i
, base
;
680 struct i82365_socket
*t
= &socket
[sockets
-ns
];
683 if (base
== 0) printk("\n");
684 printk(KERN_INFO
" %s", pcic
[type
].name
);
685 printk(" ISA-to-PCMCIA at port %#x ofs 0x%02x",
686 t
->ioaddr
, t
->psock
*0x40);
687 printk(", %d socket%s\n", ns
, ((ns
> 1) ? "s" : ""));
689 /* Set host options, build basic interrupt mask */
690 if (irq_list_count
== 0)
693 for (i
= mask
= 0; i
< irq_list_count
; i
++)
694 mask
|= (1<<irq_list
[i
]);
695 mask
&= I365_MASK
& set_bridge_opts(base
, ns
);
696 /* Scan for ISA interrupts */
697 mask
= isa_scan(base
, mask
);
699 /* Poll if only two interrupts available */
700 if (!poll_interval
) {
701 u_int tmp
= (mask
& 0xff20);
703 if ((tmp
& (tmp
-1)) == 0)
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))
717 printk(" status change on irq %d\n", cs_irq
);
722 if (poll_interval
== 0)
724 printk(" polling interval = %d ms\n",
725 poll_interval
* 1000 / HZ
);
729 /* Update socket interrupt information, capabilities */
730 for (i
= 0; i
< ns
; i
++) {
731 t
[i
].socket
.features
|= SS_CAP_PCCARD
;
732 t
[i
].socket
.map_size
= 0x1000;
733 t
[i
].socket
.irq_mask
= mask
;
734 t
[i
].cs_irq
= isa_irq
;
739 /*====================================================================*/
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" },
751 MODULE_DEVICE_TABLE(isapnp
, id_table
);
753 static struct pnp_dev
*i82365_pnpdev
;
756 static void __init
isa_probe(void)
758 int i
, j
, sock
, k
, ns
, id
;
761 struct isapnp_device_id
*devid
;
764 for (devid
= id_table
; devid
->vendor
; devid
++) {
765 if ((dev
= pnp_find_dev(NULL
, devid
->vendor
, devid
->function
, NULL
))) {
767 if (pnp_device_attach(dev
) < 0)
770 if (pnp_activate_dev(dev
) < 0) {
771 printk("activate failed\n");
772 pnp_device_detach(dev
);
776 if (!pnp_port_valid(dev
, 0)) {
777 printk("invalid resources ?\n");
778 pnp_device_detach(dev
);
781 i365_base
= pnp_port_start(dev
, 0);
788 if (!request_region(i365_base
, 2, "i82365")) {
790 printk("port conflict at %#lx\n", i365_base
);
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);
800 if (identify(port
, sock
) == IS_I82365DF
) {
801 add_socket(port
, sock
, IS_VLSI
);
802 add_pcic(1, IS_VLSI
);
806 for (i
= 0; i
< 8; i
+= 2) {
807 if (sockets
&& !extra_sockets
&& (i
== 4))
809 port
= i365_base
+ 2*(i
>>2);
811 id
= identify(port
, sock
);
812 if (id
< 0) continue;
814 for (j
= ns
= 0; j
< 2; j
++) {
815 /* Does the socket exist? */
816 if ((ignore
== i
+j
) || (identify(port
, sock
+j
) < 0))
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
)
824 if (k
<= sockets
) break;
825 add_socket(port
, sock
+j
, id
); ns
++;
827 if (ns
!= 0) add_pcic(ns
, id
);
832 /*====================================================================*/
834 static irqreturn_t
pcic_interrupt(int irq
, void *dev
)
837 u_int events
, active
;
841 pr_debug("pcic_interrupt(%d)\n", irq
);
843 for (j
= 0; j
< 20; j
++) {
845 for (i
= 0; i
< sockets
; i
++) {
846 if (socket
[i
].cs_irq
!= irq
)
850 csc
= i365_get(i
, I365_CSC
);
851 if ((csc
== 0) || (i365_get(i
, I365_IDENT
) & 0x70)) {
852 ISA_UNLOCK(i
, flags
);
855 events
= (csc
& I365_CSC_DETECT
) ? SS_DETECT
: 0;
857 if (i365_get(i
, I365_INTCTL
) & I365_PC_IOCARD
)
858 events
|= (csc
& I365_CSC_STSCHG
) ? SS_STSCHG
: 0;
860 events
|= (csc
& I365_CSC_BVD1
) ? SS_BATDEAD
: 0;
861 events
|= (csc
& I365_CSC_BVD2
) ? SS_BATWARN
: 0;
862 events
|= (csc
& I365_CSC_READY
) ? SS_READY
: 0;
864 ISA_UNLOCK(i
, flags
);
865 pr_debug("socket %d event 0x%02x\n", i
, events
);
868 pcmcia_parse_events(&socket
[i
].socket
, events
);
875 printk(KERN_NOTICE
"i82365: infinite loop in interrupt handler\n");
877 pr_debug("pcic_interrupt done\n");
878 return IRQ_RETVAL(handled
);
879 } /* pcic_interrupt */
881 static void pcic_interrupt_wrapper(u_long data
)
883 pcic_interrupt(0, NULL
);
884 poll_timer
.expires
= jiffies
+ poll_interval
;
885 add_timer(&poll_timer
);
888 /*====================================================================*/
890 static int i365_get_status(u_short sock
, u_int
*value
)
894 status
= i365_get(sock
, I365_STATUS
);
895 *value
= ((status
& I365_CS_DETECT
) == I365_CS_DETECT
)
898 if (i365_get(sock
, I365_INTCTL
) & I365_PC_IOCARD
)
899 *value
|= (status
& I365_CS_STSCHG
) ? 0 : SS_STSCHG
;
901 *value
|= (status
& I365_CS_BVD1
) ? 0 : SS_BATDEAD
;
902 *value
|= (status
& I365_CS_BVD2
) ? 0 : SS_BATWARN
;
904 *value
|= (status
& I365_CS_WRPROT
) ? SS_WRPROT
: 0;
905 *value
|= (status
& I365_CS_READY
) ? SS_READY
: 0;
906 *value
|= (status
& I365_CS_POWERON
) ? SS_POWERON
: 0;
908 if (socket
[sock
].type
== IS_VG469
) {
909 status
= i365_get(sock
, VG469_VSENSE
);
910 if (socket
[sock
].psock
& 1) {
911 *value
|= (status
& VG469_VSENSE_B_VS1
) ? 0 : SS_3VCARD
;
912 *value
|= (status
& VG469_VSENSE_B_VS2
) ? 0 : SS_XVCARD
;
914 *value
|= (status
& VG469_VSENSE_A_VS1
) ? 0 : SS_3VCARD
;
915 *value
|= (status
& VG469_VSENSE_A_VS2
) ? 0 : SS_XVCARD
;
919 pr_debug("GetStatus(%d) = %#4.4x\n", sock
, *value
);
921 } /* i365_get_status */
923 /*====================================================================*/
925 static int i365_set_socket(u_short sock
, socket_state_t
*state
)
927 struct i82365_socket
*t
= &socket
[sock
];
930 pr_debug("SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
931 "io_irq %d, csc_mask %#2.2x)\n", sock
, state
->flags
,
932 state
->Vcc
, state
->Vpp
, state
->io_irq
, state
->csc_mask
);
934 /* First set global controller options */
935 set_bridge_state(sock
);
937 /* IO card, RESET flag, IO interrupt */
939 reg
|= state
->io_irq
;
940 reg
|= (state
->flags
& SS_RESET
) ? 0 : I365_PC_RESET
;
941 reg
|= (state
->flags
& SS_IOCARD
) ? I365_PC_IOCARD
: 0;
942 i365_set(sock
, I365_INTCTL
, reg
);
944 reg
= I365_PWR_NORESET
;
945 if (state
->flags
& SS_PWR_AUTO
) reg
|= I365_PWR_AUTO
;
946 if (state
->flags
& SS_OUTPUT_ENA
) reg
|= I365_PWR_OUT
;
948 if (t
->flags
& IS_CIRRUS
) {
949 if (state
->Vpp
!= 0) {
950 if (state
->Vpp
== 120)
951 reg
|= I365_VPP1_12V
;
952 else if (state
->Vpp
== state
->Vcc
)
956 if (state
->Vcc
!= 0) {
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
);
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
)
972 if (state
->Vcc
!= 0) {
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
);
980 } else if (t
->flags
& IS_DF_PWR
) {
981 switch (state
->Vcc
) {
983 case 33: reg
|= I365_VCC_3V
; break;
984 case 50: reg
|= I365_VCC_5V
; break;
985 default: return -EINVAL
;
987 switch (state
->Vpp
) {
989 case 50: reg
|= I365_VPP1_5V
; break;
990 case 120: reg
|= I365_VPP1_12V
; break;
991 default: return -EINVAL
;
994 switch (state
->Vcc
) {
996 case 50: reg
|= I365_VCC_5V
; break;
997 default: return -EINVAL
;
999 switch (state
->Vpp
) {
1001 case 50: reg
|= I365_VPP1_5V
| I365_VPP2_5V
; break;
1002 case 120: reg
|= I365_VPP1_12V
| I365_VPP2_12V
; break;
1003 default: return -EINVAL
;
1007 if (reg
!= i365_get(sock
, I365_POWER
))
1008 i365_set(sock
, I365_POWER
, reg
);
1010 /* Chipset-specific functions */
1011 if (t
->flags
& IS_CIRRUS
) {
1012 /* Speaker control */
1013 i365_bflip(sock
, PD67_MISC_CTL_1
, PD67_MC1_SPKR_ENA
,
1014 state
->flags
& SS_SPKR_ENA
);
1017 /* Card status change interrupt mask */
1018 reg
= t
->cs_irq
<< 4;
1019 if (state
->csc_mask
& SS_DETECT
) reg
|= I365_CSC_DETECT
;
1020 if (state
->flags
& SS_IOCARD
) {
1021 if (state
->csc_mask
& SS_STSCHG
) reg
|= I365_CSC_STSCHG
;
1023 if (state
->csc_mask
& SS_BATDEAD
) reg
|= I365_CSC_BVD1
;
1024 if (state
->csc_mask
& SS_BATWARN
) reg
|= I365_CSC_BVD2
;
1025 if (state
->csc_mask
& SS_READY
) reg
|= I365_CSC_READY
;
1027 i365_set(sock
, I365_CSCINT
, reg
);
1028 i365_get(sock
, I365_CSC
);
1031 } /* i365_set_socket */
1033 /*====================================================================*/
1035 static int i365_set_io_map(u_short sock
, struct pccard_io_map
*io
)
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
);
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
));
1060 } /* i365_set_io_map */
1062 /*====================================================================*/
1064 static int i365_set_mem_map(u_short sock
, struct pccard_mem_map
*mem
)
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
);
1075 if ((map
> 4) || (mem
->card_start
> 0x3ffffff) ||
1076 (mem
->res
->start
> mem
->res
->end
) || (mem
->speed
> 1000))
1078 if ((mem
->res
->start
> 0xffffff) || (mem
->res
->end
> 0xffffff))
1081 /* Turn off the window before changing anything */
1082 if (i365_get(sock
, I365_ADDRWIN
) & I365_ENA_MEM(map
))
1083 i365_bclr(sock
, I365_ADDRWIN
, I365_ENA_MEM(map
));
1085 base
= I365_MEM(map
);
1086 i
= (mem
->res
->start
>> 12) & 0x0fff;
1087 if (mem
->flags
& MAP_16BIT
) i
|= I365_MEM_16BIT
;
1088 if (mem
->flags
& MAP_0WS
) i
|= I365_MEM_0WS
;
1089 i365_set_pair(sock
, base
+I365_W_START
, i
);
1091 i
= (mem
->res
->end
>> 12) & 0x0fff;
1092 switch (to_cycles(mem
->speed
)) {
1094 case 1: i
|= I365_MEM_WS0
; break;
1095 case 2: i
|= I365_MEM_WS1
; break;
1096 default: i
|= I365_MEM_WS1
| I365_MEM_WS0
; break;
1098 i365_set_pair(sock
, base
+I365_W_STOP
, i
);
1100 i
= ((mem
->card_start
- mem
->res
->start
) >> 12) & 0x3fff;
1101 if (mem
->flags
& MAP_WRPROT
) i
|= I365_MEM_WRPROT
;
1102 if (mem
->flags
& MAP_ATTRIB
) i
|= I365_MEM_REG
;
1103 i365_set_pair(sock
, base
+I365_W_OFF
, i
);
1105 /* Turn on the window if necessary */
1106 if (mem
->flags
& MAP_ACTIVE
)
1107 i365_bset(sock
, I365_ADDRWIN
, I365_ENA_MEM(map
));
1109 } /* i365_set_mem_map */
1111 #if 0 /* driver model ordering issue */
1112 /*======================================================================
1114 Routines for accessing socket information and register dumps via
1115 /sys/class/pcmcia_socket/...
1117 ======================================================================*/
1119 static ssize_t
show_info(struct class_device
*class_dev
, char *buf
)
1121 struct i82365_socket
*s
= container_of(class_dev
, struct i82365_socket
, socket
.dev
);
1122 return sprintf(buf
, "type: %s\npsock: %d\n",
1123 pcic
[s
->type
].name
, s
->psock
);
1126 static ssize_t
show_exca(struct class_device
*class_dev
, char *buf
)
1128 struct i82365_socket
*s
= container_of(class_dev
, struct i82365_socket
, socket
.dev
);
1129 unsigned short sock
;
1132 unsigned long flags
= 0;
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" : " ");
1144 ISA_UNLOCK(sock
, flags
);
1149 static CLASS_DEVICE_ATTR(exca
, S_IRUGO
, show_exca
, NULL
);
1150 static CLASS_DEVICE_ATTR(info
, S_IRUGO
, show_info
, NULL
);
1153 /*====================================================================*/
1155 /* this is horribly ugly... proper locking needs to be done here at
1157 #define LOCKED(x) do { \
1159 unsigned long flags; \
1160 spin_lock_irqsave(&isa_lock, flags); \
1162 spin_unlock_irqrestore(&isa_lock, flags); \
1167 static int pcic_get_status(struct pcmcia_socket
*s
, u_int
*value
)
1169 unsigned int sock
= container_of(s
, struct i82365_socket
, socket
)->number
;
1171 if (socket
[sock
].flags
& IS_ALIVE
) {
1176 LOCKED(i365_get_status(sock
, value
));
1179 static int pcic_set_socket(struct pcmcia_socket
*s
, socket_state_t
*state
)
1181 unsigned int sock
= container_of(s
, struct i82365_socket
, socket
)->number
;
1183 if (socket
[sock
].flags
& IS_ALIVE
)
1186 LOCKED(i365_set_socket(sock
, state
));
1189 static int pcic_set_io_map(struct pcmcia_socket
*s
, struct pccard_io_map
*io
)
1191 unsigned int sock
= container_of(s
, struct i82365_socket
, socket
)->number
;
1192 if (socket
[sock
].flags
& IS_ALIVE
)
1195 LOCKED(i365_set_io_map(sock
, io
));
1198 static int pcic_set_mem_map(struct pcmcia_socket
*s
, struct pccard_mem_map
*mem
)
1200 unsigned int sock
= container_of(s
, struct i82365_socket
, socket
)->number
;
1201 if (socket
[sock
].flags
& IS_ALIVE
)
1204 LOCKED(i365_set_mem_map(sock
, mem
));
1207 static int pcic_init(struct pcmcia_socket
*s
)
1210 struct resource res
= { .start
= 0, .end
= 0x1000 };
1211 pccard_io_map io
= { 0, 0, 0, 0, 1 };
1212 pccard_mem_map mem
= { .res
= &res
, };
1214 for (i
= 0; i
< 2; i
++) {
1216 pcic_set_io_map(s
, &io
);
1218 for (i
= 0; i
< 5; i
++) {
1220 pcic_set_mem_map(s
, &mem
);
1226 static struct pccard_operations pcic_operations
= {
1228 .get_status
= pcic_get_status
,
1229 .set_socket
= pcic_set_socket
,
1230 .set_io_map
= pcic_set_io_map
,
1231 .set_mem_map
= pcic_set_mem_map
,
1234 /*====================================================================*/
1236 static struct platform_driver i82365_driver
= {
1239 .owner
= THIS_MODULE
,
1243 static struct platform_device
*i82365_device
;
1245 static int __init
init_i82365(void)
1249 ret
= platform_driver_register(&i82365_driver
);
1253 i82365_device
= platform_device_alloc("i82365", 0);
1254 if (i82365_device
) {
1255 ret
= platform_device_add(i82365_device
);
1257 platform_device_put(i82365_device
);
1262 goto err_driver_unregister
;
1264 printk(KERN_INFO
"Intel ISA PCIC probe: ");
1270 printk("not found.\n");
1272 goto err_dev_unregister
;
1275 /* Set up interrupt handler(s) */
1277 ret
= request_irq(cs_irq
, pcic_interrupt
, 0, "i82365", pcic_interrupt
);
1280 goto err_socket_release
;
1282 /* register sockets with the pcmcia core */
1283 for (i
= 0; i
< sockets
; i
++) {
1284 socket
[i
].socket
.dev
.parent
= &i82365_device
->dev
;
1285 socket
[i
].socket
.ops
= &pcic_operations
;
1286 socket
[i
].socket
.resource_ops
= &pccard_nonstatic_ops
;
1287 socket
[i
].socket
.owner
= THIS_MODULE
;
1288 socket
[i
].number
= i
;
1289 ret
= pcmcia_register_socket(&socket
[i
].socket
);
1291 socket
[i
].flags
|= IS_REGISTERED
;
1293 #if 0 /* driver model ordering issue */
1294 class_device_create_file(&socket
[i
].socket
.dev
,
1295 &class_device_attr_info
);
1296 class_device_create_file(&socket
[i
].socket
.dev
,
1297 &class_device_attr_exca
);
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
);
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);
1318 platform_device_unregister(i82365_device
);
1319 release_region(i365_base
, 2);
1322 pnp_disable_dev(i82365_pnpdev
);
1324 err_driver_unregister
:
1325 platform_driver_unregister(&i82365_driver
);
1330 static void __exit
exit_i82365(void)
1334 for (i
= 0; i
< sockets
; i
++) {
1335 if (socket
[i
].flags
& IS_REGISTERED
)
1336 pcmcia_unregister_socket(&socket
[i
].socket
);
1338 platform_device_unregister(i82365_device
);
1339 if (poll_interval
!= 0)
1340 del_timer_sync(&poll_timer
);
1342 free_irq(cs_irq
, pcic_interrupt
);
1343 for (i
= 0; i
< sockets
; i
++) {
1344 /* Turn off all interrupt sources! */
1345 i365_set(i
, I365_CSCINT
, 0);
1346 release_region(socket
[i
].ioaddr
, 2);
1348 release_region(i365_base
, 2);
1351 pnp_disable_dev(i82365_pnpdev
);
1353 platform_driver_unregister(&i82365_driver
);
1356 module_init(init_i82365
);
1357 module_exit(exit_i82365
);
1358 MODULE_LICENSE("Dual MPL/GPL");
1359 /*====================================================================*/