Re: [U-Boot] [PATCH] TI: Davinci: NAND Driver Cleanup
On 14/03/10 21:14, s-paul...@ti.com wrote: From: Cyril Chemparathy cy...@ti.com Modified to use IO accessor routines consistently. Eliminated volatile usage to keep checkpatch.pl happy. Patch was tested on DM355, DM365 and DM6446 EVMs Signed-off-by: Cyril Chemparathy cy...@ti.com Tested-by: Sandeep Paulraj s-paul...@ti.com --- drivers/mtd/nand/davinci_nand.c | 126 -- include/asm-arm/arch-davinci/emif_defs.h | 80 +-- 2 files changed, 104 insertions(+), 102 deletions(-) diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index bfc2acf..61cba14 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c @@ -57,7 +57,8 @@ #define ECC_STATE_ERR_CORR_COMP_P0x2 #define ECC_STATE_ERR_CORR_COMP_N0x3 -static emif_registers *const emif_regs = (void *) DAVINCI_ASYNC_EMIF_CNTRL_BASE; +static struct davinci_emif_regs *emif_regs = + (struct davinci_emif_regs *) DAVINCI_ASYNC_EMIF_CNTRL_BASE; Since this is really just a constant, why setup a variable locally where ever EMIF registers are accessed? What's wrong with the define you removed below? ... diff --git a/include/asm-arm/arch-davinci/emif_defs.h b/include/asm-arm/arch-davinci/emif_defs.h index aa57703..3d77bfc 100644 --- a/include/asm-arm/arch-davinci/emif_defs.h +++ b/include/asm-arm/arch-davinci/emif_defs.h @@ -24,50 +24,42 @@ #include asm/arch/hardware.h -typedef struct davinci_emif_regs { - dv_reg ERCSR; - dv_reg AWCCR; - dv_reg SDBCR; - dv_reg SDRCR; - dv_reg AB1CR; - dv_reg AB2CR; - dv_reg AB3CR; - dv_reg AB4CR; - dv_reg SDTIMR; - dv_reg DDRSR; - dv_reg DDRPHYCR; - dv_reg DDRPHYSR; - dv_reg TOTAR; - dv_reg TOTACTR; - dv_reg DDRPHYID_REV; - dv_reg SDSRETR; - dv_reg EIRR; - dv_reg EIMR; - dv_reg EIMSR; - dv_reg EIMCR; - dv_reg IOCTRLR; - dv_reg IOSTATR; - u_int8_tRSVD0[8]; - dv_reg NANDFCR; - dv_reg NANDFSR; - u_int8_tRSVD1[8]; - dv_reg NANDFECC[4]; - u_int8_tRSVD2[60]; - dv_reg NAND4BITECCLOAD; - dv_reg NAND4BITECC1; - dv_reg NAND4BITECC2; - dv_reg NAND4BITECC3; - dv_reg NAND4BITECC4; - dv_reg NANDERRADD1; - dv_reg NANDERRADD2; - dv_reg NANDERRVAL1; - dv_reg NANDERRVAL2; -} emif_registers; - -typedef emif_registers *emifregs; - -#define davinci_emif_regs \ - ((struct davinci_emif_regs *)DAVINCI_ASYNC_EMIF_CNTRL_BASE) ...This one. Nick. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH] TI: Davinci: NAND Driver Cleanup
Hi Scott, Configuring for davinci_schmoogie board... ... Should be lowercase? Thank you. I will be sending out a v2 shortly, and this time around all 8 davinci based boards build fine. Also, any particular reason to use the raw version of the accessors? Please correct me if I am wrong here, but my understanding is that the raw variants are for native-endian access, while the non-raw ones could potentially force little-endian conversions for PCI. If so, since these on-chip registers must always be accessed native-endian, I felt that the raw accessors would be appropriate. Any thoughts? Regards Cyril. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH] TI: Davinci: NAND Driver Cleanup
Chemparathy, Cyril wrote: Please correct me if I am wrong here, but my understanding is that the raw variants are for native-endian access, while the non-raw ones could potentially force little-endian conversions for PCI. The non-raw ones also provide ordering on some architectures, though I don't think this matters on ARM. Unfortunately there doesn't seem to be an arch-neutral way to unbundle these. If so, since these on-chip registers must always be accessed native-endian, I felt that the raw accessors would be appropriate. OK. -Scott ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH] TI: Davinci: NAND Driver Cleanup
On Sun, Mar 14, 2010 at 05:14:31PM -0400, s-paul...@ti.com wrote: - emif_regs-AB1CR = acfg1; /* CS2 */ + __raw_writel(acfg1, emif_regs-AB1CR); /* CS2 */ Configuring for davinci_schmoogie board... davinci_nand.c: In function ‘nand_flash_init’: davinci_nand.c:586: error: ‘struct davinci_emif_regs’ has no member named ‘AB1CR’ make[1]: *** [davinci_nand.o] Error 1 make: *** [drivers/mtd/nand/libnand.a] Error 2 Should be lowercase? Also, any particular reason to use the raw version of the accessors? -Scott ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
[U-Boot] [PATCH] TI: Davinci: NAND Driver Cleanup
From: Cyril Chemparathy cy...@ti.com Modified to use IO accessor routines consistently. Eliminated volatile usage to keep checkpatch.pl happy. Patch was tested on DM355, DM365 and DM6446 EVMs Signed-off-by: Cyril Chemparathy cy...@ti.com Tested-by: Sandeep Paulraj s-paul...@ti.com --- drivers/mtd/nand/davinci_nand.c | 126 -- include/asm-arm/arch-davinci/emif_defs.h | 80 +-- 2 files changed, 104 insertions(+), 102 deletions(-) diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index bfc2acf..61cba14 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c @@ -57,7 +57,8 @@ #define ECC_STATE_ERR_CORR_COMP_P 0x2 #define ECC_STATE_ERR_CORR_COMP_N 0x3 -static emif_registers *const emif_regs = (void *) DAVINCI_ASYNC_EMIF_CNTRL_BASE; +static struct davinci_emif_regs *emif_regs = + (struct davinci_emif_regs *) DAVINCI_ASYNC_EMIF_CNTRL_BASE; /* * Exploit the little endianness of the ARM to do multi-byte transfers @@ -93,7 +94,7 @@ static void nand_davinci_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) /* copy aligned data */ while (len = 4) { - *(u32 *)buf = readl(nand); + *(u32 *)buf = __raw_readl(nand); buf += 4; len -= 4; } @@ -138,7 +139,7 @@ static void nand_davinci_write_buf(struct mtd_info *mtd, const uint8_t *buf, /* copy aligned data */ while (len = 4) { - writel(*(u32 *)buf, nand); + __raw_writel(*(u32 *)buf, nand); buf += 4; len -= 4; } @@ -156,7 +157,8 @@ static void nand_davinci_write_buf(struct mtd_info *mtd, const uint8_t *buf, } } -static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) +static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd, + unsigned int ctrl) { struct nand_chip *this = mtd-priv; u_int32_t IO_ADDR_W = (u_int32_t)this-IO_ADDR_W; @@ -164,9 +166,9 @@ static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int c if (ctrl NAND_CTRL_CHANGE) { IO_ADDR_W = ~(MASK_ALE|MASK_CLE); - if ( ctrl NAND_CLE ) + if (ctrl NAND_CLE) IO_ADDR_W |= MASK_CLE; - if ( ctrl NAND_ALE ) + if (ctrl NAND_ALE) IO_ADDR_W |= MASK_ALE; this-IO_ADDR_W = (void __iomem *) IO_ADDR_W; } @@ -181,24 +183,25 @@ static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode) { u_int32_t val; - (void)readl((emif_regs-NANDFECC[CONFIG_SYS_NAND_CS - 2])); + (void)__raw_readl((emif_regs-nandfecc[CONFIG_SYS_NAND_CS - 2])); - val = readl(emif_regs-NANDFCR); + val = __raw_readl(emif_regs-nandfcr); val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS); val |= DAVINCI_NANDFCR_1BIT_ECC_START(CONFIG_SYS_NAND_CS); - writel(val, emif_regs-NANDFCR); + __raw_writel(val, emif_regs-nandfcr); } static u_int32_t nand_davinci_readecc(struct mtd_info *mtd, u_int32_t region) { u_int32_t ecc = 0; - ecc = readl((emif_regs-NANDFECC[region - 1])); + ecc = __raw_readl((emif_regs-nandfecc[region - 1])); - return(ecc); + return ecc; } -static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) +static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat, + u_char *ecc_code) { u_int32_t tmp; const int region = 1; @@ -232,7 +235,8 @@ static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u return 0; } -static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc) +static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat, + u_char *read_ecc, u_char *calc_ecc) { struct nand_chip *this = mtd-priv; u_int32_t ecc_nand = read_ecc[0] | (read_ecc[1] 8) | @@ -268,7 +272,7 @@ static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat, u_char * return -1; } } - return(0); + return 0; } #endif /* CONFIG_SYS_NAND_HW_ECC */ @@ -315,15 +319,15 @@ static void nand_davinci_4bit_enable_hwecc(struct mtd_info *mtd, int mode) * Start a new ECC calculation for reading or writing 512 bytes * of data. */ - val = readl(emif_regs-NANDFCR); + val = __raw_readl(emif_regs-nandfcr); val = ~DAVINCI_NANDFCR_4BIT_ECC_SEL_MASK; val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS); val |= DAVINCI_NANDFCR_4BIT_ECC_SEL(CONFIG_SYS_NAND_CS);