|
|
1.1 root 1: /*======================================================================
2:
3: Device driver for Intel 82365 and compatible PC Card controllers,
4: and Yenta-compatible PCI-to-CardBus controllers.
5:
6: i82365.c 1.358 2003/09/13 17:34:01
7:
8: The contents of this file are subject to the Mozilla Public
9: License Version 1.1 (the "License"); you may not use this file
10: except in compliance with the License. You may obtain a copy of
11: the License at http://www.mozilla.org/MPL/
12:
13: Software distributed under the License is distributed on an "AS
14: IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
15: implied. See the License for the specific language governing
16: rights and limitations under the License.
17:
18: The initial developer of the original code is David A. Hinds
19: <[email protected]>. Portions created by David A. Hinds
20: are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
21:
22: Alternatively, the contents of this file may be used under the
23: terms of the GNU General Public License version 2 (the "GPL"), in
24: which case the provisions of the GPL are applicable instead of the
25: above. If you wish to allow the use of your version of this file
26: only under the terms of the GPL and not to allow others to use
27: your version of this file under the MPL, indicate your decision
28: by deleting the provisions above and replace them with the notice
29: and other provisions required by the GPL. If you do not delete
30: the provisions above, a recipient may use your version of this
31: file under either the MPL or the GPL.
32:
33: ======================================================================*/
34:
35: #include <linux/module.h>
36: #include <linux/init.h>
37: #include <linux/config.h>
38: #include <linux/types.h>
39: #include <linux/fcntl.h>
40: #include <linux/string.h>
41: #include <linux/kernel.h>
42: #include <linux/errno.h>
43: #include <linux/timer.h>
44: #include <linux/sched.h>
45: #include <linux/slab.h>
46: #include <linux/pci.h>
47: #include <linux/ioport.h>
48: #include <linux/delay.h>
49: #include <linux/proc_fs.h>
50: #include <linux/spinlock.h>
51: #include <asm/irq.h>
52: #include <asm/io.h>
53: #include <asm/bitops.h>
54: #include <asm/system.h>
55:
56: #include <pcmcia/version.h>
57: #include <pcmcia/cs_types.h>
58: #include <pcmcia/ss.h>
59: #include <pcmcia/cs.h>
60:
61: /* ISA-bus controllers */
62: #include "i82365.h"
63: #include "cirrus.h"
64: #include "vg468.h"
65: #include "ricoh.h"
66: #include "o2micro.h"
67:
68: /* PCI-bus controllers */
69: #include "yenta.h"
70: #include "ti113x.h"
71: #include "smc34c90.h"
72: #include "topic.h"
73: #include "ene.h"
74:
75: /*====================================================================*/
76:
77: /* Module parameters */
78:
79: MODULE_AUTHOR("David Hinds <[email protected]>");
80: MODULE_DESCRIPTION("Intel ExCA/Yenta PCMCIA socket driver");
81: MODULE_LICENSE("Dual MPL/GPL");
82:
83: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
84:
85: /* General options */
86: INT_MODULE_PARM(poll_interval, 0); /* in ticks, 0 means never */
87: INT_MODULE_PARM(cycle_time, 120); /* in ns, 120 ns = 8.33 MHz */
88: INT_MODULE_PARM(do_scan, 1); /* Probe free interrupts? */
89:
90: /* Cirrus options */
91: INT_MODULE_PARM(has_dma, -1);
92: INT_MODULE_PARM(has_led, -1);
93: INT_MODULE_PARM(has_ring, -1);
94: INT_MODULE_PARM(has_vsense, 0);
95: INT_MODULE_PARM(dynamic_mode, 0);
96: INT_MODULE_PARM(freq_bypass, -1);
97: INT_MODULE_PARM(setup_time, -1);
98: INT_MODULE_PARM(cmd_time, -1);
99: INT_MODULE_PARM(recov_time, -1);
100:
101: #ifdef CONFIG_ISA
102: INT_MODULE_PARM(i365_base, 0x3e0); /* IO address for probes */
103: INT_MODULE_PARM(extra_sockets, 0); /* Probe at i365_base+2? */
104: INT_MODULE_PARM(ignore, -1); /* Ignore this socket # */
105: INT_MODULE_PARM(cs_irq, 0); /* card status irq */
106: INT_MODULE_PARM(irq_mask, 0xffff); /* bit map of irq's to use */
107: static int irq_list[16] = { -1 };
108: MODULE_PARM(irq_list, "1-16i");
109: INT_MODULE_PARM(async_clock, -1); /* Vadem specific */
110: INT_MODULE_PARM(cable_mode, -1);
111: INT_MODULE_PARM(wakeup, 0); /* Cirrus specific */
112: #endif
113:
114: #ifdef CONFIG_PCI
115: static int pci_irq_list[8] = { 0 }; /* PCI interrupt assignments */
116: MODULE_PARM(pci_irq_list, "1-8i");
117: INT_MODULE_PARM(do_pci_probe, 1); /* Scan for PCI bridges? */
118: INT_MODULE_PARM(fast_pci, -1);
119: INT_MODULE_PARM(cb_write_post, -1);
120: INT_MODULE_PARM(irq_mode, -1); /* Override BIOS routing? */
121: INT_MODULE_PARM(hold_time, -1); /* Ricoh specific */
122: INT_MODULE_PARM(p2cclk, -1); /* TI specific */
123: #endif
124:
125: #if defined(CONFIG_ISA) && defined(CONFIG_PCI)
126: INT_MODULE_PARM(pci_csc, 1); /* PCI card status irqs? */
127: INT_MODULE_PARM(pci_int, 1); /* PCI IO card irqs? */
128: #elif defined(CONFIG_ISA) && !defined(CONFIG_PCI)
129: #define pci_csc 0
130: #define pci_int 0
131: #elif !defined(CONFIG_ISA) && defined(CONFIG_PCI)
132: #define pci_csc 0
133: #define pci_int 1 /* We must use PCI irq's */
134: #else
135: #error "No bus architectures defined!"
136: #endif
137:
138: #ifdef PCMCIA_DEBUG
139: INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
140: #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
141: static const char *version =
142: "i82365.c 1.358 2003/09/13 17:34:01 (David Hinds)";
143: #else
144: #define DEBUG(n, args...) do { } while (0)
145: #endif
146:
147: /*====================================================================*/
148:
149: typedef struct socket_info_t {
150: u_short type, flags;
151: socket_cap_t cap;
152: ioaddr_t ioaddr;
153: u_short psock;
154: u_char cs_irq, intr;
155: void (*handler)(void *info, u_int events);
156: void *info;
157: #ifdef HAS_PROC_BUS
158: struct proc_dir_entry *proc;
159: #endif
160: u_char pci_irq_code;
161: #ifdef CONFIG_PCI
162: u_short vendor, device;
163: u_char revision, bus, devfn;
164: u_short bcr;
165: u_char pci_lat, cb_lat, sub_bus, cache;
166: u_int cb_phys;
167: char *cb_virt;
168: #endif
169: union {
170: cirrus_state_t cirrus;
171: vg46x_state_t vg46x;
172: o2micro_state_t o2micro;
173: ti113x_state_t ti113x;
174: ricoh_state_t ricoh;
175: topic_state_t topic;
176: } state;
177: } socket_info_t;
178:
179: /* Where we keep track of our sockets... */
180: static int sockets = 0;
181: static socket_info_t socket[8] = {
182: { 0, }, /* ... */
183: };
184:
185: #ifdef CONFIG_ISA
186: static int grab_irq;
187: #ifdef __SMP__
188: static spinlock_t isa_lock = SPIN_LOCK_UNLOCKED;
189: #endif
190: #define ISA_LOCK(s, f) \
191: if (!((s)->flags & IS_CARDBUS)) spin_lock_irqsave(&isa_lock, f)
192: #define ISA_UNLOCK(n, f) \
193: if (!((s)->flags & IS_CARDBUS)) spin_unlock_irqrestore(&isa_lock, f)
194: #else
195: #define ISA_LOCK(n, f) do { } while (0)
196: #define ISA_UNLOCK(n, f) do { } while (0)
197: #endif
198:
199: static void pcic_interrupt_wrapper(u_long data);
200: static struct timer_list poll_timer = {
201: function: pcic_interrupt_wrapper
202: };
203:
204: #define flip(v,b,f) (v = ((f)<0) ? v : ((f) ? ((v)|(b)) : ((v)&(~b))))
205:
206: /*====================================================================*/
207:
208: /* Some PCI shortcuts */
209:
210: #ifdef CONFIG_PCI
211: static int pci_readb(socket_info_t *s, int r, u_char *v)
212: { return pcibios_read_config_byte(s->bus, s->devfn, r, v); }
213: static int pci_writeb(socket_info_t *s, int r, u_char v)
214: { return pcibios_write_config_byte(s->bus, s->devfn, r, v); }
215: static int pci_readw(socket_info_t *s, int r, u_short *v)
216: { return pcibios_read_config_word(s->bus, s->devfn, r, v); }
217: static int pci_writew(socket_info_t *s, int r, u_short v)
218: { return pcibios_write_config_word(s->bus, s->devfn, r, v); }
219: static int pci_readl(socket_info_t *s, int r, u_int *v)
220: { return pcibios_read_config_dword(s->bus, s->devfn, r, v); }
221: static int pci_writel(socket_info_t *s, int r, u_int v)
222: { return pcibios_write_config_dword(s->bus, s->devfn, r, v); }
223: #endif
224:
225: #define cb_readb(s, r) readb((s)->cb_virt + (r))
226: #define cb_readl(s, r) readl((s)->cb_virt + (r))
227: #define cb_writeb(s, r, v) writeb(v, (s)->cb_virt + (r))
228: #define cb_writel(s, r, v) writel(v, (s)->cb_virt + (r))
229:
230: /*====================================================================*/
231:
232: /* These definitions must match the pcic table! */
233: typedef enum pcic_id {
234: #ifdef CONFIG_ISA
235: IS_I82365A, IS_I82365B, IS_I82365DF, IS_IBM, IS_RF5Cx96,
236: IS_VLSI, IS_VG468, IS_VG469, IS_PD6710, IS_PD672X, IS_VT83C469,
237: #endif
238: #ifdef CONFIG_PCI
239: IS_I82092AA, IS_OM82C092G, CIRRUS_PCIC_ID, O2MICRO_PCIC_ID,
240: RICOH_PCIC_ID, SMC_PCIC_ID, TI_PCIC_ID, ENE_PCIC_ID,
241: TOPIC_PCIC_ID, IS_UNK_PCI, IS_UNK_CARDBUS
242: #endif
243: } pcic_id;
244:
245: /* Flags for classifying groups of controllers */
246: #define IS_VADEM 0x0001
247: #define IS_CIRRUS 0x0002
248: #define IS_TI 0x0004
249: #define IS_O2MICRO 0x0008
250: #define IS_TOPIC 0x0020
251: #define IS_RICOH 0x0040
252: #define IS_UNKNOWN 0x0400
253: #define IS_VG_PWR 0x0800
254: #define IS_DF_PWR 0x1000
255: #define IS_PCI 0x2000
256: #define IS_CARDBUS 0x4000
257: #define IS_ALIVE 0x8000
258:
259: typedef struct pcic_t {
260: char *name;
261: u_short flags;
262: #ifdef CONFIG_PCI
263: u_short vendor, device;
264: #endif
265: } pcic_t;
266:
267: #define ID(a,b) PCI_VENDOR_ID_##a,PCI_DEVICE_ID_##a##_##b
268:
269: static pcic_t pcic[] = {
270: #ifdef CONFIG_ISA
271: { "Intel i82365sl A step", 0 },
272: { "Intel i82365sl B step", 0 },
273: { "Intel i82365sl DF", IS_DF_PWR },
274: { "IBM Clone", 0 },
275: { "Ricoh RF5C296/396", 0 },
276: { "VLSI 82C146", 0 },
277: { "Vadem VG-468", IS_VADEM },
278: { "Vadem VG-469", IS_VADEM|IS_VG_PWR },
279: { "Cirrus PD6710", IS_CIRRUS },
280: { "Cirrus PD672x", IS_CIRRUS },
281: { "VIA VT83C469", IS_CIRRUS },
282: #endif
283: #ifdef CONFIG_PCI
284: { "Intel 82092AA", IS_PCI, ID(INTEL, 82092AA_0) },
285: { "Omega Micro 82C092G", IS_PCI, ID(OMEGA, 82C092G) },
286: CIRRUS_PCIC_INFO, O2MICRO_PCIC_INFO, RICOH_PCIC_INFO,
287: SMC_PCIC_INFO, TI_PCIC_INFO, ENE_PCIC_INFO, TOPIC_PCIC_INFO,
288: { "Unknown", IS_PCI|IS_UNKNOWN, 0, 0 },
289: { "Unknown", IS_CARDBUS|IS_UNKNOWN, 0, 0 }
290: #endif
291: };
292:
293: #define PCIC_COUNT (sizeof(pcic)/sizeof(pcic_t))
294:
295: /*====================================================================*/
296:
297: static u_char i365_get(socket_info_t *s, u_short reg)
298: {
299: #ifdef CONFIG_PCI
300: if (s->cb_virt)
301: return cb_readb(s, 0x0800 + reg);
302: #endif
303: outb(I365_REG(s->psock, reg), s->ioaddr);
304: return inb(s->ioaddr+1);
305: }
306:
307: static void i365_set(socket_info_t *s, u_short reg, u_char data)
308: {
309: #ifdef CONFIG_PCI
310: if (s->cb_virt) {
311: cb_writeb(s, 0x0800 + reg, data);
312: return;
313: }
314: #endif
315: outb(I365_REG(s->psock, reg), s->ioaddr);
316: outb(data, s->ioaddr+1);
317: }
318:
319: static void i365_bset(socket_info_t *s, u_short reg, u_char mask)
320: {
321: i365_set(s, reg, i365_get(s, reg) | mask);
322: }
323:
324: static void i365_bclr(socket_info_t *s, u_short reg, u_char mask)
325: {
326: i365_set(s, reg, i365_get(s, reg) & ~mask);
327: }
328:
329: static void i365_bflip(socket_info_t *s, u_short reg, u_char mask, int b)
330: {
331: u_char d = i365_get(s, reg);
332: i365_set(s, reg, (b) ? (d | mask) : (d & ~mask));
333: }
334:
335: static u_short i365_get_pair(socket_info_t *s, u_short reg)
336: {
337: return (i365_get(s, reg) + (i365_get(s, reg+1) << 8));
338: }
339:
340: static void i365_set_pair(socket_info_t *s, u_short reg, u_short data)
341: {
342: i365_set(s, reg, data & 0xff);
343: i365_set(s, reg+1, data >> 8);
344: }
345:
346: /*======================================================================
347:
348: Code to save and restore global state information for Cirrus
349: PD67xx controllers, and to set and report global configuration
350: options.
351:
352: The VIA controllers also use these routines, as they are mostly
353: Cirrus lookalikes, without the timing registers.
354:
355: ======================================================================*/
356:
357: #ifdef CONFIG_PCI
358:
359: static int __init get_pci_irq(socket_info_t *s)
360: {
361: u8 irq = pci_irq_list[s - socket];
362: if (!irq)
363: irq = pci_find_slot(s->bus, s->devfn)->irq;
364: if (irq >= NR_IRQS) irq = 0;
365: s->cap.pci_irq = irq;
366: return irq;
367: }
368:
369: #endif
370:
371: static void __init cirrus_get_state(socket_info_t *s)
372: {
373: cirrus_state_t *p = &s->state.cirrus;
374: int i;
375:
376: p->misc1 = i365_get(s, PD67_MISC_CTL_1);
377: p->misc1 &= (PD67_MC1_MEDIA_ENA | PD67_MC1_INPACK_ENA);
378: p->misc2 = i365_get(s, PD67_MISC_CTL_2);
379: if (s->flags & IS_PCI)
380: p->ectl1 = pd67_ext_get(s, PD67_EXT_CTL_1);
381: for (i = 0; i < 6; i++)
382: p->timer[i] = i365_get(s, PD67_TIME_SETUP(0)+i);
383: }
384:
385: static void cirrus_set_state(socket_info_t *s)
386: {
387: cirrus_state_t *p = &s->state.cirrus;
388: u_char misc;
389: int i;
390:
391: misc = i365_get(s, PD67_MISC_CTL_2);
392: i365_set(s, PD67_MISC_CTL_2, p->misc2);
393: if (misc & PD67_MC2_SUSPEND) mdelay(50);
394: misc = i365_get(s, PD67_MISC_CTL_1);
395: misc &= ~(PD67_MC1_MEDIA_ENA | PD67_MC1_INPACK_ENA);
396: i365_set(s, PD67_MISC_CTL_1, misc | p->misc1);
397: if (s->flags & IS_PCI)
398: pd67_ext_set(s, PD67_EXT_CTL_1, p->ectl1);
399: else if (has_vsense) {
400: socket_info_t *t = (s->psock) ? s : s+1;
401: pd67_ext_set(t, PD67_EXT_CTL_2, PD67_EC2_GPSTB_IOR);
402: }
403: for (i = 0; i < 6; i++)
404: i365_set(s, PD67_TIME_SETUP(0)+i, p->timer[i]);
405: }
406:
407: #ifdef CONFIG_PCI
408: static int cirrus_set_irq_mode(socket_info_t *s, int pcsc, int pint)
409: {
410: flip(s->bcr, PD6832_BCR_MGMT_IRQ_ENA, !pcsc);
411: return 0;
412: }
413: #endif
414:
415: static u_int __init cirrus_set_opts(socket_info_t *s, char *buf)
416: {
417: cirrus_state_t *p = &s->state.cirrus;
418: u_int mask = 0xffff;
419:
420: p->misc1 |= PD67_MC1_SPKR_ENA;
421: if (has_ring == -1) has_ring = 1;
422: flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring);
423: flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode);
424: if (p->misc2 & PD67_MC2_IRQ15_RI)
425: strcat(buf, " [ring]");
426: if (p->misc2 & PD67_MC2_DYNAMIC_MODE)
427: strcat(buf, " [dyn mode]");
428: if (p->misc1 & PD67_MC1_INPACK_ENA)
429: strcat(buf, " [inpack]");
430: if (!(s->flags & (IS_PCI|IS_CARDBUS))) {
431: flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
432: if (p->misc2 & PD67_MC2_FREQ_BYPASS)
433: strcat(buf, " [freq bypass]");
434: if (p->misc2 & PD67_MC2_IRQ15_RI)
435: mask &= ~0x8000;
436: if (has_led > 0) {
437: strcat(buf, " [led]");
438: mask &= ~0x1000;
439: }
440: if (has_dma > 0) {
441: strcat(buf, " [dma]");
442: mask &= ~0x0600;
443: }
444: #ifdef CONFIG_PCI
445: } else {
446: p->misc1 &= ~PD67_MC1_MEDIA_ENA;
447: p->misc1 &= ~(PD67_MC1_PULSE_MGMT | PD67_MC1_PULSE_IRQ);
448: p->ectl1 &= ~(PD67_EC1_INV_MGMT_IRQ | PD67_EC1_INV_CARD_IRQ);
449: flip(p->misc2, PD67_MC2_FAST_PCI, fast_pci);
450: if (p->misc2 & PD67_MC2_IRQ15_RI)
451: mask &= (s->type == IS_PD6730) ? ~0x0400 : ~0x8000;
452: if ((s->flags & IS_PCI) && (irq_mode == 1) && get_pci_irq(s)) {
453: /* Configure PD6729 bridge for PCI interrupts */
454: p->ectl1 |= PD67_EC1_INV_MGMT_IRQ | PD67_EC1_INV_CARD_IRQ;
455: s->pci_irq_code = 3; /* PCI INTA = "irq 3" */
456: buf += strlen(buf);
457: sprintf(buf, " [pci irq %d]", s->cap.pci_irq);
458: mask = 0;
459: }
460: #endif
461: }
462: #ifdef CONFIG_ISA
463: if (s->type != IS_VT83C469)
464: #endif
465: {
466: if (setup_time >= 0)
467: p->timer[0] = p->timer[3] = setup_time;
468: if (cmd_time > 0) {
469: p->timer[1] = cmd_time;
470: p->timer[4] = cmd_time*2+4;
471: }
472: if (p->timer[1] == 0) {
473: p->timer[1] = 6; p->timer[4] = 16;
474: if (p->timer[0] == 0)
475: p->timer[0] = p->timer[3] = 1;
476: }
477: if (recov_time >= 0)
478: p->timer[2] = p->timer[5] = recov_time;
479: buf += strlen(buf);
480: sprintf(buf, " [%d/%d/%d] [%d/%d/%d]", p->timer[0], p->timer[1],
481: p->timer[2], p->timer[3], p->timer[4], p->timer[5]);
482: }
483: return mask;
484: }
485:
486: /*======================================================================
487:
488: Code to save and restore global state information for Vadem VG468
489: and VG469 controllers, and to set and report global configuration
490: options.
491:
492: ======================================================================*/
493:
494: #ifdef CONFIG_ISA
495:
496: static void __init vg46x_get_state(socket_info_t *s)
497: {
498: vg46x_state_t *p = &s->state.vg46x;
499: p->ctl = i365_get(s, VG468_CTL);
500: if (s->type == IS_VG469)
501: p->ema = i365_get(s, VG469_EXT_MODE);
502: }
503:
504: static void vg46x_set_state(socket_info_t *s)
505: {
506: vg46x_state_t *p = &s->state.vg46x;
507: i365_set(s, VG468_CTL, p->ctl);
508: if (s->type == IS_VG469)
509: i365_set(s, VG469_EXT_MODE, p->ema);
510: }
511:
512: static u_int __init vg46x_set_opts(socket_info_t *s, char *buf)
513: {
514: vg46x_state_t *p = &s->state.vg46x;
515:
516: flip(p->ctl, VG468_CTL_ASYNC, async_clock);
517: flip(p->ema, VG469_MODE_CABLE, cable_mode);
518: if (p->ctl & VG468_CTL_ASYNC)
519: strcat(buf, " [async]");
520: if (p->ctl & VG468_CTL_INPACK)
521: strcat(buf, " [inpack]");
522: if (s->type == IS_VG469) {
523: u_char vsel = i365_get(s, VG469_VSELECT);
524: if (vsel & VG469_VSEL_EXT_STAT) {
525: strcat(buf, " [ext mode]");
526: if (vsel & VG469_VSEL_EXT_BUS)
527: strcat(buf, " [isa buf]");
528: }
529: if (p->ema & VG469_MODE_CABLE)
530: strcat(buf, " [cable]");
531: if (p->ema & VG469_MODE_COMPAT)
532: strcat(buf, " [c step]");
533: }
534: return 0xffff;
535: }
536:
537: #endif
538:
539: /*======================================================================
540:
541: Code to save and restore global state information for TI 1130 and
542: TI 1131 controllers, and to set and report global configuration
543: options.
544:
545: ======================================================================*/
546:
547: #ifdef CONFIG_PCI
548:
549: static void __init ti113x_get_state(socket_info_t *s)
550: {
551: ti113x_state_t *p = &s->state.ti113x;
552: pci_readl(s, TI113X_SYSTEM_CONTROL, &p->sysctl);
553: pci_readb(s, TI113X_CARD_CONTROL, &p->cardctl);
554: pci_readb(s, TI113X_DEVICE_CONTROL, &p->devctl);
555: pci_readb(s, TI1250_DIAGNOSTIC, &p->diag);
556: pci_readl(s, TI12XX_IRQMUX, &p->irqmux);
557: }
558:
559: static void ti113x_set_state(socket_info_t *s)
560: {
561: ti113x_state_t *p = &s->state.ti113x;
562: pci_writel(s, TI113X_SYSTEM_CONTROL, p->sysctl);
563: pci_writeb(s, TI113X_CARD_CONTROL, p->cardctl);
564: pci_writeb(s, TI113X_DEVICE_CONTROL, p->devctl);
565: pci_writeb(s, TI1250_MULTIMEDIA_CTL, 0);
566: pci_writeb(s, TI1250_DIAGNOSTIC, p->diag);
567: pci_writel(s, TI12XX_IRQMUX, p->irqmux);
568: i365_set_pair(s, TI113X_IO_OFFSET(0), 0);
569: i365_set_pair(s, TI113X_IO_OFFSET(1), 0);
570: }
571:
572: static int ti113x_set_irq_mode(socket_info_t *s, int pcsc, int pint)
573: {
574: ti113x_state_t *p = &s->state.ti113x;
575: s->intr = (pcsc) ? I365_INTR_ENA : 0;
576: if (s->type <= IS_TI1131) {
577: p->cardctl &= ~(TI113X_CCR_PCI_IRQ_ENA |
578: TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC);
579: if (pcsc)
580: p->cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC;
581: if (pint)
582: p->cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ;
583: } else if (s->type == IS_TI1250A) {
584: p->diag &= TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ;
585: if (pcsc)
586: p->diag |= TI1250_DIAG_PCI_CSC;
587: if (pint)
588: p->diag |= TI1250_DIAG_PCI_IREQ;
589: }
590: return 0;
591: }
592:
593: static u_int __init ti113x_set_opts(socket_info_t *s, char *buf)
594: {
595: ti113x_state_t *p = &s->state.ti113x;
596: u_int mask = 0xffff;
597: int old = (s->type <= IS_TI1131);
598:
599: flip(p->cardctl, TI113X_CCR_RIENB, has_ring);
600: p->cardctl &= ~TI113X_CCR_ZVENABLE;
601: p->cardctl |= TI113X_CCR_SPKROUTEN;
602: if (!old) flip(p->sysctl, TI122X_SCR_P2CCLK, p2cclk);
603: switch (irq_mode) {
604: case 0:
605: p->devctl &= ~TI113X_DCR_IMODE_MASK;
606: p->irqmux = (p->irqmux & ~0x0f) | 0x02; /* route INTA */
607: if (!(p->sysctl & TI122X_SCR_INTRTIE))
608: p->irqmux = (p->irqmux & ~0xf0) | 0x20; /* route INTB */
609: break;
610: case 1:
611: p->devctl &= ~TI113X_DCR_IMODE_MASK;
612: p->devctl |= TI113X_DCR_IMODE_ISA;
613: break;
614: case 2:
615: p->devctl &= ~TI113X_DCR_IMODE_MASK;
616: p->devctl |= TI113X_DCR_IMODE_SERIAL;
617: break;
618: case 3:
619: p->devctl &= ~TI113X_DCR_IMODE_MASK;
620: p->devctl |= TI12XX_DCR_IMODE_ALL_SERIAL;
621: break;
622: default:
623: /* Feeble fallback: if PCI-only but no PCI irq, try ISA */
624: if (((p->devctl & TI113X_DCR_IMODE_MASK) == 0) &&
625: (s->cap.pci_irq == 0))
626: p->devctl |= TI113X_DCR_IMODE_ISA;
627: }
628: if (p->cardctl & TI113X_CCR_RIENB) {
629: strcat(buf, " [ring]");
630: if (old) mask &= ~0x8000;
631: }
632: if (old && (p->sysctl & TI113X_SCR_CLKRUN_ENA)) {
633: if (p->sysctl & TI113X_SCR_CLKRUN_SEL) {
634: strcat(buf, " [clkrun irq 12]");
635: mask &= ~0x1000;
636: } else {
637: strcat(buf, " [clkrun irq 10]");
638: mask &= ~0x0400;
639: }
640: }
641: switch (p->devctl & TI113X_DCR_IMODE_MASK) {
642: case TI12XX_DCR_IMODE_PCI_ONLY:
643: strcat(buf, " [pci only]");
644: mask = 0;
645: break;
646: case TI113X_DCR_IMODE_ISA:
647: strcat(buf, " [isa irq]");
648: if (old) mask &= ~0x0018;
649: break;
650: case TI113X_DCR_IMODE_SERIAL:
651: strcat(buf, " [pci + serial irq]");
652: mask = 0xffff;
653: break;
654: case TI12XX_DCR_IMODE_ALL_SERIAL:
655: strcat(buf, " [serial pci & irq]");
656: mask = 0xffff;
657: break;
658: }
659: return mask;
660: }
661:
662: #endif
663:
664: /*======================================================================
665:
666: Code to save and restore global state information for the Ricoh
667: RL5C4XX controllers, and to set and report global configuration
668: options.
669:
670: The interrupt test doesn't seem to be reliable with Ricoh
671: bridges. It seems to depend on what type of card is in the
672: socket, and on the history of that socket, in some way that
673: doesn't show up in the current socket state.
674:
675: ======================================================================*/
676:
677: #ifdef CONFIG_PCI
678:
679: static void __init ricoh_get_state(socket_info_t *s)
680: {
681: ricoh_state_t *p = &s->state.ricoh;
682: pci_readw(s, RL5C4XX_CONFIG, &p->config);
683: pci_readw(s, RL5C4XX_MISC, &p->misc);
684: pci_readw(s, RL5C4XX_16BIT_CTL, &p->ctl);
685: pci_readw(s, RL5C4XX_16BIT_IO_0, &p->io);
686: pci_readw(s, RL5C4XX_16BIT_MEM_0, &p->mem);
687: }
688:
689: static void ricoh_set_state(socket_info_t *s)
690: {
691: ricoh_state_t *p = &s->state.ricoh;
692: pci_writew(s, RL5C4XX_CONFIG, p->config);
693: pci_writew(s, RL5C4XX_MISC, p->misc);
694: pci_writew(s, RL5C4XX_16BIT_CTL, p->ctl);
695: pci_writew(s, RL5C4XX_16BIT_IO_0, p->io);
696: pci_writew(s, RL5C4XX_16BIT_MEM_0, p->mem);
697: }
698:
699: static u_int __init ricoh_set_opts(socket_info_t *s, char *buf)
700: {
701: ricoh_state_t *p = &s->state.ricoh;
702: u_int mask = 0xffff;
703: int old = (s->type < IS_RL5C475);
704:
705: p->ctl = RL5C4XX_16CTL_IO_TIMING | RL5C4XX_16CTL_MEM_TIMING;
706: if (old)
707: p->ctl |= RL5C46X_16CTL_LEVEL_1 | RL5C46X_16CTL_LEVEL_2;
708: else
709: p->config |= RL5C4XX_CONFIG_PREFETCH;
710:
711: if (setup_time >= 0) {
712: p->io = (p->io & ~RL5C4XX_SETUP_MASK) +
713: ((setup_time+1) << RL5C4XX_SETUP_SHIFT);
714: p->mem = (p->mem & ~RL5C4XX_SETUP_MASK) +
715: (setup_time << RL5C4XX_SETUP_SHIFT);
716: }
717: if (cmd_time >= 0) {
718: p->io = (p->io & ~RL5C4XX_CMD_MASK) +
719: (cmd_time << RL5C4XX_CMD_SHIFT);
720: p->mem = (p->mem & ~RL5C4XX_CMD_MASK) +
721: (cmd_time << RL5C4XX_CMD_SHIFT);
722: }
723: if (hold_time >= 0) {
724: p->io = (p->io & ~RL5C4XX_HOLD_MASK) +
725: (hold_time << RL5C4XX_HOLD_SHIFT);
726: p->mem = (p->mem & ~RL5C4XX_HOLD_MASK) +
727: (hold_time << RL5C4XX_HOLD_SHIFT);
728: }
729: if (irq_mode == 0) {
730: mask = 0;
731: p->misc &= ~RL5C47X_MISC_SRIRQ_ENA;
732: sprintf(buf, " [pci only]");
733: buf += strlen(buf);
734: } else if (!old) {
735: switch (irq_mode) {
736: case 1:
737: p->misc &= ~RL5C47X_MISC_SRIRQ_ENA; break;
738: case 2:
739: p->misc |= RL5C47X_MISC_SRIRQ_ENA; break;
740: }
741: if (p->misc & RL5C47X_MISC_SRIRQ_ENA)
742: sprintf(buf, " [serial irq]");
743: else
744: sprintf(buf, " [isa irq]");
745: buf += strlen(buf);
746: }
747: sprintf(buf, " [io %d/%d/%d] [mem %d/%d/%d]",
748: (p->io & RL5C4XX_SETUP_MASK) >> RL5C4XX_SETUP_SHIFT,
749: (p->io & RL5C4XX_CMD_MASK) >> RL5C4XX_CMD_SHIFT,
750: (p->io & RL5C4XX_HOLD_MASK) >> RL5C4XX_HOLD_SHIFT,
751: (p->mem & RL5C4XX_SETUP_MASK) >> RL5C4XX_SETUP_SHIFT,
752: (p->mem & RL5C4XX_CMD_MASK) >> RL5C4XX_CMD_SHIFT,
753: (p->mem & RL5C4XX_HOLD_MASK) >> RL5C4XX_HOLD_SHIFT);
754: return mask;
755: }
756:
757: #endif
758:
759: /*======================================================================
760:
761: Code to save and restore global state information for O2Micro
762: controllers, and to set and report global configuration options.
763:
764: ======================================================================*/
765:
766: #ifdef CONFIG_PCI
767:
768: static void __init o2micro_get_state(socket_info_t *s)
769: {
770: o2micro_state_t *p = &s->state.o2micro;
771: if ((s->revision == 0x34) || (s->revision == 0x62) ||
772: (s->type == IS_OZ6812)) {
773: p->mode_a = i365_get(s, O2_MODE_A_2);
774: p->mode_b = i365_get(s, O2_MODE_B_2);
775: } else {
776: p->mode_a = i365_get(s, O2_MODE_A);
777: p->mode_b = i365_get(s, O2_MODE_B);
778: }
779: p->mode_c = i365_get(s, O2_MODE_C);
780: p->mode_d = i365_get(s, O2_MODE_D);
781: if (s->flags & IS_CARDBUS) {
782: p->mhpg = i365_get(s, O2_MHPG_DMA);
783: p->fifo = i365_get(s, O2_FIFO_ENA);
784: p->mode_e = i365_get(s, O2_MODE_E);
785: }
786: }
787:
788: static void o2micro_set_state(socket_info_t *s)
789: {
790: o2micro_state_t *p = &s->state.o2micro;
791: if ((s->revision == 0x34) || (s->revision == 0x62) ||
792: (s->type == IS_OZ6812)) {
793: i365_set(s, O2_MODE_A_2, p->mode_a);
794: i365_set(s, O2_MODE_B_2, p->mode_b);
795: } else {
796: i365_set(s, O2_MODE_A, p->mode_a);
797: i365_set(s, O2_MODE_B, p->mode_b);
798: }
799: i365_set(s, O2_MODE_C, p->mode_c);
800: i365_set(s, O2_MODE_D, p->mode_d);
801: if (s->flags & IS_CARDBUS) {
802: i365_set(s, O2_MHPG_DMA, p->mhpg);
803: i365_set(s, O2_FIFO_ENA, p->fifo);
804: i365_set(s, O2_MODE_E, p->mode_e);
805: }
806: }
807:
808: static u_int __init o2micro_set_opts(socket_info_t *s, char *buf)
809: {
810: o2micro_state_t *p = &s->state.o2micro;
811: u_int mask = 0xffff;
812:
813: p->mode_b = (p->mode_b & ~O2_MODE_B_IDENT) | O2_MODE_B_ID_CSTEP;
814: flip(p->mode_b, O2_MODE_B_IRQ15_RI, has_ring);
815: p->mode_c &= ~(O2_MODE_C_ZVIDEO | O2_MODE_C_DREQ_MASK);
816: if (s->flags & IS_CARDBUS) {
817: p->mode_d &= ~O2_MODE_D_W97_IRQ;
818: p->mode_e &= ~O2_MODE_E_MHPG_DMA;
819: p->mhpg = O2_MHPG_CINT_ENA | O2_MHPG_CSC_ENA;
820: if (s->revision == 0x34)
821: p->mode_c = 0x20;
822: } else {
823: if (p->mode_b & O2_MODE_B_IRQ15_RI) mask &= ~0x8000;
824: }
825: if (p->mode_b & O2_MODE_B_IRQ15_RI)
826: strcat(buf, " [ring]");
827: if (irq_mode != -1)
828: p->mode_d = irq_mode;
829: if (p->mode_d & O2_MODE_D_ISA_IRQ) {
830: strcat(buf, " [pci+isa]");
831: } else {
832: switch (p->mode_d & O2_MODE_D_IRQ_MODE) {
833: case O2_MODE_D_IRQ_PCPCI:
834: strcat(buf, " [pc/pci]"); break;
835: case O2_MODE_D_IRQ_PCIWAY:
836: strcat(buf, " [pci/way]"); break;
837: case O2_MODE_D_IRQ_PCI:
838: strcat(buf, " [pci only]"); mask = 0; break;
839: }
840: }
841: if (s->flags & IS_CARDBUS) {
842: if (p->mode_d & O2_MODE_D_W97_IRQ)
843: strcat(buf, " [win97]");
844: }
845: return mask;
846: }
847:
848: #endif
849:
850: /*======================================================================
851:
852: Code to save and restore global state information for the Toshiba
853: ToPIC 95 and 97 controllers, and to set and report global
854: configuration options.
855:
856: ======================================================================*/
857:
858: #ifdef CONFIG_PCI
859:
860: static void __init topic_get_state(socket_info_t *s)
861: {
862: topic_state_t *p = &s->state.topic;
863: pci_readb(s, TOPIC_SLOT_CONTROL, &p->slot);
864: pci_readb(s, TOPIC_CARD_CONTROL, &p->ccr);
865: pci_readb(s, TOPIC_CARD_DETECT, &p->cdr);
866: pci_readl(s, TOPIC_REGISTER_CONTROL, &p->rcr);
867: p->fcr = i365_get(s, TOPIC_FUNCTION_CONTROL);
868: }
869:
870: static void topic_set_state(socket_info_t *s)
871: {
872: topic_state_t *p = &s->state.topic;
873: u_int state;
874: pci_writeb(s, TOPIC_SLOT_CONTROL, p->slot);
875: pci_writeb(s, TOPIC_CARD_CONTROL, p->ccr);
876: pci_writeb(s, TOPIC_CARD_DETECT, p->cdr);
877: pci_writel(s, TOPIC_REGISTER_CONTROL, p->rcr);
878: i365_set(s, TOPIC_FUNCTION_CONTROL, p->fcr);
879: state = cb_readl(s, CB_SOCKET_STATE);
880: if (!(state & CB_SS_32BIT))
881: cb_writel(s, CB_SOCKET_CONTROL, 0);
882: if (!(state & CB_SS_VSENSE))
883: cb_writel(s, CB_SOCKET_FORCE, CB_SF_CVSTEST);
884: }
885:
886: static u_int __init topic_set_opts(socket_info_t *s, char *buf)
887: {
888: topic_state_t *p = &s->state.topic;
889:
890: p->slot |= TOPIC_SLOT_SLOTON|TOPIC_SLOT_SLOTEN;
891: p->slot &= ~TOPIC_SLOT_ID_LOCK;
892: p->cdr |= TOPIC_CDR_MODE_PC32;
893: p->cdr &= ~(TOPIC_CDR_SW_DETECT);
894: p->ccr |= TOPIC97_ICR_IRQSEL;
895: p->fcr |= TOPIC_FCR_3V_ENA;
896: sprintf(buf, " [slot 0x%02x] [ccr 0x%02x] [cdr 0x%02x] [rcr 0x%02x]",
897: p->slot, p->ccr, p->cdr, p->rcr);
898: return 0xffff;
899: }
900:
901: #endif
902:
903: /*======================================================================
904:
905: Routines to handle common CardBus options
906:
907: ======================================================================*/
908:
909: /* Default settings for PCI command configuration register */
910: #define CMD_DFLT (PCI_COMMAND_IO|PCI_COMMAND_MEMORY| \
911: PCI_COMMAND_MASTER|PCI_COMMAND_WAIT)
912:
913: #ifdef CONFIG_PCI
914:
915: static void __init cb_get_state(socket_info_t *s)
916: {
917: pci_readb(s, PCI_CACHE_LINE_SIZE, &s->cache);
918: pci_readb(s, PCI_LATENCY_TIMER, &s->pci_lat);
919: pci_readb(s, CB_LATENCY_TIMER, &s->cb_lat);
920: pci_readb(s, CB_CARDBUS_BUS, &s->cap.cardbus);
921: pci_readb(s, CB_SUBORD_BUS, &s->sub_bus);
922: pci_readw(s, CB_BRIDGE_CONTROL, &s->bcr);
923: get_pci_irq(s);
924: }
925:
926: static void cb_set_state(socket_info_t *s)
927: {
928: pci_set_power_state(pci_find_slot(s->bus, s->devfn), 0);
929: pci_writel(s, CB_LEGACY_MODE_BASE, 0);
930: pci_writel(s, PCI_BASE_ADDRESS_0, s->cb_phys);
931: pci_writew(s, PCI_COMMAND, CMD_DFLT);
932: pci_writeb(s, PCI_CACHE_LINE_SIZE, s->cache);
933: pci_writeb(s, PCI_LATENCY_TIMER, s->pci_lat);
934: pci_writeb(s, CB_LATENCY_TIMER, s->cb_lat);
935: pci_writeb(s, CB_CARDBUS_BUS, s->cap.cardbus);
936: pci_writeb(s, CB_SUBORD_BUS, s->sub_bus);
937: pci_writew(s, CB_BRIDGE_CONTROL, s->bcr);
938: }
939:
940: static int cb_get_irq_mode(socket_info_t *s)
941: {
942: return (!(s->bcr & CB_BCR_ISA_IRQ));
943: }
944:
945: static int cb_set_irq_mode(socket_info_t *s, int pcsc, int pint)
946: {
947: flip(s->bcr, CB_BCR_ISA_IRQ, !(pint));
948: if (s->flags & IS_CIRRUS)
949: return cirrus_set_irq_mode(s, pcsc, pint);
950: else if (s->flags & IS_TI)
951: return ti113x_set_irq_mode(s, pcsc, pint);
952: /* By default, assume that we can't do ISA status irqs */
953: return (!pcsc);
954: }
955:
956: static void __init cb_set_opts(socket_info_t *s, char *buf)
957: {
958: s->bcr |= CB_BCR_WRITE_POST;
959: /* some TI1130's seem to exhibit problems with write posting */
960: if (((s->type == IS_TI1130) && (s->revision == 4) &&
961: (cb_write_post < 0)) || (cb_write_post == 0))
962: s->bcr &= ~CB_BCR_WRITE_POST;
963: if (s->cache == 0) s->cache = 8;
964: if (s->pci_lat == 0) s->pci_lat = 0xa8;
965: if (s->cb_lat == 0) s->cb_lat = 0xb0;
966: if (s->cap.pci_irq == 0)
967: strcat(buf, " [no pci irq]");
968: else
969: sprintf(buf, " [pci irq %d]", s->cap.pci_irq);
970: buf += strlen(buf);
971: if (!(s->flags & IS_TOPIC))
972: s->cap.features |= SS_CAP_PAGE_REGS;
973: sprintf(buf, " [lat %d/%d] [bus %d/%d]",
974: s->pci_lat, s->cb_lat, s->cap.cardbus, s->sub_bus);
975: }
976:
977: #endif
978:
979: /*======================================================================
980:
981: Power control for Cardbus controllers: used both for 16-bit and
982: Cardbus cards.
983:
984: ======================================================================*/
985:
986: #ifdef CONFIG_PCI
987:
988: static void cb_get_power(socket_info_t *s, socket_state_t *state)
989: {
990: u_int reg = cb_readl(s, CB_SOCKET_CONTROL);
991: state->Vcc = state->Vpp = 0;
992: switch (reg & CB_SC_VCC_MASK) {
993: case CB_SC_VCC_3V: state->Vcc = 33; break;
994: case CB_SC_VCC_5V: state->Vcc = 50; break;
995: }
996: switch (reg & CB_SC_VPP_MASK) {
997: case CB_SC_VPP_3V: state->Vpp = 33; break;
998: case CB_SC_VPP_5V: state->Vpp = 50; break;
999: case CB_SC_VPP_12V: state->Vpp = 120; break;
1000: }
1001: }
1002:
1003: static int cb_set_power(socket_info_t *s, socket_state_t *state)
1004: {
1005: u_int reg = 0;
1006: /* restart card voltage detection if it seems appropriate */
1007: if ((state->Vcc == 0) && (state->Vpp == 0) &&
1008: !(cb_readl(s, CB_SOCKET_STATE) & CB_SS_VSENSE))
1009: cb_writel(s, CB_SOCKET_FORCE, CB_SF_CVSTEST);
1010: switch (state->Vcc) {
1011: case 0: reg = 0; break;
1012: case 33: reg = CB_SC_VCC_3V; break;
1013: case 50: reg = CB_SC_VCC_5V; break;
1014: default: return -EINVAL;
1015: }
1016: switch (state->Vpp) {
1017: case 0: break;
1018: case 33: reg |= CB_SC_VPP_3V; break;
1019: case 50: reg |= CB_SC_VPP_5V; break;
1020: case 120: reg |= CB_SC_VPP_12V; break;
1021: default: return -EINVAL;
1022: }
1023: if (reg != cb_readl(s, CB_SOCKET_CONTROL))
1024: cb_writel(s, CB_SOCKET_CONTROL, reg);
1025: return 0;
1026: }
1027:
1028: #endif
1029:
1030: /*======================================================================
1031:
1032: Generic routines to get and set controller options
1033:
1034: ======================================================================*/
1035:
1036: static void __init get_bridge_state(socket_info_t *s)
1037: {
1038: if (s->flags & IS_CIRRUS)
1039: cirrus_get_state(s);
1040: #ifdef CONFIG_ISA
1041: else if (s->flags & IS_VADEM)
1042: vg46x_get_state(s);
1043: #endif
1044: #ifdef CONFIG_PCI
1045: else if (s->flags & IS_O2MICRO)
1046: o2micro_get_state(s);
1047: else if (s->flags & IS_TI)
1048: ti113x_get_state(s);
1049: else if (s->flags & IS_RICOH)
1050: ricoh_get_state(s);
1051: else if (s->flags & IS_TOPIC)
1052: topic_get_state(s);
1053: if (s->flags & IS_CARDBUS)
1054: cb_get_state(s);
1055: #endif
1056: }
1057:
1058: static void set_bridge_state(socket_info_t *s)
1059: {
1060: #ifdef CONFIG_PCI
1061: if (s->flags & IS_CARDBUS)
1062: cb_set_state(s);
1063: #endif
1064: if (s->flags & IS_CIRRUS) {
1065: cirrus_set_state(s);
1066: } else {
1067: i365_set(s, I365_GBLCTL, 0x00);
1068: i365_set(s, I365_GENCTL, 0x00);
1069: /* Trouble: changes timing of memory operations */
1070: /* i365_bset(s, I365_ADDRWIN, I365_ADDR_MEMCS16); */
1071: }
1072: i365_bflip(s, I365_INTCTL, I365_INTR_ENA, s->intr);
1073: #ifdef CONFIG_ISA
1074: if (s->flags & IS_VADEM)
1075: vg46x_set_state(s);
1076: #endif
1077: #ifdef CONFIG_PCI
1078: if (s->flags & IS_O2MICRO)
1079: o2micro_set_state(s);
1080: else if (s->flags & IS_TI)
1081: ti113x_set_state(s);
1082: else if (s->flags & IS_RICOH)
1083: ricoh_set_state(s);
1084: else if (s->flags & IS_TOPIC)
1085: topic_set_state(s);
1086: #endif
1087: }
1088:
1089: static u_int __init set_bridge_opts(socket_info_t *s, u_short ns)
1090: {
1091: u_short i;
1092: u_int m = 0xffff;
1093: char buf[128];
1094:
1095: for (i = 0; i < ns; i++) {
1096: if (s[i].flags & IS_ALIVE) {
1097: printk(KERN_INFO " host opts [%d]: already alive!\n", i);
1098: continue;
1099: }
1100: buf[0] = '\0';
1101: get_bridge_state(s+i);
1102: if (s[i].flags & IS_CIRRUS)
1103: m = cirrus_set_opts(s+i, buf);
1104: #ifdef CONFIG_ISA
1105: else if (s[i].flags & IS_VADEM)
1106: m = vg46x_set_opts(s+i, buf);
1107: #endif
1108: #ifdef CONFIG_PCI
1109: else if (s[i].flags & IS_O2MICRO)
1110: m = o2micro_set_opts(s+i, buf);
1111: else if (s[i].flags & IS_TI)
1112: m = ti113x_set_opts(s+i, buf);
1113: else if (s[i].flags & IS_RICOH)
1114: m = ricoh_set_opts(s+i, buf);
1115: else if (s[i].flags & IS_TOPIC)
1116: m = topic_set_opts(s+i, buf);
1117: if (s[i].flags & IS_CARDBUS)
1118: cb_set_opts(s+i, buf+strlen(buf));
1119: #endif
1120: set_bridge_state(s+i);
1121: printk(KERN_INFO " host opts [%d]:%s\n", i,
1122: (*buf) ? buf : " none");
1123: }
1124: #ifdef CONFIG_PCI
1125: m &= ~pci_irq_mask;
1126: #endif
1127: return m;
1128: }
1129:
1130: /*======================================================================
1131:
1132: Interrupt testing code, for ISA and PCI interrupts
1133:
1134: ======================================================================*/
1135:
1136: static volatile u_int irq_hits, irq_shared;
1137: static volatile socket_info_t *irq_sock;
1138:
1139: static void irq_count(int irq, void *dev, struct pt_regs *regs)
1140: {
1141: irq_hits++;
1142: DEBUG(2, "-> hit on irq %d\n", irq);
1143: if (!irq_shared && (irq_hits > 100)) {
1144: printk(KERN_INFO " PCI irq %d seems to be wedged!\n", irq);
1145: disable_irq(irq);
1146: return;
1147: }
1148: #ifdef CONFIG_PCI
1149: if (irq_sock->flags & IS_CARDBUS) {
1150: cb_writel(irq_sock, CB_SOCKET_EVENT, -1);
1151: } else
1152: #endif
1153: i365_get((socket_info_t *)irq_sock, I365_CSC);
1154: return;
1155: }
1156:
1157: static u_int __init test_irq(socket_info_t *s, int irq, int pci)
1158: {
1159: u_char csc = (pci) ? 0 : irq;
1160:
1161: #ifdef CONFIG_PNP_BIOS
1162: extern int check_pnp_irq(int);
1163: if (!pci && check_pnp_irq(irq)) return 1;
1164: #endif
1165:
1166: DEBUG(2, " testing %s irq %d\n", pci ? "PCI" : "ISA", irq);
1167: irq_sock = s; irq_shared = irq_hits = 0;
1168: if (request_irq(irq, irq_count, 0, "scan", socket)) {
1169: irq_shared++;
1170: if (!pci || request_irq(irq, irq_count, SA_SHIRQ, "scan", socket))
1171: return 1;
1172: }
1173: irq_hits = 0;
1174:
1175: #ifndef MACH
1176: __set_current_state(TASK_UNINTERRUPTIBLE);
1177: schedule_timeout(HZ/100);
1178: #else
1179: /* TODO: Is this really what we want? */
1180: {
1181: unsigned long flags;
1182:
1183: save_flags(flags);
1184:
1185: mdelay(1);
1186: #endif
1187:
1188: if (irq_hits && !irq_shared) {
1189: free_irq(irq, socket);
1190: DEBUG(2, " spurious hit!\n");
1191: return 1;
1192: }
1193:
1194: /* Generate one interrupt */
1195: #ifdef CONFIG_PCI
1196: if (s->flags & IS_CARDBUS) {
1197: cb_writel(s, CB_SOCKET_EVENT, -1);
1198: i365_set(s, I365_CSCINT, I365_CSC_STSCHG | (csc << 4));
1199: cb_writel(s, CB_SOCKET_EVENT, -1);
1200: cb_writel(s, CB_SOCKET_MASK, CB_SM_CSTSCHG);
1201: cb_writel(s, CB_SOCKET_FORCE, CB_SE_CSTSCHG);
1202: mdelay(1);
1203: cb_writel(s, CB_SOCKET_EVENT, -1);
1204: cb_writel(s, CB_SOCKET_MASK, 0);
1205: } else
1206: #endif
1207: {
1208: i365_set(s, I365_CSCINT, I365_CSC_DETECT | (csc << 4));
1209: i365_bset(s, I365_GENCTL, I365_CTL_SW_IRQ);
1210: mdelay(1);
1211: }
1212:
1213: #ifdef MACH
1214: restore_flags(flags);
1215: }
1216:
1217: #endif
1218:
1219: free_irq(irq, socket);
1220:
1221: /* mask all interrupts */
1222: i365_set(s, I365_CSCINT, 0);
1223: DEBUG(2, " hits = %d\n", irq_hits);
1224:
1225: return pci ? (irq_hits == 0) : (irq_hits != 1);
1226: }
1227:
1228: #ifdef CONFIG_ISA
1229: static int _check_irq(int irq, int flags)
1230: {
1231: #ifdef CONFIG_PNP_BIOS
1232: extern int check_pnp_irq(int);
1233: if ((flags != SA_SHIRQ) && check_pnp_irq(irq))
1234: return -1;
1235: #endif
1236: if (request_irq(irq, irq_count, flags, "x", irq_count) != 0)
1237: return -1;
1238: free_irq(irq, irq_count);
1239: return 0;
1240: }
1241:
1242: static u_int __init isa_scan(socket_info_t *s, u_int mask0)
1243: {
1244: u_int mask1 = 0;
1245: int i;
1246:
1247: #ifdef CONFIG_PCI
1248: /* Only scan if we can select ISA csc irq's */
1249: if (!(s->flags & IS_CARDBUS) || (cb_set_irq_mode(s, 0, 0) == 0))
1250: #endif
1251: if (do_scan) {
1252: set_bridge_state(s);
1253: i365_set(s, I365_CSCINT, 0);
1254: for (i = 0; i < 16; i++)
1255: if ((mask0 & (1 << i)) && (test_irq(s, i, 0) == 0))
1256: mask1 |= (1 << i);
1257: for (i = 0; i < 16; i++)
1258: if ((mask1 & (1 << i)) && (test_irq(s, i, 0) != 0))
1259: mask1 ^= (1 << i);
1260: }
1261:
1262: printk(KERN_INFO " ISA irqs (");
1263: /* we trust TI bridges to do this right */
1264: if (mask1 || (s->flags & IS_TI)) {
1265: printk("scanned");
1266: } else {
1267: /* Fallback: just find interrupts that aren't in use */
1268: for (i = 0; i < 16; i++)
1269: if ((mask0 & (1 << i)) && (_check_irq(i, 0) == 0))
1270: mask1 |= (1 << i);
1271: printk("default");
1272: /* If scan failed, default to polled status */
1273: if (!cs_irq && (poll_interval == 0)) poll_interval = HZ;
1274: }
1275: printk(") = ");
1276:
1277: for (i = 0; i < 16; i++)
1278: if (mask1 & (1<<i))
1279: printk("%s%d", ((mask1 & ((1<<i)-1)) ? "," : ""), i);
1280: if (mask1 == 0) printk("none!");
1281:
1282: return mask1;
1283: }
1284: #endif /* CONFIG_ISA */
1285:
1286: #ifdef CONFIG_PCI
1287: static int __init pci_scan(socket_info_t *s)
1288: {
1289: int ret;
1290: if ((s->flags & IS_RICOH) || !(s->flags & IS_CARDBUS) || !do_scan) {
1291: /* for PCI-to-PCMCIA bridges, just check for wedged irq */
1292: irq_sock = s; irq_hits = 0;
1293: if (request_irq(s->cap.pci_irq, irq_count, 0, "scan", socket))
1294: return 1;
1295: udelay(50);
1296: free_irq(s->cap.pci_irq, socket);
1297: return (!irq_hits);
1298: }
1299: cb_set_irq_mode(s, 1, 0);
1300: set_bridge_state(s);
1301: i365_set(s, I365_CSCINT, 0);
1302: ret = ((test_irq(s, s->cap.pci_irq, 1) == 0) &&
1303: (test_irq(s, s->cap.pci_irq, 1) == 0));
1304: if (!ret)
1305: printk(KERN_INFO " PCI irq %d test failed\n",
1306: s->cap.pci_irq);
1307: return ret;
1308: }
1309: #endif /* CONFIG_PCI */
1310:
1311: /*====================================================================*/
1312:
1313: #ifdef CONFIG_ISA
1314:
1315: static int __init isa_identify(u_short port, u_short sock)
1316: {
1317: socket_info_t *s = socket+sockets;
1318: u_char val;
1319: int type = -1;
1320:
1321: /* Use the next free entry in the socket table */
1322: s->ioaddr = port;
1323: s->psock = sock;
1324:
1325: /* Wake up a sleepy Cirrus controller */
1326: if (wakeup) {
1327: i365_bclr(s, PD67_MISC_CTL_2, PD67_MC2_SUSPEND);
1328: /* Pause at least 50 ms */
1329: mdelay(50);
1330: }
1331:
1332: if ((val = i365_get(s, I365_IDENT)) & 0x70)
1333: return -1;
1334: switch (val) {
1335: case 0x82:
1336: type = IS_I82365A; break;
1337: case 0x83:
1338: type = IS_I82365B; break;
1339: case 0x84:
1340: type = IS_I82365DF; break;
1341: case 0x88: case 0x89: case 0x8a:
1342: type = IS_IBM; break;
1343: }
1344:
1345: /* Check for Vadem VG-468 chips */
1346: outb(0x0e, port);
1347: outb(0x37, port);
1348: i365_bset(s, VG468_MISC, VG468_MISC_VADEMREV);
1349: val = i365_get(s, I365_IDENT);
1350: if (val & I365_IDENT_VADEM) {
1351: i365_bclr(s, VG468_MISC, VG468_MISC_VADEMREV);
1352: type = ((val & 7) >= 4) ? IS_VG469 : IS_VG468;
1353: }
1354:
1355: /* Check for Ricoh chips */
1356: val = i365_get(s, RF5C_CHIP_ID);
1357: if ((val == RF5C_CHIP_RF5C296) || (val == RF5C_CHIP_RF5C396))
1358: type = IS_RF5Cx96;
1359:
1360: /* Check for Cirrus CL-PD67xx chips */
1361: i365_set(s, PD67_CHIP_INFO, 0);
1362: val = i365_get(s, PD67_CHIP_INFO);
1363: if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
1364: val = i365_get(s, PD67_CHIP_INFO);
1365: if ((val & PD67_INFO_CHIP_ID) == 0) {
1366: type = (val & PD67_INFO_SLOTS) ? IS_PD672X : IS_PD6710;
1367: i365_set(s, PD67_EXT_INDEX, 0xe5);
1368: if (i365_get(s, PD67_EXT_INDEX) != 0xe5)
1369: type = IS_VT83C469;
1370: }
1371: }
1372: return type;
1373: } /* isa_identify */
1374:
1375: #endif
1376:
1377: /*======================================================================
1378:
1379: See if a card is present, powered up, in IO mode, and already
1380: bound to a (non PC Card) Linux driver. We leave these alone.
1381:
1382: We make an exception for cards that seem to be serial devices.
1383:
1384: ======================================================================*/
1385:
1386: static int __init is_alive(socket_info_t *s)
1387: {
1388: u_char stat;
1389: u_short start, stop;
1390:
1391: stat = i365_get(s, I365_STATUS);
1392: start = i365_get_pair(s, I365_IO(0)+I365_W_START);
1393: stop = i365_get_pair(s, I365_IO(0)+I365_W_STOP);
1394: if ((stop - start < 0x40) && (stop - start >= 0x07) &&
1395: ((start & 0xfeef) != 0x02e8) && (start >= 0x100) &&
1396: (stat & I365_CS_DETECT) && (stat & I365_CS_POWERON) &&
1397: (i365_get(s, I365_INTCTL) & I365_PC_IOCARD) &&
1398: (i365_get(s, I365_ADDRWIN) & I365_ENA_IO(0)) &&
1399: (check_region(start, stop-start+1) != 0))
1400: return 1;
1401: else
1402: return 0;
1403: }
1404:
1405: /*====================================================================*/
1406:
1407: static void __init add_socket(u_int port, int psock, int type)
1408: {
1409: socket_info_t *s = socket+sockets;
1410: s->ioaddr = port;
1411: s->psock = psock;
1412: s->type = type;
1413: s->flags = pcic[type].flags;
1414: if (is_alive(s))
1415: s->flags |= IS_ALIVE;
1416: sockets++;
1417: }
1418:
1419: static void __init add_pcic(int ns, int type)
1420: {
1421: u_int mask = 0, i;
1422: int use_pci = 0, isa_irq = 0;
1423: socket_info_t *s = &socket[sockets-ns];
1424:
1425: if (s->ioaddr > 0) request_region(s->ioaddr, 2, "i82365");
1426:
1427: printk(KERN_INFO " %s", pcic[type].name);
1428: #ifdef CONFIG_PCI
1429: if (s->flags & IS_UNKNOWN)
1430: printk(" [%04x %04x]", s->vendor, s->device);
1431: printk(" rev %02x", s->revision);
1432: if (s->flags & IS_CARDBUS)
1433: printk(" PCI-to-CardBus at slot %02x:%02x, mem %#08x\n",
1434: s->bus, PCI_SLOT(s->devfn), s->cb_phys);
1435: else if (s->flags & IS_PCI)
1436: printk(" PCI-to-PCMCIA at slot %02x:%02x, port %#x\n",
1437: s->bus, PCI_SLOT(s->devfn), s->ioaddr);
1438: else
1439: #endif
1440: printk(" ISA-to-PCMCIA at port %#x ofs 0x%02x\n",
1441: s->ioaddr, s->psock*0x40);
1442:
1443: #ifdef CONFIG_ISA
1444: if (irq_list[0] == -1)
1445: mask = irq_mask;
1446: else
1447: for (i = mask = 0; i < 16; i++)
1448: mask |= (1<<irq_list[i]);
1449: #endif
1450: /* Set host options, build basic interrupt mask */
1451: mask &= I365_ISA_IRQ_MASK & set_bridge_opts(s, ns);
1452:
1453: #ifdef CONFIG_PCI
1454: /* Can we use PCI interrupts for card status changes? */
1455: if (pci_csc || pci_int) {
1456: for (i = 0; i < ns; i++)
1457: if (!s[i].cap.pci_irq || !pci_scan(&s[i])) break;
1458: use_pci = (i == ns);
1459: }
1460: #endif
1461: #ifdef CONFIG_ISA
1462: /* Scan, report ISA card interrupts */
1463: if (mask)
1464: mask = isa_scan(s, mask);
1465: #endif
1466:
1467: #ifdef CONFIG_PCI
1468: if (!mask)
1469: printk(KERN_INFO " %s card interrupts,",
1470: (use_pci && pci_int) ? "PCI" : "*NO*");
1471: if (use_pci && pci_csc)
1472: printk(" PCI status changes\n");
1473: #endif
1474:
1475: #ifdef CONFIG_ISA
1476: /* Poll if only two sensible interrupts available */
1477: if (!(use_pci && pci_csc) && !poll_interval) {
1478: u_int tmp = (mask & 0xff20);
1479: tmp = tmp & (tmp-1);
1480: if ((tmp & (tmp-1)) == 0)
1481: poll_interval = HZ;
1482: }
1483: /* Only try an ISA cs_irq if this is the first controller */
1484: if (!(use_pci && pci_csc) && !grab_irq &&
1485: (cs_irq || !poll_interval)) {
1486: /* Avoid irq 12 unless it is explicitly requested */
1487: u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
1488: for (isa_irq = 15; isa_irq > 0; isa_irq--)
1489: if (cs_mask & (1 << isa_irq)) break;
1490: if (isa_irq) {
1491: grab_irq = 1;
1492: cs_irq = isa_irq;
1493: printk(" status change on irq %d\n", isa_irq);
1494: }
1495: }
1496: #endif
1497:
1498: if (!(use_pci && pci_csc) && !isa_irq) {
1499: if (poll_interval == 0)
1500: poll_interval = HZ;
1501: printk(" polling interval = %d ms\n", poll_interval*1000/HZ);
1502: }
1503:
1504: /* Update socket interrupt information, capabilities */
1505: for (i = 0; i < ns; i++) {
1506: s[i].cap.features |= SS_CAP_PCCARD;
1507: s[i].cap.map_size = 0x1000;
1508: s[i].cap.irq_mask = mask;
1509: if (!use_pci)
1510: s[i].cap.pci_irq = 0;
1511: s[i].cs_irq = isa_irq;
1512: #ifdef CONFIG_PCI
1513: if (s[i].flags & IS_CARDBUS) {
1514: s[i].cap.features |= SS_CAP_CARDBUS;
1515: cb_set_irq_mode(s+i, pci_csc && s[i].cap.pci_irq, 0);
1516: }
1517: #endif
1518: }
1519:
1520: } /* add_pcic */
1521:
1522: /*====================================================================*/
1523:
1524: #ifdef CONFIG_PCI
1525:
1526: static int __init pci_lookup(u_int class, struct pci_dev **id,
1527: u_char *bus, u_char *devfn)
1528: {
1529: if ((*id = pci_find_class(class<<8, *id)) != NULL) {
1530: *bus = (*id)->bus->number;
1531: *devfn = (*id)->devfn;
1532: return 0;
1533: } else return -1;
1534: }
1535:
1536: static void __init add_pci_bridge(int type, u_short v, u_short d)
1537: {
1538: socket_info_t *s = &socket[sockets];
1539: u_int addr, ns;
1540:
1541: pci_enable_device(pci_find_slot(s->bus, s->devfn));
1542: pci_writew(s, PCI_COMMAND, CMD_DFLT);
1543:
1544: if (type == PCIC_COUNT) type = IS_UNK_PCI;
1545: pci_readl(s, PCI_BASE_ADDRESS_0, &addr);
1546: addr &= ~0x1;
1547: for (ns = 0; ns < ((type == IS_I82092AA) ? 4 : 2); ns++) {
1548: s[ns].bus = s->bus; s[ns].devfn = s->devfn;
1549: s[ns].vendor = v; s[ns].device = d;
1550: add_socket(addr, ns, type);
1551: }
1552: add_pcic(ns, type);
1553: }
1554:
1555: static int check_cb_mapping(socket_info_t *s)
1556: {
1557: u_int state = cb_readl(s, CB_SOCKET_STATE) >> 16;
1558: /* A few sanity checks to validate the bridge mapping */
1559: if ((cb_readb(s, 0x800+I365_IDENT) & 0x70) ||
1560: (cb_readb(s, 0x800+I365_CSC) && cb_readb(s, 0x800+I365_CSC) &&
1561: cb_readb(s, 0x800+I365_CSC)) || cb_readl(s, CB_SOCKET_FORCE) ||
1562: ((state & ~0x3000) || !(state & 0x3000)))
1563: return 1;
1564: return 0;
1565: }
1566:
1567: static void __init add_cb_bridge(int type, u_short v, u_short d0)
1568: {
1569: socket_info_t *s = &socket[sockets];
1570: u_char bus = s->bus, devfn = s->devfn;
1571: u_short d, ns;
1572: u_char a, r, max;
1573:
1574: /* PCI bus enumeration is broken on some systems */
1575: for (ns = 0; ns < sockets; ns++)
1576: if ((socket[ns].bus == bus) &&
1577: (socket[ns].devfn == devfn))
1578: return;
1579:
1580: if (type == PCIC_COUNT) type = IS_UNK_CARDBUS;
1581: pci_readb(s, PCI_HEADER_TYPE, &a);
1582: pci_readb(s, PCI_CLASS_REVISION, &r);
1583: max = (a & 0x80) ? 8 : 1;
1584: for (ns = 0; ns < max; ns++, s++, devfn++) {
1585: s->bus = bus; s->devfn = devfn;
1586: if (pci_readw(s, PCI_DEVICE_ID, &d) || (d != d0))
1587: break;
1588: s->vendor = v; s->device = d; s->revision = r;
1589:
1590: pci_enable_device(pci_find_slot(bus, devfn));
1591: pci_set_power_state(pci_find_slot(bus, devfn), 0);
1592: pci_writew(s, PCI_COMMAND, CMD_DFLT);
1593:
1594: /* Set up CardBus register mapping */
1595: pci_writel(s, CB_LEGACY_MODE_BASE, 0);
1596: pci_readl(s, PCI_BASE_ADDRESS_0, &s->cb_phys);
1597: if (s->cb_phys == 0) {
1598: printk("\n" KERN_NOTICE " Bridge register mapping failed:"
1599: " check cb_mem_base setting\n");
1600: break;
1601: }
1602: s->cb_virt = ioremap(s->cb_phys, 0x1000);
1603: if (check_cb_mapping(s) != 0) {
1604: printk("\n" KERN_NOTICE " Bad bridge mapping at "
1605: "0x%08x!\n", s->cb_phys);
1606: break;
1607: }
1608:
1609: request_mem_region(s->cb_phys, 0x1000, "i82365");
1610: add_socket(0, 0, type);
1611: }
1612: if (ns == 0) return;
1613:
1614: add_pcic(ns, type);
1615:
1616: /* Look up PCI bus bridge structures if needed */
1617: s -= ns;
1618: for (a = 0; a < ns; a++) {
1619: struct pci_dev *self = pci_find_slot(bus, s[a].devfn);
1620: #if (LINUX_VERSION_CODE >= VERSION(2,3,40))
1621: s[a].cap.cb_bus = self->subordinate;
1622: #else
1623: struct pci_bus *child;
1624: for (child = self->bus->children; child; child = child->next)
1625: if (child->number == s[a].cap.cardbus) break;
1626: s[a].cap.cb_bus = child;
1627: #endif
1628: }
1629: }
1630:
1631: static void __init pci_probe(u_int class)
1632: {
1633: socket_info_t *s = &socket[sockets];
1634: u_short i, v, d;
1635: struct pci_dev *id;
1636:
1637: id = 0;
1638: while (pci_lookup(class, &id, &s->bus, &s->devfn) == 0) {
1639: if (PCI_FUNC(s->devfn) != 0) continue;
1640: pci_readw(s, PCI_VENDOR_ID, &v);
1641: pci_readw(s, PCI_DEVICE_ID, &d);
1642: for (i = 0; i < PCIC_COUNT; i++)
1643: if ((pcic[i].vendor == v) && (pcic[i].device == d)) break;
1644: /* The "ToPIC95-A" is unusable as a CardBus bridge */
1645: if (i == IS_TOPIC95_A)
1646: continue;
1647: if (((i < PCIC_COUNT) && (pcic[i].flags & IS_CARDBUS)) ||
1648: (class == PCI_CLASS_BRIDGE_CARDBUS))
1649: add_cb_bridge(i, v, d);
1650: else
1651: add_pci_bridge(i, v, d);
1652: s = &socket[sockets];
1653: }
1654: }
1655:
1656: #endif
1657:
1658: /*====================================================================*/
1659:
1660: #ifdef CONFIG_ISA
1661:
1662: static void __init isa_probe(ioaddr_t base)
1663: {
1664: int i, j, sock, k, ns, id;
1665: ioaddr_t port;
1666:
1667: if (check_region(base, 2) != 0) {
1668: if (sockets == 0)
1669: printk("port conflict at %#x\n", base);
1670: return;
1671: }
1672:
1673: id = isa_identify(base, 0);
1674: if ((id == IS_I82365DF) && (isa_identify(base, 1) != id)) {
1675: for (i = 0; i < 4; i++) {
1676: if (i == ignore) continue;
1677: port = base + ((i & 1) << 2) + ((i & 2) << 1);
1678: sock = (i & 1) << 1;
1679: if (isa_identify(port, sock) == IS_I82365DF) {
1680: add_socket(port, sock, IS_VLSI);
1681: add_pcic(1, IS_VLSI);
1682: }
1683: }
1684: } else {
1685: for (i = 0; i < 4; i += 2) {
1686: port = base + 2*(i>>2);
1687: sock = (i & 3);
1688: id = isa_identify(port, sock);
1689: if (id < 0) continue;
1690:
1691: for (j = ns = 0; j < 2; j++) {
1692: /* Does the socket exist? */
1693: if ((ignore == i+j) || (isa_identify(port, sock+j) < 0))
1694: continue;
1695: /* Check for bad socket decode */
1696: for (k = 0; k <= sockets; k++)
1697: i365_set(socket+k, I365_MEM(0)+I365_W_OFF, k);
1698: for (k = 0; k <= sockets; k++)
1699: if (i365_get(socket+k, I365_MEM(0)+I365_W_OFF) != k)
1700: break;
1701: if (k <= sockets) break;
1702: add_socket(port, sock+j, id); ns++;
1703: }
1704: if (ns != 0) add_pcic(ns, id);
1705: }
1706: }
1707: }
1708:
1709: #endif
1710:
1711: /*======================================================================
1712:
1713: The card status event handler. This may either be interrupt
1714: driven or polled. It monitors mainly for card insert and eject
1715: events; there are various other kinds of events that can be
1716: monitored (ready/busy, status change, etc), but they are almost
1717: never used.
1718:
1719: ======================================================================*/
1720:
1721: static void pcic_interrupt(int irq, void *dev, struct pt_regs *regs)
1722: {
1723: int i, j, csc;
1724: u_int events, active;
1725: #ifdef CONFIG_ISA
1726: u_long flags = 0;
1727: #endif
1728:
1729: DEBUG(2, "i82365: pcic_interrupt(%d)\n", irq);
1730:
1731: for (j = 0; j < 20; j++) {
1732: active = 0;
1733: for (i = 0; i < sockets; i++) {
1734: socket_info_t *s = &socket[i];
1735: if ((s->cs_irq != irq) && (s->cap.pci_irq != irq))
1736: continue;
1737: ISA_LOCK(s, flags);
1738: csc = i365_get(s, I365_CSC);
1739: #ifdef CONFIG_PCI
1740: if ((s->flags & IS_CARDBUS) &&
1741: (cb_readl(s, CB_SOCKET_EVENT) & CB_SE_CCD)) {
1742: cb_writel(s, CB_SOCKET_EVENT, CB_SE_CCD);
1743: csc |= I365_CSC_DETECT;
1744: }
1745: #endif
1746: if ((csc == 0) || (!s->handler) ||
1747: (i365_get(s, I365_IDENT) & 0x70)) {
1748: ISA_UNLOCK(s, flags);
1749: continue;
1750: }
1751: events = (csc & I365_CSC_DETECT) ? SS_DETECT : 0;
1752: if (i365_get(s, I365_INTCTL) & I365_PC_IOCARD) {
1753: events |= (csc & I365_CSC_STSCHG) ? SS_STSCHG : 0;
1754: } else {
1755: events |= (csc & I365_CSC_BVD1) ? SS_BATDEAD : 0;
1756: events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0;
1757: events |= (csc & I365_CSC_READY) ? SS_READY : 0;
1758: }
1759: ISA_UNLOCK(s, flags);
1760: DEBUG(1, "i82365: socket %d event 0x%04x\n", i, events);
1761: if (events)
1762: s->handler(s->info, events);
1763: active |= events;
1764: }
1765: if (!active) break;
1766: }
1767: if (j == 20)
1768: printk(KERN_NOTICE "i82365: infinite loop in interrupt "
1769: "handler: active = 0x%04x\n", active);
1770:
1771: DEBUG(2, "i82365: interrupt done\n");
1772: } /* pcic_interrupt */
1773:
1774: static void pcic_interrupt_wrapper(u_long data)
1775: {
1776: pcic_interrupt(0, NULL, NULL);
1777: poll_timer.expires = jiffies + poll_interval;
1778: add_timer(&poll_timer);
1779: }
1780:
1781: /*====================================================================*/
1782:
1783: static int pcic_register_callback(socket_info_t *s, ss_callback_t *call)
1784: {
1785: if (call == NULL) {
1786: s->handler = NULL;
1787: MOD_DEC_USE_COUNT;
1788: } else {
1789: MOD_INC_USE_COUNT;
1790: s->handler = call->handler;
1791: s->info = call->info;
1792: }
1793: return 0;
1794: } /* pcic_register_callback */
1795:
1796: /*====================================================================*/
1797:
1798: static int pcic_inquire_socket(socket_info_t *s, socket_cap_t *cap)
1799: {
1800: *cap = s->cap;
1801: return 0;
1802: }
1803:
1804: /*====================================================================*/
1805:
1806: static int i365_get_status(socket_info_t *s, u_int *value)
1807: {
1808: u_int status;
1809:
1810: status = i365_get(s, I365_STATUS);
1811: *value = ((status & I365_CS_DETECT) == I365_CS_DETECT)
1812: ? SS_DETECT : 0;
1813: if (i365_get(s, I365_INTCTL) & I365_PC_IOCARD) {
1814: *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG;
1815: } else {
1816: *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD;
1817: *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN;
1818: }
1819: *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0;
1820: *value |= (status & I365_CS_READY) ? SS_READY : 0;
1821: *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0;
1822:
1823: #ifdef CONFIG_PCI
1824: if (s->flags & IS_CARDBUS) {
1825: status = cb_readl(s, CB_SOCKET_STATE);
1826: *value |= (status & CB_SS_32BIT) ? SS_CARDBUS : 0;
1827: *value |= (status & CB_SS_3VCARD) ? SS_3VCARD : 0;
1828: *value |= (status & CB_SS_XVCARD) ? SS_XVCARD : 0;
1829: *value |= (status & CB_SS_VSENSE) ? 0 : SS_PENDING;
1830: } else if (s->flags & IS_O2MICRO) {
1831: status = i365_get(s, O2_MODE_B);
1832: *value |= (status & O2_MODE_B_VS1) ? 0 : SS_3VCARD;
1833: *value |= (status & O2_MODE_B_VS2) ? 0 : SS_XVCARD;
1834: }
1835: #endif
1836: if ((s->flags & IS_CIRRUS) &&
1837: ((s->flags & IS_PCI) || has_vsense)) {
1838: socket_info_t *t = (s->psock) ? s : s+1;
1839: status = pd67_ext_get(t, PD67_EXTERN_DATA);
1840: *value |= (status & PD67_EXD_VS1(s->psock)) ? 0 : SS_3VCARD;
1841: *value |= (status & PD67_EXD_VS2(s->psock)) ? 0 : SS_XVCARD;
1842: }
1843: #ifdef CONFIG_ISA
1844: if (s->type == IS_VG469) {
1845: status = i365_get(s, VG469_VSENSE);
1846: if (s->psock & 1) {
1847: *value |= (status & VG469_VSENSE_B_VS1) ? 0 : SS_3VCARD;
1848: *value |= (status & VG469_VSENSE_B_VS2) ? 0 : SS_XVCARD;
1849: } else {
1850: *value |= (status & VG469_VSENSE_A_VS1) ? 0 : SS_3VCARD;
1851: *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD;
1852: }
1853: }
1854: #endif
1855: /* For now, ignore cards with unsupported voltage keys */
1856: if (*value & SS_XVCARD)
1857: *value &= ~(SS_DETECT|SS_3VCARD|SS_XVCARD);
1858: DEBUG(1, "i82365: GetStatus(%d) = %#4.4x\n", s-socket, *value);
1859: return 0;
1860: } /* i365_get_status */
1861:
1862: /*====================================================================*/
1863:
1864: static int i365_get_socket(socket_info_t *s, socket_state_t *state)
1865: {
1866: u_char reg, vcc, vpp;
1867:
1868: reg = i365_get(s, I365_POWER);
1869: state->flags = (reg & I365_PWR_AUTO) ? SS_PWR_AUTO : 0;
1870: state->flags |= (reg & I365_PWR_OUT) ? SS_OUTPUT_ENA : 0;
1871: vcc = reg & I365_VCC_MASK; vpp = reg & I365_VPP1_MASK;
1872: state->Vcc = state->Vpp = 0;
1873: #ifdef CONFIG_PCI
1874: if ((s->flags & IS_CARDBUS) && !(s->flags & IS_TOPIC)) {
1875: cb_get_power(s, state);
1876: } else
1877: #endif
1878: {
1879: if ((s->flags & IS_CIRRUS) && (reg & I365_VCC_5V)) {
1880: state->Vcc = (i365_get(s, PD67_MISC_CTL_1) &
1881: PD67_MC1_VCC_3V) ? 33 : 50;
1882: } else if ((s->flags & IS_VG_PWR) && (reg & I365_VCC_5V)) {
1883: state->Vcc = (i365_get(s, VG469_VSELECT) &
1884: VG469_VSEL_VCC) ? 33 : 50;
1885: } else if ((s->flags & IS_DF_PWR) || (s->flags & IS_TOPIC)) {
1886: if (vcc == I365_VCC_3V) state->Vcc = 33;
1887: if (vcc == I365_VCC_5V) state->Vcc = 50;
1888: } else {
1889: if (reg & I365_VCC_5V) state->Vcc = 50;
1890: }
1891: if (vpp == I365_VPP1_5V)
1892: state->Vpp = (s->flags & IS_DF_PWR) ? 50 : state->Vcc;
1893: if (vpp == I365_VPP1_12V) state->Vpp = 120;
1894: }
1895:
1896: /* IO card, RESET flags, IO interrupt */
1897: reg = i365_get(s, I365_INTCTL);
1898: state->flags |= (reg & I365_PC_RESET) ? 0 : SS_RESET;
1899: state->flags |= (reg & I365_PC_IOCARD) ? SS_IOCARD : 0;
1900: #ifdef CONFIG_PCI
1901: if (cb_get_irq_mode(s) != 0)
1902: state->io_irq = s->cap.pci_irq;
1903: else
1904: #endif
1905: state->io_irq = reg & I365_IRQ_MASK;
1906:
1907: /* Card status change mask */
1908: reg = i365_get(s, I365_CSCINT);
1909: state->csc_mask = (reg & I365_CSC_DETECT) ? SS_DETECT : 0;
1910: if (state->flags & SS_IOCARD) {
1911: state->csc_mask |= (reg & I365_CSC_STSCHG) ? SS_STSCHG : 0;
1912: } else {
1913: state->csc_mask |= (reg & I365_CSC_BVD1) ? SS_BATDEAD : 0;
1914: state->csc_mask |= (reg & I365_CSC_BVD2) ? SS_BATWARN : 0;
1915: state->csc_mask |= (reg & I365_CSC_READY) ? SS_READY : 0;
1916: }
1917:
1918: DEBUG(2, "i82365: GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
1919: "io_irq %d, csc_mask %#2.2x\n", s-socket, state->flags,
1920: state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
1921: return 0;
1922: } /* i365_get_socket */
1923:
1924: /*====================================================================*/
1925:
1926: static int i365_set_socket(socket_info_t *s, socket_state_t *state)
1927: {
1928: u_char reg;
1929:
1930: DEBUG(2, "i82365: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
1931: "io_irq %d, csc_mask %#2.2x)\n", s-socket, state->flags,
1932: state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
1933:
1934: /* First set global controller options */
1935: #ifdef CONFIG_PCI
1936: if (s->cap.pci_irq)
1937: cb_set_irq_mode(s, pci_csc, (s->cap.pci_irq == state->io_irq));
1938: s->bcr &= ~CB_BCR_CB_RESET;
1939: #endif
1940: set_bridge_state(s);
1941:
1942: /* IO card, RESET flag, IO interrupt */
1943: reg = s->intr | ((state->io_irq == s->cap.pci_irq) ?
1944: s->pci_irq_code : state->io_irq);
1945: reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
1946: reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
1947: i365_set(s, I365_INTCTL, reg);
1948:
1949: reg = I365_PWR_NORESET;
1950: if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO;
1951: if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT;
1952:
1953: #ifdef CONFIG_PCI
1954: if ((s->flags & IS_CARDBUS) && !(s->flags & IS_TOPIC)) {
1955: cb_set_power(s, state);
1956: reg |= i365_get(s, I365_POWER) & (I365_VCC_MASK|I365_VPP1_MASK);
1957: } else
1958: #endif
1959: {
1960: int new = s->flags & (IS_TOPIC|IS_CIRRUS|IS_VG_PWR|IS_DF_PWR);
1961: int vcc3 = (state->Vcc == 33), df = (s->flags & IS_DF_PWR);
1962:
1963: if (state->Vcc == 50) {
1964: reg |= I365_VCC_5V;
1965: } else if (new && vcc3) {
1966: reg |= ((s->flags & (IS_TOPIC|IS_DF_PWR)) ?
1967: I365_VCC_3V : I365_VCC_5V);
1968: } else if (state->Vcc)
1969: return -EINVAL;
1970: if (s->flags & IS_CIRRUS)
1971: i365_bflip(s, PD67_MISC_CTL_1, PD67_MC1_VCC_3V, vcc3);
1972: if (s->flags & IS_VG_PWR)
1973: i365_bflip(s, VG469_VSELECT, VG469_VSEL_VCC, vcc3);
1974:
1975: if (state->Vpp == 120) {
1976: reg |= I365_VPP1_12V | (new ? 0 : I365_VPP2_12V);
1977: } else if (state->Vpp == (df ? 50 : state->Vcc)) {
1978: reg |= I365_VPP1_5V | (new ? 0 : I365_VPP2_5V);
1979: } else if (state->Vpp)
1980: return -EINVAL;
1981: }
1982:
1983: if (reg != i365_get(s, I365_POWER))
1984: i365_set(s, I365_POWER, reg);
1985:
1986: /* Card status change interrupt mask */
1987: reg = (s->cap.pci_irq ? s->pci_irq_code : s->cs_irq) << 4;
1988: if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT;
1989: if (state->flags & SS_IOCARD) {
1990: if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG;
1991: } else {
1992: if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1;
1993: if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2;
1994: if (state->csc_mask & SS_READY) reg |= I365_CSC_READY;
1995: }
1996: i365_set(s, I365_CSCINT, reg);
1997: i365_get(s, I365_CSC);
1998: #ifdef CONFIG_PCI
1999: if (s->flags & IS_CARDBUS) {
2000: if (s->cs_irq || (pci_csc && s->cap.pci_irq))
2001: cb_writel(s, CB_SOCKET_MASK, CB_SM_CCD);
2002: cb_writel(s, CB_SOCKET_EVENT, -1);
2003: }
2004: #endif
2005:
2006: return 0;
2007: } /* i365_set_socket */
2008:
2009: /*====================================================================*/
2010:
2011: static int i365_get_io_map(socket_info_t *s, struct pccard_io_map *io)
2012: {
2013: u_char map, ioctl, addr;
2014:
2015: map = io->map;
2016: if (map > 1) return -EINVAL;
2017: io->start = i365_get_pair(s, I365_IO(map)+I365_W_START);
2018: io->stop = i365_get_pair(s, I365_IO(map)+I365_W_STOP);
2019: ioctl = i365_get(s, I365_IOCTL);
2020: addr = i365_get(s, I365_ADDRWIN);
2021: io->speed = (ioctl & I365_IOCTL_WAIT(map)) ? cycle_time : 0;
2022: io->flags = (addr & I365_ENA_IO(map)) ? MAP_ACTIVE : 0;
2023: io->flags |= (ioctl & I365_IOCTL_0WS(map)) ? MAP_0WS : 0;
2024: io->flags |= (ioctl & I365_IOCTL_16BIT(map)) ? MAP_16BIT : 0;
2025: io->flags |= (ioctl & I365_IOCTL_IOCS16(map)) ? MAP_AUTOSZ : 0;
2026: DEBUG(3, "i82365: GetIOMap(%d, %d) = %#2.2x, %d ns, %#4.4x-%#4.4x\n",
2027: s-socket, map, io->flags, io->speed, io->start, io->stop);
2028: return 0;
2029: } /* i365_get_io_map */
2030:
2031: /*====================================================================*/
2032:
2033: static int i365_set_io_map(socket_info_t *s, struct pccard_io_map *io)
2034: {
2035: u_char map, ioctl;
2036:
2037: DEBUG(3, "i82365: SetIOMap(%d, %d, %#2.2x, %d ns, %#4.4x-%#4.4x)\n",
2038: s-socket, io->map, io->flags, io->speed, io->start, io->stop);
2039: map = io->map;
2040: if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
2041: (io->stop < io->start)) return -EINVAL;
2042: /* Turn off the window before changing anything */
2043: if (i365_get(s, I365_ADDRWIN) & I365_ENA_IO(map))
2044: i365_bclr(s, I365_ADDRWIN, I365_ENA_IO(map));
2045: i365_set_pair(s, I365_IO(map)+I365_W_START, io->start);
2046: i365_set_pair(s, I365_IO(map)+I365_W_STOP, io->stop);
2047: ioctl = i365_get(s, I365_IOCTL) & ~I365_IOCTL_MASK(map);
2048: if (io->speed) ioctl |= I365_IOCTL_WAIT(map);
2049: if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
2050: if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
2051: if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
2052: i365_set(s, I365_IOCTL, ioctl);
2053: /* Turn on the window if necessary */
2054: if (io->flags & MAP_ACTIVE)
2055: i365_bset(s, I365_ADDRWIN, I365_ENA_IO(map));
2056: return 0;
2057: } /* i365_set_io_map */
2058:
2059: /*====================================================================*/
2060:
2061: static int i365_get_mem_map(socket_info_t *s, struct pccard_mem_map *mem)
2062: {
2063: u_short base, i;
2064: u_char map, addr;
2065:
2066: map = mem->map;
2067: if (map > 4) return -EINVAL;
2068: addr = i365_get(s, I365_ADDRWIN);
2069: mem->flags = (addr & I365_ENA_MEM(map)) ? MAP_ACTIVE : 0;
2070: base = I365_MEM(map);
2071:
2072: i = i365_get_pair(s, base+I365_W_START);
2073: mem->flags |= (i & I365_MEM_16BIT) ? MAP_16BIT : 0;
2074: mem->flags |= (i & I365_MEM_0WS) ? MAP_0WS : 0;
2075: mem->sys_start = ((u_long)(i & 0x0fff) << 12);
2076:
2077: i = i365_get_pair(s, base+I365_W_STOP);
2078: mem->speed = (i & I365_MEM_WS0) ? 1 : 0;
2079: mem->speed += (i & I365_MEM_WS1) ? 2 : 0;
2080: mem->speed *= cycle_time;
2081: mem->sys_stop = ((u_long)(i & 0x0fff) << 12) + 0x0fff;
2082:
2083: i = i365_get_pair(s, base+I365_W_OFF);
2084: mem->flags |= (i & I365_MEM_WRPROT) ? MAP_WRPROT : 0;
2085: mem->flags |= (i & I365_MEM_REG) ? MAP_ATTRIB : 0;
2086: mem->card_start = ((u_int)(i & 0x3fff) << 12) + mem->sys_start;
2087: mem->card_start &= 0x3ffffff;
2088:
2089: #ifdef CONFIG_PCI
2090: /* Take care of high byte, for PCI controllers */
2091: if (s->type == IS_PD6729) {
2092: addr = pd67_ext_get(s, PD67_MEM_PAGE(map)) << 24;
2093: mem->sys_stop += addr; mem->sys_start += addr;
2094: } else if (s->flags & IS_CARDBUS) {
2095: addr = i365_get(s, CB_MEM_PAGE(map)) << 24;
2096: mem->sys_stop += addr; mem->sys_start += addr;
2097: }
2098: #endif
2099:
2100: DEBUG(3, "i82365: GetMemMap(%d, %d) = %#2.2x, %d ns, %#5.5lx-%#5."
2101: "5lx, %#5.5x\n", s-socket, mem->map, mem->flags, mem->speed,
2102: mem->sys_start, mem->sys_stop, mem->card_start);
2103: return 0;
2104: } /* i365_get_mem_map */
2105:
2106: /*====================================================================*/
2107:
2108: static int i365_set_mem_map(socket_info_t *s, struct pccard_mem_map *mem)
2109: {
2110: u_short base, i;
2111: u_char map;
2112:
2113: DEBUG(3, "i82365: SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5"
2114: "lx, %#5.5x)\n", s-socket, mem->map, mem->flags, mem->speed,
2115: mem->sys_start, mem->sys_stop, mem->card_start);
2116:
2117: map = mem->map;
2118: if ((map > 4) || (mem->card_start > 0x3ffffff) ||
2119: (mem->sys_start > mem->sys_stop) || (mem->speed > 1000))
2120: return -EINVAL;
2121: if (!(s->flags & (IS_PCI|IS_CARDBUS)) &&
2122: ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff)))
2123: return -EINVAL;
2124:
2125: /* Turn off the window before changing anything */
2126: if (i365_get(s, I365_ADDRWIN) & I365_ENA_MEM(map))
2127: i365_bclr(s, I365_ADDRWIN, I365_ENA_MEM(map));
2128:
2129: #ifdef CONFIG_PCI
2130: /* Take care of high byte, for PCI controllers */
2131: if (s->type == IS_PD6729) {
2132: pd67_ext_set(s, PD67_MEM_PAGE(map), (mem->sys_start >> 24));
2133: } else if (s->flags & IS_CARDBUS)
2134: i365_set(s, CB_MEM_PAGE(map), mem->sys_start >> 24);
2135: #endif
2136:
2137: base = I365_MEM(map);
2138: i = (mem->sys_start >> 12) & 0x0fff;
2139: if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT;
2140: if (mem->flags & MAP_0WS) i |= I365_MEM_0WS;
2141: i365_set_pair(s, base+I365_W_START, i);
2142:
2143: i = (mem->sys_stop >> 12) & 0x0fff;
2144: switch (mem->speed / cycle_time) {
2145: case 0: break;
2146: case 1: i |= I365_MEM_WS0; break;
2147: case 2: i |= I365_MEM_WS1; break;
2148: default: i |= I365_MEM_WS1 | I365_MEM_WS0; break;
2149: }
2150: i365_set_pair(s, base+I365_W_STOP, i);
2151:
2152: i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff;
2153: if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT;
2154: if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG;
2155: i365_set_pair(s, base+I365_W_OFF, i);
2156:
2157: /* Turn on the window if necessary */
2158: if (mem->flags & MAP_ACTIVE)
2159: i365_bset(s, I365_ADDRWIN, I365_ENA_MEM(map));
2160: return 0;
2161: } /* i365_set_mem_map */
2162:
2163: /*======================================================================
2164:
2165: The few things that are strictly for Cardbus cards goes here.
2166:
2167: ======================================================================*/
2168:
2169: #ifdef CONFIG_CARDBUS
2170:
2171: static int cb_get_status(socket_info_t *s, u_int *value)
2172: {
2173: u_int state = cb_readl(s, CB_SOCKET_STATE);
2174: *value = (state & CB_SS_32BIT) ? SS_CARDBUS : 0;
2175: *value |= (state & CB_SS_CCD) ? 0 : SS_DETECT;
2176: *value |= (state & CB_SS_CSTSCHG) ? SS_STSCHG : 0;
2177: *value |= (state & CB_SS_PWRCYCLE) ? (SS_POWERON|SS_READY) : 0;
2178: *value |= (state & CB_SS_3VCARD) ? SS_3VCARD : 0;
2179: *value |= (state & CB_SS_XVCARD) ? SS_XVCARD : 0;
2180: *value |= (state & CB_SS_VSENSE) ? 0 : SS_PENDING;
2181: DEBUG(1, "yenta: GetStatus(%d) = %#4.4x\n", s-socket, *value);
2182: return 0;
2183: } /* cb_get_status */
2184:
2185: static int cb_get_socket(socket_info_t *s, socket_state_t *state)
2186: {
2187: u_short bcr;
2188:
2189: cb_get_power(s, state);
2190: pci_readw(s, CB_BRIDGE_CONTROL, &bcr);
2191: state->flags |= (bcr & CB_BCR_CB_RESET) ? SS_RESET : 0;
2192: if (cb_get_irq_mode(s) != 0)
2193: state->io_irq = s->cap.pci_irq;
2194: else
2195: state->io_irq = i365_get(s, I365_INTCTL) & I365_IRQ_MASK;
2196: DEBUG(2, "yenta: GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d"
2197: ", io_irq %d, csc_mask %#2.2x\n", s-socket, state->flags,
2198: state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
2199: return 0;
2200: } /* cb_get_socket */
2201:
2202: static int cb_set_socket(socket_info_t *s, socket_state_t *state)
2203: {
2204: u_int reg;
2205:
2206: DEBUG(2, "yenta: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
2207: "io_irq %d, csc_mask %#2.2x)\n", s-socket, state->flags,
2208: state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
2209:
2210: /* First set global controller options */
2211: if (s->cap.pci_irq)
2212: cb_set_irq_mode(s, pci_csc, (s->cap.pci_irq == state->io_irq));
2213: s->bcr &= ~CB_BCR_CB_RESET;
2214: s->bcr |= (state->flags & SS_RESET) ? CB_BCR_CB_RESET : 0;
2215: set_bridge_state(s);
2216:
2217: cb_set_power(s, state);
2218:
2219: /* Handle IO interrupt using ISA routing */
2220: reg = s->intr;
2221: if (state->io_irq != s->cap.pci_irq) reg |= state->io_irq;
2222: i365_set(s, I365_INTCTL, reg);
2223:
2224: /* Handle CSC mask */
2225: if (!s->cs_irq && (!pci_csc || !s->cap.pci_irq))
2226: return 0;
2227: reg = (s->cs_irq << 4);
2228: if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT;
2229: i365_set(s, I365_CSCINT, reg);
2230: i365_get(s, I365_CSC);
2231: cb_writel(s, CB_SOCKET_MASK, CB_SM_CCD);
2232: cb_writel(s, CB_SOCKET_EVENT, -1);
2233:
2234: return 0;
2235: } /* cb_set_socket */
2236:
2237: static int cb_get_bridge(socket_info_t *s, struct cb_bridge_map *m)
2238: {
2239: u_char map = m->map;
2240:
2241: if (map > 1) return -EINVAL;
2242: m->flags &= MAP_IOSPACE;
2243: map += (m->flags & MAP_IOSPACE) ? 2 : 0;
2244: pci_readl(s, CB_MEM_BASE(map), &m->start);
2245: pci_readl(s, CB_MEM_LIMIT(map), &m->stop);
2246: if (m->start || m->stop) {
2247: m->flags |= MAP_ACTIVE;
2248: m->stop |= (map > 1) ? 3 : 0x0fff;
2249: }
2250: if (map > 1) {
2251: u_short bcr;
2252: pci_readw(s, CB_BRIDGE_CONTROL, &bcr);
2253: m->flags |= (bcr & CB_BCR_PREFETCH(map)) ? MAP_PREFETCH : 0;
2254: }
2255: DEBUG(3, "yenta: GetBridge(%d, %d) = %#2.2x, %#4.4x-%#4.4x\n",
2256: s-socket, map, m->flags, m->start, m->stop);
2257: return 0;
2258: }
2259:
2260: static int cb_set_bridge(socket_info_t *s, struct cb_bridge_map *m)
2261: {
2262: u_char map;
2263:
2264: DEBUG(3, "yenta: SetBridge(%d, %d, %#2.2x, %#4.4x-%#4.4x)\n",
2265: s-socket, m->map, m->flags, m->start, m->stop);
2266: map = m->map;
2267: if (!(s->flags & IS_CARDBUS) || (map > 1) || (m->stop < m->start))
2268: return -EINVAL;
2269: if (m->flags & MAP_IOSPACE) {
2270: if ((m->stop > 0xffff) || (m->start & 3) ||
2271: ((m->stop & 3) != 3))
2272: return -EINVAL;
2273: map += 2;
2274: } else {
2275: if ((m->start & 0x0fff) || ((m->stop & 0x0fff) != 0x0fff))
2276: return -EINVAL;
2277: s->bcr &= ~CB_BCR_PREFETCH(map);
2278: s->bcr |= (m->flags & MAP_PREFETCH) ? CB_BCR_PREFETCH(map) : 0;
2279: pci_writew(s, CB_BRIDGE_CONTROL, s->bcr);
2280: }
2281: if (m->flags & MAP_ACTIVE) {
2282: pci_writel(s, CB_MEM_BASE(map), m->start);
2283: pci_writel(s, CB_MEM_LIMIT(map), m->stop);
2284: } else {
2285: pci_writel(s, CB_MEM_LIMIT(map), 0);
2286: pci_writel(s, CB_MEM_BASE(map), 0);
2287: }
2288: return 0;
2289: }
2290:
2291: #endif /* CONFIG_CARDBUS */
2292:
2293: /*======================================================================
2294:
2295: Routines for accessing socket information and register dumps via
2296: /proc/bus/pccard/...
2297:
2298: ======================================================================*/
2299:
2300: #ifdef HAS_PROC_BUS
2301:
2302: static int proc_read_info(char *buf, char **start, off_t pos,
2303: int count, int *eof, void *data)
2304: {
2305: socket_info_t *s = data;
2306: char *p = buf;
2307: p += sprintf(p, "type: %s\npsock: %d\n",
2308: pcic[s->type].name, s->psock);
2309: #ifdef CONFIG_PCI
2310: if (s->flags & (IS_PCI|IS_CARDBUS))
2311: p += sprintf(p, "bus: %02x\ndevfn: %02x.%1x\n",
2312: s->bus, PCI_SLOT(s->devfn), PCI_FUNC(s->devfn));
2313: if (s->flags & IS_CARDBUS)
2314: p += sprintf(p, "cardbus: %02x\n", s->cap.cardbus);
2315: #endif
2316: return (p - buf);
2317: }
2318:
2319: static int proc_read_exca(char *buf, char **start, off_t pos,
2320: int count, int *eof, void *data)
2321: {
2322: socket_info_t *s = data;
2323: char *p = buf;
2324: int i, top;
2325:
2326: #ifdef CONFIG_ISA
2327: u_long flags = 0;
2328: #endif
2329: ISA_LOCK(s, flags);
2330: top = 0x40;
2331: if (s->flags & IS_CARDBUS)
2332: top = (s->flags & IS_CIRRUS) ? 0x140 : 0x50;
2333: for (i = 0; i < top; i += 4) {
2334: if (i == 0x50) {
2335: p += sprintf(p, "\n");
2336: i = 0x100;
2337: }
2338: p += sprintf(p, "%02x %02x %02x %02x%s",
2339: i365_get(s,i), i365_get(s,i+1),
2340: i365_get(s,i+2), i365_get(s,i+3),
2341: ((i % 16) == 12) ? "\n" : " ");
2342: }
2343: ISA_UNLOCK(s, flags);
2344: return (p - buf);
2345: }
2346:
2347: #ifdef CONFIG_PCI
2348: static int proc_read_pci(char *buf, char **start, off_t pos,
2349: int count, int *eof, void *data)
2350: {
2351: socket_info_t *s = data;
2352: char *p = buf;
2353: u_int a, b, c, d;
2354: int i;
2355:
2356: for (i = 0; i < 0xc0; i += 0x10) {
2357: pci_readl(s, i, &a);
2358: pci_readl(s, i+4, &b);
2359: pci_readl(s, i+8, &c);
2360: pci_readl(s, i+12, &d);
2361: p += sprintf(p, "%08x %08x %08x %08x\n", a, b, c, d);
2362: }
2363: return (p - buf);
2364: }
2365:
2366: static int proc_read_cardbus(char *buf, char **start, off_t pos,
2367: int count, int *eof, void *data)
2368: {
2369: socket_info_t *s = data;
2370: char *p = buf;
2371: int i, top;
2372:
2373: top = (s->flags & IS_O2MICRO) ? 0x30 : 0x20;
2374: for (i = 0; i < top; i += 0x10)
2375: p += sprintf(p, "%08x %08x %08x %08x\n",
2376: cb_readl(s,i+0x00), cb_readl(s,i+0x04),
2377: cb_readl(s,i+0x08), cb_readl(s,i+0x0c));
2378: return (p - buf);
2379: }
2380: #endif
2381:
2382: static void pcic_proc_setup(socket_info_t *s, struct proc_dir_entry *base)
2383: {
2384: create_proc_read_entry("info", 0, base, proc_read_info, s);
2385: create_proc_read_entry("exca", 0, base, proc_read_exca, s);
2386: #ifdef CONFIG_PCI
2387: if (s->flags & (IS_PCI|IS_CARDBUS))
2388: create_proc_read_entry("pci", 0, base, proc_read_pci, s);
2389: if (s->flags & IS_CARDBUS)
2390: create_proc_read_entry("cardbus", 0, base, proc_read_cardbus, s);
2391: #endif
2392: s->proc = base;
2393: }
2394:
2395: static void pcic_proc_remove(socket_info_t *s)
2396: {
2397: struct proc_dir_entry *base = s->proc;
2398: if (base == NULL) return;
2399: remove_proc_entry("info", base);
2400: remove_proc_entry("exca", base);
2401: #ifdef CONFIG_PCI
2402: if (s->flags & (IS_PCI|IS_CARDBUS))
2403: remove_proc_entry("pci", base);
2404: if (s->flags & IS_CARDBUS)
2405: remove_proc_entry("cardbus", base);
2406: #endif
2407: }
2408:
2409: #endif /* HAS_PROC_BUS */
2410:
2411: /*====================================================================*/
2412:
2413: typedef int (*subfn_t)(socket_info_t *, void *);
2414:
2415: static subfn_t pcic_service_table[] = {
2416: (subfn_t)&pcic_register_callback,
2417: (subfn_t)&pcic_inquire_socket,
2418: (subfn_t)&i365_get_status,
2419: (subfn_t)&i365_get_socket,
2420: (subfn_t)&i365_set_socket,
2421: (subfn_t)&i365_get_io_map,
2422: (subfn_t)&i365_set_io_map,
2423: (subfn_t)&i365_get_mem_map,
2424: (subfn_t)&i365_set_mem_map,
2425: #ifdef CONFIG_CARDBUS
2426: (subfn_t)&cb_get_bridge,
2427: (subfn_t)&cb_set_bridge,
2428: #else
2429: NULL, NULL,
2430: #endif
2431: #ifdef HAS_PROC_BUS
2432: (subfn_t)&pcic_proc_setup
2433: #endif
2434: };
2435:
2436: #define NFUNC (sizeof(pcic_service_table)/sizeof(subfn_t))
2437:
2438: static int pcic_service(u_int sock, u_int cmd, void *arg)
2439: {
2440: socket_info_t *s = &socket[sock];
2441: subfn_t fn;
2442: int ret;
2443: #ifdef CONFIG_ISA
2444: u_long flags = 0;
2445: #endif
2446:
2447: if (cmd >= NFUNC)
2448: return -EINVAL;
2449:
2450: if (s->flags & IS_ALIVE) {
2451: if (cmd == SS_GetStatus)
2452: *(u_int *)arg = 0;
2453: return -EINVAL;
2454: }
2455:
2456: fn = pcic_service_table[cmd];
2457: #ifdef CONFIG_CARDBUS
2458: if ((s->flags & IS_CARDBUS) &&
2459: (cb_readl(s, CB_SOCKET_STATE) & CB_SS_32BIT)) {
2460: if (cmd == SS_GetStatus)
2461: fn = (subfn_t)&cb_get_status;
2462: else if (cmd == SS_GetSocket)
2463: fn = (subfn_t)&cb_get_socket;
2464: else if (cmd == SS_SetSocket)
2465: fn = (subfn_t)&cb_set_socket;
2466: }
2467: #endif
2468:
2469: ISA_LOCK(s, flags);
2470: ret = (fn == NULL) ? -EINVAL : fn(s, arg);
2471: ISA_UNLOCK(s, flags);
2472: return ret;
2473: } /* pcic_service */
2474:
2475: /*====================================================================*/
2476:
2477: int __init init_i82365(void)
2478: {
2479: servinfo_t serv;
2480: CardServices(GetCardServicesInfo, &serv);
2481: if (serv.Revision != CS_RELEASE_CODE) {
2482: printk(KERN_NOTICE "i82365: Card Services release "
2483: "does not match!\n");
2484: return -EINVAL;
2485: }
2486: DEBUG(0, "%s\n", version);
2487:
2488: #ifdef CONFIG_PCI
2489: if (pcic[IS_UNK_CARDBUS].flags != (IS_CARDBUS|IS_UNKNOWN)) {
2490: printk(KERN_NOTICE "i82365: bad pcic_id enumeration!\n");
2491: return -EINVAL;
2492: }
2493: #endif
2494:
2495: printk(KERN_INFO "Intel ISA/PCI/CardBus PCIC probe:\n");
2496: sockets = 0;
2497:
2498: #ifdef CONFIG_PCI
2499: if (do_pci_probe && pcibios_present()) {
2500: pci_probe(PCI_CLASS_BRIDGE_CARDBUS);
2501: pci_probe(PCI_CLASS_BRIDGE_PCMCIA);
2502: }
2503: #endif
2504:
2505: #ifdef CONFIG_ISA
2506: isa_probe(i365_base);
2507: if (!sockets || extra_sockets)
2508: isa_probe(i365_base+2);
2509: #endif
2510:
2511: if (sockets == 0) {
2512: printk(KERN_INFO " no bridges found.\n");
2513: return -ENODEV;
2514: }
2515:
2516: /* Set up interrupt handler(s) */
2517: #ifdef CONFIG_ISA
2518: if (grab_irq != 0)
2519: request_irq(cs_irq, pcic_interrupt, 0, "i82365", socket);
2520: #endif
2521: #ifdef CONFIG_PCI
2522: if (pci_csc) {
2523: u_int i, irq, mask = 0;
2524: for (i = 0; i < sockets; i++) {
2525: irq = socket[i].cap.pci_irq;
2526: if (irq && !(mask & (1<<irq)))
2527: request_irq(irq, pcic_interrupt, SA_SHIRQ, "i82365", socket);
2528: mask |= (1<<irq);
2529: }
2530: }
2531: #endif
2532:
2533: if (register_ss_entry(sockets, &pcic_service) != 0)
2534: printk(KERN_NOTICE "i82365: register_ss_entry() failed\n");
2535:
2536: /* Finally, schedule a polling interrupt */
2537: if (poll_interval != 0) {
2538: poll_timer.expires = jiffies + poll_interval;
2539: add_timer(&poll_timer);
2540: }
2541:
2542: return 0;
2543:
2544: } /* init_i82365 */
2545:
2546: static void __exit exit_i82365(void)
2547: {
2548: int i;
2549: #ifdef HAS_PROC_BUS
2550: for (i = 0; i < sockets; i++)
2551: pcic_proc_remove(&socket[i]);
2552: #endif
2553: unregister_ss_entry(&pcic_service);
2554: if (poll_interval != 0)
2555: del_timer(&poll_timer);
2556: #ifdef CONFIG_ISA
2557: if (grab_irq != 0)
2558: free_irq(cs_irq, socket);
2559: #endif
2560: #ifdef CONFIG_PCI
2561: if (pci_csc) {
2562: u_int irq, mask = 0;
2563: for (i = 0; i < sockets; i++) {
2564: irq = socket[i].cap.pci_irq;
2565: if (irq && !(mask & (1<<irq)))
2566: free_irq(irq, socket);
2567: mask |= (1<<irq);
2568: }
2569: }
2570: #endif
2571: for (i = 0; i < sockets; i++) {
2572: socket_info_t *s = &socket[i];
2573: /* Turn off all interrupt sources! */
2574: i365_set(s, I365_CSCINT, 0);
2575: #ifdef CONFIG_PCI
2576: if (s->flags & IS_CARDBUS)
2577: cb_writel(s, CB_SOCKET_MASK, 0);
2578: if (s->cb_virt) {
2579: iounmap(s->cb_virt);
2580: release_mem_region(s->cb_phys, 0x1000);
2581: } else
2582: #endif
2583: release_region(s->ioaddr, 2);
2584: }
2585: } /* exit_i82365 */
2586:
2587: module_init(init_i82365);
2588: module_exit(exit_i82365);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.