fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / pcmcia / m8xx_pcmcia.c
1 /*
2  * m8xx_pcmcia.c - Linux PCMCIA socket driver for the mpc8xx series.
3  *
4  * (C) 1999-2000 Magnus Damm <damm@bitsmart.com>
5  * (C) 2001-2002 Montavista Software, Inc.
6  *     <mlocke@mvista.com>
7  *
8  * Support for two slots by Cyclades Corporation
9  *     <oliver.kurth@cyclades.de>
10  * Further fixes, v2.6 kernel port
11  *     <marcelo.tosatti@cyclades.com>
12  * 
13  * Some fixes, additions (C) 2005 Montavista Software, Inc. 
14  *     <vbordug@ru.mvista.com>
15  *
16  * "The ExCA standard specifies that socket controllers should provide
17  * two IO and five memory windows per socket, which can be independently
18  * configured and positioned in the host address space and mapped to
19  * arbitrary segments of card address space. " - David A Hinds. 1999
20  *
21  * This controller does _not_ meet the ExCA standard.
22  *
23  * m8xx pcmcia controller brief info:
24  * + 8 windows (attrib, mem, i/o)
25  * + up to two slots (SLOT_A and SLOT_B)
26  * + inputpins, outputpins, event and mask registers.
27  * - no offset register. sigh.
28  *
29  * Because of the lacking offset register we must map the whole card.
30  * We assign each memory window PCMCIA_MEM_WIN_SIZE address space.
31  * Make sure there is (PCMCIA_MEM_WIN_SIZE * PCMCIA_MEM_WIN_NO
32  * * PCMCIA_SOCKETS_NO) bytes at PCMCIA_MEM_WIN_BASE.
33  * The i/o windows are dynamically allocated at PCMCIA_IO_WIN_BASE.
34  * They are maximum 64KByte each...
35  */
36
37 #include <linux/module.h>
38 #include <linux/init.h>
39 #include <linux/types.h>
40 #include <linux/fcntl.h>
41 #include <linux/string.h>
42
43 #include <asm/io.h>
44 #include <asm/bitops.h>
45 #include <asm/system.h>
46
47 #include <linux/kernel.h>
48 #include <linux/errno.h>
49 #include <linux/sched.h>
50 #include <linux/slab.h>
51 #include <linux/timer.h>
52 #include <linux/ioport.h>
53 #include <linux/delay.h>
54 #include <linux/interrupt.h>
55 #include <linux/platform_device.h>
56
57 #include <asm/mpc8xx.h>
58 #include <asm/8xx_immap.h>
59 #include <asm/irq.h>
60
61 #include <pcmcia/version.h>
62 #include <pcmcia/cs_types.h>
63 #include <pcmcia/cs.h>
64 #include <pcmcia/ss.h>
65
66 #ifdef PCMCIA_DEBUG
67 static int pc_debug = PCMCIA_DEBUG;
68 module_param(pc_debug, int, 0);
69 #define dprintk(args...) printk(KERN_DEBUG "m8xx_pcmcia: " args);
70 #else
71 #define dprintk(args...)
72 #endif
73
74 #define pcmcia_info(args...) printk(KERN_INFO "m8xx_pcmcia: "args)
75 #define pcmcia_error(args...) printk(KERN_ERR "m8xx_pcmcia: "args)
76
77 static const char *version = "Version 0.06, Aug 2005";
78 MODULE_LICENSE("Dual MPL/GPL");
79
80 #if !defined(CONFIG_PCMCIA_SLOT_A) && !defined(CONFIG_PCMCIA_SLOT_B)
81
82 /* The RPX series use SLOT_B */
83 #if defined(CONFIG_RPXCLASSIC) || defined(CONFIG_RPXLITE)
84 #define CONFIG_PCMCIA_SLOT_B
85 #define CONFIG_BD_IS_MHZ
86 #endif
87
88 /* The ADS board use SLOT_A */
89 #ifdef CONFIG_ADS
90 #define CONFIG_PCMCIA_SLOT_A
91 #define CONFIG_BD_IS_MHZ
92 #endif
93
94 /* The FADS series are a mess */
95 #ifdef CONFIG_FADS
96 #if defined(CONFIG_MPC860T) || defined(CONFIG_MPC860) || defined(CONFIG_MPC821)
97 #define CONFIG_PCMCIA_SLOT_A
98 #else
99 #define CONFIG_PCMCIA_SLOT_B
100 #endif
101 #endif
102
103 #if defined(CONFIG_MPC885ADS)
104 #define CONFIG_PCMCIA_SLOT_A
105 #define PCMCIA_GLITCHY_CD
106 #endif
107
108 /* Cyclades ACS uses both slots */
109 #ifdef CONFIG_PRxK
110 #define CONFIG_PCMCIA_SLOT_A
111 #define CONFIG_PCMCIA_SLOT_B
112 #endif
113
114 #endif /* !defined(CONFIG_PCMCIA_SLOT_A) && !defined(CONFIG_PCMCIA_SLOT_B) */
115
116 #if defined(CONFIG_PCMCIA_SLOT_A) && defined(CONFIG_PCMCIA_SLOT_B)
117
118 #define PCMCIA_SOCKETS_NO 2
119 /* We have only 8 windows, dualsocket support will be limited. */
120 #define PCMCIA_MEM_WIN_NO 2
121 #define PCMCIA_IO_WIN_NO  2
122 #define PCMCIA_SLOT_MSG "SLOT_A and SLOT_B"
123
124 #elif defined(CONFIG_PCMCIA_SLOT_A) || defined(CONFIG_PCMCIA_SLOT_B)
125
126 #define PCMCIA_SOCKETS_NO 1
127 /* full support for one slot */
128 #define PCMCIA_MEM_WIN_NO 5
129 #define PCMCIA_IO_WIN_NO  2
130
131 /* define _slot_ to be able to optimize macros */
132
133 #ifdef CONFIG_PCMCIA_SLOT_A
134 #define _slot_ 0
135 #define PCMCIA_SLOT_MSG "SLOT_A"
136 #else
137 #define _slot_ 1
138 #define PCMCIA_SLOT_MSG "SLOT_B"
139 #endif
140
141 #else
142 #error m8xx_pcmcia: Bad configuration!
143 #endif
144
145 /* ------------------------------------------------------------------------- */
146
147 #define PCMCIA_MEM_WIN_BASE 0xe0000000 /* base address for memory window 0   */
148 #define PCMCIA_MEM_WIN_SIZE 0x04000000 /* each memory window is 64 MByte     */
149 #define PCMCIA_IO_WIN_BASE  _IO_BASE   /* base address for io window 0       */
150
151 #define PCMCIA_SCHLVL PCMCIA_INTERRUPT /* Status Change Interrupt Level      */
152
153 /* ------------------------------------------------------------------------- */
154
155 /* 2.4.x and newer has this always in HZ */
156 #define M8XX_BUSFREQ ((((bd_t *)&(__res))->bi_busfreq))
157
158 static int pcmcia_schlvl = PCMCIA_SCHLVL;
159
160 static DEFINE_SPINLOCK(events_lock);
161
162
163 #define PCMCIA_SOCKET_KEY_5V 1
164 #define PCMCIA_SOCKET_KEY_LV 2
165
166 /* look up table for pgcrx registers */
167 static u32 *m8xx_pgcrx[2] = {
168         &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pgcra,
169         &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pgcrb
170 };
171
172 /*
173  * This structure is used to address each window in the PCMCIA controller.
174  *
175  * Keep in mind that we assume that pcmcia_win[n+1] is mapped directly
176  * after pcmcia_win[n]...
177  */
178
179 struct pcmcia_win {
180         u32     br;
181         u32     or;
182 };
183
184 /*
185  * For some reason the hardware guys decided to make both slots share
186  * some registers.
187  *
188  * Could someone invent object oriented hardware ?
189  *
190  * The macros are used to get the right bit from the registers.
191  * SLOT_A : slot = 0
192  * SLOT_B : slot = 1
193  */
194
195 #define M8XX_PCMCIA_VS1(slot)      (0x80000000 >> (slot << 4))
196 #define M8XX_PCMCIA_VS2(slot)      (0x40000000 >> (slot << 4))
197 #define M8XX_PCMCIA_VS_MASK(slot)  (0xc0000000 >> (slot << 4))
198 #define M8XX_PCMCIA_VS_SHIFT(slot) (30 - (slot << 4))
199
200 #define M8XX_PCMCIA_WP(slot)       (0x20000000 >> (slot << 4))
201 #define M8XX_PCMCIA_CD2(slot)      (0x10000000 >> (slot << 4))
202 #define M8XX_PCMCIA_CD1(slot)      (0x08000000 >> (slot << 4))
203 #define M8XX_PCMCIA_BVD2(slot)     (0x04000000 >> (slot << 4))
204 #define M8XX_PCMCIA_BVD1(slot)     (0x02000000 >> (slot << 4))
205 #define M8XX_PCMCIA_RDY(slot)      (0x01000000 >> (slot << 4))
206 #define M8XX_PCMCIA_RDY_L(slot)    (0x00800000 >> (slot << 4))
207 #define M8XX_PCMCIA_RDY_H(slot)    (0x00400000 >> (slot << 4))
208 #define M8XX_PCMCIA_RDY_R(slot)    (0x00200000 >> (slot << 4))
209 #define M8XX_PCMCIA_RDY_F(slot)    (0x00100000 >> (slot << 4))
210 #define M8XX_PCMCIA_MASK(slot)     (0xFFFF0000 >> (slot << 4))
211
212 #define M8XX_PCMCIA_POR_VALID    0x00000001
213 #define M8XX_PCMCIA_POR_WRPROT   0x00000002
214 #define M8XX_PCMCIA_POR_ATTRMEM  0x00000010
215 #define M8XX_PCMCIA_POR_IO       0x00000018
216 #define M8XX_PCMCIA_POR_16BIT    0x00000040
217
218 #define M8XX_PGCRX(slot)  m8xx_pgcrx[slot]
219
220 #define M8XX_PGCRX_CXOE    0x00000080
221 #define M8XX_PGCRX_CXRESET 0x00000040
222
223 /* we keep one lookup table per socket to check flags */
224
225 #define PCMCIA_EVENTS_MAX 5  /* 4 max at a time + termination */
226
227 struct event_table {
228         u32 regbit;
229         u32 eventbit;
230 };
231
232 struct socket_info {
233         void    (*handler)(void *info, u32 events);
234         void    *info;
235
236         u32 slot;
237
238         socket_state_t state;
239         struct pccard_mem_map mem_win[PCMCIA_MEM_WIN_NO];
240         struct pccard_io_map  io_win[PCMCIA_IO_WIN_NO];
241         struct event_table events[PCMCIA_EVENTS_MAX];
242         struct pcmcia_socket socket;
243 };
244
245 static struct socket_info socket[PCMCIA_SOCKETS_NO];
246
247 /*
248  * Search this table to see if the windowsize is
249  * supported...
250  */
251
252 #define M8XX_SIZES_NO 32
253
254 static const u32 m8xx_size_to_gray[M8XX_SIZES_NO] =
255 {
256         0x00000001, 0x00000002, 0x00000008, 0x00000004,
257         0x00000080, 0x00000040, 0x00000010, 0x00000020,
258         0x00008000, 0x00004000, 0x00001000, 0x00002000,
259         0x00000100, 0x00000200, 0x00000800, 0x00000400,
260
261         0x0fffffff, 0xffffffff, 0xffffffff, 0xffffffff,
262         0x01000000, 0x02000000, 0xffffffff, 0x04000000,
263         0x00010000, 0x00020000, 0x00080000, 0x00040000,
264         0x00800000, 0x00400000, 0x00100000, 0x00200000
265 };
266
267 /* ------------------------------------------------------------------------- */
268
269 static irqreturn_t m8xx_interrupt(int irq, void *dev);
270
271 #define PCMCIA_BMT_LIMIT (15*4)  /* Bus Monitor Timeout value */
272
273 /* ------------------------------------------------------------------------- */
274 /* board specific stuff:                                                     */
275 /* voltage_set(), hardware_enable() and hardware_disable()                   */
276 /* ------------------------------------------------------------------------- */
277 /* RPX Boards from Embedded Planet                                           */
278
279 #if defined(CONFIG_RPXCLASSIC) || defined(CONFIG_RPXLITE)
280
281 /* The RPX boards seems to have it's bus monitor timeout set to 6*8 clocks.
282  * SYPCR is write once only, therefore must the slowest memory be faster
283  * than the bus monitor or we will get a machine check due to the bus timeout.
284  */
285
286 #define PCMCIA_BOARD_MSG "RPX CLASSIC or RPX LITE"
287
288 #undef PCMCIA_BMT_LIMIT
289 #define PCMCIA_BMT_LIMIT (6*8)
290
291 static int voltage_set(int slot, int vcc, int vpp)
292 {
293         u32 reg = 0;
294
295         switch(vcc) {
296         case 0: break;
297         case 33:
298                 reg |= BCSR1_PCVCTL4;
299                 break;
300         case 50:
301                 reg |= BCSR1_PCVCTL5;
302                 break;
303         default:
304                 return 1;
305         }
306
307         switch(vpp) {
308         case 0: break;
309         case 33:
310         case 50:
311                 if(vcc == vpp)
312                         reg |= BCSR1_PCVCTL6;
313                 else
314                         return 1;
315                 break;
316         case 120:
317                 reg |= BCSR1_PCVCTL7;
318         default:
319                 return 1;
320         }
321
322         if(!((vcc == 50) || (vcc == 0)))
323                 return 1;
324
325         /* first, turn off all power */
326
327         out_be32(((u32 *)RPX_CSR_ADDR), in_be32(((u32 *)RPX_CSR_ADDR)) & ~(BCSR1_PCVCTL4 | BCSR1_PCVCTL5 | BCSR1_PCVCTL6 | BCSR1_PCVCTL7));
328
329         /* enable new powersettings */
330
331         out_be32(((u32 *)RPX_CSR_ADDR), in_be32(((u32 *)RPX_CSR_ADDR)) | reg);
332
333         return 0;
334 }
335
336 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
337 #define hardware_enable(_slot_)  /* No hardware to enable */
338 #define hardware_disable(_slot_) /* No hardware to disable */
339
340 #endif /* CONFIG_RPXCLASSIC */
341
342 /* FADS Boards from Motorola                                               */
343
344 #if defined(CONFIG_FADS)
345
346 #define PCMCIA_BOARD_MSG "FADS"
347
348 static int voltage_set(int slot, int vcc, int vpp)
349 {
350         u32 reg = 0;
351
352         switch(vcc) {
353                 case 0:
354                         break;
355                 case 33:
356                         reg |= BCSR1_PCCVCC0;
357                         break;
358                 case 50:
359                         reg |= BCSR1_PCCVCC1;
360                         break;
361                 default:
362                         return 1;
363         }
364
365         switch(vpp) {
366                 case 0:
367                         break;
368                 case 33:
369                 case 50:
370                         if(vcc == vpp)
371                                 reg |= BCSR1_PCCVPP1;
372                         else
373                                 return 1;
374                         break;
375                 case 120:
376                         if ((vcc == 33) || (vcc == 50))
377                                 reg |= BCSR1_PCCVPP0;
378                         else
379                                 return 1;
380                 default:
381                         return 1;
382         }
383
384         /* first, turn off all power */
385         out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) & ~(BCSR1_PCCVCC_MASK | BCSR1_PCCVPP_MASK));
386
387         /* enable new powersettings */
388         out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) | reg);
389
390         return 0;
391 }
392
393 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
394
395 static void hardware_enable(int slot)
396 {
397         out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) & ~BCSR1_PCCEN);
398 }
399
400 static void hardware_disable(int slot)
401 {
402         out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) |  BCSR1_PCCEN);
403 }
404
405 #endif
406
407 /* MPC885ADS Boards */
408
409 #if defined(CONFIG_MPC885ADS)
410
411 #define PCMCIA_BOARD_MSG "MPC885ADS"
412
413 static int voltage_set(int slot, int vcc, int vpp)
414 {
415         u32 reg = 0;
416         unsigned *bcsr_io;
417
418         bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
419
420         switch(vcc) {
421                 case 0:
422                         break;
423                 case 33:
424                         reg |= BCSR1_PCCVCC0;
425                         break;
426                 case 50:
427                         reg |= BCSR1_PCCVCC1;
428                         break;
429                 default:
430                         goto out_unmap;
431         }
432
433         switch(vpp) {
434                 case 0:
435                         break;
436                 case 33:
437                 case 50:
438                         if(vcc == vpp)
439                                 reg |= BCSR1_PCCVPP1;
440                         else
441                                 goto out_unmap;
442                         break;
443                 case 120:
444                         if ((vcc == 33) || (vcc == 50))
445                                 reg |= BCSR1_PCCVPP0;
446                         else
447                                 goto out_unmap;
448                 default:
449                         goto out_unmap;
450         }
451
452         /* first, turn off all power */
453         out_be32(bcsr_io, in_be32(bcsr_io) & ~(BCSR1_PCCVCC_MASK | BCSR1_PCCVPP_MASK));
454
455         /* enable new powersettings */
456         out_be32(bcsr_io, in_be32(bcsr_io) | reg);
457
458         iounmap(bcsr_io);
459         return 0;
460
461 out_unmap:
462         iounmap(bcsr_io);
463         return 1;
464 }
465
466 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
467
468 static void hardware_enable(int slot)
469 {
470         unsigned *bcsr_io;
471
472         bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
473         out_be32(bcsr_io, in_be32(bcsr_io) & ~BCSR1_PCCEN);
474         iounmap(bcsr_io);
475 }
476
477 static void hardware_disable(int slot)
478 {
479         unsigned *bcsr_io;
480
481         bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
482         out_be32(bcsr_io, in_be32(bcsr_io) |  BCSR1_PCCEN);
483         iounmap(bcsr_io);
484 }
485
486 #endif
487
488 /* ------------------------------------------------------------------------- */
489 /* Motorola MBX860                                                           */
490
491 #if defined(CONFIG_MBX)
492
493 #define PCMCIA_BOARD_MSG "MBX"
494
495 static int voltage_set(int slot, int vcc, int vpp)
496 {
497         u8 reg = 0;
498
499         switch(vcc) {
500                 case 0:
501                         break;
502                 case 33:
503                         reg |= CSR2_VCC_33;
504                         break;
505                 case 50:
506                         reg |= CSR2_VCC_50;
507                         break;
508                 default:
509                         return 1;
510         }
511
512         switch(vpp) {
513                 case 0:
514                         break;
515                 case 33:
516                 case 50:
517                         if(vcc == vpp)
518                                 reg |= CSR2_VPP_VCC;
519                         else
520                                 return 1;
521                         break;
522                 case 120:
523                         if ((vcc == 33) || (vcc == 50))
524                                 reg |= CSR2_VPP_12;
525                         else
526                                 return 1;
527                 default:
528                         return 1;
529         }
530
531         /* first, turn off all power */
532         out_8((u8 *)MBX_CSR2_ADDR, in_8((u8 *)MBX_CSR2_ADDR) & ~(CSR2_VCC_MASK | CSR2_VPP_MASK));
533
534         /* enable new powersettings */
535         out_8((u8 *)MBX_CSR2_ADDR, in_8((u8 *)MBX_CSR2_ADDR) | reg);
536
537         return 0;
538 }
539
540 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
541 #define hardware_enable(_slot_)  /* No hardware to enable */
542 #define hardware_disable(_slot_) /* No hardware to disable */
543
544 #endif /* CONFIG_MBX */
545
546 #if defined(CONFIG_PRxK)
547 #include <asm/cpld.h>
548 extern volatile fpga_pc_regs *fpga_pc;
549
550 #define PCMCIA_BOARD_MSG "MPC855T"
551
552 static int voltage_set(int slot, int vcc, int vpp)
553 {
554         u8 reg = 0;
555         u8 regread;
556         cpld_regs *ccpld = get_cpld();
557
558         switch(vcc) {
559                 case 0:
560                         break;
561                 case 33:
562                         reg |= PCMCIA_VCC_33;
563                         break;
564                 case 50:
565                         reg |= PCMCIA_VCC_50;
566                         break;
567                 default:
568                         return 1;
569         }
570
571         switch(vpp) {
572                 case 0:
573                         break;
574                 case 33:
575                 case 50:
576                         if(vcc == vpp)
577                                 reg |= PCMCIA_VPP_VCC;
578                         else
579                                 return 1;
580                         break;
581                 case 120:
582                         if ((vcc == 33) || (vcc == 50))
583                                 reg |= PCMCIA_VPP_12;
584                         else
585                                 return 1;
586                 default:
587                         return 1;
588         }
589
590         reg = reg >> (slot << 2);
591         regread = in_8(&ccpld->fpga_pc_ctl);
592         if (reg != (regread & ((PCMCIA_VCC_MASK | PCMCIA_VPP_MASK) >> (slot << 2)))) {
593                 /* enable new powersettings */
594                 regread = regread & ~((PCMCIA_VCC_MASK | PCMCIA_VPP_MASK) >> (slot << 2));
595                 out_8(&ccpld->fpga_pc_ctl, reg | regread);
596                 msleep(100);
597         }
598
599         return 0;
600 }
601
602 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_LV
603 #define hardware_enable(_slot_)  /* No hardware to enable */
604 #define hardware_disable(_slot_) /* No hardware to disable */
605
606 #endif /* CONFIG_PRxK */
607
608 static void m8xx_shutdown(void)
609 {
610         u32 m, i;
611         struct pcmcia_win *w;
612
613         for(i = 0; i < PCMCIA_SOCKETS_NO; i++){
614                 w = (void *) &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0;
615
616                 out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr, M8XX_PCMCIA_MASK(i));
617                 out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per, in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per) & ~M8XX_PCMCIA_MASK(i));
618
619                 /* turn off interrupt and disable CxOE */
620                 out_be32(M8XX_PGCRX(i), M8XX_PGCRX_CXOE);
621
622                 /* turn off memory windows */
623                 for(m = 0; m < PCMCIA_MEM_WIN_NO; m++) {
624                         out_be32(&w->or, 0); /* set to not valid */
625                         w++;
626                 }
627
628                 /* turn off voltage */
629                 voltage_set(i, 0, 0);
630
631                 /* disable external hardware */
632                 hardware_disable(i);
633         }
634
635         free_irq(pcmcia_schlvl, NULL);
636 }
637
638 static struct device_driver m8xx_driver = {
639         .name = "m8xx-pcmcia",
640         .bus = &platform_bus_type,
641         .suspend = pcmcia_socket_dev_suspend,
642         .resume = pcmcia_socket_dev_resume,
643 };
644
645 static struct platform_device m8xx_device = {
646         .name = "m8xx-pcmcia",
647         .id = 0,
648 };
649
650 static u32 pending_events[PCMCIA_SOCKETS_NO];
651 static DEFINE_SPINLOCK(pending_event_lock);
652
653 static irqreturn_t m8xx_interrupt(int irq, void *dev)
654 {
655         struct socket_info *s;
656         struct event_table *e;
657         unsigned int i, events, pscr, pipr, per;
658
659         dprintk("Interrupt!\n");
660         /* get interrupt sources */
661
662         pscr = in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr);
663         pipr = in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pipr);
664         per = in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per);
665
666         for(i = 0; i < PCMCIA_SOCKETS_NO; i++) {
667                 s = &socket[i];
668                 e = &s->events[0];
669                 events = 0;
670
671                 while(e->regbit) {
672                         if(pscr & e->regbit)
673                                 events |= e->eventbit;
674
675                                 e++;
676                 }
677
678                 /*
679                  * report only if both card detect signals are the same
680                  * not too nice done,
681                  * we depend on that CD2 is the bit to the left of CD1...
682                  */
683                 if(events & SS_DETECT)
684                         if(((pipr & M8XX_PCMCIA_CD2(i)) >> 1) ^
685                                 (pipr & M8XX_PCMCIA_CD1(i)))
686                         {
687                                 events &= ~SS_DETECT;
688                         }
689
690 #ifdef PCMCIA_GLITCHY_CD
691                 /*
692                  * I've experienced CD problems with my ADS board.
693                  * We make an extra check to see if there was a
694                  * real change of Card detection.
695                  */
696
697                 if((events & SS_DETECT) &&
698                    ((pipr &
699                      (M8XX_PCMCIA_CD2(i) | M8XX_PCMCIA_CD1(i))) == 0) &&
700                    (s->state.Vcc | s->state.Vpp)) {
701                         events &= ~SS_DETECT;
702                         /*printk( "CD glitch workaround - CD = 0x%08x!\n",
703                                 (pipr & (M8XX_PCMCIA_CD2(i)
704                                          | M8XX_PCMCIA_CD1(i))));*/
705                 }
706 #endif
707
708                 /* call the handler */
709
710                 dprintk("slot %u: events = 0x%02x, pscr = 0x%08x, "
711                         "pipr = 0x%08x\n",
712                         i, events, pscr, pipr);
713
714                 if(events) {
715                         spin_lock(&pending_event_lock);
716                         pending_events[i] |= events;
717                         spin_unlock(&pending_event_lock);
718                         /*
719                          * Turn off RDY_L bits in the PER mask on
720                          * CD interrupt receival.
721                          *
722                          * They can generate bad interrupts on the
723                          * ACS4,8,16,32.   - marcelo
724                          */
725                         per &= ~M8XX_PCMCIA_RDY_L(0);
726                         per &= ~M8XX_PCMCIA_RDY_L(1);
727
728                         out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per, per);
729
730                         if (events)
731                                 pcmcia_parse_events(&socket[i].socket, events);
732                 }
733         }
734
735         /* clear the interrupt sources */
736         out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr, pscr);
737
738         dprintk("Interrupt done.\n");
739
740         return IRQ_HANDLED;
741 }
742
743 static u32 m8xx_get_graycode(u32 size)
744 {
745         u32 k;
746
747         for(k = 0; k < M8XX_SIZES_NO; k++)
748                 if(m8xx_size_to_gray[k] == size)
749                         break;
750
751         if((k == M8XX_SIZES_NO) || (m8xx_size_to_gray[k] == -1))
752                 k = -1;
753
754         return k;
755 }
756
757 static u32 m8xx_get_speed(u32 ns, u32 is_io)
758 {
759         u32 reg, clocks, psst, psl, psht;
760
761         if(!ns) {
762
763                 /*
764                  * We get called with IO maps setup to 0ns
765                  * if not specified by the user.
766                  * They should be 255ns.
767                  */
768
769                 if(is_io)
770                         ns = 255;
771                 else
772                         ns = 100;  /* fast memory if 0 */
773         }
774
775         /*
776          * In PSST, PSL, PSHT fields we tell the controller
777          * timing parameters in CLKOUT clock cycles.
778          * CLKOUT is the same as GCLK2_50.
779          */
780
781 /* how we want to adjust the timing - in percent */
782
783 #define ADJ 180 /* 80 % longer accesstime - to be sure */
784
785         clocks = ((M8XX_BUSFREQ / 1000) * ns) / 1000;
786         clocks = (clocks * ADJ) / (100*1000);
787         if(clocks >= PCMCIA_BMT_LIMIT) {
788                 printk( "Max access time limit reached\n");
789                 clocks = PCMCIA_BMT_LIMIT-1;
790         }
791
792         psst = clocks / 7;          /* setup time */
793         psht = clocks / 7;          /* hold time */
794         psl  = (clocks * 5) / 7;    /* strobe length */
795
796         psst += clocks - (psst + psht + psl);
797
798         reg =  psst << 12;
799         reg |= psl  << 7;
800         reg |= psht << 16;
801
802         return reg;
803 }
804
805 static int m8xx_get_status(struct pcmcia_socket *sock, unsigned int *value)
806 {
807         int lsock = container_of(sock, struct socket_info, socket)->slot;
808         struct socket_info *s = &socket[lsock];
809         unsigned int pipr, reg;
810
811         pipr = in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pipr);
812
813         *value  = ((pipr & (M8XX_PCMCIA_CD1(lsock)
814                             | M8XX_PCMCIA_CD2(lsock))) == 0) ? SS_DETECT : 0;
815         *value |= (pipr & M8XX_PCMCIA_WP(lsock)) ? SS_WRPROT : 0;
816
817         if (s->state.flags & SS_IOCARD)
818                 *value |= (pipr & M8XX_PCMCIA_BVD1(lsock)) ? SS_STSCHG : 0;
819         else {
820                 *value |= (pipr & M8XX_PCMCIA_RDY(lsock)) ? SS_READY : 0;
821                 *value |= (pipr & M8XX_PCMCIA_BVD1(lsock)) ? SS_BATDEAD : 0;
822                 *value |= (pipr & M8XX_PCMCIA_BVD2(lsock)) ? SS_BATWARN : 0;
823         }
824
825         if (s->state.Vcc | s->state.Vpp)
826                 *value |= SS_POWERON;
827
828         /*
829          * Voltage detection:
830          * This driver only supports 16-Bit pc-cards.
831          * Cardbus is not handled here.
832          *
833          * To determine what voltage to use we must read the VS1 and VS2 pin.
834          * Depending on what socket type is present,
835          * different combinations mean different things.
836          *
837          * Card Key  Socket Key   VS1   VS2   Card         Vcc for CIS parse
838          *
839          * 5V        5V, LV*      NC    NC    5V only       5V (if available)
840          *
841          * 5V        5V, LV*      GND   NC    5 or 3.3V     as low as possible
842          *
843          * 5V        5V, LV*      GND   GND   5, 3.3, x.xV  as low as possible
844          *
845          * LV*       5V            -     -    shall not fit into socket
846          *
847          * LV*       LV*          GND   NC    3.3V only     3.3V
848          *
849          * LV*       LV*          NC    GND   x.xV          x.xV (if avail.)
850          *
851          * LV*       LV*          GND   GND   3.3 or x.xV   as low as possible
852          *
853          * *LV means Low Voltage
854          *
855          *
856          * That gives us the following table:
857          *
858          * Socket    VS1  VS2   Voltage
859          *
860          * 5V        NC   NC    5V
861          * 5V        NC   GND   none (should not be possible)
862          * 5V        GND  NC    >= 3.3V
863          * 5V        GND  GND   >= x.xV
864          *
865          * LV        NC   NC    5V   (if available)
866          * LV        NC   GND   x.xV (if available)
867          * LV        GND  NC    3.3V
868          * LV        GND  GND   >= x.xV
869          *
870          * So, how do I determine if I have a 5V or a LV
871          * socket on my board?  Look at the socket!
872          *
873          *
874          * Socket with 5V key:
875          * ++--------------------------------------------+
876          * ||                                            |
877          * ||                                           ||
878          * ||                                           ||
879          * |                                             |
880          * +---------------------------------------------+
881          *
882          * Socket with LV key:
883          * ++--------------------------------------------+
884          * ||                                            |
885          * |                                            ||
886          * |                                            ||
887          * |                                             |
888          * +---------------------------------------------+
889          *
890          *
891          * With other words - LV only cards does not fit
892          * into the 5V socket!
893          */
894
895         /* read out VS1 and VS2 */
896
897         reg = (pipr & M8XX_PCMCIA_VS_MASK(lsock))
898                 >> M8XX_PCMCIA_VS_SHIFT(lsock);
899
900         if(socket_get(lsock) == PCMCIA_SOCKET_KEY_LV) {
901                 switch(reg) {
902                 case 1:
903                         *value |= SS_3VCARD;
904                         break; /* GND, NC - 3.3V only */
905                 case 2:
906                         *value |= SS_XVCARD;
907                         break; /* NC. GND - x.xV only */
908                 };
909         }
910
911         dprintk("GetStatus(%d) = %#2.2x\n", lsock, *value);
912         return 0;
913 }
914
915 static int m8xx_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
916 {
917         int lsock = container_of(sock, struct socket_info, socket)->slot;
918         struct socket_info *s = &socket[lsock];
919         struct event_table *e;
920         unsigned int reg;
921         unsigned long flags;
922
923         dprintk( "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
924               "io_irq %d, csc_mask %#2.2x)\n", lsock, state->flags,
925               state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
926
927         /* First, set voltage - bail out if invalid */
928         if(voltage_set(lsock, state->Vcc, state->Vpp))
929                 return -EINVAL;
930
931         /* Take care of reset... */
932         if(state->flags & SS_RESET)
933                 out_be32(M8XX_PGCRX(lsock), in_be32(M8XX_PGCRX(lsock)) |  M8XX_PGCRX_CXRESET); /* active high */
934         else
935                 out_be32(M8XX_PGCRX(lsock), in_be32(M8XX_PGCRX(lsock)) & ~M8XX_PGCRX_CXRESET);
936
937         /* ... and output enable. */
938
939         /* The CxOE signal is connected to a 74541 on the ADS.
940            I guess most other boards used the ADS as a reference.
941            I tried to control the CxOE signal with SS_OUTPUT_ENA,
942            but the reset signal seems connected via the 541.
943            If the CxOE is left high are some signals tristated and
944            no pullups are present -> the cards act wierd.
945            So right now the buffers are enabled if the power is on. */
946
947         if(state->Vcc || state->Vpp)
948                 out_be32(M8XX_PGCRX(lsock), in_be32(M8XX_PGCRX(lsock)) & ~M8XX_PGCRX_CXOE); /* active low */
949         else
950                 out_be32(M8XX_PGCRX(lsock), in_be32(M8XX_PGCRX(lsock)) | M8XX_PGCRX_CXOE);
951
952         /*
953          * We'd better turn off interrupts before
954          * we mess with the events-table..
955          */
956
957         spin_lock_irqsave(&events_lock, flags);
958
959         /*
960          * Play around with the interrupt mask to be able to
961          * give the events the generic pcmcia driver wants us to.
962          */
963
964         e = &s->events[0];
965         reg = 0;
966
967         if(state->csc_mask & SS_DETECT) {
968                 e->eventbit = SS_DETECT;
969                 reg |= e->regbit = (M8XX_PCMCIA_CD2(lsock)
970                                     | M8XX_PCMCIA_CD1(lsock));
971                 e++;
972         }
973         if(state->flags & SS_IOCARD) {
974                 /*
975                  * I/O card
976                  */
977                 if(state->csc_mask & SS_STSCHG) {
978                         e->eventbit = SS_STSCHG;
979                         reg |= e->regbit = M8XX_PCMCIA_BVD1(lsock);
980                         e++;
981                 }
982                 /*
983                  * If io_irq is non-zero we should enable irq.
984                  */
985                 if(state->io_irq) {
986                         out_be32(M8XX_PGCRX(lsock), in_be32(M8XX_PGCRX(lsock)) | mk_int_int_mask(state->io_irq) << 24);
987                         /*
988                          * Strange thing here:
989                          * The manual does not tell us which interrupt
990                          * the sources generate.
991                          * Anyhow, I found out that RDY_L generates IREQLVL.
992                          *
993                          * We use level triggerd interrupts, and they don't
994                          * have to be cleared in PSCR in the interrupt handler.
995                          */
996                         reg |= M8XX_PCMCIA_RDY_L(lsock);
997                 }
998                 else
999                         out_be32(M8XX_PGCRX(lsock), in_be32(M8XX_PGCRX(lsock)) & 0x00ffffff);
1000         }
1001         else {
1002                 /*
1003                  * Memory card
1004                  */
1005                 if(state->csc_mask & SS_BATDEAD) {
1006                         e->eventbit = SS_BATDEAD;
1007                         reg |= e->regbit = M8XX_PCMCIA_BVD1(lsock);
1008                         e++;
1009                 }
1010                 if(state->csc_mask & SS_BATWARN) {
1011                         e->eventbit = SS_BATWARN;
1012                         reg |= e->regbit = M8XX_PCMCIA_BVD2(lsock);
1013                         e++;
1014                 }
1015                 /* What should I trigger on - low/high,raise,fall? */
1016                 if(state->csc_mask & SS_READY) {
1017                         e->eventbit = SS_READY;
1018                         reg |= e->regbit = 0; //??
1019                         e++;
1020                 }
1021         }
1022
1023         e->regbit = 0;  /* terminate list */
1024
1025         /*
1026          * Clear the status changed .
1027          * Port A and Port B share the same port.
1028          * Writing ones will clear the bits.
1029          */
1030
1031         out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr, reg);
1032
1033         /*
1034          * Write the mask.
1035          * Port A and Port B share the same port.
1036          * Need for read-modify-write.
1037          * Ones will enable the interrupt.
1038          */
1039
1040         /*
1041           reg |= ((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per
1042           & M8XX_PCMCIA_MASK(lsock);
1043         */
1044
1045         reg |= in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per) &
1046                 (M8XX_PCMCIA_MASK(0) | M8XX_PCMCIA_MASK(1));
1047
1048         out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per, reg);
1049
1050         spin_unlock_irqrestore(&events_lock, flags);
1051
1052         /* copy the struct and modify the copy */
1053
1054         s->state = *state;
1055
1056         return 0;
1057 }
1058
1059 static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
1060 {
1061         int lsock = container_of(sock, struct socket_info, socket)->slot;
1062
1063         struct socket_info *s = &socket[lsock];
1064         struct pcmcia_win *w;
1065         unsigned int reg, winnr;
1066
1067 #define M8XX_SIZE (io->stop - io->start + 1)
1068 #define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start)
1069
1070         dprintk( "SetIOMap(%d, %d, %#2.2x, %d ns, "
1071               "%#4.4x-%#4.4x)\n", lsock, io->map, io->flags,
1072               io->speed, io->start, io->stop);
1073
1074         if ((io->map >= PCMCIA_IO_WIN_NO) || (io->start > 0xffff)
1075             || (io->stop > 0xffff) || (io->stop < io->start))
1076                 return -EINVAL;
1077
1078         if((reg = m8xx_get_graycode(M8XX_SIZE)) == -1)
1079                 return -EINVAL;
1080
1081         if(io->flags & MAP_ACTIVE) {
1082
1083                 dprintk( "io->flags & MAP_ACTIVE\n");
1084
1085                 winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO)
1086                         + (lsock * PCMCIA_IO_WIN_NO) + io->map;
1087
1088                 /* setup registers */
1089
1090                 w = (void *) &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0;
1091                 w += winnr;
1092
1093                 out_be32(&w->or, 0); /* turn off window first */
1094                 out_be32(&w->br, M8XX_BASE);
1095
1096                 reg <<= 27;
1097                 reg |= M8XX_PCMCIA_POR_IO |(lsock << 2);
1098
1099                 reg |= m8xx_get_speed(io->speed, 1);
1100
1101                 if(io->flags & MAP_WRPROT)
1102                         reg |= M8XX_PCMCIA_POR_WRPROT;
1103
1104                 if(io->flags & (MAP_16BIT | MAP_AUTOSZ))
1105                         reg |= M8XX_PCMCIA_POR_16BIT;
1106
1107                 if(io->flags & MAP_ACTIVE)
1108                         reg |= M8XX_PCMCIA_POR_VALID;
1109
1110                 out_be32(&w->or, reg);
1111
1112                 dprintk("Socket %u: Mapped io window %u at %#8.8x, "
1113                       "OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
1114         } else {
1115                 /* shutdown IO window */
1116                 winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO)
1117                         + (lsock * PCMCIA_IO_WIN_NO) + io->map;
1118
1119                 /* setup registers */
1120
1121                 w = (void *) &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0;
1122                 w += winnr;
1123
1124                 out_be32(&w->or, 0); /* turn off window */
1125                 out_be32(&w->br, 0); /* turn off base address */
1126
1127                 dprintk("Socket %u: Unmapped io window %u at %#8.8x, "
1128                         "OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
1129         }
1130
1131         /* copy the struct and modify the copy */
1132         s->io_win[io->map] = *io;
1133         s->io_win[io->map].flags &= (MAP_WRPROT
1134                                      | MAP_16BIT
1135                                      | MAP_ACTIVE);
1136         dprintk("SetIOMap exit\n");
1137
1138         return 0;
1139 }
1140
1141 static int m8xx_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *mem)
1142 {
1143         int lsock = container_of(sock, struct socket_info, socket)->slot;
1144         struct socket_info *s = &socket[lsock];
1145         struct pcmcia_win *w;
1146         struct pccard_mem_map *old;
1147         unsigned int reg, winnr;
1148
1149         dprintk( "SetMemMap(%d, %d, %#2.2x, %d ns, "
1150               "%#5.5lx, %#5.5x)\n", lsock, mem->map, mem->flags,
1151               mem->speed, mem->static_start, mem->card_start);
1152
1153         if ((mem->map >= PCMCIA_MEM_WIN_NO)
1154 //          || ((mem->s) >= PCMCIA_MEM_WIN_SIZE)
1155             || (mem->card_start >= 0x04000000)
1156             || (mem->static_start & 0xfff)                /* 4KByte resolution */
1157             || (mem->card_start & 0xfff))
1158                 return -EINVAL;
1159
1160         if((reg = m8xx_get_graycode(PCMCIA_MEM_WIN_SIZE)) == -1) {
1161                 printk( "Cannot set size to 0x%08x.\n", PCMCIA_MEM_WIN_SIZE);
1162                 return -EINVAL;
1163         }
1164         reg <<= 27;
1165
1166         winnr = (lsock * PCMCIA_MEM_WIN_NO) + mem->map;
1167
1168         /* Setup the window in the pcmcia controller */
1169
1170         w = (void *) &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0;
1171         w += winnr;
1172
1173         reg |= lsock << 2;
1174
1175         reg |= m8xx_get_speed(mem->speed, 0);
1176
1177         if(mem->flags & MAP_ATTRIB)
1178                 reg |=  M8XX_PCMCIA_POR_ATTRMEM;
1179
1180         if(mem->flags & MAP_WRPROT)
1181                 reg |= M8XX_PCMCIA_POR_WRPROT;
1182
1183         if(mem->flags & MAP_16BIT)
1184                 reg |= M8XX_PCMCIA_POR_16BIT;
1185
1186         if(mem->flags & MAP_ACTIVE)
1187                 reg |= M8XX_PCMCIA_POR_VALID;
1188
1189         out_be32(&w->or, reg);
1190
1191         dprintk("Socket %u: Mapped memory window %u at %#8.8x, "
1192               "OR = %#8.8x.\n", lsock, mem->map, w->br, w->or);
1193
1194         if(mem->flags & MAP_ACTIVE) {
1195                 /* get the new base address */
1196                 mem->static_start = PCMCIA_MEM_WIN_BASE +
1197                         (PCMCIA_MEM_WIN_SIZE * winnr)
1198                         + mem->card_start;
1199         }
1200
1201         dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, "
1202               "%#5.5lx, %#5.5x)\n", lsock, mem->map, mem->flags,
1203               mem->speed, mem->static_start, mem->card_start);
1204
1205         /* copy the struct and modify the copy */
1206
1207         old = &s->mem_win[mem->map];
1208
1209         *old = *mem;
1210         old->flags &= (MAP_ATTRIB
1211                        | MAP_WRPROT
1212                        | MAP_16BIT
1213                        | MAP_ACTIVE);
1214
1215         return 0;
1216 }
1217
1218 static int m8xx_sock_init(struct pcmcia_socket *sock)
1219 {
1220         int i;
1221         pccard_io_map io = { 0, 0, 0, 0, 1 };
1222         pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 };
1223
1224         dprintk( "sock_init(%d)\n", s);
1225
1226         m8xx_set_socket(sock, &dead_socket);
1227         for (i = 0; i < PCMCIA_IO_WIN_NO; i++) {
1228                 io.map = i;
1229                 m8xx_set_io_map(sock, &io);
1230         }
1231         for (i = 0; i < PCMCIA_MEM_WIN_NO; i++) {
1232                 mem.map = i;
1233                 m8xx_set_mem_map(sock, &mem);
1234         }
1235
1236         return 0;
1237
1238 }
1239
1240 static int m8xx_suspend(struct pcmcia_socket *sock)
1241 {
1242         return m8xx_set_socket(sock, &dead_socket);
1243 }
1244
1245 static struct pccard_operations m8xx_services = {
1246         .init   = m8xx_sock_init,
1247         .suspend = m8xx_suspend,
1248         .get_status = m8xx_get_status,
1249         .set_socket = m8xx_set_socket,
1250         .set_io_map = m8xx_set_io_map,
1251         .set_mem_map = m8xx_set_mem_map,
1252 };
1253
1254 static int __init m8xx_init(void)
1255 {
1256         struct pcmcia_win *w;
1257         unsigned int i,m;
1258
1259         pcmcia_info("%s\n", version);
1260
1261         if (driver_register(&m8xx_driver))
1262                 return -1;
1263
1264         pcmcia_info(PCMCIA_BOARD_MSG " using " PCMCIA_SLOT_MSG
1265                     " with IRQ %u.\n", pcmcia_schlvl);
1266
1267         /* Configure Status change interrupt */
1268
1269         if(request_irq(pcmcia_schlvl, m8xx_interrupt, 0,
1270                           "m8xx_pcmcia", NULL)) {
1271                 pcmcia_error("Cannot allocate IRQ %u for SCHLVL!\n",
1272                              pcmcia_schlvl);
1273                 return -1;
1274         }
1275
1276         w = (void *) &((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0;
1277
1278         out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr,
1279                 M8XX_PCMCIA_MASK(0)| M8XX_PCMCIA_MASK(1));
1280
1281         out_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per,
1282                 in_be32(&((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per) &
1283                 ~(M8XX_PCMCIA_MASK(0)| M8XX_PCMCIA_MASK(1)));
1284
1285 /* connect interrupt and disable CxOE */
1286
1287         out_be32(M8XX_PGCRX(0), M8XX_PGCRX_CXOE | (mk_int_int_mask(pcmcia_schlvl) << 16));
1288         out_be32(M8XX_PGCRX(1), M8XX_PGCRX_CXOE | (mk_int_int_mask(pcmcia_schlvl) << 16));
1289
1290 /* intialize the fixed memory windows */
1291
1292         for(i = 0; i < PCMCIA_SOCKETS_NO; i++){
1293                 for(m = 0; m < PCMCIA_MEM_WIN_NO; m++) {
1294                         out_be32(&w->br, PCMCIA_MEM_WIN_BASE +
1295                                 (PCMCIA_MEM_WIN_SIZE
1296                                  * (m + i * PCMCIA_MEM_WIN_NO)));
1297
1298                         out_be32(&w->or, 0);  /* set to not valid */
1299
1300                         w++;
1301                 }
1302         }
1303
1304 /* turn off voltage */
1305         voltage_set(0, 0, 0);
1306         voltage_set(1, 0, 0);
1307
1308 /* Enable external hardware */
1309         hardware_enable(0);
1310         hardware_enable(1);
1311
1312         platform_device_register(&m8xx_device);
1313
1314         for (i = 0 ; i < PCMCIA_SOCKETS_NO; i++) {
1315                 socket[i].slot = i;
1316                 socket[i].socket.owner = THIS_MODULE;
1317                 socket[i].socket.features = SS_CAP_PCCARD | SS_CAP_MEM_ALIGN | SS_CAP_STATIC_MAP;
1318                 socket[i].socket.irq_mask = 0x000;
1319                 socket[i].socket.map_size = 0x1000;
1320                 socket[i].socket.io_offset = 0;
1321                 socket[i].socket.pci_irq = i  ? 7 : 9;
1322                 socket[i].socket.ops = &m8xx_services;
1323                 socket[i].socket.resource_ops = &pccard_iodyn_ops;
1324                 socket[i].socket.cb_dev = NULL;
1325                 socket[i].socket.dev.dev = &m8xx_device.dev;
1326         }
1327
1328         for (i = 0; i < PCMCIA_SOCKETS_NO; i++)
1329                 pcmcia_register_socket(&socket[i].socket);
1330
1331         return 0;
1332 }
1333
1334 static void __exit m8xx_exit(void)
1335 {
1336         int i;
1337
1338         for (i = 0; i < PCMCIA_SOCKETS_NO; i++)
1339                 pcmcia_unregister_socket(&socket[i].socket);
1340
1341         m8xx_shutdown();
1342
1343         platform_device_unregister(&m8xx_device);
1344         driver_unregister(&m8xx_driver);
1345 }
1346
1347 module_init(m8xx_init);
1348 module_exit(m8xx_exit);