2 * m8xx_pcmcia.c - Linux PCMCIA socket driver for the mpc8xx series.
4 * (C) 1999-2000 Magnus Damm <damm@bitsmart.com>
5 * (C) 2001-2002 Montavista Software, Inc.
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>
13 * Some fixes, additions (C) 2005 Montavista Software, Inc.
14 * <vbordug@ru.mvista.com>
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
21 * This controller does _not_ meet the ExCA standard.
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.
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...
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>
44 #include <asm/bitops.h>
45 #include <asm/system.h>
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>
57 #include <asm/mpc8xx.h>
58 #include <asm/8xx_immap.h>
61 #include <pcmcia/version.h>
62 #include <pcmcia/cs_types.h>
63 #include <pcmcia/cs.h>
64 #include <pcmcia/ss.h>
67 static int pc_debug
= PCMCIA_DEBUG
;
68 module_param(pc_debug
, int, 0);
69 #define dprintk(args...) printk(KERN_DEBUG "m8xx_pcmcia: " args);
71 #define dprintk(args...)
74 #define pcmcia_info(args...) printk(KERN_INFO "m8xx_pcmcia: "args)
75 #define pcmcia_error(args...) printk(KERN_ERR "m8xx_pcmcia: "args)
77 static const char *version
= "Version 0.06, Aug 2005";
78 MODULE_LICENSE("Dual MPL/GPL");
80 #if !defined(CONFIG_PCMCIA_SLOT_A) && !defined(CONFIG_PCMCIA_SLOT_B)
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
88 /* The ADS board use SLOT_A */
90 #define CONFIG_PCMCIA_SLOT_A
91 #define CONFIG_BD_IS_MHZ
94 /* The FADS series are a mess */
96 #if defined(CONFIG_MPC860T) || defined(CONFIG_MPC860) || defined(CONFIG_MPC821)
97 #define CONFIG_PCMCIA_SLOT_A
99 #define CONFIG_PCMCIA_SLOT_B
103 #if defined(CONFIG_MPC885ADS)
104 #define CONFIG_PCMCIA_SLOT_A
105 #define PCMCIA_GLITCHY_CD
108 /* Cyclades ACS uses both slots */
110 #define CONFIG_PCMCIA_SLOT_A
111 #define CONFIG_PCMCIA_SLOT_B
114 #endif /* !defined(CONFIG_PCMCIA_SLOT_A) && !defined(CONFIG_PCMCIA_SLOT_B) */
116 #if defined(CONFIG_PCMCIA_SLOT_A) && defined(CONFIG_PCMCIA_SLOT_B)
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"
124 #elif defined(CONFIG_PCMCIA_SLOT_A) || defined(CONFIG_PCMCIA_SLOT_B)
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
131 /* define _slot_ to be able to optimize macros */
133 #ifdef CONFIG_PCMCIA_SLOT_A
135 #define PCMCIA_SLOT_MSG "SLOT_A"
138 #define PCMCIA_SLOT_MSG "SLOT_B"
142 #error m8xx_pcmcia: Bad configuration!
145 /* ------------------------------------------------------------------------- */
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 */
151 #define PCMCIA_SCHLVL PCMCIA_INTERRUPT /* Status Change Interrupt Level */
153 /* ------------------------------------------------------------------------- */
155 /* 2.4.x and newer has this always in HZ */
156 #define M8XX_BUSFREQ ((((bd_t *)&(__res))->bi_busfreq))
158 static int pcmcia_schlvl
= PCMCIA_SCHLVL
;
160 static DEFINE_SPINLOCK(events_lock
);
163 #define PCMCIA_SOCKET_KEY_5V 1
164 #define PCMCIA_SOCKET_KEY_LV 2
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
173 * This structure is used to address each window in the PCMCIA controller.
175 * Keep in mind that we assume that pcmcia_win[n+1] is mapped directly
176 * after pcmcia_win[n]...
185 * For some reason the hardware guys decided to make both slots share
188 * Could someone invent object oriented hardware ?
190 * The macros are used to get the right bit from the registers.
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))
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))
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
218 #define M8XX_PGCRX(slot) m8xx_pgcrx[slot]
220 #define M8XX_PGCRX_CXOE 0x00000080
221 #define M8XX_PGCRX_CXRESET 0x00000040
223 /* we keep one lookup table per socket to check flags */
225 #define PCMCIA_EVENTS_MAX 5 /* 4 max at a time + termination */
233 void (*handler
)(void *info
, u32 events
);
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
;
245 static struct socket_info socket
[PCMCIA_SOCKETS_NO
];
248 * Search this table to see if the windowsize is
252 #define M8XX_SIZES_NO 32
254 static const u32 m8xx_size_to_gray
[M8XX_SIZES_NO
] =
256 0x00000001, 0x00000002, 0x00000008, 0x00000004,
257 0x00000080, 0x00000040, 0x00000010, 0x00000020,
258 0x00008000, 0x00004000, 0x00001000, 0x00002000,
259 0x00000100, 0x00000200, 0x00000800, 0x00000400,
261 0x0fffffff, 0xffffffff, 0xffffffff, 0xffffffff,
262 0x01000000, 0x02000000, 0xffffffff, 0x04000000,
263 0x00010000, 0x00020000, 0x00080000, 0x00040000,
264 0x00800000, 0x00400000, 0x00100000, 0x00200000
267 /* ------------------------------------------------------------------------- */
269 static irqreturn_t
m8xx_interrupt(int irq
, void *dev
);
271 #define PCMCIA_BMT_LIMIT (15*4) /* Bus Monitor Timeout value */
273 /* ------------------------------------------------------------------------- */
274 /* board specific stuff: */
275 /* voltage_set(), hardware_enable() and hardware_disable() */
276 /* ------------------------------------------------------------------------- */
277 /* RPX Boards from Embedded Planet */
279 #if defined(CONFIG_RPXCLASSIC) || defined(CONFIG_RPXLITE)
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.
286 #define PCMCIA_BOARD_MSG "RPX CLASSIC or RPX LITE"
288 #undef PCMCIA_BMT_LIMIT
289 #define PCMCIA_BMT_LIMIT (6*8)
291 static int voltage_set(int slot
, int vcc
, int vpp
)
298 reg
|= BCSR1_PCVCTL4
;
301 reg
|= BCSR1_PCVCTL5
;
312 reg
|= BCSR1_PCVCTL6
;
317 reg
|= BCSR1_PCVCTL7
;
322 if(!((vcc
== 50) || (vcc
== 0)))
325 /* first, turn off all power */
327 out_be32(((u32
*)RPX_CSR_ADDR
), in_be32(((u32
*)RPX_CSR_ADDR
)) & ~(BCSR1_PCVCTL4
| BCSR1_PCVCTL5
| BCSR1_PCVCTL6
| BCSR1_PCVCTL7
));
329 /* enable new powersettings */
331 out_be32(((u32
*)RPX_CSR_ADDR
), in_be32(((u32
*)RPX_CSR_ADDR
)) | reg
);
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 */
340 #endif /* CONFIG_RPXCLASSIC */
342 /* FADS Boards from Motorola */
344 #if defined(CONFIG_FADS)
346 #define PCMCIA_BOARD_MSG "FADS"
348 static int voltage_set(int slot
, int vcc
, int vpp
)
356 reg
|= BCSR1_PCCVCC0
;
359 reg
|= BCSR1_PCCVCC1
;
371 reg
|= BCSR1_PCCVPP1
;
376 if ((vcc
== 33) || (vcc
== 50))
377 reg
|= BCSR1_PCCVPP0
;
384 /* first, turn off all power */
385 out_be32((u32
*)BCSR1
, in_be32((u32
*)BCSR1
) & ~(BCSR1_PCCVCC_MASK
| BCSR1_PCCVPP_MASK
));
387 /* enable new powersettings */
388 out_be32((u32
*)BCSR1
, in_be32((u32
*)BCSR1
) | reg
);
393 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
395 static void hardware_enable(int slot
)
397 out_be32((u32
*)BCSR1
, in_be32((u32
*)BCSR1
) & ~BCSR1_PCCEN
);
400 static void hardware_disable(int slot
)
402 out_be32((u32
*)BCSR1
, in_be32((u32
*)BCSR1
) | BCSR1_PCCEN
);
407 /* MPC885ADS Boards */
409 #if defined(CONFIG_MPC885ADS)
411 #define PCMCIA_BOARD_MSG "MPC885ADS"
413 static int voltage_set(int slot
, int vcc
, int vpp
)
418 bcsr_io
= ioremap(BCSR1
, sizeof(unsigned long));
424 reg
|= BCSR1_PCCVCC0
;
427 reg
|= BCSR1_PCCVCC1
;
439 reg
|= BCSR1_PCCVPP1
;
444 if ((vcc
== 33) || (vcc
== 50))
445 reg
|= BCSR1_PCCVPP0
;
452 /* first, turn off all power */
453 out_be32(bcsr_io
, in_be32(bcsr_io
) & ~(BCSR1_PCCVCC_MASK
| BCSR1_PCCVPP_MASK
));
455 /* enable new powersettings */
456 out_be32(bcsr_io
, in_be32(bcsr_io
) | reg
);
466 #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
468 static void hardware_enable(int slot
)
472 bcsr_io
= ioremap(BCSR1
, sizeof(unsigned long));
473 out_be32(bcsr_io
, in_be32(bcsr_io
) & ~BCSR1_PCCEN
);
477 static void hardware_disable(int slot
)
481 bcsr_io
= ioremap(BCSR1
, sizeof(unsigned long));
482 out_be32(bcsr_io
, in_be32(bcsr_io
) | BCSR1_PCCEN
);
488 /* ------------------------------------------------------------------------- */
489 /* Motorola MBX860 */
491 #if defined(CONFIG_MBX)
493 #define PCMCIA_BOARD_MSG "MBX"
495 static int voltage_set(int slot
, int vcc
, int vpp
)
523 if ((vcc
== 33) || (vcc
== 50))
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
));
534 /* enable new powersettings */
535 out_8((u8
*)MBX_CSR2_ADDR
, in_8((u8
*)MBX_CSR2_ADDR
) | reg
);
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 */
544 #endif /* CONFIG_MBX */
546 #if defined(CONFIG_PRxK)
547 #include <asm/cpld.h>
548 extern volatile fpga_pc_regs
*fpga_pc
;
550 #define PCMCIA_BOARD_MSG "MPC855T"
552 static int voltage_set(int slot
, int vcc
, int vpp
)
556 cpld_regs
*ccpld
= get_cpld();
562 reg
|= PCMCIA_VCC_33
;
565 reg
|= PCMCIA_VCC_50
;
577 reg
|= PCMCIA_VPP_VCC
;
582 if ((vcc
== 33) || (vcc
== 50))
583 reg
|= PCMCIA_VPP_12
;
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
);
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 */
606 #endif /* CONFIG_PRxK */
608 static void m8xx_shutdown(void)
611 struct pcmcia_win
*w
;
613 for(i
= 0; i
< PCMCIA_SOCKETS_NO
; i
++){
614 w
= (void *) &((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pbr0
;
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
));
619 /* turn off interrupt and disable CxOE */
620 out_be32(M8XX_PGCRX(i
), M8XX_PGCRX_CXOE
);
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 */
628 /* turn off voltage */
629 voltage_set(i
, 0, 0);
631 /* disable external hardware */
635 free_irq(pcmcia_schlvl
, NULL
);
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
,
645 static struct platform_device m8xx_device
= {
646 .name
= "m8xx-pcmcia",
650 static u32 pending_events
[PCMCIA_SOCKETS_NO
];
651 static DEFINE_SPINLOCK(pending_event_lock
);
653 static irqreturn_t
m8xx_interrupt(int irq
, void *dev
)
655 struct socket_info
*s
;
656 struct event_table
*e
;
657 unsigned int i
, events
, pscr
, pipr
, per
;
659 dprintk("Interrupt!\n");
660 /* get interrupt sources */
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
);
666 for(i
= 0; i
< PCMCIA_SOCKETS_NO
; i
++) {
673 events
|= e
->eventbit
;
679 * report only if both card detect signals are the same
681 * we depend on that CD2 is the bit to the left of CD1...
683 if(events
& SS_DETECT
)
684 if(((pipr
& M8XX_PCMCIA_CD2(i
)) >> 1) ^
685 (pipr
& M8XX_PCMCIA_CD1(i
)))
687 events
&= ~SS_DETECT
;
690 #ifdef PCMCIA_GLITCHY_CD
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.
697 if((events
& SS_DETECT
) &&
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))));*/
708 /* call the handler */
710 dprintk("slot %u: events = 0x%02x, pscr = 0x%08x, "
712 i
, events
, pscr
, pipr
);
715 spin_lock(&pending_event_lock
);
716 pending_events
[i
] |= events
;
717 spin_unlock(&pending_event_lock
);
719 * Turn off RDY_L bits in the PER mask on
720 * CD interrupt receival.
722 * They can generate bad interrupts on the
723 * ACS4,8,16,32. - marcelo
725 per
&= ~M8XX_PCMCIA_RDY_L(0);
726 per
&= ~M8XX_PCMCIA_RDY_L(1);
728 out_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_per
, per
);
731 pcmcia_parse_events(&socket
[i
].socket
, events
);
735 /* clear the interrupt sources */
736 out_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pscr
, pscr
);
738 dprintk("Interrupt done.\n");
743 static u32
m8xx_get_graycode(u32 size
)
747 for(k
= 0; k
< M8XX_SIZES_NO
; k
++)
748 if(m8xx_size_to_gray
[k
] == size
)
751 if((k
== M8XX_SIZES_NO
) || (m8xx_size_to_gray
[k
] == -1))
757 static u32
m8xx_get_speed(u32 ns
, u32 is_io
)
759 u32 reg
, clocks
, psst
, psl
, psht
;
764 * We get called with IO maps setup to 0ns
765 * if not specified by the user.
766 * They should be 255ns.
772 ns
= 100; /* fast memory if 0 */
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.
781 /* how we want to adjust the timing - in percent */
783 #define ADJ 180 /* 80 % longer accesstime - to be sure */
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;
792 psst
= clocks
/ 7; /* setup time */
793 psht
= clocks
/ 7; /* hold time */
794 psl
= (clocks
* 5) / 7; /* strobe length */
796 psst
+= clocks
- (psst
+ psht
+ psl
);
805 static int m8xx_get_status(struct pcmcia_socket
*sock
, unsigned int *value
)
807 int lsock
= container_of(sock
, struct socket_info
, socket
)->slot
;
808 struct socket_info
*s
= &socket
[lsock
];
809 unsigned int pipr
, reg
;
811 pipr
= in_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pipr
);
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;
817 if (s
->state
.flags
& SS_IOCARD
)
818 *value
|= (pipr
& M8XX_PCMCIA_BVD1(lsock
)) ? SS_STSCHG
: 0;
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;
825 if (s
->state
.Vcc
| s
->state
.Vpp
)
826 *value
|= SS_POWERON
;
830 * This driver only supports 16-Bit pc-cards.
831 * Cardbus is not handled here.
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.
837 * Card Key Socket Key VS1 VS2 Card Vcc for CIS parse
839 * 5V 5V, LV* NC NC 5V only 5V (if available)
841 * 5V 5V, LV* GND NC 5 or 3.3V as low as possible
843 * 5V 5V, LV* GND GND 5, 3.3, x.xV as low as possible
845 * LV* 5V - - shall not fit into socket
847 * LV* LV* GND NC 3.3V only 3.3V
849 * LV* LV* NC GND x.xV x.xV (if avail.)
851 * LV* LV* GND GND 3.3 or x.xV as low as possible
853 * *LV means Low Voltage
856 * That gives us the following table:
858 * Socket VS1 VS2 Voltage
861 * 5V NC GND none (should not be possible)
865 * LV NC NC 5V (if available)
866 * LV NC GND x.xV (if available)
870 * So, how do I determine if I have a 5V or a LV
871 * socket on my board? Look at the socket!
874 * Socket with 5V key:
875 * ++--------------------------------------------+
880 * +---------------------------------------------+
882 * Socket with LV key:
883 * ++--------------------------------------------+
888 * +---------------------------------------------+
891 * With other words - LV only cards does not fit
892 * into the 5V socket!
895 /* read out VS1 and VS2 */
897 reg
= (pipr
& M8XX_PCMCIA_VS_MASK(lsock
))
898 >> M8XX_PCMCIA_VS_SHIFT(lsock
);
900 if(socket_get(lsock
) == PCMCIA_SOCKET_KEY_LV
) {
904 break; /* GND, NC - 3.3V only */
907 break; /* NC. GND - x.xV only */
911 dprintk("GetStatus(%d) = %#2.2x\n", lsock
, *value
);
915 static int m8xx_set_socket(struct pcmcia_socket
*sock
, socket_state_t
*state
)
917 int lsock
= container_of(sock
, struct socket_info
, socket
)->slot
;
918 struct socket_info
*s
= &socket
[lsock
];
919 struct event_table
*e
;
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
);
927 /* First, set voltage - bail out if invalid */
928 if(voltage_set(lsock
, state
->Vcc
, state
->Vpp
))
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 */
935 out_be32(M8XX_PGCRX(lsock
), in_be32(M8XX_PGCRX(lsock
)) & ~M8XX_PGCRX_CXRESET
);
937 /* ... and output enable. */
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. */
947 if(state
->Vcc
|| state
->Vpp
)
948 out_be32(M8XX_PGCRX(lsock
), in_be32(M8XX_PGCRX(lsock
)) & ~M8XX_PGCRX_CXOE
); /* active low */
950 out_be32(M8XX_PGCRX(lsock
), in_be32(M8XX_PGCRX(lsock
)) | M8XX_PGCRX_CXOE
);
953 * We'd better turn off interrupts before
954 * we mess with the events-table..
957 spin_lock_irqsave(&events_lock
, flags
);
960 * Play around with the interrupt mask to be able to
961 * give the events the generic pcmcia driver wants us to.
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
));
973 if(state
->flags
& SS_IOCARD
) {
977 if(state
->csc_mask
& SS_STSCHG
) {
978 e
->eventbit
= SS_STSCHG
;
979 reg
|= e
->regbit
= M8XX_PCMCIA_BVD1(lsock
);
983 * If io_irq is non-zero we should enable irq.
986 out_be32(M8XX_PGCRX(lsock
), in_be32(M8XX_PGCRX(lsock
)) | mk_int_int_mask(state
->io_irq
) << 24);
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.
993 * We use level triggerd interrupts, and they don't
994 * have to be cleared in PSCR in the interrupt handler.
996 reg
|= M8XX_PCMCIA_RDY_L(lsock
);
999 out_be32(M8XX_PGCRX(lsock
), in_be32(M8XX_PGCRX(lsock
)) & 0x00ffffff);
1005 if(state
->csc_mask
& SS_BATDEAD
) {
1006 e
->eventbit
= SS_BATDEAD
;
1007 reg
|= e
->regbit
= M8XX_PCMCIA_BVD1(lsock
);
1010 if(state
->csc_mask
& SS_BATWARN
) {
1011 e
->eventbit
= SS_BATWARN
;
1012 reg
|= e
->regbit
= M8XX_PCMCIA_BVD2(lsock
);
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; //??
1023 e
->regbit
= 0; /* terminate list */
1026 * Clear the status changed .
1027 * Port A and Port B share the same port.
1028 * Writing ones will clear the bits.
1031 out_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pscr
, reg
);
1035 * Port A and Port B share the same port.
1036 * Need for read-modify-write.
1037 * Ones will enable the interrupt.
1041 reg |= ((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_per
1042 & M8XX_PCMCIA_MASK(lsock);
1045 reg
|= in_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_per
) &
1046 (M8XX_PCMCIA_MASK(0) | M8XX_PCMCIA_MASK(1));
1048 out_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_per
, reg
);
1050 spin_unlock_irqrestore(&events_lock
, flags
);
1052 /* copy the struct and modify the copy */
1059 static int m8xx_set_io_map(struct pcmcia_socket
*sock
, struct pccard_io_map
*io
)
1061 int lsock
= container_of(sock
, struct socket_info
, socket
)->slot
;
1063 struct socket_info
*s
= &socket
[lsock
];
1064 struct pcmcia_win
*w
;
1065 unsigned int reg
, winnr
;
1067 #define M8XX_SIZE (io->stop - io->start + 1)
1068 #define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start)
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
);
1074 if ((io
->map
>= PCMCIA_IO_WIN_NO
) || (io
->start
> 0xffff)
1075 || (io
->stop
> 0xffff) || (io
->stop
< io
->start
))
1078 if((reg
= m8xx_get_graycode(M8XX_SIZE
)) == -1)
1081 if(io
->flags
& MAP_ACTIVE
) {
1083 dprintk( "io->flags & MAP_ACTIVE\n");
1085 winnr
= (PCMCIA_MEM_WIN_NO
* PCMCIA_SOCKETS_NO
)
1086 + (lsock
* PCMCIA_IO_WIN_NO
) + io
->map
;
1088 /* setup registers */
1090 w
= (void *) &((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pbr0
;
1093 out_be32(&w
->or, 0); /* turn off window first */
1094 out_be32(&w
->br
, M8XX_BASE
);
1097 reg
|= M8XX_PCMCIA_POR_IO
|(lsock
<< 2);
1099 reg
|= m8xx_get_speed(io
->speed
, 1);
1101 if(io
->flags
& MAP_WRPROT
)
1102 reg
|= M8XX_PCMCIA_POR_WRPROT
;
1104 if(io
->flags
& (MAP_16BIT
| MAP_AUTOSZ
))
1105 reg
|= M8XX_PCMCIA_POR_16BIT
;
1107 if(io
->flags
& MAP_ACTIVE
)
1108 reg
|= M8XX_PCMCIA_POR_VALID
;
1110 out_be32(&w
->or, reg
);
1112 dprintk("Socket %u: Mapped io window %u at %#8.8x, "
1113 "OR = %#8.8x.\n", lsock
, io
->map
, w
->br
, w
->or);
1115 /* shutdown IO window */
1116 winnr
= (PCMCIA_MEM_WIN_NO
* PCMCIA_SOCKETS_NO
)
1117 + (lsock
* PCMCIA_IO_WIN_NO
) + io
->map
;
1119 /* setup registers */
1121 w
= (void *) &((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pbr0
;
1124 out_be32(&w
->or, 0); /* turn off window */
1125 out_be32(&w
->br
, 0); /* turn off base address */
1127 dprintk("Socket %u: Unmapped io window %u at %#8.8x, "
1128 "OR = %#8.8x.\n", lsock
, io
->map
, w
->br
, w
->or);
1131 /* copy the struct and modify the copy */
1132 s
->io_win
[io
->map
] = *io
;
1133 s
->io_win
[io
->map
].flags
&= (MAP_WRPROT
1136 dprintk("SetIOMap exit\n");
1141 static int m8xx_set_mem_map(struct pcmcia_socket
*sock
, struct pccard_mem_map
*mem
)
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
;
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
);
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))
1160 if((reg
= m8xx_get_graycode(PCMCIA_MEM_WIN_SIZE
)) == -1) {
1161 printk( "Cannot set size to 0x%08x.\n", PCMCIA_MEM_WIN_SIZE
);
1166 winnr
= (lsock
* PCMCIA_MEM_WIN_NO
) + mem
->map
;
1168 /* Setup the window in the pcmcia controller */
1170 w
= (void *) &((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pbr0
;
1175 reg
|= m8xx_get_speed(mem
->speed
, 0);
1177 if(mem
->flags
& MAP_ATTRIB
)
1178 reg
|= M8XX_PCMCIA_POR_ATTRMEM
;
1180 if(mem
->flags
& MAP_WRPROT
)
1181 reg
|= M8XX_PCMCIA_POR_WRPROT
;
1183 if(mem
->flags
& MAP_16BIT
)
1184 reg
|= M8XX_PCMCIA_POR_16BIT
;
1186 if(mem
->flags
& MAP_ACTIVE
)
1187 reg
|= M8XX_PCMCIA_POR_VALID
;
1189 out_be32(&w
->or, reg
);
1191 dprintk("Socket %u: Mapped memory window %u at %#8.8x, "
1192 "OR = %#8.8x.\n", lsock
, mem
->map
, w
->br
, w
->or);
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
)
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
);
1205 /* copy the struct and modify the copy */
1207 old
= &s
->mem_win
[mem
->map
];
1210 old
->flags
&= (MAP_ATTRIB
1218 static int m8xx_sock_init(struct pcmcia_socket
*sock
)
1221 pccard_io_map io
= { 0, 0, 0, 0, 1 };
1222 pccard_mem_map mem
= { 0, 0, 0, 0, 0, 0 };
1224 dprintk( "sock_init(%d)\n", s
);
1226 m8xx_set_socket(sock
, &dead_socket
);
1227 for (i
= 0; i
< PCMCIA_IO_WIN_NO
; i
++) {
1229 m8xx_set_io_map(sock
, &io
);
1231 for (i
= 0; i
< PCMCIA_MEM_WIN_NO
; i
++) {
1233 m8xx_set_mem_map(sock
, &mem
);
1240 static int m8xx_suspend(struct pcmcia_socket
*sock
)
1242 return m8xx_set_socket(sock
, &dead_socket
);
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
,
1254 static int __init
m8xx_init(void)
1256 struct pcmcia_win
*w
;
1259 pcmcia_info("%s\n", version
);
1261 if (driver_register(&m8xx_driver
))
1264 pcmcia_info(PCMCIA_BOARD_MSG
" using " PCMCIA_SLOT_MSG
1265 " with IRQ %u.\n", pcmcia_schlvl
);
1267 /* Configure Status change interrupt */
1269 if(request_irq(pcmcia_schlvl
, m8xx_interrupt
, 0,
1270 "m8xx_pcmcia", NULL
)) {
1271 pcmcia_error("Cannot allocate IRQ %u for SCHLVL!\n",
1276 w
= (void *) &((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pbr0
;
1278 out_be32(&((immap_t
*)IMAP_ADDR
)->im_pcmcia
.pcmc_pscr
,
1279 M8XX_PCMCIA_MASK(0)| M8XX_PCMCIA_MASK(1));
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)));
1285 /* connect interrupt and disable CxOE */
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));
1290 /* intialize the fixed memory windows */
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
)));
1298 out_be32(&w
->or, 0); /* set to not valid */
1304 /* turn off voltage */
1305 voltage_set(0, 0, 0);
1306 voltage_set(1, 0, 0);
1308 /* Enable external hardware */
1312 platform_device_register(&m8xx_device
);
1314 for (i
= 0 ; i
< PCMCIA_SOCKETS_NO
; 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
;
1328 for (i
= 0; i
< PCMCIA_SOCKETS_NO
; i
++)
1329 pcmcia_register_socket(&socket
[i
].socket
);
1334 static void __exit
m8xx_exit(void)
1338 for (i
= 0; i
< PCMCIA_SOCKETS_NO
; i
++)
1339 pcmcia_unregister_socket(&socket
[i
].socket
);
1343 platform_device_unregister(&m8xx_device
);
1344 driver_unregister(&m8xx_driver
);
1347 module_init(m8xx_init
);
1348 module_exit(m8xx_exit
);