]> nv-tegra.nvidia Code Review - linux-3.10.git/blob - drivers/pcmcia/tcic.c
[PATCH] DRIVER MODEL: Get rid of the obsolete tri-level suspend/resume callbacks
[linux-3.10.git] / drivers / pcmcia / tcic.c
1 /*======================================================================
2
3     Device driver for Databook TCIC-2 PCMCIA controller
4
5     tcic.c 1.111 2000/02/15 04:13:12
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/errno.h>
41 #include <linux/interrupt.h>
42 #include <linux/slab.h>
43 #include <linux/timer.h>
44 #include <linux/ioport.h>
45 #include <linux/delay.h>
46 #include <linux/workqueue.h>
47 #include <linux/device.h>
48 #include <linux/bitops.h>
49
50 #include <asm/io.h>
51 #include <asm/system.h>
52
53 #include <pcmcia/cs_types.h>
54 #include <pcmcia/cs.h>
55 #include <pcmcia/ss.h>
56 #include "tcic.h"
57
58 #ifdef DEBUG
59 static int pc_debug;
60
61 module_param(pc_debug, int, 0644);
62 static const char version[] =
63 "tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)";
64
65 #define debug(lvl, fmt, arg...) do {                            \
66         if (pc_debug > (lvl))                                   \
67                 printk(KERN_DEBUG "tcic: " fmt , ## arg);       \
68 } while (0)
69 #else
70 #define debug(lvl, fmt, arg...) do { } while (0)
71 #endif
72
73 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
74 MODULE_DESCRIPTION("Databook TCIC-2 PCMCIA socket driver");
75 MODULE_LICENSE("Dual MPL/GPL");
76
77 /*====================================================================*/
78
79 /* Parameters that can be set with 'insmod' */
80
81 /* The base port address of the TCIC-2 chip */
82 static unsigned long tcic_base = TCIC_BASE;
83
84 /* Specify a socket number to ignore */
85 static int ignore = -1;
86
87 /* Probe for safe interrupts? */
88 static int do_scan = 1;
89
90 /* Bit map of interrupts to choose from */
91 static u_int irq_mask = 0xffff;
92 static int irq_list[16];
93 static int irq_list_count;
94
95 /* The card status change interrupt -- 0 means autoselect */
96 static int cs_irq;
97
98 /* Poll status interval -- 0 means default to interrupt */
99 static int poll_interval;
100
101 /* Delay for card status double-checking */
102 static int poll_quick = HZ/20;
103
104 /* CCLK external clock time, in nanoseconds.  70 ns = 14.31818 MHz */
105 static int cycle_time = 70;
106
107 module_param(tcic_base, ulong, 0444);
108 module_param(ignore, int, 0444);
109 module_param(do_scan, int, 0444);
110 module_param(irq_mask, int, 0444);
111 module_param_array(irq_list, int, &irq_list_count, 0444);
112 module_param(cs_irq, int, 0444);
113 module_param(poll_interval, int, 0444);
114 module_param(poll_quick, int, 0444);
115 module_param(cycle_time, int, 0444);
116
117 /*====================================================================*/
118
119 static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs);
120 static void tcic_timer(u_long data);
121 static struct pccard_operations tcic_operations;
122
123 struct tcic_socket {
124     u_short     psock;
125     u_char      last_sstat;
126     u_char      id;
127     struct pcmcia_socket        socket;
128 };
129
130 static struct timer_list poll_timer;
131 static int tcic_timer_pending;
132
133 static int sockets;
134 static struct tcic_socket socket_table[2];
135
136 /*====================================================================*/
137
138 /* Trick when selecting interrupts: the TCIC sktirq pin is supposed
139    to map to irq 11, but is coded as 0 or 1 in the irq registers. */
140 #define TCIC_IRQ(x) ((x) ? (((x) == 11) ? 1 : (x)) : 15)
141
142 #ifdef DEBUG_X
143 static u_char tcic_getb(u_char reg)
144 {
145     u_char val = inb(tcic_base+reg);
146     printk(KERN_DEBUG "tcic_getb(%#lx) = %#x\n", tcic_base+reg, val);
147     return val;
148 }
149
150 static u_short tcic_getw(u_char reg)
151 {
152     u_short val = inw(tcic_base+reg);
153     printk(KERN_DEBUG "tcic_getw(%#lx) = %#x\n", tcic_base+reg, val);
154     return val;
155 }
156
157 static void tcic_setb(u_char reg, u_char data)
158 {
159     printk(KERN_DEBUG "tcic_setb(%#lx, %#x)\n", tcic_base+reg, data);
160     outb(data, tcic_base+reg);
161 }
162
163 static void tcic_setw(u_char reg, u_short data)
164 {
165     printk(KERN_DEBUG "tcic_setw(%#lx, %#x)\n", tcic_base+reg, data);
166     outw(data, tcic_base+reg);
167 }
168 #else
169 #define tcic_getb(reg) inb(tcic_base+reg)
170 #define tcic_getw(reg) inw(tcic_base+reg)
171 #define tcic_setb(reg, data) outb(data, tcic_base+reg)
172 #define tcic_setw(reg, data) outw(data, tcic_base+reg)
173 #endif
174
175 static void tcic_setl(u_char reg, u_int data)
176 {
177 #ifdef DEBUG_X
178     printk(KERN_DEBUG "tcic_setl(%#x, %#lx)\n", tcic_base+reg, data);
179 #endif
180     outw(data & 0xffff, tcic_base+reg);
181     outw(data >> 16, tcic_base+reg+2);
182 }
183
184 static u_char tcic_aux_getb(u_short reg)
185 {
186     u_char mode = (tcic_getb(TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
187     tcic_setb(TCIC_MODE, mode);
188     return tcic_getb(TCIC_AUX);
189 }
190
191 static void tcic_aux_setb(u_short reg, u_char data)
192 {
193     u_char mode = (tcic_getb(TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
194     tcic_setb(TCIC_MODE, mode);
195     tcic_setb(TCIC_AUX, data);
196 }
197
198 static u_short tcic_aux_getw(u_short reg)
199 {
200     u_char mode = (tcic_getb(TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
201     tcic_setb(TCIC_MODE, mode);
202     return tcic_getw(TCIC_AUX);
203 }
204
205 static void tcic_aux_setw(u_short reg, u_short data)
206 {
207     u_char mode = (tcic_getb(TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
208     tcic_setb(TCIC_MODE, mode);
209     tcic_setw(TCIC_AUX, data);
210 }
211
212 /*====================================================================*/
213
214 /* Time conversion functions */
215
216 static int to_cycles(int ns)
217 {
218     if (ns < 14)
219         return 0;
220     else
221         return 2*(ns-14)/cycle_time;
222 }
223
224 /*====================================================================*/
225
226 static volatile u_int irq_hits;
227
228 static irqreturn_t __init tcic_irq_count(int irq, void *dev, struct pt_regs *regs)
229 {
230     irq_hits++;
231     return IRQ_HANDLED;
232 }
233
234 static u_int __init try_irq(int irq)
235 {
236     u_short cfg;
237
238     irq_hits = 0;
239     if (request_irq(irq, tcic_irq_count, 0, "irq scan", tcic_irq_count) != 0)
240         return -1;
241     mdelay(10);
242     if (irq_hits) {
243         free_irq(irq, tcic_irq_count);
244         return -1;
245     }
246
247     /* Generate one interrupt */
248     cfg = TCIC_SYSCFG_AUTOBUSY | 0x0a00;
249     tcic_aux_setw(TCIC_AUX_SYSCFG, cfg | TCIC_IRQ(irq));
250     tcic_setb(TCIC_IENA, TCIC_IENA_ERR | TCIC_IENA_CFG_HIGH);
251     tcic_setb(TCIC_ICSR, TCIC_ICSR_ERR | TCIC_ICSR_JAM);
252
253     udelay(1000);
254     free_irq(irq, tcic_irq_count);
255
256     /* Turn off interrupts */
257     tcic_setb(TCIC_IENA, TCIC_IENA_CFG_OFF);
258     while (tcic_getb(TCIC_ICSR))
259         tcic_setb(TCIC_ICSR, TCIC_ICSR_JAM);
260     tcic_aux_setw(TCIC_AUX_SYSCFG, cfg);
261     
262     return (irq_hits != 1);
263 }
264
265 static u_int __init irq_scan(u_int mask0)
266 {
267     u_int mask1;
268     int i;
269
270 #ifdef __alpha__
271 #define PIC 0x4d0
272     /* Don't probe level-triggered interrupts -- reserved for PCI */
273     int level_mask = inb_p(PIC) | (inb_p(PIC+1) << 8);
274     if (level_mask)
275         mask0 &= ~level_mask;
276 #endif
277
278     mask1 = 0;
279     if (do_scan) {
280         for (i = 0; i < 16; i++)
281             if ((mask0 & (1 << i)) && (try_irq(i) == 0))
282                 mask1 |= (1 << i);
283         for (i = 0; i < 16; i++)
284             if ((mask1 & (1 << i)) && (try_irq(i) != 0)) {
285                 mask1 ^= (1 << i);
286             }
287     }
288     
289     if (mask1) {
290         printk("scanned");
291     } else {
292         /* Fallback: just find interrupts that aren't in use */
293         for (i = 0; i < 16; i++)
294             if ((mask0 & (1 << i)) &&
295                 (request_irq(i, tcic_irq_count, 0, "x", tcic_irq_count) == 0)) {
296                 mask1 |= (1 << i);
297                 free_irq(i, tcic_irq_count);
298             }
299         printk("default");
300     }
301     
302     printk(") = ");
303     for (i = 0; i < 16; i++)
304         if (mask1 & (1<<i))
305             printk("%s%d", ((mask1 & ((1<<i)-1)) ? "," : ""), i);
306     printk(" ");
307     
308     return mask1;
309 }
310
311 /*======================================================================
312
313     See if a card is present, powered up, in IO mode, and already
314     bound to a (non-PCMCIA) Linux driver.
315
316     We make an exception for cards that look like serial devices.
317     
318 ======================================================================*/
319
320 static int __init is_active(int s)
321 {
322     u_short scf1, ioctl, base, num;
323     u_char pwr, sstat;
324     u_int addr;
325     
326     tcic_setl(TCIC_ADDR, (s << TCIC_ADDR_SS_SHFT)
327               | TCIC_ADDR_INDREG | TCIC_SCF1(s));
328     scf1 = tcic_getw(TCIC_DATA);
329     pwr = tcic_getb(TCIC_PWR);
330     sstat = tcic_getb(TCIC_SSTAT);
331     addr = TCIC_IWIN(s, 0);
332     tcic_setw(TCIC_ADDR, addr + TCIC_IBASE_X);
333     base = tcic_getw(TCIC_DATA);
334     tcic_setw(TCIC_ADDR, addr + TCIC_ICTL_X);
335     ioctl = tcic_getw(TCIC_DATA);
336
337     if (ioctl & TCIC_ICTL_TINY)
338         num = 1;
339     else {
340         num = (base ^ (base-1));
341         base = base & (base-1);
342     }
343
344     if ((sstat & TCIC_SSTAT_CD) && (pwr & TCIC_PWR_VCC(s)) &&
345         (scf1 & TCIC_SCF1_IOSTS) && (ioctl & TCIC_ICTL_ENA) &&
346         ((base & 0xfeef) != 0x02e8)) {
347         struct resource *res = request_region(base, num, "tcic-2");
348         if (!res) /* region is busy */
349             return 1;
350         release_region(base, num);
351     }
352
353     return 0;
354 }
355
356 /*======================================================================
357
358     This returns the revision code for the specified socket.
359     
360 ======================================================================*/
361
362 static int __init get_tcic_id(void)
363 {
364     u_short id;
365     
366     tcic_aux_setw(TCIC_AUX_TEST, TCIC_TEST_DIAG);
367     id = tcic_aux_getw(TCIC_AUX_ILOCK);
368     id = (id & TCIC_ILOCKTEST_ID_MASK) >> TCIC_ILOCKTEST_ID_SH;
369     tcic_aux_setw(TCIC_AUX_TEST, 0);
370     return id;
371 }
372
373 /*====================================================================*/
374
375 static struct device_driver tcic_driver = {
376         .name = "tcic-pcmcia",
377         .bus = &platform_bus_type,
378         .suspend = pcmcia_socket_dev_suspend,
379         .resume = pcmcia_socket_dev_resume,
380 };
381
382 static struct platform_device tcic_device = {
383         .name = "tcic-pcmcia",
384         .id = 0,
385 };
386
387
388 static int __init init_tcic(void)
389 {
390     int i, sock, ret = 0;
391     u_int mask, scan;
392
393     if (driver_register(&tcic_driver))
394         return -1;
395     
396     printk(KERN_INFO "Databook TCIC-2 PCMCIA probe: ");
397     sock = 0;
398
399     if (!request_region(tcic_base, 16, "tcic-2")) {
400         printk("could not allocate ports,\n ");
401         driver_unregister(&tcic_driver);
402         return -ENODEV;
403     }
404     else {
405         tcic_setw(TCIC_ADDR, 0);
406         if (tcic_getw(TCIC_ADDR) == 0) {
407             tcic_setw(TCIC_ADDR, 0xc3a5);
408             if (tcic_getw(TCIC_ADDR) == 0xc3a5) sock = 2;
409         }
410         if (sock == 0) {
411             /* See if resetting the controller does any good */
412             tcic_setb(TCIC_SCTRL, TCIC_SCTRL_RESET);
413             tcic_setb(TCIC_SCTRL, 0);
414             tcic_setw(TCIC_ADDR, 0);
415             if (tcic_getw(TCIC_ADDR) == 0) {
416                 tcic_setw(TCIC_ADDR, 0xc3a5);
417                 if (tcic_getw(TCIC_ADDR) == 0xc3a5) sock = 2;
418             }
419         }
420     }
421     if (sock == 0) {
422         printk("not found.\n");
423         release_region(tcic_base, 16);
424         driver_unregister(&tcic_driver);
425         return -ENODEV;
426     }
427
428     sockets = 0;
429     for (i = 0; i < sock; i++) {
430         if ((i == ignore) || is_active(i)) continue;
431         socket_table[sockets].psock = i;
432         socket_table[sockets].id = get_tcic_id();
433
434         socket_table[sockets].socket.owner = THIS_MODULE;
435         /* only 16-bit cards, memory windows must be size-aligned */
436         /* No PCI or CardBus support */
437         socket_table[sockets].socket.features = SS_CAP_PCCARD | SS_CAP_MEM_ALIGN;
438         /* irq 14, 11, 10, 7, 6, 5, 4, 3 */
439         socket_table[sockets].socket.irq_mask = 0x4cf8;
440         /* 4K minimum window size */
441         socket_table[sockets].socket.map_size = 0x1000;         
442         sockets++;
443     }
444
445     switch (socket_table[0].id) {
446     case TCIC_ID_DB86082:
447         printk("DB86082"); break;
448     case TCIC_ID_DB86082A:
449         printk("DB86082A"); break;
450     case TCIC_ID_DB86084:
451         printk("DB86084"); break;
452     case TCIC_ID_DB86084A:
453         printk("DB86084A"); break;
454     case TCIC_ID_DB86072:
455         printk("DB86072"); break;
456     case TCIC_ID_DB86184:
457         printk("DB86184"); break;
458     case TCIC_ID_DB86082B:
459         printk("DB86082B"); break;
460     default:
461         printk("Unknown ID 0x%02x", socket_table[0].id);
462     }
463     
464     /* Set up polling */
465     poll_timer.function = &tcic_timer;
466     poll_timer.data = 0;
467     init_timer(&poll_timer);
468
469     /* Build interrupt mask */
470     printk(", %d sockets\n" KERN_INFO "  irq list (", sockets);
471     if (irq_list_count == 0)
472         mask = irq_mask;
473     else
474         for (i = mask = 0; i < irq_list_count; i++)
475             mask |= (1<<irq_list[i]);
476
477     /* irq 14, 11, 10, 7, 6, 5, 4, 3 */
478     mask &= 0x4cf8;
479     /* Scan interrupts */
480     mask = irq_scan(mask);
481     for (i=0;i<sockets;i++)
482             socket_table[i].socket.irq_mask = mask;
483     
484     /* Check for only two interrupts available */
485     scan = (mask & (mask-1));
486     if (((scan & (scan-1)) == 0) && (poll_interval == 0))
487         poll_interval = HZ;
488     
489     if (poll_interval == 0) {
490         /* Avoid irq 12 unless it is explicitly requested */
491         u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
492         for (i = 15; i > 0; i--)
493             if ((cs_mask & (1 << i)) &&
494                 (request_irq(i, tcic_interrupt, 0, "tcic",
495                              tcic_interrupt) == 0))
496                 break;
497         cs_irq = i;
498         if (cs_irq == 0) poll_interval = HZ;
499     }
500     
501     if (socket_table[0].socket.irq_mask & (1 << 11))
502         printk("sktirq is irq 11, ");
503     if (cs_irq != 0)
504         printk("status change on irq %d\n", cs_irq);
505     else
506         printk("polled status, interval = %d ms\n",
507                poll_interval * 1000 / HZ);
508     
509     for (i = 0; i < sockets; i++) {
510         tcic_setw(TCIC_ADDR+2, socket_table[i].psock << TCIC_SS_SHFT);
511         socket_table[i].last_sstat = tcic_getb(TCIC_SSTAT);
512     }
513     
514     /* jump start interrupt handler, if needed */
515     tcic_interrupt(0, NULL, NULL);
516
517     platform_device_register(&tcic_device);
518
519     for (i = 0; i < sockets; i++) {
520             socket_table[i].socket.ops = &tcic_operations;
521             socket_table[i].socket.resource_ops = &pccard_nonstatic_ops;
522             socket_table[i].socket.dev.dev = &tcic_device.dev;
523             ret = pcmcia_register_socket(&socket_table[i].socket);
524             if (ret && i)
525                     pcmcia_unregister_socket(&socket_table[0].socket);
526     }
527     
528     return ret;
529
530     return 0;
531     
532 } /* init_tcic */
533
534 /*====================================================================*/
535
536 static void __exit exit_tcic(void)
537 {
538     int i;
539
540     del_timer_sync(&poll_timer);
541     if (cs_irq != 0) {
542         tcic_aux_setw(TCIC_AUX_SYSCFG, TCIC_SYSCFG_AUTOBUSY|0x0a00);
543         free_irq(cs_irq, tcic_interrupt);
544     }
545     release_region(tcic_base, 16);
546
547     for (i = 0; i < sockets; i++) {
548             pcmcia_unregister_socket(&socket_table[i].socket);      
549     }
550
551     platform_device_unregister(&tcic_device);
552     driver_unregister(&tcic_driver);
553 } /* exit_tcic */
554
555 /*====================================================================*/
556
557 static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs)
558 {
559     int i, quick = 0;
560     u_char latch, sstat;
561     u_short psock;
562     u_int events;
563     static volatile int active = 0;
564
565     if (active) {
566         printk(KERN_NOTICE "tcic: reentered interrupt handler!\n");
567         return IRQ_NONE;
568     } else
569         active = 1;
570
571     debug(2, "tcic_interrupt()\n");
572     
573     for (i = 0; i < sockets; i++) {
574         psock = socket_table[i].psock;
575         tcic_setl(TCIC_ADDR, (psock << TCIC_ADDR_SS_SHFT)
576                   | TCIC_ADDR_INDREG | TCIC_SCF1(psock));
577         sstat = tcic_getb(TCIC_SSTAT);
578         latch = sstat ^ socket_table[psock].last_sstat;
579         socket_table[i].last_sstat = sstat;
580         if (tcic_getb(TCIC_ICSR) & TCIC_ICSR_CDCHG) {
581             tcic_setb(TCIC_ICSR, TCIC_ICSR_CLEAR);
582             quick = 1;
583         }
584         if (latch == 0)
585             continue;
586         events = (latch & TCIC_SSTAT_CD) ? SS_DETECT : 0;
587         events |= (latch & TCIC_SSTAT_WP) ? SS_WRPROT : 0;
588         if (tcic_getw(TCIC_DATA) & TCIC_SCF1_IOSTS) {
589             events |= (latch & TCIC_SSTAT_LBAT1) ? SS_STSCHG : 0;
590         } else {
591             events |= (latch & TCIC_SSTAT_RDY) ? SS_READY : 0;
592             events |= (latch & TCIC_SSTAT_LBAT1) ? SS_BATDEAD : 0;
593             events |= (latch & TCIC_SSTAT_LBAT2) ? SS_BATWARN : 0;
594         }
595         if (events) {
596                 pcmcia_parse_events(&socket_table[i].socket, events);
597         }
598     }
599
600     /* Schedule next poll, if needed */
601     if (((cs_irq == 0) || quick) && (!tcic_timer_pending)) {
602         poll_timer.expires = jiffies + (quick ? poll_quick : poll_interval);
603         add_timer(&poll_timer);
604         tcic_timer_pending = 1;
605     }
606     active = 0;
607     
608     debug(2, "interrupt done\n");
609     return IRQ_HANDLED;
610 } /* tcic_interrupt */
611
612 static void tcic_timer(u_long data)
613 {
614     debug(2, "tcic_timer()\n");
615     tcic_timer_pending = 0;
616     tcic_interrupt(0, NULL, NULL);
617 } /* tcic_timer */
618
619 /*====================================================================*/
620
621 static int tcic_get_status(struct pcmcia_socket *sock, u_int *value)
622 {
623     u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
624     u_char reg;
625
626     tcic_setl(TCIC_ADDR, (psock << TCIC_ADDR_SS_SHFT)
627               | TCIC_ADDR_INDREG | TCIC_SCF1(psock));
628     reg = tcic_getb(TCIC_SSTAT);
629     *value  = (reg & TCIC_SSTAT_CD) ? SS_DETECT : 0;
630     *value |= (reg & TCIC_SSTAT_WP) ? SS_WRPROT : 0;
631     if (tcic_getw(TCIC_DATA) & TCIC_SCF1_IOSTS) {
632         *value |= (reg & TCIC_SSTAT_LBAT1) ? SS_STSCHG : 0;
633     } else {
634         *value |= (reg & TCIC_SSTAT_RDY) ? SS_READY : 0;
635         *value |= (reg & TCIC_SSTAT_LBAT1) ? SS_BATDEAD : 0;
636         *value |= (reg & TCIC_SSTAT_LBAT2) ? SS_BATWARN : 0;
637     }
638     reg = tcic_getb(TCIC_PWR);
639     if (reg & (TCIC_PWR_VCC(psock)|TCIC_PWR_VPP(psock)))
640         *value |= SS_POWERON;
641     debug(1, "GetStatus(%d) = %#2.2x\n", psock, *value);
642     return 0;
643 } /* tcic_get_status */
644   
645 /*====================================================================*/
646
647 static int tcic_get_socket(struct pcmcia_socket *sock, socket_state_t *state)
648 {
649     u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
650     u_char reg;
651     u_short scf1, scf2;
652     
653     tcic_setl(TCIC_ADDR, (psock << TCIC_ADDR_SS_SHFT)
654               | TCIC_ADDR_INDREG | TCIC_SCF1(psock));
655     scf1 = tcic_getw(TCIC_DATA);
656     state->flags = (scf1 & TCIC_SCF1_IOSTS) ? SS_IOCARD : 0;
657     state->flags |= (scf1 & TCIC_SCF1_DMA_MASK) ? SS_DMA_MODE : 0;
658     state->flags |= (scf1 & TCIC_SCF1_SPKR) ? SS_SPKR_ENA : 0;
659     if (tcic_getb(TCIC_SCTRL) & TCIC_SCTRL_ENA)
660         state->flags |= SS_OUTPUT_ENA;
661     state->io_irq = scf1 & TCIC_SCF1_IRQ_MASK;
662     if (state->io_irq == 1) state->io_irq = 11;
663
664     reg = tcic_getb(TCIC_PWR);
665     state->Vcc = state->Vpp = 0;
666     if (reg & TCIC_PWR_VCC(psock)) {
667         if (reg & TCIC_PWR_VPP(psock))
668             state->Vcc = 50;
669         else
670             state->Vcc = state->Vpp = 50;
671     } else {
672         if (reg & TCIC_PWR_VPP(psock)) {
673             state->Vcc = 50;
674             state->Vpp = 120;
675         }
676     }
677     reg = tcic_aux_getb(TCIC_AUX_ILOCK);
678     state->flags |= (reg & TCIC_ILOCK_CRESET) ? SS_RESET : 0;
679
680     /* Card status change interrupt mask */
681     tcic_setw(TCIC_ADDR, TCIC_SCF2(psock));
682     scf2 = tcic_getw(TCIC_DATA);
683     state->csc_mask = (scf2 & TCIC_SCF2_MCD) ? 0 : SS_DETECT;
684     if (state->flags & SS_IOCARD) {
685         state->csc_mask |= (scf2 & TCIC_SCF2_MLBAT1) ? 0 : SS_STSCHG;
686     } else {
687         state->csc_mask |= (scf2 & TCIC_SCF2_MLBAT1) ? 0 : SS_BATDEAD;
688         state->csc_mask |= (scf2 & TCIC_SCF2_MLBAT2) ? 0 : SS_BATWARN;
689         state->csc_mask |= (scf2 & TCIC_SCF2_MRDY) ? 0 : SS_READY;
690     }
691
692     debug(1, "GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
693           "io_irq %d, csc_mask %#2.2x\n", psock, state->flags,
694           state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
695     return 0;
696 } /* tcic_get_socket */
697
698 /*====================================================================*/
699
700 static int tcic_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
701 {
702     u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
703     u_char reg;
704     u_short scf1, scf2;
705
706     debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
707           "io_irq %d, csc_mask %#2.2x)\n", psock, state->flags,
708           state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
709     tcic_setw(TCIC_ADDR+2, (psock << TCIC_SS_SHFT) | TCIC_ADR2_INDREG);
710
711     reg = tcic_getb(TCIC_PWR);
712     reg &= ~(TCIC_PWR_VCC(psock) | TCIC_PWR_VPP(psock));
713
714     if (state->Vcc == 50) {
715         switch (state->Vpp) {
716         case 0:   reg |= TCIC_PWR_VCC(psock) | TCIC_PWR_VPP(psock); break;
717         case 50:  reg |= TCIC_PWR_VCC(psock); break;
718         case 120: reg |= TCIC_PWR_VPP(psock); break;
719         default:  return -EINVAL;
720         }
721     } else if (state->Vcc != 0)
722         return -EINVAL;
723
724     if (reg != tcic_getb(TCIC_PWR))
725         tcic_setb(TCIC_PWR, reg);
726
727     reg = TCIC_ILOCK_HOLD_CCLK | TCIC_ILOCK_CWAIT;
728     if (state->flags & SS_OUTPUT_ENA) {
729         tcic_setb(TCIC_SCTRL, TCIC_SCTRL_ENA);
730         reg |= TCIC_ILOCK_CRESENA;
731     } else
732         tcic_setb(TCIC_SCTRL, 0);
733     if (state->flags & SS_RESET)
734         reg |= TCIC_ILOCK_CRESET;
735     tcic_aux_setb(TCIC_AUX_ILOCK, reg);
736     
737     tcic_setw(TCIC_ADDR, TCIC_SCF1(psock));
738     scf1 = TCIC_SCF1_FINPACK;
739     scf1 |= TCIC_IRQ(state->io_irq);
740     if (state->flags & SS_IOCARD) {
741         scf1 |= TCIC_SCF1_IOSTS;
742         if (state->flags & SS_SPKR_ENA)
743             scf1 |= TCIC_SCF1_SPKR;
744         if (state->flags & SS_DMA_MODE)
745             scf1 |= TCIC_SCF1_DREQ2 << TCIC_SCF1_DMA_SHIFT;
746     }
747     tcic_setw(TCIC_DATA, scf1);
748
749     /* Some general setup stuff, and configure status interrupt */
750     reg = TCIC_WAIT_ASYNC | TCIC_WAIT_SENSE | to_cycles(250);
751     tcic_aux_setb(TCIC_AUX_WCTL, reg);
752     tcic_aux_setw(TCIC_AUX_SYSCFG, TCIC_SYSCFG_AUTOBUSY|0x0a00|
753                   TCIC_IRQ(cs_irq));
754     
755     /* Card status change interrupt mask */
756     tcic_setw(TCIC_ADDR, TCIC_SCF2(psock));
757     scf2 = TCIC_SCF2_MALL;
758     if (state->csc_mask & SS_DETECT) scf2 &= ~TCIC_SCF2_MCD;
759     if (state->flags & SS_IOCARD) {
760         if (state->csc_mask & SS_STSCHG) reg &= ~TCIC_SCF2_MLBAT1;
761     } else {
762         if (state->csc_mask & SS_BATDEAD) reg &= ~TCIC_SCF2_MLBAT1;
763         if (state->csc_mask & SS_BATWARN) reg &= ~TCIC_SCF2_MLBAT2;
764         if (state->csc_mask & SS_READY) reg &= ~TCIC_SCF2_MRDY;
765     }
766     tcic_setw(TCIC_DATA, scf2);
767     /* For the ISA bus, the irq should be active-high totem-pole */
768     tcic_setb(TCIC_IENA, TCIC_IENA_CDCHG | TCIC_IENA_CFG_HIGH);
769
770     return 0;
771 } /* tcic_set_socket */
772   
773 /*====================================================================*/
774
775 static int tcic_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
776 {
777     u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
778     u_int addr;
779     u_short base, len, ioctl;
780     
781     debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, "
782           "%#lx-%#lx)\n", psock, io->map, io->flags,
783           io->speed, io->start, io->stop);
784     if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
785         (io->stop < io->start)) return -EINVAL;
786     tcic_setw(TCIC_ADDR+2, TCIC_ADR2_INDREG | (psock << TCIC_SS_SHFT));
787     addr = TCIC_IWIN(psock, io->map);
788
789     base = io->start; len = io->stop - io->start;
790     /* Check to see that len+1 is power of two, etc */
791     if ((len & (len+1)) || (base & len)) return -EINVAL;
792     base |= (len+1)>>1;
793     tcic_setw(TCIC_ADDR, addr + TCIC_IBASE_X);
794     tcic_setw(TCIC_DATA, base);
795     
796     ioctl  = (psock << TCIC_ICTL_SS_SHFT);
797     ioctl |= (len == 0) ? TCIC_ICTL_TINY : 0;
798     ioctl |= (io->flags & MAP_ACTIVE) ? TCIC_ICTL_ENA : 0;
799     ioctl |= to_cycles(io->speed) & TCIC_ICTL_WSCNT_MASK;
800     if (!(io->flags & MAP_AUTOSZ)) {
801         ioctl |= TCIC_ICTL_QUIET;
802         ioctl |= (io->flags & MAP_16BIT) ? TCIC_ICTL_BW_16 : TCIC_ICTL_BW_8;
803     }
804     tcic_setw(TCIC_ADDR, addr + TCIC_ICTL_X);
805     tcic_setw(TCIC_DATA, ioctl);
806     
807     return 0;
808 } /* tcic_set_io_map */
809
810 /*====================================================================*/
811
812 static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *mem)
813 {
814     u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
815     u_short addr, ctl;
816     u_long base, len, mmap;
817
818     debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, "
819           "%#lx-%#lx, %#x)\n", psock, mem->map, mem->flags,
820           mem->speed, mem->res->start, mem->res->end, mem->card_start);
821     if ((mem->map > 3) || (mem->card_start > 0x3ffffff) ||
822         (mem->res->start > 0xffffff) || (mem->res->end > 0xffffff) ||
823         (mem->res->start > mem->res->end) || (mem->speed > 1000))
824         return -EINVAL;
825     tcic_setw(TCIC_ADDR+2, TCIC_ADR2_INDREG | (psock << TCIC_SS_SHFT));
826     addr = TCIC_MWIN(psock, mem->map);
827
828     base = mem->res->start; len = mem->res->end - mem->res->start;
829     if ((len & (len+1)) || (base & len)) return -EINVAL;
830     if (len == 0x0fff)
831         base = (base >> TCIC_MBASE_HA_SHFT) | TCIC_MBASE_4K_BIT;
832     else
833         base = (base | (len+1)>>1) >> TCIC_MBASE_HA_SHFT;
834     tcic_setw(TCIC_ADDR, addr + TCIC_MBASE_X);
835     tcic_setw(TCIC_DATA, base);
836     
837     mmap = mem->card_start - mem->res->start;
838     mmap = (mmap >> TCIC_MMAP_CA_SHFT) & TCIC_MMAP_CA_MASK;
839     if (mem->flags & MAP_ATTRIB) mmap |= TCIC_MMAP_REG;
840     tcic_setw(TCIC_ADDR, addr + TCIC_MMAP_X);
841     tcic_setw(TCIC_DATA, mmap);
842
843     ctl  = TCIC_MCTL_QUIET | (psock << TCIC_MCTL_SS_SHFT);
844     ctl |= to_cycles(mem->speed) & TCIC_MCTL_WSCNT_MASK;
845     ctl |= (mem->flags & MAP_16BIT) ? 0 : TCIC_MCTL_B8;
846     ctl |= (mem->flags & MAP_WRPROT) ? TCIC_MCTL_WP : 0;
847     ctl |= (mem->flags & MAP_ACTIVE) ? TCIC_MCTL_ENA : 0;
848     tcic_setw(TCIC_ADDR, addr + TCIC_MCTL_X);
849     tcic_setw(TCIC_DATA, ctl);
850     
851     return 0;
852 } /* tcic_set_mem_map */
853
854 /*====================================================================*/
855
856 static int tcic_init(struct pcmcia_socket *s)
857 {
858         int i;
859         struct resource res = { .start = 0, .end = 0x1000 };
860         pccard_io_map io = { 0, 0, 0, 0, 1 };
861         pccard_mem_map mem = { .res = &res, };
862
863         for (i = 0; i < 2; i++) {
864                 io.map = i;
865                 tcic_set_io_map(s, &io);
866         }
867         for (i = 0; i < 5; i++) {
868                 mem.map = i;
869                 tcic_set_mem_map(s, &mem);
870         }
871         return 0;
872 }
873
874 static struct pccard_operations tcic_operations = {
875         .init              = tcic_init,
876         .get_status        = tcic_get_status,
877         .get_socket        = tcic_get_socket,
878         .set_socket        = tcic_set_socket,
879         .set_io_map        = tcic_set_io_map,
880         .set_mem_map       = tcic_set_mem_map,
881 };
882
883 /*====================================================================*/
884
885 module_init(init_tcic);
886 module_exit(exit_tcic);