diff options
author | Huang Shijie <b32955@freescale.com> | 2012-05-04 21:42:06 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-05-14 00:22:29 -0400 |
commit | 9013bb40ae8e97d579015a3dc96a10aa9c625757 (patch) | |
tree | 7c0650491a805f462ea464611a3558e1742d278d /drivers/mtd/nand/gpmi-nand | |
parent | e10db1f00a5e3c2ec04d7fe26c7444dc55a59b19 (diff) |
mtd: gpmi: add gpmi support for mx6q
add gpmi support for mx6q.
Signed-off-by: Huang Shijie <b32955@freescale.com>
Signed-off-by: Huang Shijie <shijie8@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/nand/gpmi-nand')
-rw-r--r-- | drivers/mtd/nand/gpmi-nand/bch-regs.h | 42 | ||||
-rw-r--r-- | drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 11 | ||||
-rw-r--r-- | drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 4 | ||||
-rw-r--r-- | drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 2 |
4 files changed, 44 insertions, 15 deletions
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: | |||
1515 | static const struct platform_device_id gpmi_ids[] = { | 1515 | static 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 | }; |
1530 | MODULE_DEVICE_TABLE(of, gpmi_nand_id_table); | 1534 | MODULE_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 |