aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/nand/Kconfig2
-rw-r--r--drivers/mtd/nand/gpmi-nand/bch-regs.h42
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-lib.c11
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-nand.c4
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-nand.h2
5 files changed, 45 insertions, 16 deletions
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 7d17cecad69d..bf0a28d513d4 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -440,7 +440,7 @@ config MTD_NAND_NANDSIM
440 440
441config MTD_NAND_GPMI_NAND 441config MTD_NAND_GPMI_NAND
442 bool "GPMI NAND Flash Controller driver" 442 bool "GPMI NAND Flash Controller driver"
443 depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28) 443 depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28 || SOC_IMX6Q)
444 help 444 help
445 Enables NAND Flash support for IMX23 or IMX28. 445 Enables NAND Flash support for IMX23 or IMX28.
446 The GPMI controller is very powerful, with the help of BCH 446 The GPMI controller is very powerful, with the help of BCH
diff --git a/drivers/mtd/nand/gpmi-nand/bch-regs.h b/drivers/mtd/nand/gpmi-nand/bch-regs.h
index 4effb8c579db..a0924515c396 100644
--- a/drivers/mtd/nand/gpmi-nand/bch-regs.h
+++ b/drivers/mtd/nand/gpmi-nand/bch-regs.h
@@ -51,15 +51,26 @@
51 51
52#define BP_BCH_FLASH0LAYOUT0_ECC0 12 52#define BP_BCH_FLASH0LAYOUT0_ECC0 12
53#define BM_BCH_FLASH0LAYOUT0_ECC0 (0xf << BP_BCH_FLASH0LAYOUT0_ECC0) 53#define BM_BCH_FLASH0LAYOUT0_ECC0 (0xf << BP_BCH_FLASH0LAYOUT0_ECC0)
54#define BF_BCH_FLASH0LAYOUT0_ECC0(v) \ 54#define MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0 11
55 (((v) << BP_BCH_FLASH0LAYOUT0_ECC0) & BM_BCH_FLASH0LAYOUT0_ECC0) 55#define MX6Q_BM_BCH_FLASH0LAYOUT0_ECC0 (0x1f << MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0)
56#define BF_BCH_FLASH0LAYOUT0_ECC0(v, x) \
57 (GPMI_IS_MX6Q(x) \
58 ? (((v) << MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0) \
59 & MX6Q_BM_BCH_FLASH0LAYOUT0_ECC0) \
60 : (((v) << BP_BCH_FLASH0LAYOUT0_ECC0) \
61 & BM_BCH_FLASH0LAYOUT0_ECC0) \
62 )
56 63
57#define BP_BCH_FLASH0LAYOUT0_DATA0_SIZE 0 64#define BP_BCH_FLASH0LAYOUT0_DATA0_SIZE 0
58#define BM_BCH_FLASH0LAYOUT0_DATA0_SIZE \ 65#define BM_BCH_FLASH0LAYOUT0_DATA0_SIZE \
59 (0xfff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE) 66 (0xfff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)
60#define BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(v) \ 67#define MX6Q_BM_BCH_FLASH0LAYOUT0_DATA0_SIZE \
61 (((v) << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)\ 68 (0x3ff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)
62 & BM_BCH_FLASH0LAYOUT0_DATA0_SIZE) 69#define BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(v, x) \
70 (GPMI_IS_MX6Q(x) \
71 ? (((v) >> 2) & MX6Q_BM_BCH_FLASH0LAYOUT0_DATA0_SIZE) \
72 : ((v) & BM_BCH_FLASH0LAYOUT0_DATA0_SIZE) \
73 )
63 74
64#define HW_BCH_FLASH0LAYOUT1 0x00000090 75#define HW_BCH_FLASH0LAYOUT1 0x00000090
65 76
@@ -72,13 +83,24 @@
72 83
73#define BP_BCH_FLASH0LAYOUT1_ECCN 12 84#define BP_BCH_FLASH0LAYOUT1_ECCN 12
74#define BM_BCH_FLASH0LAYOUT1_ECCN (0xf << BP_BCH_FLASH0LAYOUT1_ECCN) 85#define BM_BCH_FLASH0LAYOUT1_ECCN (0xf << BP_BCH_FLASH0LAYOUT1_ECCN)
75#define BF_BCH_FLASH0LAYOUT1_ECCN(v) \ 86#define MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN 11
76 (((v) << BP_BCH_FLASH0LAYOUT1_ECCN) & BM_BCH_FLASH0LAYOUT1_ECCN) 87#define MX6Q_BM_BCH_FLASH0LAYOUT1_ECCN (0x1f << MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN)
88#define BF_BCH_FLASH0LAYOUT1_ECCN(v, x) \
89 (GPMI_IS_MX6Q(x) \
90 ? (((v) << MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN) \
91 & MX6Q_BM_BCH_FLASH0LAYOUT1_ECCN) \
92 : (((v) << BP_BCH_FLASH0LAYOUT1_ECCN) \
93 & BM_BCH_FLASH0LAYOUT1_ECCN) \
94 )
77 95
78#define BP_BCH_FLASH0LAYOUT1_DATAN_SIZE 0 96#define BP_BCH_FLASH0LAYOUT1_DATAN_SIZE 0
79#define BM_BCH_FLASH0LAYOUT1_DATAN_SIZE \ 97#define BM_BCH_FLASH0LAYOUT1_DATAN_SIZE \
80 (0xfff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE) 98 (0xfff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE)
81#define BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(v) \ 99#define MX6Q_BM_BCH_FLASH0LAYOUT1_DATAN_SIZE \
82 (((v) << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE) \ 100 (0x3ff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE)
83 & BM_BCH_FLASH0LAYOUT1_DATAN_SIZE) 101#define BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(v, x) \
102 (GPMI_IS_MX6Q(x) \
103 ? (((v) >> 2) & MX6Q_BM_BCH_FLASH0LAYOUT1_DATAN_SIZE) \
104 : ((v) & BM_BCH_FLASH0LAYOUT1_DATAN_SIZE) \
105 )
84#endif 106#endif
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
index 5c55c717fe14..a1f43329ad43 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
@@ -224,13 +224,13 @@ int bch_set_geometry(struct gpmi_nand_data *this)
224 /* Configure layout 0. */ 224 /* Configure layout 0. */
225 writel(BF_BCH_FLASH0LAYOUT0_NBLOCKS(block_count) 225 writel(BF_BCH_FLASH0LAYOUT0_NBLOCKS(block_count)
226 | BF_BCH_FLASH0LAYOUT0_META_SIZE(metadata_size) 226 | BF_BCH_FLASH0LAYOUT0_META_SIZE(metadata_size)
227 | BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength) 227 | BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength, this)
228 | BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size), 228 | BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size, this),
229 r->bch_regs + HW_BCH_FLASH0LAYOUT0); 229 r->bch_regs + HW_BCH_FLASH0LAYOUT0);
230 230
231 writel(BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size) 231 writel(BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size)
232 | BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength) 232 | BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength, this)
233 | BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size), 233 | BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size, this),
234 r->bch_regs + HW_BCH_FLASH0LAYOUT1); 234 r->bch_regs + HW_BCH_FLASH0LAYOUT1);
235 235
236 /* Set *all* chip selects to use layout 0. */ 236 /* Set *all* chip selects to use layout 0. */
@@ -805,7 +805,8 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip)
805 if (GPMI_IS_MX23(this)) { 805 if (GPMI_IS_MX23(this)) {
806 mask = MX23_BM_GPMI_DEBUG_READY0 << chip; 806 mask = MX23_BM_GPMI_DEBUG_READY0 << chip;
807 reg = readl(r->gpmi_regs + HW_GPMI_DEBUG); 807 reg = readl(r->gpmi_regs + HW_GPMI_DEBUG);
808 } else if (GPMI_IS_MX28(this)) { 808 } else if (GPMI_IS_MX28(this) || GPMI_IS_MX6Q(this)) {
809 /* MX28 shares the same R/B register as MX6Q. */
809 mask = MX28_BF_GPMI_STAT_READY_BUSY(1 << chip); 810 mask = MX28_BF_GPMI_STAT_READY_BUSY(1 << chip);
810 reg = readl(r->gpmi_regs + HW_GPMI_STAT); 811 reg = readl(r->gpmi_regs + HW_GPMI_STAT);
811 } else 812 } else
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
index d9dc4c874ffa..519e4306e352 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
@@ -1515,6 +1515,7 @@ err_out:
1515static const struct platform_device_id gpmi_ids[] = { 1515static const struct platform_device_id gpmi_ids[] = {
1516 { .name = "imx23-gpmi-nand", .driver_data = IS_MX23, }, 1516 { .name = "imx23-gpmi-nand", .driver_data = IS_MX23, },
1517 { .name = "imx28-gpmi-nand", .driver_data = IS_MX28, }, 1517 { .name = "imx28-gpmi-nand", .driver_data = IS_MX28, },
1518 { .name = "imx6q-gpmi-nand", .driver_data = IS_MX6Q, },
1518 {}, 1519 {},
1519}; 1520};
1520 1521
@@ -1525,6 +1526,9 @@ static const struct of_device_id gpmi_nand_id_table[] = {
1525 }, { 1526 }, {
1526 .compatible = "fsl,imx28-gpmi-nand", 1527 .compatible = "fsl,imx28-gpmi-nand",
1527 .data = (void *)&gpmi_ids[IS_MX28] 1528 .data = (void *)&gpmi_ids[IS_MX28]
1529 }, {
1530 .compatible = "fsl,imx6q-gpmi-nand",
1531 .data = (void *)&gpmi_ids[IS_MX6Q]
1528 }, {} 1532 }, {}
1529}; 1533};
1530MODULE_DEVICE_TABLE(of, gpmi_nand_id_table); 1534MODULE_DEVICE_TABLE(of, gpmi_nand_id_table);
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
index 12fdd7767c1c..ce5daa160920 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
@@ -268,6 +268,8 @@ extern int gpmi_read_page(struct gpmi_nand_data *,
268/* Use the platform_id to distinguish different Archs. */ 268/* Use the platform_id to distinguish different Archs. */
269#define IS_MX23 0x0 269#define IS_MX23 0x0
270#define IS_MX28 0x1 270#define IS_MX28 0x1
271#define IS_MX6Q 0x2
271#define GPMI_IS_MX23(x) ((x)->pdev->id_entry->driver_data == IS_MX23) 272#define GPMI_IS_MX23(x) ((x)->pdev->id_entry->driver_data == IS_MX23)
272#define GPMI_IS_MX28(x) ((x)->pdev->id_entry->driver_data == IS_MX28) 273#define GPMI_IS_MX28(x) ((x)->pdev->id_entry->driver_data == IS_MX28)
274#define GPMI_IS_MX6Q(x) ((x)->pdev->id_entry->driver_data == IS_MX6Q)
273#endif 275#endif