gpio: pcf857x: Avoid calling irq_domain_cleanup twice
Currently irq_domain_cleanup is called twice if irq_domain_init fails.
This causes the following crash.
Unable to handle kernel paging request at virtual address
00100104
pgd =
c0004000
[
00100104] *pgd=
00000000
Internal error: Oops: 805 [#1] SMP ARM
Modules linked in:
CPU: 0 PID: 6 Comm: kworker/u4:0 Not tainted
3.12.15-01889-gedd10a8-dirty #4
Workqueue: deferwq deferred_probe_work_func
task:
ed0ee800 ti:
ed116000 task.ti:
ed116000
PC is at irq_domain_remove+0x3c/0x8c
LR is at 0x0
pc : [<
c0089734>] lr : [<
00000000>] psr:
a0000013
sp :
ed117b50 ip :
00100100 fp :
ed117b64
r10:
ed5d1a04 r9 :
00000008 r8 :
00000000
r7 :
ffffffea r6 :
ed5d1a20 r5 :
ed5d1a00 r4 :
ed5e7540
r3 :
00200200 r2 :
00100100 r1 :
c08aa180 r0 :
00200200
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control:
10c53c7d Table:
8000406a DAC:
00000017
Process kworker/u4:0 (pid: 6, stack limit = 0xed116248)
Stack: (0xed117b50 to 0xed118000)
7b40:
0000016b ed5d5f10 ed117b74 ed117b68
7b60:
c02c8910 c0089704 ed117bb4 ed117b78 c02c8e14 c02c8900 ed5d1a04 ed5d4e80
...
<snip>
...
fe0:
00000000 00000000 00000000 00000000 00000013 00000000 384a13ea 1590210a
Backtrace:
[<
c00896f8>] (irq_domain_remove+0x0/0x8c) from [<
c02c8910>] (pcf857x_irq_domain_cleanup+0x1c/0x20)
r4:
ed5d5f10 r3:
0000016b
[<
c02c88f4>] (pcf857x_irq_domain_cleanup+0x0/0x20) from [<
c02c8e14>] (pcf857x_probe+0x2a8/0x364)
[<
c02c8b6c>] (pcf857x_probe+0x0/0x364) from [<
c04787ac>] (i2c_device_probe+0x80/0xc0)
[<
c047872c>] (i2c_device_probe+0x0/0xc0) from [<
c036c33c>] (driver_probe_device+0x104/0x240)
r6:
00000000 r5:
ed5d1a20 r4:
c08c709c r3:
c047872c
[<
c036c238>] (driver_probe_device+0x0/0x240) from [<
c036c558>] (__device_attach+0x48/0x4c)
r7:
ed4fc480 r6:
c036c510 r5:
ed5d1a20 r4:
c0866bb8
[<
c036c510>] (__device_attach+0x0/0x4c) from [<
c036a6d8>] (bus_for_each_drv+0x4c/0x94)
r5:
ed5d1a20 r4:
00000000
[<
c036a68c>] (bus_for_each_drv+0x0/0x94) from [<
c036c1f4>] (device_attach+0x78/0x90)
r6:
c087fe50 r5:
ed5d1a54 r4:
ed5d1a20
[<
c036c17c>] (device_attach+0x0/0x90) from [<
c036b76c>] (bus_probe_device+0x8c/0xb4)
r6:
c087fe50 r5:
ed5d1a20 r4:
ed5d1a20 r3:
ed17e1c0
[<
c036b6e0>] (bus_probe_device+0x0/0xb4) from [<
c0369888>] (device_add+0x34c/0x624)
r6:
ed5d1a28 r5:
00000000 r4:
ed5d1a20 r3:
fffffffe
[<
c036953c>] (device_add+0x0/0x624) from [<
c0369b7c>] (device_register+0x1c/0x20)
...
<snip>
...
[<
c0060844>] (process_one_work+0x0/0x37c) from [<
c0061040>] (worker_thread+0x13c/0x3c4)
[<
c0060f04>] (worker_thread+0x0/0x3c4) from [<
c00670ec>] (kthread+0xac/0xb8)
[<
c0067040>] (kthread+0x0/0xb8) from [<
c00148b8>] (ret_from_fork+0x14/0x3c)
r7:
00000000 r6:
00000000 r5:
c0067040 r4:
ed105d20
Code:
e59fc04c e591e000 e59f0048 e154000e (
e5823004)
---[ end trace
59dd1e90032c4217 ]---
Signed-off-by: George Cherian <george.cherian@ti.com>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>