157 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <common.h>
 | |
| #include <mpc8xx.h>
 | |
| #include <pcmcia.h>
 | |
| 
 | |
| #include "csr.h"
 | |
| 
 | |
| #undef	CONFIG_PCMCIA
 | |
| 
 | |
| #if defined(CONFIG_CMD_PCMCIA)
 | |
| #define	CONFIG_PCMCIA
 | |
| #endif
 | |
| 
 | |
| #if defined(CONFIG_CMD_IDE) && defined(CONFIG_IDE_8xx_PCCARD)
 | |
| #define	CONFIG_PCMCIA
 | |
| #endif
 | |
| 
 | |
| #ifdef	CONFIG_PCMCIA
 | |
| 
 | |
| /* A lot of this has been taken from the RPX code in this file it works from me.
 | |
|    I have added the voltage selection for the MBX board. */
 | |
| 
 | |
| /* MBX voltage bit in control register #2 */
 | |
| #define CR2_VPP12       ((uchar)0x10)
 | |
| #define CR2_VPPVDD      ((uchar)0x20)
 | |
| #define CR2_VDD5        ((uchar)0x40)
 | |
| #define CR2_VDD3        ((uchar)0x80)
 | |
| 
 | |
| #define PCMCIA_BOARD_MSG "MBX860"
 | |
| 
 | |
| int pcmcia_voltage_set (int slot, int vcc, int vpp)
 | |
| {
 | |
| 	uchar reg = 0;
 | |
| 
 | |
| 	debug ("voltage_set: PCMCIA_BOARD_MSG Slot %c, Vcc=%d.%d, Vpp=%d.%d\n",
 | |
| 	       'A' + slot, vcc / 10, vcc % 10, vpp / 10, vcc % 10);
 | |
| 
 | |
| 	switch (vcc) {
 | |
| 		case 0:
 | |
| 			break;
 | |
| 		case 33:
 | |
| 			reg |= CR2_VDD3;
 | |
| 			break;
 | |
| 		case 50:
 | |
| 			reg |= CR2_VDD5;
 | |
| 			break;
 | |
| 		default:
 | |
| 			return 1;
 | |
| 	}
 | |
| 
 | |
| 	switch (vpp) {
 | |
| 		case 0:
 | |
| 			break;
 | |
| 		case 33:
 | |
| 		case 50:
 | |
| 			if (vcc == vpp) {
 | |
| 				reg |= CR2_VPPVDD;
 | |
| 			} else {
 | |
| 				return 1;
 | |
| 			}
 | |
| 			break;
 | |
| 		case 120:
 | |
| 			reg |= CR2_VPP12;
 | |
| 			break;
 | |
| 		default:
 | |
| 			return 1;
 | |
| 	}
 | |
| 
 | |
| 	/* first, turn off all power */
 | |
| 	MBX_CSR2 &= ~(CR2_VDDSEL | CR2_VPPSEL);
 | |
| 
 | |
| 	/* enable new powersettings */
 | |
| 	MBX_CSR2 |= reg;
 | |
| 	debug ("MBX_CSR2 read = 0x%02x\n", MBX_CSR2);
 | |
| 
 | |
| 	return (0);
 | |
| }
 | |
| 
 | |
| int pcmcia_hardware_enable (int slot)
 | |
| {
 | |
| 	volatile pcmconf8xx_t *pcmp;
 | |
| 	uint reg, mask;
 | |
| 
 | |
| 	debug ("hardware_enable: " PCMCIA_BOARD_MSG " Slot %c\n",
 | |
| 	       'A' + slot);
 | |
| 
 | |
| 	udelay (10000);
 | |
| 
 | |
| 	pcmp = (pcmconf8xx_t *) (&(((immap_t *) CONFIG_SYS_IMMR)->im_pcmcia));
 | |
| 
 | |
| 	/* clear interrupt state, and disable interrupts */
 | |
| 	pcmp->pcmc_pscr = PCMCIA_MASK (_slot_);
 | |
| 	pcmp->pcmc_per &= ~PCMCIA_MASK (_slot_);
 | |
| 
 | |
| 	/*
 | |
| 	* Disable interrupts, DMA, and PCMCIA buffers
 | |
| 	* (isolate the interface) and assert RESET signal
 | |
| 	*/
 | |
| 	debug ("Disable PCMCIA buffers and assert RESET\n");
 | |
| 	reg = 0;
 | |
| 	reg |= __MY_PCMCIA_GCRX_CXRESET;	/* active high */
 | |
| 	reg |= __MY_PCMCIA_GCRX_CXOE;	/* active low  */
 | |
| 	PCMCIA_PGCRX (_slot_) = reg;
 | |
| 	udelay (500);
 | |
| 
 | |
| 	/* remove all power */
 | |
| 	pcmcia_voltage_set (slot, 0, 0);
 | |
| 	/*
 | |
| 	* Make sure there is a card in the slot, then configure the interface.
 | |
| 	*/
 | |
| 	udelay(10000);
 | |
| 	debug ("[%d] %s: PIPR(%p)=0x%x\n",
 | |
| 	       __LINE__,__FUNCTION__,
 | |
| 	       &(pcmp->pcmc_pipr),pcmp->pcmc_pipr);
 | |
| 	if (pcmp->pcmc_pipr & (0x10000000 >> (slot << 4))) {
 | |
| 		printf ("   No Card found\n");
 | |
| 		return (1);
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	* Power On.
 | |
| 	*/
 | |
| 	mask = PCMCIA_VS1 (_slot_) | PCMCIA_VS2 (_slot_);
 | |
| 	reg = pcmp->pcmc_pipr;
 | |
| 	debug ("PIPR: 0x%x ==> VS1=o%s, VS2=o%s\n", reg,
 | |
| 	       (reg & PCMCIA_VS1 (slot)) ? "n" : "ff",
 | |
| 	       (reg & PCMCIA_VS2 (slot)) ? "n" : "ff");
 | |
| 
 | |
| 	if ((reg & mask) == mask) {
 | |
| 		pcmcia_voltage_set (_slot_, 50, 0);
 | |
| 		printf (" 5.0V card found: ");
 | |
| 	} else {
 | |
| 		pcmcia_voltage_set (_slot_, 33, 0);
 | |
| 		printf (" 3.3V card found: ");
 | |
| 	}
 | |
| 
 | |
| 	debug ("Enable PCMCIA buffers and stop RESET\n");
 | |
| 	reg = PCMCIA_PGCRX (_slot_);
 | |
| 	reg &= ~__MY_PCMCIA_GCRX_CXRESET;	/* active high */
 | |
| 	reg &= ~__MY_PCMCIA_GCRX_CXOE;	/* active low  */
 | |
| 	PCMCIA_PGCRX (_slot_) = reg;
 | |
| 
 | |
| 	udelay (250000);	/* some cards need >150 ms to come up :-( */
 | |
| 
 | |
| 	debug ("# hardware_enable done\n");
 | |
| 
 | |
| 	return (0);
 | |
| 	}
 | |
| 
 | |
| #if defined(CONFIG_CMD_PCMCIA)
 | |
| int pcmcia_hardware_disable (int slot)
 | |
| {
 | |
| 	return 0;	/* No hardware to disable */
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif	/* CONFIG_PCMCIA */
 |