diff options
Diffstat (limited to 'drivers/mtd/nand/raw/nand_macronix.c')
| -rw-r--r-- | drivers/mtd/nand/raw/nand_macronix.c | 48 | 
1 files changed, 36 insertions, 12 deletions
| diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/raw/nand_macronix.c index 7ed1f87e742a..49c546c97c6f 100644 --- a/drivers/mtd/nand/raw/nand_macronix.c +++ b/drivers/mtd/nand/raw/nand_macronix.c @@ -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;  } |