|
@@ -48,6 +48,7 @@
|
|
#include <linux/leds.h>
|
|
#include <linux/leds.h>
|
|
#include <linux/io.h>
|
|
#include <linux/io.h>
|
|
#include <linux/mtd/partitions.h>
|
|
#include <linux/mtd/partitions.h>
|
|
|
|
+#include <linux/of_mtd.h>
|
|
|
|
|
|
/* Define default oob placement schemes for large and small page devices */
|
|
/* Define default oob placement schemes for large and small page devices */
|
|
static struct nand_ecclayout nand_oob_8 = {
|
|
static struct nand_ecclayout nand_oob_8 = {
|
|
@@ -3795,6 +3796,39 @@ ident_done:
|
|
return type;
|
|
return type;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int nand_dt_init(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
|
+ struct device_node *dn)
|
|
|
|
+{
|
|
|
|
+ int ecc_mode, ecc_strength, ecc_step;
|
|
|
|
+
|
|
|
|
+ if (of_get_nand_bus_width(dn) == 16)
|
|
|
|
+ chip->options |= NAND_BUSWIDTH_16;
|
|
|
|
+
|
|
|
|
+ if (of_get_nand_on_flash_bbt(dn))
|
|
|
|
+ chip->bbt_options |= NAND_BBT_USE_FLASH;
|
|
|
|
+
|
|
|
|
+ ecc_mode = of_get_nand_ecc_mode(dn);
|
|
|
|
+ ecc_strength = of_get_nand_ecc_strength(dn);
|
|
|
|
+ ecc_step = of_get_nand_ecc_step_size(dn);
|
|
|
|
+
|
|
|
|
+ if ((ecc_step >= 0 && !(ecc_strength >= 0)) ||
|
|
|
|
+ (!(ecc_step >= 0) && ecc_strength >= 0)) {
|
|
|
|
+ pr_err("must set both strength and step size in DT\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (ecc_mode >= 0)
|
|
|
|
+ chip->ecc.mode = ecc_mode;
|
|
|
|
+
|
|
|
|
+ if (ecc_strength >= 0)
|
|
|
|
+ chip->ecc.strength = ecc_strength;
|
|
|
|
+
|
|
|
|
+ if (ecc_step > 0)
|
|
|
|
+ chip->ecc.size = ecc_step;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* nand_scan_ident - [NAND Interface] Scan for the NAND device
|
|
* nand_scan_ident - [NAND Interface] Scan for the NAND device
|
|
* @mtd: MTD device structure
|
|
* @mtd: MTD device structure
|
|
@@ -3812,6 +3846,13 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
|
|
int i, nand_maf_id, nand_dev_id;
|
|
int i, nand_maf_id, nand_dev_id;
|
|
struct nand_chip *chip = mtd->priv;
|
|
struct nand_chip *chip = mtd->priv;
|
|
struct nand_flash_dev *type;
|
|
struct nand_flash_dev *type;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ if (chip->dn) {
|
|
|
|
+ ret = nand_dt_init(mtd, chip, chip->dn);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
|
|
/* Set the default functions */
|
|
/* Set the default functions */
|
|
nand_set_defaults(chip, chip->options & NAND_BUSWIDTH_16);
|
|
nand_set_defaults(chip, chip->options & NAND_BUSWIDTH_16);
|