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
Kconfig mtd: nand: Allow MTD_NAND_BRCMNAND to be selected for ARM64 2015-10-12 14:17:40 -07:00
Makefile mtd: nand: vf610_nfc: Freescale NFC for VF610, MPC5125 and others 2015-09-29 13:47:58 -07:00
ams-delta.c mtd: nand: ams-delta: fix overwritten mtd_info->owner in initialization 2015-01-15 19:33:03 -08:00
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 mtd: atmel_nand: add a definition for the oob reserved bytes 2015-04-05 17:47:56 -07:00
atmel_nand_nfc.h mtd: atmel_nand: check NFC busy flag by HSMC_SR instead of NFC cmd regs 2015-03-11 09:49:28 -07:00
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 mtd: cmx270_nand: Remove unnecessary OOM messages 2014-01-03 11:22:29 -08:00
cs553x_nand.c mtd: cs553x_nand: Fix kasprintf() usage 2015-06-16 18:58:47 -07:00
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 mtd: nand: drop owner assignment from platform_drivers 2014-10-20 16:20:58 +02:00
denali_pci.c mtd: denali_pci: switch to dev_err() 2015-08-18 17:21:37 -07:00
diskonchip.c arch, drivers: don't include <asm/io.h> directly, use <linux/io.h> instead 2015-08-10 23:07:05 -04:00
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
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
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 mtd: cleanup style on pr_debug messages 2011-09-11 15:02:16 +03:00
nand_ecc.c mtd: nand: add line feed to pr_err 2014-04-16 00:18:26 -07:00
nand_ids.c mtd: nand: add Toshiba TC58NVG0S3E to nand_ids table 2015-08-25 12:24:02 -07:00
nand_timings.c mtd: nand: Use ULL-suffix for big u64 constant 2014-08-19 11:53:09 -07:00
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 mtd: omap_elm: Fix module alias 2015-08-18 17:57:46 -07:00
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 mtd: r852: remove useless pci powerup/down from suspend/resume routines 2010-10-25 01:32:21 +01:00
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 mtd: nand: refactor chip->block_markbad interface 2013-08-30 16:47:52 +01:00
sm_common.h mtd: use __packed shorthand 2014-08-19 11:53:08 -07:00
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 mtd: plat_nand: use default partition probe 2015-05-27 12:34:35 -07:00