|
@@ -17,23 +17,47 @@
|
|
|
|
|
|
#include <linux/mtd/rawnand.h>
|
|
|
|
|
|
+/*
|
|
|
+ * Macronix AC series does not support using SET/GET_FEATURES to change
|
|
|
+ * the timings unlike what is declared in the parameter page. Unflag
|
|
|
+ * this feature to avoid unnecessary downturns.
|
|
|
+ */
|
|
|
+static void macronix_nand_fix_broken_get_timings(struct nand_chip *chip)
|
|
|
+{
|
|
|
+ unsigned int i;
|
|
|
+ static const char * const broken_get_timings[] = {
|
|
|
+ "MX30LF1G18AC",
|
|
|
+ "MX30LF1G28AC",
|
|
|
+ "MX30LF2G18AC",
|
|
|
+ "MX30LF2G28AC",
|
|
|
+ "MX30LF4G18AC",
|
|
|
+ "MX30LF4G28AC",
|
|
|
+ "MX60LF8G18AC",
|
|
|
+ };
|
|
|
+
|
|
|
+ if (!chip->parameters.supports_set_get_features)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(broken_get_timings); i++) {
|
|
|
+ if (!strcmp(broken_get_timings[i], chip->parameters.model))
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (i == ARRAY_SIZE(broken_get_timings))
|
|
|
+ return;
|
|
|
+
|
|
|
+ bitmap_clear(chip->parameters.get_feature_list,
|
|
|
+ ONFI_FEATURE_ADDR_TIMING_MODE, 1);
|
|
|
+ bitmap_clear(chip->parameters.set_feature_list,
|
|
|
+ ONFI_FEATURE_ADDR_TIMING_MODE, 1);
|
|
|
+}
|
|
|
+
|
|
|
static int macronix_nand_init(struct nand_chip *chip)
|
|
|
{
|
|
|
if (nand_is_slc(chip))
|
|
|
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
|
|
|
|
|
- /*
|
|
|
- * MX30LF2G18AC chip does not support using SET/GET_FEATURES to change
|
|
|
- * the timings unlike what is declared in the parameter page. Unflag
|
|
|
- * this feature to avoid unnecessary downturns.
|
|
|
- */
|
|
|
- if (chip->parameters.supports_set_get_features &&
|
|
|
- !strcmp("MX30LF2G18AC", chip->parameters.model)) {
|
|
|
- bitmap_clear(chip->parameters.get_feature_list,
|
|
|
- ONFI_FEATURE_ADDR_TIMING_MODE, 1);
|
|
|
- bitmap_clear(chip->parameters.set_feature_list,
|
|
|
- ONFI_FEATURE_ADDR_TIMING_MODE, 1);
|
|
|
- }
|
|
|
+ macronix_nand_fix_broken_get_timings(chip);
|
|
|
|
|
|
return 0;
|
|
|
}
|