Skip to content

Commit 6a13802

Browse files
Merge tag 'nand/for-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux into mtd/next
Core changes: * Drop useless 'depends on' in Kconfig * Add an extra level in the Kconfig hierarchy * Trivial spellings * Dynamic allocation of the interface configurations * Dropping the default ONFI timing mode * Various cleanup (types, structures, naming, comments) * Hide the chip->data_interface indirection * Add the generic rb-gpios property * Add the ->choose_interface_config() hook * Introduce nand_choose_best_sdr_timings() * Use default values for tPROG_max and tBERS_max * Avoid redefining tR_max and tCCS_min * Add a helper to find the closest ONFI mode * bcm63xx MTD parsers: simplify CFE detection Raw NAND controller drivers changes: * fsl-upm: Deprecation of specific DT properties * fsl_upm: Driver rework and cleanup in favor of ->exec_op() * Ingenic: Cleanup ARRAY_SIZE() vs sizeof() use * brcmnand: ECC error handling on EDU transfers * brcmnand: Don't default to EDU transfers * qcom: Set BAM mode only if not set already * qcom: Avoid write to unavailable register * gpio: Driver rework in favor of ->exec_op() * tango: ->exec_op() conversion * mtk: ->exec_op() conversion Raw NAND chip drivers changes: * toshiba: Implement ->choose_interface_config() for TH58NVG2S3HBAI4 * toshiba: Implement ->choose_interface_config() for TC58NVG0S3E * toshiba: Implement ->choose_interface_config() for TC58TEG5DCLTA00 * hynix: Implement ->choose_interface_config() for H27UCG8T2ATR-BC
2 parents 0c84b7f + da151e3 commit 6a13802

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1018
-747
lines changed

Documentation/devicetree/bindings/mtd/fsl-upm-nand.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ Required properties:
77
- fsl,upm-cmd-offset : UPM pattern offset for the command latch.
88

99
Optional properties:
10-
- fsl,upm-wait-flags : add chip-dependent short delays after running the
11-
UPM pattern (0x1), after writing a data byte (0x2) or after
12-
writing out a buffer (0x4).
1310
- fsl,upm-addr-line-cs-offsets : address offsets for multi-chip support.
1411
The corresponding address lines are used to select the chip.
1512
- gpios : may specify optional GPIOs connected to the Ready-Not-Busy pins
1613
(R/B#). For multi-chip devices, "n" GPIO definitions are required
1714
according to the number of chips.
15+
16+
Deprecated properties:
17+
- fsl,upm-wait-flags : add chip-dependent short delays after running the
18+
UPM pattern (0x1), after writing a data byte (0x2) or after
19+
writing out a buffer (0x4).
1820
- chip-delay : chip dependent delay for transferring data from array to
1921
read registers (tR). Required if property "gpios" is not used
2022
(R/B# pins not connected).
@@ -52,8 +54,6 @@ upm@3,0 {
5254
fsl,upm-cmd-offset = <0x08>;
5355
/* Multi-chip NAND device */
5456
fsl,upm-addr-line-cs-offsets = <0x0 0x200>;
55-
fsl,upm-wait-flags = <0x5>;
56-
chip-delay = <25>; // in micro-seconds
5757

5858
nand@0 {
5959
#address-cells = <1>;

Documentation/devicetree/bindings/mtd/nand-controller.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ patternProperties:
114114
description:
115115
Contains the native Ready/Busy IDs.
116116

117+
rb-gpios:
118+
description:
119+
Contains one or more GPIO descriptor (the numper of descriptor
120+
depends on the number of R/B pins exposed by the flash) for the
121+
Ready/Busy pins. Active state refers to the NAND ready state and
122+
should be set to GPIOD_ACTIVE_HIGH unless the signal is inverted.
123+
117124
required:
118125
- reg
119126

drivers/mtd/nand/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2+
3+
menu "NAND"
4+
25
config MTD_NAND_CORE
36
tristate
47

58
source "drivers/mtd/nand/onenand/Kconfig"
69
source "drivers/mtd/nand/raw/Kconfig"
710
source "drivers/mtd/nand/spi/Kconfig"
11+
12+
endmenu

drivers/mtd/nand/onenand/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# SPDX-License-Identifier: GPL-2.0-only
22
menuconfig MTD_ONENAND
33
tristate "OneNAND Device Support"
4-
depends on MTD
54
depends on HAS_IOMEM
65
help
76
This enables support for accessing all type of OneNAND flash

drivers/mtd/nand/raw/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ config MTD_NAND_ECC_SW_HAMMING_SMC
1212

1313
menuconfig MTD_RAW_NAND
1414
tristate "Raw/Parallel NAND Device Support"
15-
depends on MTD
1615
select MTD_NAND_CORE
1716
select MTD_NAND_ECC_SW_HAMMING
1817
help

drivers/mtd/nand/raw/ams-delta.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ static int gpio_nand_exec_op(struct nand_chip *this,
191191
return ret;
192192
}
193193

194-
static int gpio_nand_setup_data_interface(struct nand_chip *this, int csline,
195-
const struct nand_data_interface *cf)
194+
static int gpio_nand_setup_interface(struct nand_chip *this, int csline,
195+
const struct nand_interface_config *cf)
196196
{
197197
struct gpio_nand *priv = nand_get_controller_data(this);
198198
const struct nand_sdr_timings *sdr = nand_get_sdr_timings(cf);
@@ -217,7 +217,7 @@ static int gpio_nand_setup_data_interface(struct nand_chip *this, int csline,
217217

218218
static const struct nand_controller_ops gpio_nand_ops = {
219219
.exec_op = gpio_nand_exec_op,
220-
.setup_data_interface = gpio_nand_setup_data_interface,
220+
.setup_interface = gpio_nand_setup_interface,
221221
};
222222

223223
/*

drivers/mtd/nand/raw/arasan-nand-controller.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,8 @@ static int anfc_exec_op(struct nand_chip *chip,
854854
return nand_op_parser_exec_op(chip, &anfc_op_parser, op, check_only);
855855
}
856856

857-
static int anfc_setup_data_interface(struct nand_chip *chip, int target,
858-
const struct nand_data_interface *conf)
857+
static int anfc_setup_interface(struct nand_chip *chip, int target,
858+
const struct nand_interface_config *conf)
859859
{
860860
struct anand *anand = to_anand(chip);
861861
struct arasan_nfc *nfc = to_anfc(chip->controller);
@@ -1083,7 +1083,7 @@ static void anfc_detach_chip(struct nand_chip *chip)
10831083

10841084
static const struct nand_controller_ops anfc_ops = {
10851085
.exec_op = anfc_exec_op,
1086-
.setup_data_interface = anfc_setup_data_interface,
1086+
.setup_interface = anfc_setup_interface,
10871087
.attach_chip = anfc_attach_chip,
10881088
.detach_chip = anfc_detach_chip,
10891089
};

drivers/mtd/nand/raw/atmel/nand-controller.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@ struct atmel_nand_controller_ops {
200200
void (*nand_init)(struct atmel_nand_controller *nc,
201201
struct atmel_nand *nand);
202202
int (*ecc_init)(struct nand_chip *chip);
203-
int (*setup_data_interface)(struct atmel_nand *nand, int csline,
204-
const struct nand_data_interface *conf);
203+
int (*setup_interface)(struct atmel_nand *nand, int csline,
204+
const struct nand_interface_config *conf);
205205
};
206206

207207
struct atmel_nand_controller_caps {
@@ -1168,7 +1168,7 @@ static int atmel_hsmc_nand_ecc_init(struct nand_chip *chip)
11681168
}
11691169

11701170
static int atmel_smc_nand_prepare_smcconf(struct atmel_nand *nand,
1171-
const struct nand_data_interface *conf,
1171+
const struct nand_interface_config *conf,
11721172
struct atmel_smc_cs_conf *smcconf)
11731173
{
11741174
u32 ncycles, totalcycles, timeps, mckperiodps;
@@ -1397,9 +1397,9 @@ static int atmel_smc_nand_prepare_smcconf(struct atmel_nand *nand,
13971397
return 0;
13981398
}
13991399

1400-
static int atmel_smc_nand_setup_data_interface(struct atmel_nand *nand,
1400+
static int atmel_smc_nand_setup_interface(struct atmel_nand *nand,
14011401
int csline,
1402-
const struct nand_data_interface *conf)
1402+
const struct nand_interface_config *conf)
14031403
{
14041404
struct atmel_nand_controller *nc;
14051405
struct atmel_smc_cs_conf smcconf;
@@ -1422,9 +1422,9 @@ static int atmel_smc_nand_setup_data_interface(struct atmel_nand *nand,
14221422
return 0;
14231423
}
14241424

1425-
static int atmel_hsmc_nand_setup_data_interface(struct atmel_nand *nand,
1425+
static int atmel_hsmc_nand_setup_interface(struct atmel_nand *nand,
14261426
int csline,
1427-
const struct nand_data_interface *conf)
1427+
const struct nand_interface_config *conf)
14281428
{
14291429
struct atmel_hsmc_nand_controller *nc;
14301430
struct atmel_smc_cs_conf smcconf;
@@ -1452,8 +1452,8 @@ static int atmel_hsmc_nand_setup_data_interface(struct atmel_nand *nand,
14521452
return 0;
14531453
}
14541454

1455-
static int atmel_nand_setup_data_interface(struct nand_chip *chip, int csline,
1456-
const struct nand_data_interface *conf)
1455+
static int atmel_nand_setup_interface(struct nand_chip *chip, int csline,
1456+
const struct nand_interface_config *conf)
14571457
{
14581458
struct atmel_nand *nand = to_atmel_nand(chip);
14591459
struct atmel_nand_controller *nc;
@@ -1464,7 +1464,7 @@ static int atmel_nand_setup_data_interface(struct nand_chip *chip, int csline,
14641464
(csline < 0 && csline != NAND_DATA_IFACE_CHECK_ONLY))
14651465
return -EINVAL;
14661466

1467-
return nc->caps->ops->setup_data_interface(nand, csline, conf);
1467+
return nc->caps->ops->setup_interface(nand, csline, conf);
14681468
}
14691469

14701470
static void atmel_nand_init(struct atmel_nand_controller *nc,
@@ -1483,7 +1483,7 @@ static void atmel_nand_init(struct atmel_nand_controller *nc,
14831483
chip->legacy.write_buf = atmel_nand_write_buf;
14841484
chip->legacy.select_chip = atmel_nand_select_chip;
14851485

1486-
if (!nc->mck || !nc->caps->ops->setup_data_interface)
1486+
if (!nc->mck || !nc->caps->ops->setup_interface)
14871487
chip->options |= NAND_KEEP_TIMINGS;
14881488

14891489
/* Some NANDs require a longer delay than the default one (20us). */
@@ -1956,7 +1956,7 @@ static int atmel_nand_attach_chip(struct nand_chip *chip)
19561956

19571957
static const struct nand_controller_ops atmel_nand_controller_ops = {
19581958
.attach_chip = atmel_nand_attach_chip,
1959-
.setup_data_interface = atmel_nand_setup_data_interface,
1959+
.setup_interface = atmel_nand_setup_interface,
19601960
};
19611961

19621962
static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
@@ -2318,7 +2318,7 @@ static const struct atmel_nand_controller_ops atmel_hsmc_nc_ops = {
23182318
.remove = atmel_hsmc_nand_controller_remove,
23192319
.ecc_init = atmel_hsmc_nand_ecc_init,
23202320
.nand_init = atmel_hsmc_nand_init,
2321-
.setup_data_interface = atmel_hsmc_nand_setup_data_interface,
2321+
.setup_interface = atmel_hsmc_nand_setup_interface,
23222322
};
23232323

23242324
static const struct atmel_nand_controller_caps atmel_sama5_nc_caps = {
@@ -2375,10 +2375,10 @@ atmel_smc_nand_controller_remove(struct atmel_nand_controller *nc)
23752375

23762376
/*
23772377
* The SMC reg layout of at91rm9200 is completely different which prevents us
2378-
* from re-using atmel_smc_nand_setup_data_interface() for the
2379-
* ->setup_data_interface() hook.
2378+
* from re-using atmel_smc_nand_setup_interface() for the
2379+
* ->setup_interface() hook.
23802380
* At this point, there's no support for the at91rm9200 SMC IP, so we leave
2381-
* ->setup_data_interface() unassigned.
2381+
* ->setup_interface() unassigned.
23822382
*/
23832383
static const struct atmel_nand_controller_ops at91rm9200_nc_ops = {
23842384
.probe = atmel_smc_nand_controller_probe,
@@ -2399,7 +2399,7 @@ static const struct atmel_nand_controller_ops atmel_smc_nc_ops = {
23992399
.remove = atmel_smc_nand_controller_remove,
24002400
.ecc_init = atmel_nand_ecc_init,
24012401
.nand_init = atmel_smc_nand_init,
2402-
.setup_data_interface = atmel_smc_nand_setup_data_interface,
2402+
.setup_interface = atmel_smc_nand_setup_interface,
24032403
};
24042404

24052405
static const struct atmel_nand_controller_caps atmel_sam9260_nc_caps = {

drivers/mtd/nand/raw/brcmnand/brcmnand.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,6 +1918,22 @@ static int brcmnand_edu_trans(struct brcmnand_host *host, u64 addr, u32 *buf,
19181918
edu_writel(ctrl, EDU_STOP, 0); /* force stop */
19191919
edu_readl(ctrl, EDU_STOP);
19201920

1921+
if (!ret && edu_cmd == EDU_CMD_READ) {
1922+
u64 err_addr = 0;
1923+
1924+
/*
1925+
* check for ECC errors here, subpage ECC errors are
1926+
* retained in ECC error address register
1927+
*/
1928+
err_addr = brcmnand_get_uncorrecc_addr(ctrl);
1929+
if (!err_addr) {
1930+
err_addr = brcmnand_get_correcc_addr(ctrl);
1931+
if (err_addr)
1932+
ret = -EUCLEAN;
1933+
} else
1934+
ret = -EBADMSG;
1935+
}
1936+
19211937
return ret;
19221938
}
19231939

@@ -2124,6 +2140,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,
21242140
u64 err_addr = 0;
21252141
int err;
21262142
bool retry = true;
2143+
bool edu_err = false;
21272144

21282145
dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf);
21292146

@@ -2141,6 +2158,10 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,
21412158
else
21422159
return -EIO;
21432160
}
2161+
2162+
if (has_edu(ctrl) && err_addr)
2163+
edu_err = true;
2164+
21442165
} else {
21452166
if (oob)
21462167
memset(oob, 0x99, mtd->oobsize);
@@ -2188,6 +2209,11 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,
21882209
if (mtd_is_bitflip(err)) {
21892210
unsigned int corrected = brcmnand_count_corrected(ctrl);
21902211

2212+
/* in case of EDU correctable error we read again using PIO */
2213+
if (edu_err)
2214+
err = brcmnand_read_by_pio(mtd, chip, addr, trans, buf,
2215+
oob, &err_addr);
2216+
21912217
dev_dbg(ctrl->dev, "corrected error at 0x%llx\n",
21922218
(unsigned long long)err_addr);
21932219
mtd->ecc_stats.corrected += corrected;
@@ -3023,8 +3049,9 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
30233049
if (ret < 0)
30243050
goto err;
30253051

3026-
/* set edu transfer function to call */
3027-
ctrl->dma_trans = brcmnand_edu_trans;
3052+
if (has_edu(ctrl))
3053+
/* set edu transfer function to call */
3054+
ctrl->dma_trans = brcmnand_edu_trans;
30283055
}
30293056

30303057
/* Disable automatic device ID config, direct addressing */

drivers/mtd/nand/raw/cadence-nand-controller.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,8 +2303,8 @@ static inline u32 calc_tdvw(u32 trp_cnt, u32 clk_period, u32 trhoh_min,
23032303
}
23042304

23052305
static int
2306-
cadence_nand_setup_data_interface(struct nand_chip *chip, int chipnr,
2307-
const struct nand_data_interface *conf)
2306+
cadence_nand_setup_interface(struct nand_chip *chip, int chipnr,
2307+
const struct nand_interface_config *conf)
23082308
{
23092309
const struct nand_sdr_timings *sdr;
23102310
struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller);
@@ -2690,7 +2690,7 @@ static int cadence_nand_attach_chip(struct nand_chip *chip)
26902690
static const struct nand_controller_ops cadence_nand_controller_ops = {
26912691
.attach_chip = cadence_nand_attach_chip,
26922692
.exec_op = cadence_nand_exec_op,
2693-
.setup_data_interface = cadence_nand_setup_data_interface,
2693+
.setup_interface = cadence_nand_setup_interface,
26942694
};
26952695

26962696
static int cadence_nand_chip_init(struct cdns_nand_ctrl *cdns_ctrl,

0 commit comments

Comments
 (0)