linux-hardened/sound/pci/hda
Thierry Reding 3b90f40727 ALSA: hda/tegra - Fix oops
Commit a41d122449 ("ALSA: hda - Embed bus into controller object")
introduced a regression in the Tegra HDA driver that causes the
following oops during boot:

	[    2.333458] Unable to handle kernel NULL pointer dereference at virtual address 000004c4
	[    2.341537] pgd = c0004000
	[    2.344312] [000004c4] *pgd=00000000
	[    2.347898] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
	[    2.353200] Modules linked in:
	[    2.356264] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G        W       4.1.0-rc2-next-20150505-00344-g8577890defbf #79
	[    2.366682] Hardware name: NVIDIA Tegra SoC (Flattened Device Tree)
	[    2.372939] task: ee0d8b40 ti: ee0da000 task.ti: ee0da000
	[    2.378336] PC is at azx_bus_init+0x18/0xf4
	[    2.382516] LR is at hda_tegra_probe+0x6c/0x478
	[    2.387043] pc : [<c06156c4>]    lr : [<c061cf00>]    psr: 60000113
	[    2.387043] sp : ee0dbe38  ip : 00000000  fp : 00000000
	[    2.398501] r10: ed874c00  r9 : 000000fd  r8 : 00000000
	[    2.403717] r7 : ed874c10  r6 : 00000000  r5 : 00000000  r4 : ed016810
	[    2.410232] r3 : c08a2ad4  r2 : c08a1ea0  r1 : 00000000  r0 : ed016810
	[    2.416750] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
	[    2.424046] Control: 10c5387d  Table: 8000406a  DAC: 00000015
	[    2.429783] Process swapper/0 (pid: 1, stack limit = 0xee0da210)
	[    2.435778] Stack: (0xee0dbe38 to 0xee0dc000)
	[    2.440129] be20:                                                       00000000 ed016810
	[    2.448297] be40: 00000000 c061cf00 00000000 ee0dbe5c ed8735d0 c0a7bc48 ed02fd50 ed016000
	[    2.456462] be60: c1250164 ed874c10 c0c66bf8 fffffdfb 00000000 000000fd c0b8dc98 c046664c
	[    2.464628] be80: c0466608 c1250164 ed874c10 00000000 c0c66bf8 c0464eb4 ed874c10 c0c66bf8
	[    2.472793] bea0: ed874c44 c0c43458 00000000 c04650d0 00000000 c0c66bf8 c046503c c04633b4
	[    2.480959] bec0: ee11bea4 ed85f390 c0c66bf8 ed017ac0 00000000 c0464634 c0ab2b7c c0c66bf8
	[    2.489125] bee0: c0bfde20 c0c66bf8 c0bfde20 ed01ce40 c0b7b414 c04656e8 c04665b0 c0bfde20
	[    2.497291] bf00: c0bfde20 c0009770 ee0d8b40 c0c02488 60000113 00000000 00000000 00000003
	[    2.505458] bf20: 00000000 c0c02488 60000113 00000000 c0b54598 c0b16a90 ef7fcc57 c0041228
	[    2.513624] bf40: c0a9150c ef7fcc5f 00000006 00000006 00000000 c0bf1fa8 c0bf2354 00000006
	[    2.521790] bf60: c0b8dc90 c0c7c000 c0c7c000 c0b8dc98 00000000 c0b54dd8 00000006 00000006
	[    2.529956] bf80: c0b54598 00000000 00000000 c07ff08c 00000000 00000000 00000000 00000000
	[    2.538122] bfa0: 00000000 c07ff094 00000000 c000f5a0 00000000 00000000 00000000 00000000
	[    2.546286] bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
	[    2.554451] bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 fffff7ff c013f264
	[    2.562624] [<c06156c4>] (azx_bus_init) from [<c061cf00>] (hda_tegra_probe+0x6c/0x478)
	[    2.570535] [<c061cf00>] (hda_tegra_probe) from [<c046664c>] (platform_drv_probe+0x44/0xa4)
	[    2.578879] [<c046664c>] (platform_drv_probe) from [<c0464eb4>] (driver_probe_device+0x174/0x2b8)
	[    2.587739] [<c0464eb4>] (driver_probe_device) from [<c04650d0>] (__driver_attach+0x94/0x98)
	[    2.596172] [<c04650d0>] (__driver_attach) from [<c04633b4>] (bus_for_each_dev+0x6c/0xa0)
	[    2.604342] [<c04633b4>] (bus_for_each_dev) from [<c0464634>] (bus_add_driver+0x148/0x1f0)
	[    2.612597] [<c0464634>] (bus_add_driver) from [<c04656e8>] (driver_register+0x78/0xf8)
	[    2.620593] [<c04656e8>] (driver_register) from [<c0009770>] (do_one_initcall+0x8c/0x1d4)
	[    2.628765] [<c0009770>] (do_one_initcall) from [<c0b54dd8>] (kernel_init_freeable+0x144/0x1e4)
	[    2.637459] [<c0b54dd8>] (kernel_init_freeable) from [<c07ff094>] (kernel_init+0x8/0xe8)
	[    2.645543] [<c07ff094>] (kernel_init) from [<c000f5a0>] (ret_from_fork+0x14/0x34)

This is caused by azx_bus_init() trying to dereference chip->card, which
for the Tegra driver doesn't get initialized until sometime later during
the call to hda_tegra_create().

Fix this by mimicking the behaviour of the Intel driver and defer HDA
bus initialization until right before the call to snd_device_new().

Fixes: a41d122449 ('ALSA: hda - Embed bus into controller object')
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-05-05 14:56:44 +02:00
..
ca0132_regs.h ALSA: hda: ca0132_regs.h: Fix typo in include guard 2014-08-22 11:24:11 +02:00
dell_wmi_helper.c ALSA: hda - add mic mute led hook for dell machines 2014-07-31 09:21:42 +02:00
hda_auto_parser.c ALSA: hda - Move a part of hda_codec stuff into hdac_device 2015-03-23 13:17:17 +01:00
hda_auto_parser.h ALSA: hda - Sort input pins depending on amp caps 2014-09-23 15:57:32 +02:00
hda_beep.c ALSA: hda - Move a part of hda_codec stuff into hdac_device 2015-03-23 13:17:17 +01:00
hda_beep.h ALSA: hda - Adjust power of beep widget and outputs 2015-03-18 09:23:10 +01:00
hda_bind.c ALSA: hda - Add regmap support 2015-03-23 13:19:36 +01:00
hda_codec.c Merge branch 'topic/hda' into for-next 2015-04-29 12:28:52 +02:00
hda_codec.h Merge branch 'topic/jack' into for-next 2015-05-02 10:02:30 +02:00
hda_controller.c ALSA: hda - implement link_power ops for i915 display power control 2015-04-29 12:27:53 +02:00
hda_controller.h Merge branch 'topic/hda' into for-next 2015-04-29 12:28:52 +02:00
hda_eld.c ALSA: hda - Correct kerneldoc comments 2014-10-29 15:06:54 +01:00
hda_generic.c ALSA: hda - Fix click noise at start on Dell XPS13 2015-04-27 10:48:37 +02:00
hda_generic.h ALSA: hda - Fix power of pins used for mute LED with vrefs 2015-03-20 18:30:48 +01:00
hda_hwdep.c ALSA: hda - Add card field to hda_codec struct 2015-03-03 11:25:16 +01:00
hda_i915.c ALSA: hda - reset display codec when power on 2015-05-05 14:44:36 +02:00
hda_intel.c ALSA: hda - reset display codec when power on 2015-05-05 14:44:36 +02:00
hda_intel.h ALSA: hda - reset display codec when power on 2015-05-05 14:44:36 +02:00
hda_intel_trace.h ALSA: hda - Reenable tracepoints for controller 2015-04-16 11:45:26 +02:00
hda_jack.c ALSA: hda - Update to use the new jack kctls method 2015-04-27 21:37:42 +02:00
hda_jack.h ALSA: hda - Update to use the new jack kctls method 2015-04-27 21:37:42 +02:00
hda_local.h ALSA: hda - Use regmap for parameter caches, too 2015-03-23 13:19:40 +01:00
hda_proc.c ALSA: hda - potential (but unlikely) uninitialized variable 2015-04-17 15:32:17 +02:00
hda_sysfs.c ALSA: hda - Move a part of hda_codec stuff into hdac_device 2015-03-23 13:17:17 +01:00
hda_tegra.c ALSA: hda/tegra - Fix oops 2015-05-05 14:56:44 +02:00
Kconfig Merge branch 'topic/jack' into for-next 2015-05-02 10:02:30 +02:00
local.h ALSA: hda - Move a part of hda_codec stuff into hdac_device 2015-03-23 13:17:17 +01:00
Makefile ALSA: hda - Merge codec and controller helpers 2015-04-16 07:31:31 +02:00
patch_analog.c ALSA: hda - Use regmap for command verb caches, too 2015-03-23 13:19:41 +01:00
patch_ca0110.c ALSA: hda - Bind codecs via standard bus 2015-02-23 09:16:06 +01:00
patch_ca0132.c ALSA: hda - Move PCM format and rate handling code to core library 2015-04-16 08:47:28 +02:00
patch_cirrus.c Merge branch 'topic/hda-bus' into for-next 2015-03-16 14:48:16 +01:00
patch_cmedia.c ALSA: hda - Bind codecs via standard bus 2015-02-23 09:16:06 +01:00
patch_conexant.c ALSA: hda - Use regmap for command verb caches, too 2015-03-23 13:19:41 +01:00
patch_hdmi.c Merge branch 'topic/hda' into for-next 2015-04-29 12:28:52 +02:00
patch_realtek.c ALSA: hda - Fix click noise at start on Dell XPS13 2015-04-27 10:48:37 +02:00
patch_si3054.c ALSA: hda - Use regmap for command verb caches, too 2015-03-23 13:19:41 +01:00
patch_sigmatel.c ALSA: hda - Use regmap for command verb caches, too 2015-03-23 13:19:41 +01:00
patch_via.c ALSA: hda/via - Add missing stream_pm ops setup 2015-04-09 15:23:59 +02:00
thinkpad_helper.c ALSA: hda - Add mute-LED mode control to Thinkpad 2015-04-27 10:48:37 +02:00