Message ID | 20180620094228.10693-1-boris.brezillon@bootlin.com |
---|---|
State | Superseded |
Delegated to: | Miquel Raynal |
Headers | show |
Series | mtd: rawnand: All AC chips have a broken GET_FEATURES(TIMINGS). | expand |
On Wed, 20 Jun 2018 11:42:28 +0200 Boris Brezillon <boris.brezillon@bootlin.com> wrote: > From: Mason Yang <masonccyang@mxic.com.tw> > > Make sure we flag all broken chips as not supporting this feature. > Also move this logic to a new function to keep things readable. > Crap! I forgot the Fixes and Cc-stable tags. I'll send a new version soon. > Signed-off-by: Mason Yang <masonccyang@mxic.com.tw> > Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> > --- > drivers/mtd/nand/raw/nand_macronix.c | 48 +++++++++++++++++++++++++++--------- > 1 file 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; > }
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; }