From 01736c62b670272d3165cef1a9aee5463cd05ca6 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 28 Jul 2010 10:36:29 +0800 Subject: [PATCH] =?utf8?q?nand=20flash=20cs=E5=8D=A0=E7=94=A8iomux?= =?utf8?q?=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- arch/arm/mach-rk2818/include/mach/iomux.h | 2 ++ arch/arm/mach-rk2818/iomux.c | 16 ++++++++++++ drivers/mtd/nand/rk2818_nand.c | 32 +++++++++++++++++++++-- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rk2818/include/mach/iomux.h b/arch/arm/mach-rk2818/include/mach/iomux.h index f37c9e1a6793..281f037f2727 100644 --- a/arch/arm/mach-rk2818/include/mach/iomux.h +++ b/arch/arm/mach-rk2818/include/mach/iomux.h @@ -221,5 +221,7 @@ struct mux_config { extern int rk2818_iomux_init(void); extern void rk2818_mux_api_set(char *name, unsigned int mode); +extern unsigned int rk2818_mux_api_get(char *name); + #endif diff --git a/arch/arm/mach-rk2818/iomux.c b/arch/arm/mach-rk2818/iomux.c index bcd062ebcb7f..954a5e983182 100644 --- a/arch/arm/mach-rk2818/iomux.c +++ b/arch/arm/mach-rk2818/iomux.c @@ -127,3 +127,19 @@ void rk2818_mux_api_set(char *name, unsigned int mode) } } EXPORT_SYMBOL(rk2818_mux_api_set); + +unsigned int rk2818_mux_api_get(char *name) +{ + int i; + for(i=0;iname) + if (!strcmp(rk2818_muxs[i].name, name)) + { + return rk2818_muxs[i].mode; + } + } + return 0xff; +} +EXPORT_SYMBOL(rk2818_mux_api_get); + diff --git a/drivers/mtd/nand/rk2818_nand.c b/drivers/mtd/nand/rk2818_nand.c index 9e317192f12c..6e0cba2c46c8 100644 --- a/drivers/mtd/nand/rk2818_nand.c +++ b/drivers/mtd/nand/rk2818_nand.c @@ -788,7 +788,9 @@ static int rk2818_nand_probe(struct platform_device *pdev) int err = 0; pNANDC pRK28NC; u_char maf_id,dev_id,ext_id3,ext_id4; - + u32 iomux_mode0,iomux_mode1,iomux_mode2,iomux_mode3,iomux_mode4; + struct nand_chip *chip; + #ifdef CONFIG_MTD_PARTITIONS struct mtd_partition *partitions = NULL; int num_partitions = 0; @@ -882,7 +884,12 @@ static int rk2818_nand_probe(struct platform_device *pdev) this->options |= NAND_BUSWIDTH_16; this->ecc.layout = &nand_hw_eccoob_16; } - + //±£³ÖIO MUXԭʼֵ + iomux_mode0=rk2818_mux_api_get(GPIOA5_FLASHCS1_SEL_NAME); + iomux_mode1=rk2818_mux_api_get(GPIOA6_FLASHCS2_SEL_NAME); + iomux_mode2=rk2818_mux_api_get(GPIOA7_FLASHCS3_SEL_NAME); + iomux_mode3=rk2818_mux_api_get(GPIOE_SPI1_FLASH_SEL1_NAME); + iomux_mode4=rk2818_mux_api_get(GPIOE_SPI1_FLASH_SEL_NAME); // iomux flash cs1~cs7 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); @@ -899,6 +906,27 @@ static int rk2818_nand_probe(struct platform_device *pdev) goto outscan; } + //¸ù¾ÝƬѡÇé¿ö»Ö¸´IO MUXԭʼֵ + chip = mtd->priv; + switch(chip->numchips) + { + case 1: + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, iomux_mode0); + case 2: + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, iomux_mode1); + case 3: + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, iomux_mode2); + case 4: + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, iomux_mode3); + case 5: + case 6: + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, iomux_mode4); + case 7: + case 8: + break; + default: + DEBUG(MTD_DEBUG_LEVEL0, "RK2818 NAND: numchips error!!!\n"); + } #if 0 // rk281x dma mode bch must (1k data + 32 oob) bytes align , so cheat system writesize =1024,oobsize=32 mtd->writesize = 1024; -- 2.34.1