]>
git.ipfire.org Git - people/ms/u-boot.git/blob - board/uc100/pcmcia.c
7 #if defined(CONFIG_CMD_PCMCIA)
11 #if (defined(CONFIG_CMD_IDE)) && defined(CONFIG_IDE_8xx_PCCARD)
17 #define PCMCIA_BOARD_MSG "UC100"
20 * Remark: don't turn off OE "__MY_PCMCIA_GCRX_CXOE" on UC100 board.
21 * This leads to board-hangup! (sr, 8 Dez. 2004)
23 static void cfg_ports (void)
25 volatile immap_t
*immap
;
27 immap
= (immap_t
*)CONFIG_SYS_IMMR
;
30 * Configure Port A for MAX1602 PC-Card Power-Interface Switch
32 immap
->im_ioport
.iop_padat
&= ~0x8000; /* set port x output to low */
33 immap
->im_ioport
.iop_padir
|= 0x8000; /* enable port x as output */
35 debug ("Set Port A: PAR: %08x DIR: %08x DAT: %08x\n",
36 immap
->im_ioport
.iop_papar
, immap
->im_ioport
.iop_padir
,
37 immap
->im_ioport
.iop_padat
);
40 int pcmcia_hardware_enable(int slot
)
42 volatile immap_t
*immap
;
43 volatile cpm8xx_t
*cp
;
44 volatile pcmconf8xx_t
*pcmp
;
45 volatile sysconf8xx_t
*sysp
;
48 debug ("hardware_enable: " PCMCIA_BOARD_MSG
" Slot %c\n", 'A'+slot
);
52 immap
= (immap_t
*)CONFIG_SYS_IMMR
;
53 sysp
= (sysconf8xx_t
*)(&(((immap_t
*)CONFIG_SYS_IMMR
)->im_siu_conf
));
54 pcmp
= (pcmconf8xx_t
*)(&(((immap_t
*)CONFIG_SYS_IMMR
)->im_pcmcia
));
55 cp
= (cpm8xx_t
*)(&(((immap_t
*)CONFIG_SYS_IMMR
)->im_cpm
));
57 /* Configure Ports for TPS2211A PC-Card Power-Interface Switch */
61 * Configure SIUMCR to enable PCMCIA port B
62 * (VFLS[0:1] are not used for debugging, we connect FRZ# instead)
64 sysp
->sc_siumcr
&= ~SIUMCR_DBGC11
; /* set DBGC to 00 */
66 /* clear interrupt state, and disable interrupts */
67 pcmp
->pcmc_pscr
= PCMCIA_MASK(_slot_
);
68 pcmp
->pcmc_per
&= ~PCMCIA_MASK(_slot_
);
71 * Disable interrupts, DMA, and PCMCIA buffers
72 * (isolate the interface) and assert RESET signal
74 debug ("Disable PCMCIA buffers and assert RESET\n");
76 reg
|= __MY_PCMCIA_GCRX_CXRESET
; /* active high */
77 PCMCIA_PGCRX(_slot_
) = reg
;
81 * Make sure there is a card in the slot, then configure the interface.
84 debug ("[%d] %s: PIPR(%p)=0x%x\n",
85 __LINE__
,__FUNCTION__
,
86 &(pcmp
->pcmc_pipr
),pcmp
->pcmc_pipr
);
87 if (pcmp
->pcmc_pipr
& (0x18000000 >> (slot
<< 4))) {
88 printf (" No Card found\n");
95 mask
= PCMCIA_VS1(slot
) | PCMCIA_VS2(slot
);
96 reg
= pcmp
->pcmc_pipr
;
97 debug ("PIPR: 0x%x ==> VS1=o%s, VS2=o%s\n",
99 (reg
&PCMCIA_VS1(slot
))?"n":"ff",
100 (reg
&PCMCIA_VS2(slot
))?"n":"ff");
101 if ((reg
& mask
) == mask
) {
102 puts (" 5.0V card found: ");
104 puts (" 3.3V card found: ");
108 immap
->im_ioport
.iop_padat
|= 0x8000; /* power enable 3.3V */
112 debug ("Enable PCMCIA buffers and stop RESET\n");
113 reg
= PCMCIA_PGCRX(_slot_
);
114 reg
&= ~__MY_PCMCIA_GCRX_CXRESET
; /* active high */
115 reg
&= ~__MY_PCMCIA_GCRX_CXOE
; /* active low */
116 PCMCIA_PGCRX(_slot_
) = reg
;
118 udelay(250000); /* some cards need >150 ms to come up :-( */
120 debug ("# hardware_enable done\n");
126 #if defined(CONFIG_CMD_PCMCIA)
127 int pcmcia_hardware_disable(int slot
)
129 volatile immap_t
*immap
;
130 volatile cpm8xx_t
*cp
;
131 volatile pcmconf8xx_t
*pcmp
;
134 debug ("hardware_disable: " PCMCIA_BOARD_MSG
" Slot %c\n", 'A'+slot
);
136 immap
= (immap_t
*)CONFIG_SYS_IMMR
;
137 pcmp
= (pcmconf8xx_t
*)(&(((immap_t
*)CONFIG_SYS_IMMR
)->im_pcmcia
));
140 immap
->im_ioport
.iop_padat
&= ~0x8000; /* power disable 3.3V */
142 /* Configure PCMCIA General Control Register */
143 debug ("Disable PCMCIA buffers and assert RESET\n");
145 reg
|= __MY_PCMCIA_GCRX_CXRESET
; /* active high */
146 PCMCIA_PGCRX(_slot_
) = reg
;
155 int pcmcia_voltage_set(int slot
, int vcc
, int vpp
)
157 volatile immap_t
*immap
;
158 volatile pcmconf8xx_t
*pcmp
;
161 debug ("voltage_set: "
163 " Slot %c, Vcc=%d.%d, Vpp=%d.%d\n",
164 'A'+slot
, vcc
/10, vcc
%10, vpp
/10, vcc
%10);
166 immap
= (immap_t
*)CONFIG_SYS_IMMR
;
167 pcmp
= (pcmconf8xx_t
*)(&(((immap_t
*)CONFIG_SYS_IMMR
)->im_pcmcia
));
169 * Disable PCMCIA buffers (isolate the interface)
170 * and assert RESET signal
172 debug ("Disable PCMCIA buffers and assert RESET\n");
173 reg
= PCMCIA_PGCRX(_slot_
);
174 reg
|= __MY_PCMCIA_GCRX_CXRESET
; /* active high */
175 PCMCIA_PGCRX(_slot_
) = reg
;
179 * Configure Port C pins for
180 * 5 Volts Enable and 3 Volts enable,
181 * Turn all power pins to Hi-Z
183 debug ("PCMCIA power OFF\n");
184 cfg_ports (); /* Enables switch, but all in Hi-Z */
186 debug ("Enable PCMCIA buffers and stop RESET\n");
187 reg
= PCMCIA_PGCRX(_slot_
);
188 reg
&= ~__MY_PCMCIA_GCRX_CXRESET
; /* active high */
189 reg
&= ~__MY_PCMCIA_GCRX_CXOE
; /* active low */
190 PCMCIA_PGCRX(_slot_
) = reg
;
193 debug ("voltage_set: " PCMCIA_BOARD_MSG
" Slot %c, DONE\n",
198 #endif /* CONFIG_PCMCIA */