diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-06-06 06:33:15 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-07-06 13:17:06 -0400 |
commit | 71718a8edf688eb02a9475b7f567e3ec383c9734 (patch) | |
tree | db4e47baca98e021dca6e661fb81d1902cf97d84 | |
parent | 71885b650ab0fd9d2d35cd922bf949c07c171b04 (diff) |
mtd: mxc_nand: add i.MX53 support
The only relevant change between i.MX51 and i.MX53 is that
a bitfield is shifted one bit to the left.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 48c57275001f..3f94e1f13231 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
@@ -43,8 +43,8 @@ | |||
43 | 43 | ||
44 | #define nfc_is_v21() (cpu_is_mx25() || cpu_is_mx35()) | 44 | #define nfc_is_v21() (cpu_is_mx25() || cpu_is_mx35()) |
45 | #define nfc_is_v1() (cpu_is_mx31() || cpu_is_mx27() || cpu_is_mx21()) | 45 | #define nfc_is_v1() (cpu_is_mx31() || cpu_is_mx27() || cpu_is_mx21()) |
46 | #define nfc_is_v3_2() (cpu_is_mx51() || cpu_is_mx53()) | 46 | #define nfc_is_v3_2a() cpu_is_mx51() |
47 | #define nfc_is_v3() nfc_is_v3_2() | 47 | #define nfc_is_v3_2b() cpu_is_mx53() |
48 | 48 | ||
49 | /* Addresses for NFC registers */ | 49 | /* Addresses for NFC registers */ |
50 | #define NFC_V1_V2_BUF_SIZE (host->regs + 0x00) | 50 | #define NFC_V1_V2_BUF_SIZE (host->regs + 0x00) |
@@ -122,7 +122,7 @@ | |||
122 | #define NFC_V3_CONFIG2_2CMD_PHASES (1 << 4) | 122 | #define NFC_V3_CONFIG2_2CMD_PHASES (1 << 4) |
123 | #define NFC_V3_CONFIG2_NUM_ADDR_PHASE0 (1 << 5) | 123 | #define NFC_V3_CONFIG2_NUM_ADDR_PHASE0 (1 << 5) |
124 | #define NFC_V3_CONFIG2_ECC_MODE_8 (1 << 6) | 124 | #define NFC_V3_CONFIG2_ECC_MODE_8 (1 << 6) |
125 | #define NFC_V3_CONFIG2_PPB(x) (((x) & 0x3) << 7) | 125 | #define NFC_V3_CONFIG2_PPB(x, shift) (((x) & 0x3) << shift) |
126 | #define NFC_V3_CONFIG2_NUM_ADDR_PHASE1(x) (((x) & 0x3) << 12) | 126 | #define NFC_V3_CONFIG2_NUM_ADDR_PHASE1(x) (((x) & 0x3) << 12) |
127 | #define NFC_V3_CONFIG2_INT_MSK (1 << 15) | 127 | #define NFC_V3_CONFIG2_INT_MSK (1 << 15) |
128 | #define NFC_V3_CONFIG2_ST_CMD(x) (((x) & 0xff) << 24) | 128 | #define NFC_V3_CONFIG2_ST_CMD(x) (((x) & 0xff) << 24) |
@@ -174,6 +174,7 @@ struct mxc_nand_devtype_data { | |||
174 | int spare_len; | 174 | int spare_len; |
175 | int eccbytes; | 175 | int eccbytes; |
176 | int eccsize; | 176 | int eccsize; |
177 | int ppb_shift; | ||
177 | }; | 178 | }; |
178 | 179 | ||
179 | struct mxc_nand_host { | 180 | struct mxc_nand_host { |
@@ -1021,7 +1022,9 @@ static void preset_v3(struct mtd_info *mtd) | |||
1021 | } | 1022 | } |
1022 | 1023 | ||
1023 | if (mtd->writesize) { | 1024 | if (mtd->writesize) { |
1024 | config2 |= NFC_V3_CONFIG2_PPB(ffs(mtd->erasesize / mtd->writesize) - 6); | 1025 | config2 |= NFC_V3_CONFIG2_PPB( |
1026 | ffs(mtd->erasesize / mtd->writesize) - 6, | ||
1027 | host->devtype_data->ppb_shift); | ||
1025 | host->eccsize = get_eccsize(mtd); | 1028 | host->eccsize = get_eccsize(mtd); |
1026 | if (host->eccsize == 8) | 1029 | if (host->eccsize == 8) |
1027 | config2 |= NFC_V3_CONFIG2_ECC_MODE_8; | 1030 | config2 |= NFC_V3_CONFIG2_ECC_MODE_8; |
@@ -1234,7 +1237,7 @@ static const struct mxc_nand_devtype_data imx25_nand_devtype_data = { | |||
1234 | .eccsize = 0, | 1237 | .eccsize = 0, |
1235 | }; | 1238 | }; |
1236 | 1239 | ||
1237 | /* v3: i.MX51, i.MX53 */ | 1240 | /* v3.2a: i.MX51 */ |
1238 | static const struct mxc_nand_devtype_data imx51_nand_devtype_data = { | 1241 | static const struct mxc_nand_devtype_data imx51_nand_devtype_data = { |
1239 | .preset = preset_v3, | 1242 | .preset = preset_v3, |
1240 | .send_cmd = send_cmd_v3, | 1243 | .send_cmd = send_cmd_v3, |
@@ -1258,6 +1261,34 @@ static const struct mxc_nand_devtype_data imx51_nand_devtype_data = { | |||
1258 | .spare_len = 64, | 1261 | .spare_len = 64, |
1259 | .eccbytes = 0, | 1262 | .eccbytes = 0, |
1260 | .eccsize = 0, | 1263 | .eccsize = 0, |
1264 | .ppb_shift = 7, | ||
1265 | }; | ||
1266 | |||
1267 | /* v3.2b: i.MX53 */ | ||
1268 | static const struct mxc_nand_devtype_data imx53_nand_devtype_data = { | ||
1269 | .preset = preset_v3, | ||
1270 | .send_cmd = send_cmd_v3, | ||
1271 | .send_addr = send_addr_v3, | ||
1272 | .send_page = send_page_v3, | ||
1273 | .send_read_id = send_read_id_v3, | ||
1274 | .get_dev_status = get_dev_status_v3, | ||
1275 | .check_int = check_int_v3, | ||
1276 | .irq_control = irq_control_v3, | ||
1277 | .get_ecc_status = get_ecc_status_v3, | ||
1278 | .ecclayout_512 = &nandv2_hw_eccoob_smallpage, | ||
1279 | .ecclayout_2k = &nandv2_hw_eccoob_largepage, | ||
1280 | .ecclayout_4k = &nandv2_hw_eccoob_smallpage, /* XXX: needs fix */ | ||
1281 | .select_chip = mxc_nand_select_chip_v1_v3, | ||
1282 | .correct_data = mxc_nand_correct_data_v2_v3, | ||
1283 | .irqpending_quirk = 0, | ||
1284 | .needs_ip = 1, | ||
1285 | .regs_offset = 0, | ||
1286 | .spare0_offset = 0x1000, | ||
1287 | .axi_offset = 0x1e00, | ||
1288 | .spare_len = 64, | ||
1289 | .eccbytes = 0, | ||
1290 | .eccsize = 0, | ||
1291 | .ppb_shift = 8, | ||
1261 | }; | 1292 | }; |
1262 | 1293 | ||
1263 | #ifdef CONFIG_OF_MTD | 1294 | #ifdef CONFIG_OF_MTD |
@@ -1274,6 +1305,9 @@ static const struct of_device_id mxcnd_dt_ids[] = { | |||
1274 | }, { | 1305 | }, { |
1275 | .compatible = "fsl,imx51-nand", | 1306 | .compatible = "fsl,imx51-nand", |
1276 | .data = &imx51_nand_devtype_data, | 1307 | .data = &imx51_nand_devtype_data, |
1308 | }, { | ||
1309 | .compatible = "fsl,imx53-nand", | ||
1310 | .data = &imx53_nand_devtype_data, | ||
1277 | }, | 1311 | }, |
1278 | { /* sentinel */ } | 1312 | { /* sentinel */ } |
1279 | }; | 1313 | }; |
@@ -1327,8 +1361,10 @@ static int __init mxcnd_probe_pdata(struct mxc_nand_host *host) | |||
1327 | host->devtype_data = &imx27_nand_devtype_data; | 1361 | host->devtype_data = &imx27_nand_devtype_data; |
1328 | } else if (nfc_is_v21()) { | 1362 | } else if (nfc_is_v21()) { |
1329 | host->devtype_data = &imx25_nand_devtype_data; | 1363 | host->devtype_data = &imx25_nand_devtype_data; |
1330 | } else if (nfc_is_v3_2()) { | 1364 | } else if (nfc_is_v3_2a()) { |
1331 | host->devtype_data = &imx51_nand_devtype_data; | 1365 | host->devtype_data = &imx51_nand_devtype_data; |
1366 | } else if (nfc_is_v3_2b()) { | ||
1367 | host->devtype_data = &imx53_nand_devtype_data; | ||
1332 | } else | 1368 | } else |
1333 | BUG(); | 1369 | BUG(); |
1334 | 1370 | ||