1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2017 Free Electrons
4 * Copyright (C) 2017 NextThing Co
6 * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
12 * Macronix AC series does not support using SET/GET_FEATURES to change
13 * the timings unlike what is declared in the parameter page. Unflag
14 * this feature to avoid unnecessary downturns.
16 static void macronix_nand_fix_broken_get_timings(struct nand_chip *chip)
19 static const char * const broken_get_timings[] = {
36 if (!chip->parameters.supports_set_get_features)
39 for (i = 0; i < ARRAY_SIZE(broken_get_timings); i++) {
40 if (!strcmp(broken_get_timings[i], chip->parameters.model))
44 if (i == ARRAY_SIZE(broken_get_timings))
47 bitmap_clear(chip->parameters.get_feature_list,
48 ONFI_FEATURE_ADDR_TIMING_MODE, 1);
49 bitmap_clear(chip->parameters.set_feature_list,
50 ONFI_FEATURE_ADDR_TIMING_MODE, 1);
53 static int macronix_nand_init(struct nand_chip *chip)
55 if (nand_is_slc(chip))
56 chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE;
58 macronix_nand_fix_broken_get_timings(chip);
63 const struct nand_manufacturer_ops macronix_nand_manuf_ops = {
64 .init = macronix_nand_init,