]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - sound/soc/tegra/tegra_alc5632.c
ASoC: tegra: free jack GPIOs before the sound card is freed
[mirror_ubuntu-bionic-kernel.git] / sound / soc / tegra / tegra_alc5632.c
index c61ea3a1030f7a683f55bd087049392fe4867bfb..02734bd4f09bd383222e88fd607066af9ec1394f 100644 (file)
@@ -125,6 +125,18 @@ static int tegra_alc5632_asoc_init(struct snd_soc_pcm_runtime *rtd)
        return 0;
 }
 
+static int tegra_alc5632_card_remove(struct snd_soc_card *card)
+{
+       struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(card);
+
+       if (gpio_is_valid(machine->gpio_hp_det)) {
+               snd_soc_jack_free_gpios(&tegra_alc5632_hs_jack, 1,
+                                       &tegra_alc5632_hp_jack_gpio);
+       }
+
+       return 0;
+}
+
 static struct snd_soc_dai_link tegra_alc5632_dai = {
        .name = "ALC5632",
        .stream_name = "ALC5632 PCM",
@@ -139,6 +151,7 @@ static struct snd_soc_dai_link tegra_alc5632_dai = {
 static struct snd_soc_card snd_soc_tegra_alc5632 = {
        .name = "tegra-alc5632",
        .owner = THIS_MODULE,
+       .remove = tegra_alc5632_card_remove,
        .dai_link = &tegra_alc5632_dai,
        .num_links = 1,
        .controls = tegra_alc5632_controls,
@@ -223,9 +236,6 @@ static int tegra_alc5632_remove(struct platform_device *pdev)
        struct snd_soc_card *card = platform_get_drvdata(pdev);
        struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(card);
 
-       snd_soc_jack_free_gpios(&tegra_alc5632_hs_jack, 1,
-                               &tegra_alc5632_hp_jack_gpio);
-
        snd_soc_unregister_card(card);
 
        tegra_asoc_utils_fini(&machine->util_data);