diff options
| author | Afzal Mohammed <afzal@ti.com> | 2012-10-04 06:19:04 -0400 |
|---|---|---|
| committer | Afzal Mohammed <afzal@ti.com> | 2012-10-15 05:12:10 -0400 |
| commit | 2fdf0c98969fdac8f7b191d4988e2e436717c857 (patch) | |
| tree | fc773bafa813e819b5d604aeffade1373093ef68 | |
| parent | 3852ccd66a9bcb2aa6f46bce5442b6d8d08e5b5d (diff) | |
ARM: OMAP2+: gpmc: nand register helper bch update
Update helper function that provides gpmc-nand register
details for nand driver with bch register information.
Using this nand driver can be made self sufficient to
handle remaining gpmc-nand operations by itself instead
of relying on gpmc exported nand functions.
Signed-off-by: Afzal Mohammed <afzal@ti.com>
| -rw-r--r-- | arch/arm/mach-omap2/gpmc.c | 18 | ||||
| -rw-r--r-- | include/linux/platform_data/mtd-nand-omap2.h | 7 |
2 files changed, 23 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 34823b3092f3..f5cde49854a5 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -61,6 +61,9 @@ | |||
| 61 | #define GPMC_ECC_SIZE_CONFIG 0x1fc | 61 | #define GPMC_ECC_SIZE_CONFIG 0x1fc |
| 62 | #define GPMC_ECC1_RESULT 0x200 | 62 | #define GPMC_ECC1_RESULT 0x200 |
| 63 | #define GPMC_ECC_BCH_RESULT_0 0x240 /* not available on OMAP2 */ | 63 | #define GPMC_ECC_BCH_RESULT_0 0x240 /* not available on OMAP2 */ |
| 64 | #define GPMC_ECC_BCH_RESULT_1 0x244 /* not available on OMAP2 */ | ||
| 65 | #define GPMC_ECC_BCH_RESULT_2 0x248 /* not available on OMAP2 */ | ||
| 66 | #define GPMC_ECC_BCH_RESULT_3 0x24c /* not available on OMAP2 */ | ||
| 64 | 67 | ||
| 65 | /* GPMC ECC control settings */ | 68 | /* GPMC ECC control settings */ |
| 66 | #define GPMC_ECC_CTRL_ECCCLEAR 0x100 | 69 | #define GPMC_ECC_CTRL_ECCCLEAR 0x100 |
| @@ -77,6 +80,7 @@ | |||
| 77 | 80 | ||
| 78 | #define GPMC_CS0_OFFSET 0x60 | 81 | #define GPMC_CS0_OFFSET 0x60 |
| 79 | #define GPMC_CS_SIZE 0x30 | 82 | #define GPMC_CS_SIZE 0x30 |
| 83 | #define GPMC_BCH_SIZE 0x10 | ||
| 80 | 84 | ||
| 81 | #define GPMC_MEM_START 0x00000000 | 85 | #define GPMC_MEM_START 0x00000000 |
| 82 | #define GPMC_MEM_END 0x3FFFFFFF | 86 | #define GPMC_MEM_END 0x3FFFFFFF |
| @@ -731,6 +735,8 @@ EXPORT_SYMBOL(gpmc_prefetch_reset); | |||
| 731 | 735 | ||
| 732 | void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) | 736 | void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) |
| 733 | { | 737 | { |
| 738 | int i; | ||
| 739 | |||
| 734 | reg->gpmc_status = gpmc_base + GPMC_STATUS; | 740 | reg->gpmc_status = gpmc_base + GPMC_STATUS; |
| 735 | reg->gpmc_nand_command = gpmc_base + GPMC_CS0_OFFSET + | 741 | reg->gpmc_nand_command = gpmc_base + GPMC_CS0_OFFSET + |
| 736 | GPMC_CS_NAND_COMMAND + GPMC_CS_SIZE * cs; | 742 | GPMC_CS_NAND_COMMAND + GPMC_CS_SIZE * cs; |
| @@ -746,7 +752,17 @@ void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) | |||
| 746 | reg->gpmc_ecc_control = gpmc_base + GPMC_ECC_CONTROL; | 752 | reg->gpmc_ecc_control = gpmc_base + GPMC_ECC_CONTROL; |
| 747 | reg->gpmc_ecc_size_config = gpmc_base + GPMC_ECC_SIZE_CONFIG; | 753 | reg->gpmc_ecc_size_config = gpmc_base + GPMC_ECC_SIZE_CONFIG; |
| 748 | reg->gpmc_ecc1_result = gpmc_base + GPMC_ECC1_RESULT; | 754 | reg->gpmc_ecc1_result = gpmc_base + GPMC_ECC1_RESULT; |
| 749 | reg->gpmc_bch_result0 = gpmc_base + GPMC_ECC_BCH_RESULT_0; | 755 | |
| 756 | for (i = 0; i < GPMC_BCH_NUM_REMAINDER; i++) { | ||
| 757 | reg->gpmc_bch_result0[i] = gpmc_base + GPMC_ECC_BCH_RESULT_0 + | ||
| 758 | GPMC_BCH_SIZE * i; | ||
| 759 | reg->gpmc_bch_result1[i] = gpmc_base + GPMC_ECC_BCH_RESULT_1 + | ||
| 760 | GPMC_BCH_SIZE * i; | ||
| 761 | reg->gpmc_bch_result2[i] = gpmc_base + GPMC_ECC_BCH_RESULT_2 + | ||
| 762 | GPMC_BCH_SIZE * i; | ||
| 763 | reg->gpmc_bch_result3[i] = gpmc_base + GPMC_ECC_BCH_RESULT_3 + | ||
| 764 | GPMC_BCH_SIZE * i; | ||
| 765 | } | ||
| 750 | } | 766 | } |
| 751 | 767 | ||
| 752 | int gpmc_get_client_irq(unsigned irq_config) | 768 | int gpmc_get_client_irq(unsigned irq_config) |
diff --git a/include/linux/platform_data/mtd-nand-omap2.h b/include/linux/platform_data/mtd-nand-omap2.h index e1965fe581d1..24d32ca34bef 100644 --- a/include/linux/platform_data/mtd-nand-omap2.h +++ b/include/linux/platform_data/mtd-nand-omap2.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/mtd/partitions.h> | 14 | #include <linux/mtd/partitions.h> |
| 15 | 15 | ||
| 16 | #define GPMC_BCH_NUM_REMAINDER 8 | ||
| 17 | |||
| 16 | enum nand_io { | 18 | enum nand_io { |
| 17 | NAND_OMAP_PREFETCH_POLLED = 0, /* prefetch polled mode, default */ | 19 | NAND_OMAP_PREFETCH_POLLED = 0, /* prefetch polled mode, default */ |
| 18 | NAND_OMAP_POLLED, /* polled mode, without prefetch */ | 20 | NAND_OMAP_POLLED, /* polled mode, without prefetch */ |
| @@ -43,7 +45,10 @@ struct gpmc_nand_regs { | |||
| 43 | void __iomem *gpmc_ecc_control; | 45 | void __iomem *gpmc_ecc_control; |
| 44 | void __iomem *gpmc_ecc_size_config; | 46 | void __iomem *gpmc_ecc_size_config; |
| 45 | void __iomem *gpmc_ecc1_result; | 47 | void __iomem *gpmc_ecc1_result; |
| 46 | void __iomem *gpmc_bch_result0; | 48 | void __iomem *gpmc_bch_result0[GPMC_BCH_NUM_REMAINDER]; |
| 49 | void __iomem *gpmc_bch_result1[GPMC_BCH_NUM_REMAINDER]; | ||
| 50 | void __iomem *gpmc_bch_result2[GPMC_BCH_NUM_REMAINDER]; | ||
| 51 | void __iomem *gpmc_bch_result3[GPMC_BCH_NUM_REMAINDER]; | ||
| 47 | }; | 52 | }; |
| 48 | 53 | ||
| 49 | struct omap_nand_platform_data { | 54 | struct omap_nand_platform_data { |
