summaryrefslogtreecommitdiff
path: root/drivers/mtd
diff options
context:
space:
mode:
authorHaikun Wang <Haikun.Wang@freescale.com>2015-02-04 11:56:59 (GMT)
committerZhengxiong Jin <Jason.Jin@freescale.com>2015-02-05 08:22:09 (GMT)
commit425d2732e9617965fd1cded565ac16f923ef9873 (patch)
treea555179903536148e986eb90355cbaf1386a8c92 /drivers/mtd
parent97eb5207434a590554c3948f984f994f2859e64a (diff)
downloadlinux-fsl-qoriq-425d2732e9617965fd1cded565ac16f923ef9873.tar.xz
mtd: fsl-quadspi:fix qspi irq handler complete exception
In case of interrupt arrive immediately after requesting irq, kernel will panic due to uninitialized variable. Fix below exception: Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = 80003000 [00000000] *pgd=80000080004003, *pmd=00000000 Internal error: Oops: 206 [#1] SMP THUMB2 Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.12.19-rt30+ #138 task: ef07c000 ti: ef080000 task.ti: ef080000 PC is at __swait_wake_locked+0x10/0x4e LR is at complete+0x21/0x2e pc : [<8002ee4a>] lr : [<8002f2bb>] psr: 400001b3 sp : ef081d00 ip : 0000001f fp : ef080000 r10: 00000001 r9 : 00000000 r8 : 00000003 r7 : ef0329ac r6 : 80000193 r5 : 00000000 r4 : ef0329ac r3 : 00000000 r2 : 00000001 r1 : 00000003 r0 : ef0329ac Flags: nZcv IRQs off FIQs on Mode SVC_32 ISA Thumb Segment kernel Control: 70c53c7d Table: 80003000 DAC: 02851004 Process swapper/0 (pid: 1, stack limit = 0xef080248) Stack: (0xef081d00 to 0xef082000) 1d00: ef0329ac ef0329a8 80000193 ef081d20 00000000 00000000 804c252c 8002f2bb 1d20: 80000000 804d6a13 ef3cc2c0 ef011c00 000000a3 801c3c1d 801c3bdb 8003b8b7 1d40: ef011c00 ef3cc2c0 802e1ed0 00000000 ef011c00 8049cd7c 00000000 ef081de4 1d60: 803f6b32 815115d0 804c252c 8003b9b9 00000000 ef011c00 8049cd7c 8003d5cf 1d80: 000000a3 8003b3fb 000000a3 8000ca3d f0002000 ef081db0 804a8c8c 800083df 1da0: 802e1ed0 00000133 ffffffff 802e245b 804fd8fc 60000113 00000066 00001dc5 1dc0: 804fd8fc 60000113 00000000 00000000 803f6b32 815115d0 804c252c ef080000 1de0: 0000001f ef081df8 8023cb13 802e1ed0 00000133 ffffffff ef032010 ef005e10 1e00: ef005e00 00000000 00000000 8023cb23 f02c0000 801c4123 00000000 ef111280 1e20: ef032010 ef3caf40 ef3caf40 800b44ff ef07c000 00000000 ef3caf40 ef111300 1e40: ef269f80 800b4b37 804c256c 8023cce7 ef063684 00000003 ef111300 00000000 1e60: 804fbbd4 ef005e10 00000000 ef005e10 ef005e44 804fbbd4 804c2364 80482039 1e80: 000000ad 00000000 ef080000 80198371 ef005e10 ef005e44 804c2364 00000000 1ea0: 80482039 801984a5 00000000 804c2364 80198471 8019742d ef06365c ef110434 1ec0: 804c2364 804bfb30 ef269f80 80197e3b 803f6bae 803f6bb3 00000071 804c2364 1ee0: 80490ad0 8049b374 804d6d40 8019882d 00000000 00000006 80490ad0 800085f5 1f00: ef105300 ef105580 00000000 ef105580 802ea500 803d4d54 00000000 800aeae1 1f20: 804ae908 00000113 80471461 815188d2 815188da 80028f35 00000000 80447320 1f40: 00000000 000000ad 00000006 00000006 00000001 00000006 80490ad0 8049b374 1f60: 804d6d40 804d6d40 000000ad 80490adc 00000000 8047192d 00000006 00000006 1f80: 80471461 00000000 00000000 802db775 00000000 00000000 00000000 00000000 1fa0: 00000000 802db77b 00000000 8000c219 00000000 00000000 00000000 00000000 1fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 1fe0: 00000000 00000000 00000000 00000000 00000013 00000000 deadbeef deadbeef [<8002ee4a>] (__swait_wake_locked+0x10/0x4e) from [<8002f2bb>] (complete+0x21/0x2e) [<8002f2bb>] (complete+0x21/0x2e) from [<801c3c1d>] (fsl_qspi_irq_handler+0x43/0x46) [<801c3c1d>] (fsl_qspi_irq_handler+0x43/0x46) from [<8003b8b7>] (handle_irq_event_percpu+0x33/0x104) [<8003b8b7>] (handle_irq_event_percpu+0x33/0x104) from [<8003b9b9>] (handle_irq_event+0x31/0x48) [<8003b9b9>] (handle_irq_event+0x31/0x48) from [<8003d5cf>] (handle_fasteoi_irq+0x6b/0xa4) [<8003d5cf>] (handle_fasteoi_irq+0x6b/0xa4) from [<8003b3fb>] (generic_handle_irq+0x13/0x1c) [<8003b3fb>] (generic_handle_irq+0x13/0x1c) from [<8000ca3d>] (handle_IRQ+0x3d/0x60) [<8000ca3d>] (handle_IRQ+0x3d/0x60) from [<800083df>] (gic_handle_irq+0x2b/0x44) [<800083df>] (gic_handle_irq+0x2b/0x44) from [<802e245b>] (__irq_svc+0x3b/0x5c) Exception stack(0xef081db0 to 0xef081df8) 1da0: 804fd8fc 60000113 00000066 00001dc5 1dc0: 804fd8fc 60000113 00000000 00000000 803f6b32 815115d0 804c252c ef080000 1de0: 0000001f ef081df8 8023cb13 802e1ed0 00000133 ffffffff [<802e245b>] (__irq_svc+0x3b/0x5c) from [<802e1ed0>] (_raw_spin_unlock_irqrestore+0x16/0x18) [<802e1ed0>] (_raw_spin_unlock_irqrestore+0x16/0x18) from [<8023cb13>] (of_find_property+0x29/0x32) [<8023cb13>] (of_find_property+0x29/0x32) from [<8023cb23>] (of_get_property+0x7/0xc) [<8023cb23>] (of_get_property+0x7/0xc) from [<801c4123>] (fsl_qspi_probe+0x197/0x5b0) [<801c4123>] (fsl_qspi_probe+0x197/0x5b0) from [<80198371>] (driver_probe_device+0x65/0x140) [<80198371>] (driver_probe_device+0x65/0x140) from [<801984a5>] (__driver_attach+0x35/0x48) [<801984a5>] (__driver_attach+0x35/0x48) from [<8019742d>] (bus_for_each_dev+0x3b/0x46) [<8019742d>] (bus_for_each_dev+0x3b/0x46) from [<80197e3b>] (bus_add_driver+0x8b/0x164) [<80197e3b>] (bus_add_driver+0x8b/0x164) from [<8019882d>] (driver_register+0x4b/0x76) [<8019882d>] (driver_register+0x4b/0x76) from [<800085f5>] (do_one_initcall+0x65/0xd4) [<800085f5>] (do_one_initcall+0x65/0xd4) from [<8047192d>] (kernel_init_freeable+0xbd/0x150) [<8047192d>] (kernel_init_freeable+0xbd/0x150) from [<802db77b>] (kernel_init+0x7/0x90) [<802db77b>] (kernel_init+0x7/0x90) from [<8000c219>] (ret_from_fork+0x11/0x38) Code: 4607 4688 4692 46a9 (681e) 1f1c ---[ end trace 2857aa3b399c215c ]--- Kernel panic - not syncing: Fatal exception in interrupt CPU1: stopping CPU: 1 PID: 0 Comm: swapper/1 Tainted: G D 3.12.19-rt30+ #138 [<80010829>] (unwind_backtrace+0x1/0x88) from [<8000e53b>] (show_stack+0xb/0xc) [<8000e53b>] (show_stack+0xb/0xc) from [<802df461>] (dump_stack+0x4d/0x60) [<802df461>] (dump_stack+0x4d/0x60) from [<8000ff23>] (handle_IPI+0x7f/0xd0) [<8000ff23>] (handle_IPI+0x7f/0xd0) from [<800083ef>] (gic_handle_irq+0x3b/0x44) [<800083ef>] (gic_handle_irq+0x3b/0x44) from [<802e245b>] (__irq_svc+0x3b/0x5c) Exception stack(0xef09bfa0 to 0xef09bfe8) bfa0: ffffffed 00000000 01087000 00000000 ef09a000 ef09a010 80000000 804d7054 bfc0: 80003010 410fc075 00000000 00000000 00000008 ef09bfe8 8000cc21 8000cc22 bfe0: 60000133 ffffffff [<802e245b>] (__irq_svc+0x3b/0x5c) from [<8000cc22>] (arch_cpu_idle+0x1a/0x20) [<8000cc22>] (arch_cpu_idle+0x1a/0x20) from [<8003b395>] (cpu_startup_entry+0x7d/0xc4) [<8003b395>] (cpu_startup_entry+0x7d/0xc4) from [<80008485>] (__enable_mmu+0x1/0x1c) Signed-off-by: Haikun Wang <b53464@freescale.com> Change-Id: If47a75274ae794a504cee0fca02920c9af1a29c1 Reviewed-on: http://git.am.freescale.net:8181/30121 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Huan Wang <alison.wang@freescale.com> Reviewed-by: Zhengxiong Jin <Jason.Jin@freescale.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/spi-nor/fsl-quadspi.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c
index 2dd29c3..399c5e2 100644
--- a/drivers/mtd/spi-nor/fsl-quadspi.c
+++ b/drivers/mtd/spi-nor/fsl-quadspi.c
@@ -704,6 +704,10 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q)
qspi_writel(q, QUADSPI_MCR_RESERVED_MASK | QUADSPI_MCR_END_CFG_MASK,
base + QUADSPI_MCR);
+ /* clear flag register before enable the interrupt */
+ reg = qspi_readl(q, q->iobase + QUADSPI_FR);
+ qspi_writel(q, reg, q->iobase + QUADSPI_FR);
+
/* enable the interrupt */
qspi_writel(q, QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER);
@@ -941,6 +945,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)
goto irq_failed;
}
+ /* In case of interrupt arrive immediately after requesting irq,
+ * kernel will panic without init_completion.
+ */
+ init_completion(&q->c);
ret = devm_request_irq(dev, ret,
fsl_qspi_irq_handler, 0, pdev->name, q);
if (ret) {