From: David Brownell <[email protected]>

Minor ECC cleanup for the DaVinci NAND driver:

 - Clarify Kconfig:  this HW_ECC is just the 1-bit flavor
 - Remove needless non-mainline NAND_ECC_HWx_y constants
 - Use BIT(n) in a few places for clarity

And remove pointless DRIVER_NAME define, correcting MODULE_ALIAS
so it could really trigger hotplugging.

Signed-off-by: David Brownell <[email protected]>
---
 drivers/mtd/nand/Kconfig        |    6 ++-
 drivers/mtd/nand/davinci_nand.c |   75 +++++---------------------------------
 2 files changed, 14 insertions(+), 67 deletions(-)

--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -453,9 +453,11 @@ config MTD_NAND_DAVINCI
           Support for NAND flash on Texas Instruments DaVinci SoC.
 
 config NAND_FLASH_HW_ECC
-        bool "Hardware ECC Support on NAND Device for DaVinci"
+        bool "1-Bit Hardware ECC on NAND Device for DaVinci"
         depends on MTD_NAND_DAVINCI
         help
-          Support for Hardware ECC on NAND device for DaVinci.
+         Support the single bit Hardware ECC on NAND devices
+         for DaVinci.  This uses three bytes of OOB data for
+         each 512 bytes of data.
 
 endif # MTD_NAND
--- a/drivers/mtd/nand/davinci_nand.c
+++ b/drivers/mtd/nand/davinci_nand.c
@@ -78,14 +78,8 @@ static inline int mtd_has_cmdlinepart(vo
 static inline int is_hw_ecc_1bit(void) { return 1; }
 #else
 static inline int is_hw_ecc_1bit(void) { return 0; }
-#define NAND_ECC_HW3_256       100
-#define NAND_ECC_HW3_512       101
-#define NAND_ECC_HW6_512       102
-#define NAND_ECC_HW8_512       103
-#define NAND_ECC_HW12_2048     104
 #endif
 
-#define DRIVER_NAME "davinci_nand"
 
 struct davinci_nand_info {
        struct mtd_info         mtd;
@@ -179,7 +173,7 @@ static void nand_davinci_enable_hwecc_1b
 
        /* Restart ECC hardware */
        retval = davinci_nand_readl(info, NANDFCR_OFFSET);
-       retval |= (1 << 8);
+       retval |= BIT(8);
        davinci_nand_writel(info, NANDFCR_OFFSET, retval);
 }
 
@@ -226,7 +220,7 @@ static int nand_davinci_correct_data_1bi
                if ((((diff >> 12) ^ diff) & 0xfff) == 0xfff) {
                        /* Correctable error */
                        if ((diff >> (12 + 3)) < chip->ecc.size) {
-                               dat[diff >> (12 + 3)] ^= (1 << ((diff >> 12) & 
7));
+                               dat[diff >> (12 + 3)] ^= BIT((diff >> 12) & 7);
                                return 1;
                        } else {
                                return -1;
@@ -425,53 +419,6 @@ static int nand_davinci_dev_ready(struct
        return davinci_nand_readl(info, NANDFSR_OFFSET) & NAND_BUSY_FLAG;
 }
 
-static void __init nand_davinci_set_eccsize(struct nand_chip *chip)
-{
-       chip->ecc.size = 256;
-
-       if (!is_hw_ecc_1bit())
-               return;
-
-       switch (chip->ecc.mode) {
-       case NAND_ECC_HW12_2048:
-               chip->ecc.size = 2048;
-               break;
-
-       case NAND_ECC_HW3_512:
-       case NAND_ECC_HW6_512:
-       case NAND_ECC_HW8_512:
-               chip->ecc.size = 512;
-               break;
-
-       case NAND_ECC_HW3_256:
-       default:
-               /* do nothing */
-               break;
-       }
-}
-
-static void __init nand_davinci_set_eccbytes(struct nand_chip *chip)
-{
-       chip->ecc.bytes = 3;
-
-       if (!is_hw_ecc_1bit())
-               return;
-
-       switch (chip->ecc.mode) {
-       case NAND_ECC_HW12_2048:
-               chip->ecc.bytes += 4;
-       case NAND_ECC_HW8_512:
-               chip->ecc.bytes += 2;
-       case NAND_ECC_HW6_512:
-               chip->ecc.bytes += 3;
-       case NAND_ECC_HW3_512:
-       case NAND_ECC_HW3_256:
-       default:
-               /* do nothing */
-               break;
-       }
-}
-
 static void __init nand_dm355evm_flash_init(struct davinci_nand_info *info)
 {
        u32 val, tmp;
@@ -672,12 +619,14 @@ static int __init nand_davinci_probe(str
         * fixed?):  Linux seemed to limit ECC data to 32 bytes.
         */
        if (is_hw_ecc_1bit()) {
-               info->chip.ecc.mode      = NAND_ECC_HW3_512;
+               info->chip.ecc.mode = NAND_ECC_HW;
                info->chip.ecc.calculate = nand_davinci_calculate_ecc_1bit;
-               info->chip.ecc.correct   = nand_davinci_correct_data_1bit;
-               info->chip.ecc.hwctl     = nand_davinci_enable_hwecc_1bit;
+               info->chip.ecc.correct = nand_davinci_correct_data_1bit;
+               info->chip.ecc.hwctl = nand_davinci_enable_hwecc_1bit;
+               info->chip.ecc.size = 512;
+               info->chip.ecc.bytes = 3;
        } else {
-               info->chip.ecc.mode      = NAND_ECC_SOFT;
+               info->chip.ecc.mode = NAND_ECC_SOFT;
        }
 
        info->clk = clk_get(&pdev->dev, "AEMIFCLK");
@@ -693,10 +642,6 @@ static int __init nand_davinci_probe(str
                goto err_clk_enable;
        }
 
-       /* Set ECC size and bytes */
-       nand_davinci_set_eccsize(&info->chip);
-       nand_davinci_set_eccbytes(&info->chip);
-
        /* FIXME these don't belong here ... */
        if (machine_is_davinci_dm355_evm())
                nand_dm355evm_flash_init(info);
@@ -817,9 +762,10 @@ static int __exit nand_davinci_remove(st
 static struct platform_driver nand_davinci_driver = {
        .remove         = __exit_p(nand_davinci_remove),
        .driver         = {
-               .name   = DRIVER_NAME,
+               .name   = "davinci_nand",
        },
 };
+MODULE_ALIAS("platform:davinci_nand");
 
 static int __init nand_davinci_init(void)
 {
@@ -833,7 +779,6 @@ static void __exit nand_davinci_exit(voi
 }
 module_exit(nand_davinci_exit);
 
-MODULE_ALIAS(DRIVER_NAME);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Texas Instruments");
 MODULE_DESCRIPTION("Davinci NAND flash driver");

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to