linux/drivers/mtd/nand/raw
Boris Brezillon 013e6292aa mtd: rawnand: Simplify the locking
nand_get_device() was complex for apparently no good reason. Let's
replace this locking scheme with 2 mutexes: one attached to the
controller and another one attached to the chip.

Every time the core calls nand_get_device(), it will first lock the
chip and if the chip is not suspended, will then lock the controller.
nand_release_device() will release both lock in the reverse order.

nand_get_device() can sleep, just like the previous implementation,
which means you should never call that from an atomic context.

We also get rid of

- the chip->state field, since all it was used for was flagging the
  chip as suspended. We replace it by a field called chip->suspended
  and directly set it from nand_suspend/resume()
- the controller->wq and controller->active fields which are no longer
  needed since the new controller->lock (now a mutex) guarantees that
  all operations are serialized at the controller level
- panic_nand_get_device() which would anyway be a no-op. Talking about
  panic write, I keep thinking the rawnand implementation is unsafe
  because there's not negotiation with the controller to know when it's
  actually done with it's previous operation. I don't intend to fix
  that here, but that's probably something we should look at, or maybe
  we should consider dropping the ->_panic_write() implementation

Last important change to mention: we now return -EBUSY when someone
tries to access a device that as been suspended, and propagate this
error to the upper layer.

Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
2019-02-05 15:39:40 +01:00
..
atmel Core changes: 2018-12-18 20:00:52 +01:00
bcm47xxnflash mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
brcmnand mtd: rawnand: Deprecate ->dev_ready() and ->waitfunc() 2018-10-03 11:12:25 +02:00
gpmi-nand mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
ams-delta.c mtd: rawnand: ams-delta: Use GPIO API for data I/O 2018-12-07 10:38:27 +01:00
au1550nd.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
cafe_nand.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
cmx270_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
cs553x_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
davinci_nand.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
denali_dt.c mtd: rawnand: denali: use SPDX-License-Identifier and fix license mismatch 2018-09-04 23:37:40 +02:00
denali_pci.c mtd: rawnand: denali: use SPDX-License-Identifier and fix license mismatch 2018-09-04 23:37:40 +02:00
denali.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
denali.h mtd: rawnand: denali: include <linux/bits.h> instead of <linux/bitops.h> 2018-11-05 10:57:07 +01:00
diskonchip.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
fsl_elbc_nand.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
fsl_ifc_nand.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
fsl_upm.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
fsmc_nand.c mtd: rawnand: fsmc: Fix all coding style issues reported by checkpatch 2018-12-07 10:54:48 +01:00
gpio.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
hisi504_nand.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
internals.h mtd: rawnand: Move ->setup_data_interface() to nand_controller_ops 2018-12-07 10:38:27 +01:00
jz4740_nand.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
jz4780_bch.c mtd: rawnand: jz4780: annotate implicit fall throughs 2018-12-07 11:07:19 +01:00
jz4780_bch.h
jz4780_nand.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
Kconfig mtd: rawnand: stm32_fmc2: add STM32 FMC2 NAND flash controller driver 2019-02-05 15:39:37 +01:00
lpc32xx_mlc.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
lpc32xx_slc.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
Makefile mtd: rawnand: stm32_fmc2: add STM32 FMC2 NAND flash controller driver 2019-02-05 15:39:37 +01:00
marvell_nand.c mtd: rawnand: marvell: use struct_size() in devm_kzalloc() 2019-02-05 15:39:39 +01:00
mpc5121_nfc.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
mtk_ecc.c mtd: rawnand: mtk: use of_device_get_match_data() 2018-04-29 08:56:41 +02:00
mtk_ecc.h
mtk_nand.c mtd: rawnand: mtk: Use nand_controller_init() instead of open-coding it 2019-02-05 15:39:39 +01:00
mxc_nand.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
nand_amd.c mtd: rawnand: Keep all internal stuff private 2018-10-03 11:12:25 +02:00
nand_base.c mtd: rawnand: Simplify the locking 2019-02-05 15:39:40 +01:00
nand_bbt.c mtd: rawnand: Reorganize code to avoid forward declarations 2018-12-07 10:38:23 +01:00
nand_bch.c mtd: rawnand: Pass a nand_chip object to ecc->correct() 2018-10-03 11:12:25 +02:00
nand_ecc.c mtd: rawnand: Allow selection of ECC byte ordering at runtime 2018-10-03 11:12:25 +02:00
nand_esmt.c mtd: rawnand: ESMT: retrieve ECC requirements from 5th id byte 2018-10-03 11:12:25 +02:00
nand_hynix.c mtd: rawnand: Move the ->exec_op() method to nand_controller_ops 2018-12-07 10:38:27 +01:00
nand_ids.c mtd: rawnand: ESMT: retrieve ECC requirements from 5th id byte 2018-10-03 11:12:25 +02:00
nand_jedec.c mtd: rawnand: Fix JEDEC detection 2018-12-14 22:45:13 +01:00
nand_legacy.c mtd: rawnand: Move ->setup_data_interface() to nand_controller_ops 2018-12-07 10:38:27 +01:00
nand_macronix.c mtd: rawnand: Flag 1.8V AC chips with a broken GET_FEATURES(TIMINGS) 2018-11-06 10:18:01 +01:00
nand_micron.c mtd: rawnand: Keep all internal stuff private 2018-10-03 11:12:25 +02:00
nand_onfi.c mtd: rawnand: Move ONFI code to nand_onfi.c 2018-10-03 11:12:25 +02:00
nand_samsung.c mtd: rawnand: Keep all internal stuff private 2018-10-03 11:12:25 +02:00
nand_timings.c mtd: rawnand: Keep all internal stuff private 2018-10-03 11:12:25 +02:00
nand_toshiba.c mtd: rawnand: toshiba: Pass a single nand_chip object to the status helper 2018-10-08 10:00:10 +02:00
nandsim.c Merge tag 'nand/for-4.21' of git://git.infradead.org/linux-mtd into mtd/next 2018-12-18 19:59:16 +01:00
ndfc.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
nuc900_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
omap2.c mtd: rawnand: Stop using chip->state in drivers 2019-02-05 15:39:40 +01:00
omap_elm.c
orion_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
oxnas_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
pasemi_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
plat_nand.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00
qcom_nandc.c Core changes: 2018-12-18 20:00:52 +01:00
r852.c mtd: rawnand: Stop using chip->state in drivers 2019-02-05 15:39:40 +01:00
r852.h mtd: rawnand: r852: fix spelling mistake "card_registred" -> "card_registered" 2018-10-08 10:00:10 +02:00
s3c2410.c mtd: rawnand: Move ->setup_data_interface() to nand_controller_ops 2018-12-07 10:38:27 +01:00
sh_flctl.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
sharpsl.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
sm_common.c mtd: rawnand: Deprecate the dummy_controller field 2018-12-07 10:58:11 +01:00
sm_common.h
socrates_nand.c mtd: rawnand: Deprecate ->chip_delay 2018-10-03 11:12:25 +02:00
stm32_fmc2_nand.c mtd: rawnand: stm32_fmc2: add polling mode 2019-02-05 15:39:37 +01:00
sunxi_nand.c mtd: rawnand: sunxi: Handle the tREA > tRC / 2 case 2019-02-05 15:39:39 +01:00
tango_nand.c mtd: rawnand: Move ->setup_data_interface() to nand_controller_ops 2018-12-07 10:38:27 +01:00
tegra_nand.c mtd: rawnand: Move ->setup_data_interface() to nand_controller_ops 2018-12-07 10:38:27 +01:00
tmio_nand.c mtd: rawnand: Stop using chip->state in drivers 2019-02-05 15:39:40 +01:00
txx9ndfmc.c mtd: rawnand: Allow selection of ECC byte ordering at runtime 2018-10-03 11:12:25 +02:00
vf610_nfc.c mtd: rawnand: vf610: Add an SPDX tag to replace the license text 2018-12-07 10:58:03 +01:00
xway_nand.c mtd: rawnand: Deprecate the ->select_chip() hook 2018-12-07 10:38:27 +01:00