Unverified Commit ef9bec27 authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown
Browse files

ASoC: SOF: Intel: hda: Make hdac_device device-managed



snd_hdac_ext_bus_device_exit() has been recently modified
to no longer free the hdac device. SOF allocates memory for
hdac_device and hda_hda_priv with kzalloc. Make them
device-managed instead so that they will be freed when the
SOF driver is unloaded.

Because of the above change, hda_codec is device-managed and
it will be freed when the ASoC device is removed. Freeing
the codec in snd_hda_codec_dev_release() leads to kernel
panic while unloading and reloading the ASoC driver. So,
avoid freeing the hda_codec for ASoC driver. This is done in
the same patch to avoid bisect failure.

Signed-off-by: default avatarLibin Yang <libin.yang@intel.com>
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20190626070450.7229-1-ranjani.sridharan@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5f9e832c
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -846,6 +846,12 @@ static void snd_hda_codec_dev_release(struct device *dev)
	snd_hda_sysfs_clear(codec);
	kfree(codec->modelname);
	kfree(codec->wcaps);

	/*
	 * In the case of ASoC HD-audio, hda_codec is device managed.
	 * It will be freed when the ASoC device is removed.
	 */
	if (codec->core.type == HDA_DEV_LEGACY)
		kfree(codec);
}

+2 −4
Original line number Diff line number Diff line
@@ -62,8 +62,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address)
		address, resp);

#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC)
	/* snd_hdac_ext_bus_device_exit will use kfree to free hdev */
	hda_priv = kzalloc(sizeof(*hda_priv), GFP_KERNEL);
	hda_priv = devm_kzalloc(sdev->dev, sizeof(*hda_priv), GFP_KERNEL);
	if (!hda_priv)
		return -ENOMEM;

@@ -82,8 +81,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address)

	return 0;
#else
	/* snd_hdac_ext_bus_device_exit will use kfree to free hdev */
	hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
	hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL);
	if (!hdev)
		return -ENOMEM;