aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-06-06 06:33:15 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-07-06 13:17:06 -0400
commit71718a8edf688eb02a9475b7f567e3ec383c9734 (patch)
treedb4e47baca98e021dca6e661fb81d1902cf97d84
parent71885b650ab0fd9d2d35cd922bf949c07c171b04 (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.c48
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
179struct mxc_nand_host { 180struct 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 */
1238static const struct mxc_nand_devtype_data imx51_nand_devtype_data = { 1241static 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 */
1268static 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