xref: /rk3399_rockchip-uboot/drivers/pcmcia/marubun_pcmcia.c (revision fc843a02acad62e231a3e779cebd1712688146fc)
129592ecbSNobuhiro Iwamatsu /*
229592ecbSNobuhiro Iwamatsu  * Marubun MR-SHPC-01 PCMCIA controller device driver
329592ecbSNobuhiro Iwamatsu  *
429592ecbSNobuhiro Iwamatsu  * (c) 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
529592ecbSNobuhiro Iwamatsu  *
61a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
729592ecbSNobuhiro Iwamatsu  */
829592ecbSNobuhiro Iwamatsu 
929592ecbSNobuhiro Iwamatsu #include <common.h>
1029592ecbSNobuhiro Iwamatsu #include <config.h>
1129592ecbSNobuhiro Iwamatsu #include <pcmcia.h>
1229592ecbSNobuhiro Iwamatsu #include <asm/io.h>
1329592ecbSNobuhiro Iwamatsu 
14f91d7ae5SNobuhiro Iwamatsu #undef CONFIG_PCMCIA
15f91d7ae5SNobuhiro Iwamatsu 
16f91d7ae5SNobuhiro Iwamatsu #if defined(CONFIG_CMD_PCMCIA)
1729592ecbSNobuhiro Iwamatsu #define	CONFIG_PCMCIA
1829592ecbSNobuhiro Iwamatsu #endif
1929592ecbSNobuhiro Iwamatsu 
20*fc843a02SSimon Glass #if defined(CONFIG_IDE)
2129592ecbSNobuhiro Iwamatsu #define	CONFIG_PCMCIA
2229592ecbSNobuhiro Iwamatsu #endif
2329592ecbSNobuhiro Iwamatsu 
24c9eff328SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_PCMCIA)
2529592ecbSNobuhiro Iwamatsu 
2629592ecbSNobuhiro Iwamatsu /* MR-SHPC-01 register */
276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_MODE	(CONFIG_SYS_MARUBUN_MRSHPC + 4)
286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_OPTION   (CONFIG_SYS_MARUBUN_MRSHPC + 6)
296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_CSR      (CONFIG_SYS_MARUBUN_MRSHPC + 8)
306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_ISR      (CONFIG_SYS_MARUBUN_MRSHPC + 10)
316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_ICR      (CONFIG_SYS_MARUBUN_MRSHPC + 12)
326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_CPWCR    (CONFIG_SYS_MARUBUN_MRSHPC + 14)
336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_MW0CR1   (CONFIG_SYS_MARUBUN_MRSHPC + 16)
346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_MW1CR1   (CONFIG_SYS_MARUBUN_MRSHPC + 18)
356d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_IOWCR1   (CONFIG_SYS_MARUBUN_MRSHPC + 20)
366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_MW0CR2   (CONFIG_SYS_MARUBUN_MRSHPC + 22)
376d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_MW1CR2   (CONFIG_SYS_MARUBUN_MRSHPC + 24)
386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_IOWCR2   (CONFIG_SYS_MARUBUN_MRSHPC + 26)
396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_CDCR     (CONFIG_SYS_MARUBUN_MRSHPC + 28)
406d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define MRSHPC_PCIC_INFO (CONFIG_SYS_MARUBUN_MRSHPC + 30)
4129592ecbSNobuhiro Iwamatsu 
pcmcia_on(void)4229592ecbSNobuhiro Iwamatsu int pcmcia_on (void)
4329592ecbSNobuhiro Iwamatsu {
4429592ecbSNobuhiro Iwamatsu 	printf("Enable PCMCIA " PCMCIA_SLOT_MSG "\n");
4529592ecbSNobuhiro Iwamatsu 
4629592ecbSNobuhiro Iwamatsu 	/* Init */
4729592ecbSNobuhiro Iwamatsu 	outw( 0x0000 , MRSHPC_MODE );
4829592ecbSNobuhiro Iwamatsu 
4929592ecbSNobuhiro Iwamatsu 	if ((inw(MRSHPC_CSR) & 0x000c) == 0){	/* if card detect is true */
5029592ecbSNobuhiro Iwamatsu 		if ((inw(MRSHPC_CSR) & 0x0080) == 0){
5129592ecbSNobuhiro Iwamatsu 			outw(0x0674 ,MRSHPC_CPWCR);  /* Card Vcc is 3.3v? */
5229592ecbSNobuhiro Iwamatsu 		}else{
5329592ecbSNobuhiro Iwamatsu 			outw(0x0678 ,MRSHPC_CPWCR);  /* Card Vcc is 5V */
5429592ecbSNobuhiro Iwamatsu 		}
5529592ecbSNobuhiro Iwamatsu 		udelay( 100000 );   /* wait for power on */
5629592ecbSNobuhiro Iwamatsu 	}else{
5729592ecbSNobuhiro Iwamatsu 		return 1;
5829592ecbSNobuhiro Iwamatsu 	}
5929592ecbSNobuhiro Iwamatsu 	/*
6029592ecbSNobuhiro Iwamatsu 	 *	PC-Card window open
6129592ecbSNobuhiro Iwamatsu 	 *	flag == COMMON/ATTRIBUTE/IO
6229592ecbSNobuhiro Iwamatsu 	 */
6329592ecbSNobuhiro Iwamatsu 	/* common window open */
6429592ecbSNobuhiro Iwamatsu 	outw(0x8a84,MRSHPC_MW0CR1); /* window 0xb8400000 */
6529592ecbSNobuhiro Iwamatsu 	if ((inw(MRSHPC_CSR) & 0x4000) != 0)
6629592ecbSNobuhiro Iwamatsu 		outw(0x0b00,MRSHPC_MW0CR2); /* common mode & bus width 16bit SWAP = 1 */
6729592ecbSNobuhiro Iwamatsu 	else
6829592ecbSNobuhiro Iwamatsu 		outw(0x0300,MRSHPC_MW0CR2); /* common mode & bus width 16bit SWAP = 0 */
6929592ecbSNobuhiro Iwamatsu 
7029592ecbSNobuhiro Iwamatsu 	/* attribute window open */
7129592ecbSNobuhiro Iwamatsu 	outw(0x8a85,MRSHPC_MW1CR1); /* window 0xb8500000 */
7229592ecbSNobuhiro Iwamatsu 	if ((inw(MRSHPC_CSR) & 0x4000) != 0)
7329592ecbSNobuhiro Iwamatsu 		outw(0x0a00,MRSHPC_MW1CR2); /* attribute mode & bus width 16bit SWAP = 1 */
7429592ecbSNobuhiro Iwamatsu 	else
7529592ecbSNobuhiro Iwamatsu 		outw(0x0200,MRSHPC_MW1CR2); /* attribute mode & bus width 16bit SWAP = 0 */
7629592ecbSNobuhiro Iwamatsu 
7729592ecbSNobuhiro Iwamatsu 	/* I/O window open */
7829592ecbSNobuhiro Iwamatsu 	outw(0x8a86,MRSHPC_IOWCR1); /* I/O window 0xb8600000 */
7929592ecbSNobuhiro Iwamatsu 	outw(0x0008,MRSHPC_CDCR);   /* I/O card mode */
8029592ecbSNobuhiro Iwamatsu 	if ((inw(MRSHPC_CSR) & 0x4000) != 0)
8129592ecbSNobuhiro Iwamatsu 		outw(0x0a00,MRSHPC_IOWCR2); /* bus width 16bit SWAP = 1 */
8229592ecbSNobuhiro Iwamatsu 	else
8329592ecbSNobuhiro Iwamatsu 		outw(0x0200,MRSHPC_IOWCR2); /* bus width 16bit SWAP = 0 */
8429592ecbSNobuhiro Iwamatsu 
8529592ecbSNobuhiro Iwamatsu 	outw(0x0000,MRSHPC_ISR);
8629592ecbSNobuhiro Iwamatsu 	outw(0x2000,MRSHPC_ICR);
876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	outb(0x00,(CONFIG_SYS_MARUBUN_MW2 + 0x206));
886d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	outb(0x42,(CONFIG_SYS_MARUBUN_MW2 + 0x200));
8929592ecbSNobuhiro Iwamatsu 
9029592ecbSNobuhiro Iwamatsu 	return 0;
9129592ecbSNobuhiro Iwamatsu }
9229592ecbSNobuhiro Iwamatsu 
pcmcia_off(void)9329592ecbSNobuhiro Iwamatsu int pcmcia_off (void)
9429592ecbSNobuhiro Iwamatsu {
9529592ecbSNobuhiro Iwamatsu 	printf ("Disable PCMCIA " PCMCIA_SLOT_MSG "\n");
9629592ecbSNobuhiro Iwamatsu 
9729592ecbSNobuhiro Iwamatsu 	return 0;
9829592ecbSNobuhiro Iwamatsu }
9929592ecbSNobuhiro Iwamatsu 
100c9eff328SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_PCMCIA */
101