|
@@ -2699,6 +2699,50 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|
|
return chip->block_markbad(mtd, ofs);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * nand_onfi_set_features- [REPLACEABLE] set features for ONFI nand
|
|
|
+ * @mtd: MTD device structure
|
|
|
+ * @chip: nand chip info structure
|
|
|
+ * @addr: feature address.
|
|
|
+ * @subfeature_param: the subfeature parameters, a four bytes array.
|
|
|
+ */
|
|
|
+static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
+ int addr, uint8_t *subfeature_param)
|
|
|
+{
|
|
|
+ int status;
|
|
|
+
|
|
|
+ if (!chip->onfi_version)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1);
|
|
|
+ chip->write_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
|
|
|
+ status = chip->waitfunc(mtd, chip);
|
|
|
+ if (status & NAND_STATUS_FAIL)
|
|
|
+ return -EIO;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * nand_onfi_get_features- [REPLACEABLE] get features for ONFI nand
|
|
|
+ * @mtd: MTD device structure
|
|
|
+ * @chip: nand chip info structure
|
|
|
+ * @addr: feature address.
|
|
|
+ * @subfeature_param: the subfeature parameters, a four bytes array.
|
|
|
+ */
|
|
|
+static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
+ int addr, uint8_t *subfeature_param)
|
|
|
+{
|
|
|
+ if (!chip->onfi_version)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* clear the sub feature parameters */
|
|
|
+ memset(subfeature_param, 0, ONFI_SUBFEATURE_PARAM_LEN);
|
|
|
+
|
|
|
+ chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1);
|
|
|
+ chip->read_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* nand_suspend - [MTD Interface] Suspend the NAND flash
|
|
|
* @mtd: MTD device structure
|
|
@@ -3223,6 +3267,12 @@ int nand_scan_tail(struct mtd_info *mtd)
|
|
|
if (!chip->write_page)
|
|
|
chip->write_page = nand_write_page;
|
|
|
|
|
|
+ /* set for ONFI nand */
|
|
|
+ if (!chip->onfi_set_features)
|
|
|
+ chip->onfi_set_features = nand_onfi_set_features;
|
|
|
+ if (!chip->onfi_get_features)
|
|
|
+ chip->onfi_get_features = nand_onfi_get_features;
|
|
|
+
|
|
|
/*
|
|
|
* Check ECC mode, default to software if 3byte/512byte hardware ECC is
|
|
|
* selected and we have 256 byte pagesize fallback to software ECC
|