]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: Intel: sof_sdw_rt711: remove properties in card remove
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 17 Jul 2020 21:13:33 +0000 (16:13 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Sep 2020 09:29:20 +0000 (11:29 +0200)
[ Upstream commit cf0418cd06ce42fcf35beb33e315b5a77e596926 ]

The rt711 jack detection properties are set from the machine drivers
during the card probe, as done in other ASoC examples.

KASAN reports a use-after-free error when unbinding drivers due to a
confusing sequence between the ACPI core, the device core and the
SoundWire device cleanups.

Rather than fixing this sequence, follow the recommendation to have
the same caller add and remove properties, add an explicit
device_remove_properties() in the card .remove() callback.

In future patches the use of device_add/remove_properties will be
replaced by a direct handling of a swnode, but the sequence will
remain the same.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20200717211337.31956-3-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/intel/boards/sof_sdw.c
sound/soc/intel/boards/sof_sdw_common.h
sound/soc/intel/boards/sof_sdw_rt711.c

index 1bfd9613449e9c0b07c2b43200454e0395a7b394..95a119a2d354ec0bbfd26cb0ab831ea4115d22f2 100644 (file)
@@ -184,6 +184,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {true, true},
                .dai_name = "rt711-aif1",
                .init = sof_sdw_rt711_init,
+               .exit = sof_sdw_rt711_exit,
        },
        {
                .id = 0x1308,
index 69b363b8a6869672a56737057244dca9e130aad2..fdd2385049e1e41c7b2dfb8f38254ed073d1fe99 100644 (file)
@@ -84,6 +84,7 @@ int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link,
                       struct snd_soc_dai_link *dai_links,
                       struct sof_sdw_codec_info *info,
                       bool playback);
+int sof_sdw_rt711_exit(struct device *dev, struct snd_soc_dai_link *dai_link);
 
 /* RT700 support */
 int sof_sdw_rt700_init(const struct snd_soc_acpi_link_adr *link,
index d4d75c8dc6b78612c63498d690b6e2c52e627153..0cb9f1c1f8676a61a7cc2baf869794c561ab43c8 100644 (file)
@@ -133,6 +133,21 @@ static int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd)
        return ret;
 }
 
+int sof_sdw_rt711_exit(struct device *dev, struct snd_soc_dai_link *dai_link)
+{
+       struct device *sdw_dev;
+
+       sdw_dev = bus_find_device_by_name(&sdw_bus_type, NULL,
+                                         dai_link->codecs[0].name);
+       if (!sdw_dev)
+               return -EINVAL;
+
+       device_remove_properties(sdw_dev);
+       put_device(sdw_dev);
+
+       return 0;
+}
+
 int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link,
                       struct snd_soc_dai_link *dai_links,
                       struct sof_sdw_codec_info *info,