linux_dsm_epyc7002/drivers/mtd/nand/raw
Miquel Raynal f6997bec6a mtd: rawnand: marvell: fix the chip-select DT parsing logic
The block responsible of parsing the DT for the number of chip-select
lines uses an 'if/else if/else if' block. The content of the second and
third 'else if' conditions are:
        1/ the actual condition to enter the sub-block and
        2/ the operation to do in this sub-block.

        [...]
        else if (condition1_to_enter && action1() == failed)
                raise_error();
        else if (condition2_to_enter && action2() == failed)
                raise_error();
        [...]

In case of failure, the sub-block is entered and an error raised.
Otherwise, in case of success, the code would continue erroneously in
the next 'else if' statement because it did not failed (and did not
enter the first 'else if' sub-block).

The first 'else if' refers to legacy bindings while the second 'else if'
refers to new bindings. The second 'else if', which is entered
erroneously, checks for the 'reg' property, which, for old bindings,
does not mean anything because it would not be the number of CS
available, but the regular register map of almost any DT node. This
being said, the content of the 'reg' property being the register map
offset and length, it has '2' values, so the number of CS in this
situation is assumed to be '2'.

When running nand_scan_ident() with 2 CS, the core will check for an
array of chips. It will first issue a RESET and then a READ_ID. Of
course this will trigger two timeouts because there is no chip in front
of the second CS:

[    1.367460] marvell-nfc f2720000.nand: Timeout on CMDD (NDSR: 0x00000080)
[    1.474292] marvell-nfc f2720000.nand: Timeout on CMDD (NDSR: 0x00000280)

Indeed, this is harmless and the core will then assume there is only one
valid CS.

Fix the logic in the whole block by entering each sub-block just on the
'is legacy' condition, doing the action inside the sub-block. This way,
when the action succeeds, the whole block is left.

Furthermore, for both the old bindings and the new bindings the same
logic was applied to retrieve the number of CS lines:
using of_get_property() to get a size in bytes, converted in the actual
number of lines by dividing it per sizeof(u32) (4 bytes).

This is fine for the 'reg' property which is a list of the CS IDs but
not for the 'num-cs' property which is directly the value of the number
of CS.

Anyway, no existing DT uses another value than 'num-cs = <1>' and no
other value has ever been supported by the old driver (pxa3xx_nand.c).
Remove this condition and apply a number of 1 CS anyway, as already
described in the bindings.

Finally, the 'reg' property of a 'nand' node (with the new bindings)
gives the IDs of each CS line in use. marvell_nand.c driver first look
at the number of CS lines that are present in this property.

Better use of_property_count_elems_of_size() than dividing by 4 the size
of the number of bytes returned by of_get_property().

Fixes: 02f26ecf8c ("mtd: nand: add reworked Marvell NAND controller driver")
Cc: stable@vger.kernel.org
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Tested-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
2018-04-26 19:06:42 +02:00
..
atmel MTD changes: 2018-04-06 12:15:41 -07:00
bcm47xxnflash mtd: rawnand: rename SET/GET FEATURES related functions 2018-03-20 09:33:22 +01:00
brcmnand mtd: rawnand: brcmnand: fix probe function error path 2018-03-29 09:38:18 +02:00
gpmi-nand mtd: rawnand: gpmi: use core timings instead of an empirical derivation 2018-03-20 12:00:00 +01:00
ams-delta.c
au1550nd.c
cafe_nand.c mtd: rawnand: cafe: fix probe function error path 2018-03-29 09:38:18 +02:00
cmx270_nand.c
cs553x_nand.c
davinci_nand.c mtd: rawnand: davinci: fix probe function error path 2018-03-29 09:38:18 +02:00
denali_dt.c
denali_pci.c
denali.c mtd: rawnand: denali: fix probe function error path 2018-03-29 09:38:19 +02:00
denali.h
diskonchip.c
docg4.c mtd: rawnand: rename SET/GET FEATURES related functions 2018-03-20 09:33:22 +01:00
fsl_elbc_nand.c mtd: rawnand: rename SET/GET FEATURES related functions 2018-03-20 09:33:22 +01:00
fsl_ifc_nand.c MTD changes: 2018-04-06 12:15:41 -07:00
fsl_upm.c
fsmc_nand.c
gpio.c
hisi504_nand.c mtd: rawnand: rename SET/GET FEATURES related functions 2018-03-20 09:33:22 +01:00
jz4740_nand.c
jz4780_bch.c
jz4780_bch.h
jz4780_nand.c
Kconfig Linux 4.16-rc2 2018-04-04 22:13:35 +02:00
lpc32xx_mlc.c
lpc32xx_slc.c
Makefile mtd: rawnand: remove bf5xx_nand driver 2018-03-17 15:35:32 +01:00
marvell_nand.c mtd: rawnand: marvell: fix the chip-select DT parsing logic 2018-04-26 19:06:42 +02:00
mpc5121_nfc.c mtd: rawnand: rename SET/GET FEATURES related functions 2018-03-20 09:33:22 +01:00
mtk_ecc.c
mtk_ecc.h
mtk_nand.c
mxc_nand.c mtd: rawnand: mxc: fix probe function error path 2018-03-29 09:38:19 +02:00
nand_amd.c
nand_base.c Core changes: 2018-04-04 22:11:36 +02:00
nand_bbt.c Core changes: 2018-04-04 22:11:36 +02:00
nand_bch.c
nand_ecc.c mtd: rawnand: remove STANDALONE compile mode of nand_ecc 2018-03-15 16:42:33 +01:00
nand_hynix.c
nand_ids.c
nand_macronix.c mtd: rawnand: macronix: nack the support of changing timings for one chip 2018-03-20 11:59:58 +01:00
nand_micron.c mtd: rawnand: allow vendors to declare (un)supported features 2018-03-20 11:59:58 +01:00
nand_samsung.c
nand_timings.c mtd: rawnand: prepare the removal of the ONFI parameter page 2018-03-20 11:59:54 +01:00
nand_toshiba.c
nandsim.c
ndfc.c
nuc900_nand.c
omap2.c mtd: rawnand: omap2: fix the probe function error path 2018-03-29 09:38:20 +02:00
omap_elm.c
orion_nand.c
oxnas_nand.c
pasemi_nand.c
plat_nand.c
qcom_nandc.c mtd: rawnand: rename SET/GET FEATURES related functions 2018-03-20 09:33:22 +01:00
r852.c
r852.h
s3c2410.c mtd: rawnand: s3c2410: enhance the probe function error path 2018-03-29 09:38:21 +02:00
sh_flctl.c mtd: rawnand: sh_flctl: fix the probe function error path 2018-03-29 09:38:20 +02:00
sharpsl.c
sm_common.c
sm_common.h
socrates_nand.c
sunxi_nand.c mtd: rawnand: sunxi: Stop supporting ECC_HW_SYNDROME mode 2018-03-29 09:38:17 +02:00
tango_nand.c mtd: rawnand: tango: Fix struct clk memory leak 2018-04-21 00:24:57 +02:00
tmio_nand.c
txx9ndfmc.c
vf610_nfc.c Linux 4.16-rc2 2018-04-04 22:13:35 +02:00
xway_nand.c