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