34 #include <linux/module.h>
37 #include <linux/types.h>
38 #include <linux/fcntl.h>
39 #include <linux/string.h>
40 #include <linux/errno.h>
47 #include <linux/bitops.h>
63 static unsigned long tcic_base =
TCIC_BASE;
66 static int ignore = -1;
69 static int do_scan = 1;
72 static u_int irq_mask = 0xffff;
73 static int irq_list[16];
74 static unsigned int irq_list_count;
80 static int poll_interval;
83 static int poll_quick =
HZ/20;
86 static int cycle_time = 70;
112 static int tcic_timer_pending;
121 #define TCIC_IRQ(x) ((x) ? (((x) == 11) ? 1 : (x)) : 15)
141 outb(data, tcic_base+reg);
147 outw(data, tcic_base+reg);
150 #define tcic_getb(reg) inb(tcic_base+reg)
151 #define tcic_getw(reg) inw(tcic_base+reg)
152 #define tcic_setb(reg, data) outb(data, tcic_base+reg)
153 #define tcic_setw(reg, data) outw(data, tcic_base+reg)
161 outw(data & 0xffff, tcic_base+reg);
162 outw(data >> 16, tcic_base+reg+2);
195 return 2*(ns-14)/cycle_time;
200 static volatile u_int irq_hits;
213 if (
request_irq(irq, tcic_irq_count, 0,
"irq scan", tcic_irq_count) != 0)
236 return (irq_hits != 1);
247 int level_mask =
inb_p(PIC) | (
inb_p(PIC+1) << 8);
249 mask0 &= ~level_mask;
254 for (i = 0; i < 16; i++)
255 if ((mask0 & (1 << i)) && (try_irq(i) == 0))
257 for (i = 0; i < 16; i++)
258 if ((mask1 & (1 << i)) && (try_irq(i) != 0)) {
267 for (i = 0; i < 16; i++)
268 if ((mask0 & (1 << i)) &&
269 (
request_irq(i, tcic_irq_count, 0,
"x", tcic_irq_count) == 0)) {
277 for (i = 0; i < 16; i++)
279 printk(
"%s%d", ((mask1 & ((1<<i)-1)) ?
"," :
""), i);
314 num = (base ^ (base-1));
315 base = base & (base-1);
320 ((base & 0xfeef) != 0x02e8)) {
336 static int __init get_tcic_id(
void)
351 .name =
"tcic-pcmcia",
357 .name =
"tcic-pcmcia",
362 static int __init init_tcic(
void)
374 printk(
"could not allocate ports,\n ");
403 for (i = 0; i <
sock; i++) {
404 if ((i == ignore) ||
is_active(i))
continue;
405 socket_table[sockets].psock =
i;
406 socket_table[sockets].id = get_tcic_id();
413 socket_table[sockets].socket.irq_mask = 0x4cf8;
415 socket_table[sockets].socket.map_size = 0x1000;
419 switch (socket_table[0].
id) {
423 printk(
"DB86082A");
break;
427 printk(
"DB86084A");
break;
433 printk(
"DB86082B");
break;
435 printk(
"Unknown ID 0x%02x", socket_table[0].
id);
439 poll_timer.function = &tcic_timer;
446 if (irq_list_count == 0)
449 for (i = mask = 0; i < irq_list_count; i++)
450 mask |= (1<<irq_list[i]);
455 mask = irq_scan(mask);
456 for (i=0;i<sockets;i++)
457 socket_table[i].
socket.irq_mask = mask;
460 scan = (mask & (mask-1));
461 if (((scan & (scan-1)) == 0) && (poll_interval == 0))
464 if (poll_interval == 0) {
466 u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
467 for (i = 15; i > 0; i--)
468 if ((cs_mask & (1 << i)) &&
470 tcic_interrupt) == 0))
473 if (cs_irq == 0) poll_interval =
HZ;
476 if (socket_table[0].
socket.irq_mask & (1 << 11))
477 printk(
"sktirq is irq 11, ");
479 printk(
"status change on irq %d\n", cs_irq);
481 printk(
"polled status, interval = %d ms\n",
482 poll_interval * 1000 /
HZ);
484 for (i = 0; i < sockets; i++) {
490 tcic_interrupt(0,
NULL);
494 for (i = 0; i < sockets; i++) {
495 socket_table[
i].socket.ops = &tcic_operations;
497 socket_table[
i].socket.dev.parent = &tcic_device.
dev;
511 static void __exit exit_tcic(
void)
522 for (i = 0; i < sockets; i++) {
538 static volatile int active = 0;
548 for (i = 0; i < sockets; i++) {
549 psock = socket_table[
i].psock;
553 latch = sstat ^ socket_table[psock].last_sstat;
554 socket_table[
i].last_sstat = sstat;
576 if (((cs_irq == 0) || quick) && (!tcic_timer_pending)) {
577 poll_timer.expires =
jiffies + (quick ? poll_quick : poll_interval);
579 tcic_timer_pending = 1;
590 tcic_timer_pending = 0;
591 tcic_interrupt(0,
NULL);
616 dev_dbg(&sock->
dev,
"GetStatus(%d) = %#2.2x\n", psock, *value);
628 dev_dbg(&sock->
dev,
"SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
629 "io_irq %d, csc_mask %#2.2x)\n", psock, state->
flags,
636 if (state->
Vcc == 50) {
637 switch (state->
Vpp) {
643 }
else if (state->
Vcc != 0)
703 dev_dbg(&sock->
dev,
"SetIOMap(%d, %d, %#2.2x, %d ns, "
705 (
unsigned long long)io->
start, (
unsigned long long)io->
stop);
706 if ((io->
map > 1) || (io->
start > 0xffff) || (io->
stop > 0xffff) ||
713 if ((len & (len+1)) || (base & len))
return -
EINVAL;
719 ioctl |= (len == 0) ? TCIC_ICTL_TINY : 0;
740 dev_dbg(&sock->
dev,
"SetMemMap(%d, %d, %#2.2x, %d ns, "
741 "%#llx-%#llx, %#x)\n", psock, mem->
map, mem->
flags,
742 mem->
speed, (
unsigned long long)mem->
res->start,
745 (mem->
res->start > 0xffffff) || (mem->
res->end > 0xffffff) ||
746 (mem->
res->start > mem->
res->end) || (mem->
speed > 1000))
751 base = mem->
res->start; len = mem->
res->end - mem->
res->start;
752 if ((len & (len+1)) || (base & len))
return -
EINVAL;
782 struct resource res = { .start = 0, .end = 0x1000 };
786 for (i = 0; i < 2; i++) {
788 tcic_set_io_map(s, &io);
790 for (i = 0; i < 5; i++) {
792 tcic_set_mem_map(s, &mem);
799 .get_status = tcic_get_status,
800 .set_socket = tcic_set_socket,
801 .set_io_map = tcic_set_io_map,
802 .set_mem_map = tcic_set_mem_map,