aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/nand/denali.c23
-rw-r--r--drivers/mtd/nand/denali.h3
-rw-r--r--drivers/mtd/nand/denali_dt.c5
3 files changed, 18 insertions, 13 deletions
diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
index 417a8950cf49..16634df2e39a 100644
--- a/drivers/mtd/nand/denali.c
+++ b/drivers/mtd/nand/denali.c
@@ -419,17 +419,12 @@ static void find_valid_banks(struct denali_nand_info *denali)
419static void detect_max_banks(struct denali_nand_info *denali) 419static void detect_max_banks(struct denali_nand_info *denali)
420{ 420{
421 uint32_t features = ioread32(denali->flash_reg + FEATURES); 421 uint32_t features = ioread32(denali->flash_reg + FEATURES);
422 /*
423 * Read the revision register, so we can calculate the max_banks
424 * properly: the encoding changed from rev 5.0 to 5.1
425 */
426 u32 revision = MAKE_COMPARABLE_REVISION(
427 ioread32(denali->flash_reg + REVISION));
428 422
429 if (revision < REVISION_5_1) 423 denali->max_banks = 1 << (features & FEATURES__N_BANKS);
430 denali->max_banks = 2 << (features & FEATURES__N_BANKS); 424
431 else 425 /* the encoding changed from rev 5.0 to 5.1 */
432 denali->max_banks = 1 << (features & FEATURES__N_BANKS); 426 if (denali->revision < 0x0501)
427 denali->max_banks <<= 1;
433} 428}
434 429
435static uint16_t denali_nand_timing_set(struct denali_nand_info *denali) 430static uint16_t denali_nand_timing_set(struct denali_nand_info *denali)
@@ -1320,6 +1315,14 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
1320static void denali_hw_init(struct denali_nand_info *denali) 1315static void denali_hw_init(struct denali_nand_info *denali)
1321{ 1316{
1322 /* 1317 /*
1318 * The REVISION register may not be reliable. Platforms are allowed to
1319 * override it.
1320 */
1321 if (!denali->revision)
1322 denali->revision =
1323 swab16(ioread32(denali->flash_reg + REVISION));
1324
1325 /*
1323 * tell driver how many bit controller will skip before 1326 * tell driver how many bit controller will skip before
1324 * writing ECC code in OOB, this register may be already 1327 * writing ECC code in OOB, this register may be already
1325 * set by firmware. So we read this value out. 1328 * set by firmware. So we read this value out.
diff --git a/drivers/mtd/nand/denali.h b/drivers/mtd/nand/denali.h
index 1f413d05a010..ec004850652a 100644
--- a/drivers/mtd/nand/denali.h
+++ b/drivers/mtd/nand/denali.h
@@ -179,8 +179,6 @@
179 179
180#define REVISION 0x370 180#define REVISION 0x370
181#define REVISION__VALUE 0xffff 181#define REVISION__VALUE 0xffff
182#define MAKE_COMPARABLE_REVISION(x) swab16((x) & REVISION__VALUE)
183#define REVISION_5_1 0x00000501
184 182
185#define ONFI_DEVICE_FEATURES 0x380 183#define ONFI_DEVICE_FEATURES 0x380
186#define ONFI_DEVICE_FEATURES__VALUE 0x003f 184#define ONFI_DEVICE_FEATURES__VALUE 0x003f
@@ -343,6 +341,7 @@ struct denali_nand_info {
343 int devnum; /* represent how many nands connected */ 341 int devnum; /* represent how many nands connected */
344 int bbtskipbytes; 342 int bbtskipbytes;
345 int max_banks; 343 int max_banks;
344 unsigned int revision;
346 unsigned int caps; 345 unsigned int caps;
347}; 346};
348 347
diff --git a/drivers/mtd/nand/denali_dt.c b/drivers/mtd/nand/denali_dt.c
index ada38636122c..df9ef36cc2ce 100644
--- a/drivers/mtd/nand/denali_dt.c
+++ b/drivers/mtd/nand/denali_dt.c
@@ -30,6 +30,7 @@ struct denali_dt {
30}; 30};
31 31
32struct denali_dt_data { 32struct denali_dt_data {
33 unsigned int revision;
33 unsigned int caps; 34 unsigned int caps;
34}; 35};
35 36
@@ -60,8 +61,10 @@ static int denali_dt_probe(struct platform_device *pdev)
60 denali = &dt->denali; 61 denali = &dt->denali;
61 62
62 data = of_device_get_match_data(&pdev->dev); 63 data = of_device_get_match_data(&pdev->dev);
63 if (data) 64 if (data) {
65 denali->revision = data->revision;
64 denali->caps = data->caps; 66 denali->caps = data->caps;
67 }
65 68
66 denali->platform = DT; 69 denali->platform = DT;
67 denali->dev = &pdev->dev; 70 denali->dev = &pdev->dev;