linux/drivers/mtd/nand
Brian Norris 9ca641b0f0 mtd: nand: fix shutdown/reboot for multi-chip systems
If multiple NAND chips are registered to the same controller, then when
rebooting the system, the first one will grab the controller lock, while
the second will wait forever for the first one to release it. i.e., a
classic deadlock.

This problem was solved for a similar case (suspend/resume) back in
commit 6b0d9a8412 ("mtd: nand: fix multi-chip suspend problem"), and
the shutdown state really isn't much different for us, so rather than
adding a new special case to nand_get_device(), we can just overload the
FL_PM_SUSPENDED state.

Now, multiple chips can "get" the same controller lock (preventing
further I/O), while we still allow other chips to pass through
nand_shutdown().

Original report:
http://thread.gmane.org/gmane.linux.drivers.mtd/59726
http://lists.infradead.org/pipermail/linux-mtd/2015-July/059992.html

Fixes: 72ea403669 ("mtd: nand: added nand_shutdown")
Reported-by: Andrew E. Mileski <andrewm@isoar.ca>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: Andrew E. Mileski <andrewm@isoar.ca>
Acked-by: Scott Branden <sbranden@broadcom.com>
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
2015-11-16 10:51:39 -08:00
..
bcm47xxnflash mtd: nand: bcm47xxnflash: show parent device in sysfs 2015-10-13 12:56:26 -07:00
brcmnand mtd: brcmnand: Force 8bit mode before doing nand_scan_ident() 2015-10-30 11:50:38 -07:00
gpmi-nand mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
ams-delta.c
atmel_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
atmel_nand_ecc.h
atmel_nand_nfc.h
au1550nd.c mtd: nand: au1550nd: show parent device in sysfs 2015-10-13 12:56:25 -07:00
bf5xx_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
cafe_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
cmx270_nand.c
cs553x_nand.c
davinci_nand.c mtd: nand: davinci_nand: drop owner and name assignment 2015-10-13 12:56:28 -07:00
denali.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
denali.h mtd: nand: denali: max_banks calculation changed in revision 5.1 2015-09-29 11:44:59 -07:00
denali_dt.c
denali_pci.c
diskonchip.c
docg4.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
fsl_elbc_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
fsl_ifc_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
fsl_upm.c mtd: nand: fsl_upm: show parent device in sysfs 2015-10-13 12:56:47 -07:00
fsmc_nand.c mtd: fsmc_nand: Add BCH4 SW ECC support for SPEAr600 2015-10-26 13:19:40 -07:00
gpio.c mtd: nand: gpio: show parent device in sysfs 2015-10-13 12:56:44 -07:00
hisi504_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
jz4740_nand.c mtd: jz4740_nand: fix build on jz4740 after removing gpio.h 2015-11-16 10:48:15 -08:00
Kconfig mtd: nand: Allow MTD_NAND_BRCMNAND to be selected for ARM64 2015-10-12 14:17:40 -07:00
lpc32xx_mlc.c mtd: lpc32xx_mlc: fix warnings caused by enabling unprepared clock 2015-10-19 18:23:15 -07:00
lpc32xx_slc.c mtd: lpc32xx_slc: fix warnings caused by enabling unprepared clock 2015-10-19 18:23:14 -07:00
Makefile mtd: nand: vf610_nfc: Freescale NFC for VF610, MPC5125 and others 2015-09-29 13:47:58 -07:00
mpc5121_nfc.c mtd: nand: mpc5121_nfc: show parent device in sysfs 2015-10-13 12:56:32 -07:00
mxc_nand.c mtd: nand: mxc_nand: drop owner assignment 2015-10-13 12:56:38 -07:00
nand_base.c mtd: nand: fix shutdown/reboot for multi-chip systems 2015-11-16 10:51:39 -08:00
nand_bbt.c mtd: nand_bbt: set the smallest size of bbt table 2015-10-11 12:58:28 -07:00
nand_bch.c
nand_ecc.c
nand_ids.c
nand_timings.c
nandsim.c mtd: nandsim: drop null test before destroy functions 2015-09-21 17:04:50 -07:00
ndfc.c mtd: nand: ndfc: show parent device in sysfs 2015-10-13 12:56:39 -07:00
nuc900_nand.c mtd: nand: nuc900_nand: show parent device in sysfs 2015-10-13 12:56:33 -07:00
omap2.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
omap_elm.c
orion_nand.c mtd: nand: orion_nand: show parent device in sysfs 2015-10-13 12:56:33 -07:00
pasemi_nand.c mtd: nand: pasemi_nand: show parent device in sysfs 2015-10-13 12:56:39 -07:00
plat_nand.c mtd: nand: plat_nand: show parent device in sysfs 2015-10-13 12:56:34 -07:00
pxa3xx_nand.c mtd: pxa3xx_nand: clean up the pxa3xx timings 2015-10-26 11:38:12 -07:00
r852.c mtd: nand: r852: drop owner assignment 2015-10-13 12:56:35 -07:00
r852.h
s3c2410.c mtd: nand: s3c2410: show parent device in sysfs 2015-10-13 12:56:42 -07:00
sh_flctl.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
sharpsl.c mtd: nand: sharpsl: show parent device in sysfs 2015-10-13 12:56:42 -07:00
sm_common.c
sm_common.h
socrates_nand.c mtd: nand: socrates_nand: drop owner assignment 2015-10-13 12:56:46 -07:00
sunxi_nand.c mtd: nand: sunxi: avoid retrieving data before ECC pass 2015-11-02 12:54:37 -08:00
tmio_nand.c mtd: nand: tmio_nand: show parent device in sysfs 2015-10-13 12:56:37 -07:00
txx9ndfmc.c mtd: nand: txx9ndfmc: show parent device in sysfs 2015-10-13 12:56:48 -07:00
vf610_nfc.c mtd: nand: vf610_nfc: use nand_check_erased_ecc_chunk() helper 2015-10-26 13:05:42 -07:00
xway_nand.c