ASoC: hdmi-codec: fix oops on re-probe
hdmi-codec oopses the kernel when it is unbound from a successfully
bound audio subsystem, and is then rebound:
Unable to handle kernel NULL pointer dereference at virtual address
0000001c
pgd =
ee3f0000
[
0000001c] *pgd=
3cc59831
Internal error: Oops: 817 [#1] PREEMPT ARM
Modules linked in: ext2 snd_soc_spdif_tx vmeta dove_thermal snd_soc_kirkwood ofpart marvell_cesa m25p80 orion_wdt mtd spi_nor des_generic gpio_ir_recv snd_soc_kirkwood_spdif bmm_dmabuf auth_rpcgss nfsd autofs4 etnaviv thermal_sys hwmon gpu_sched tda9950
CPU: 0 PID: 1005 Comm: bash Not tainted 4.20.0+ #1762
Hardware name: Marvell Dove (Cubox)
PC is at hdmi_dai_probe+0x68/0x80
LR is at find_held_lock+0x20/0x94
pc : [<
c04c7de0>] lr : [<
c0063bf4>] psr:
600f0013
sp :
ee15bd28 ip :
eebd8b1c fp :
c093b488
r10:
ee048000 r9 :
eebdab18 r8 :
ee048600
r7 :
00000001 r6 :
00000000 r5 :
00000000 r4 :
ee82c100
r3 :
00000006 r2 :
00000001 r1 :
c067e38c r0 :
ee82c100
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none[ 297.318599] Control:
10c5387d Table:
2e3f0019 DAC:
00000051
Process bash (pid: 1005, stack limit = 0xee15a248)
...
[<
c04c7de0>] (hdmi_dai_probe) from [<
c04b7060>] (soc_probe_dai.part.9+0x34/0x70)
[<
c04b7060>] (soc_probe_dai.part.9) from [<
c04b81a8>] (snd_soc_instantiate_card+0x734/0xc9c)
[<
c04b81a8>] (snd_soc_instantiate_card) from [<
c04b8b6c>] (snd_soc_add_component+0x29c/0x378)
[<
c04b8b6c>] (snd_soc_add_component) from [<
c04b8c8c>] (snd_soc_register_component+0x44/0x54)
[<
c04b8c8c>] (snd_soc_register_component) from [<
c04c64b4>] (devm_snd_soc_register_component+0x48/0x84)
[<
c04c64b4>] (devm_snd_soc_register_component) from [<
c04c7be8>] (hdmi_codec_probe+0x150/0x260)
[<
c04c7be8>] (hdmi_codec_probe) from [<
c0373124>] (platform_drv_probe+0x48/0x98)
This happens because hdmi_dai_probe() attempts to access the HDMI
codec private data, but this has not been assigned by hdmi_dai_probe()
before it calls devm_snd_soc_register_component(). Move the call to
dev_set_drvdata() before devm_snd_soc_register_component() to avoid
this oops.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org