aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAfzal Mohammed <afzal@ti.com>2012-10-04 06:19:04 -0400
committerAfzal Mohammed <afzal@ti.com>2012-10-15 05:12:10 -0400
commit2fdf0c98969fdac8f7b191d4988e2e436717c857 (patch)
treefc773bafa813e819b5d604aeffade1373093ef68
parent3852ccd66a9bcb2aa6f46bce5442b6d8d08e5b5d (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.c18
-rw-r--r--include/linux/platform_data/mtd-nand-omap2.h7
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
732void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) 736void 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
752int gpmc_get_client_irq(unsigned irq_config) 768int 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
16enum nand_io { 18enum 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
49struct omap_nand_platform_data { 54struct omap_nand_platform_data {