]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
asoc: tegra-alt: add suspend and resume for rt5639
authorKerwin Wan <kerwinw@nvidia.com>
Mon, 29 Dec 2014 06:13:14 +0000 (14:13 +0800)
committerBharat Nihalani <bnihalani@nvidia.com>
Mon, 29 Dec 2014 08:44:17 +0000 (00:44 -0800)
Bug 200068745

Change-Id: I6c853e22643ba645b8736e0e073333cbd0438e93
Signed-off-by: Kerwin Wan <kerwinw@nvidia.com>
Reviewed-on: http://git-master/r/668053
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Manoj Gangwal <mgangwal@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
sound/soc/tegra-alt/tegra_t210ref_mobile_alt.c

index f1fc494166e99bef6156ea60820a98e52bb40376..04ef49248516e565dcef2b274cf5523c17aa4699 100644 (file)
@@ -434,6 +434,63 @@ static const struct snd_soc_dapm_widget tegra_t210ref_dapm_widgets[] = {
        SND_SOC_DAPM_MIC("Int Mic", NULL),
 };
 
+static int tegra_t210ref_suspend_pre(struct snd_soc_card *card)
+{
+       struct snd_soc_jack_gpio *gpio = &tegra_t210ref_hp_jack_gpio;
+       unsigned int idx;
+
+       /* DAPM dai link stream work for non pcm links */
+       for (idx = 0; idx < card->num_rtd; idx++) {
+               if (card->rtd[idx].dai_link->params)
+                       INIT_DELAYED_WORK(&card->rtd[idx].delayed_work, NULL);
+       }
+
+       if (gpio_is_valid(gpio->gpio))
+               disable_irq(gpio_to_irq(gpio->gpio));
+
+       return 0;
+}
+
+static int tegra_t210ref_suspend_post(struct snd_soc_card *card)
+{
+       struct tegra_t210ref *machine = snd_soc_card_get_drvdata(card);
+
+       if (machine->clock_enabled) {
+               machine->clock_enabled = 0;
+               tegra_alt_asoc_utils_clk_disable(&machine->audio_clock);
+       }
+
+       if (machine->digital_reg)
+               regulator_disable(machine->digital_reg);
+
+       return 0;
+}
+
+static int tegra_t210ref_resume_pre(struct snd_soc_card *card)
+{
+       struct tegra_t210ref *machine = snd_soc_card_get_drvdata(card);
+       struct snd_soc_jack_gpio *gpio = &tegra_t210ref_hp_jack_gpio;
+       int ret, val;
+
+       if (machine->digital_reg)
+               ret = regulator_enable(machine->digital_reg);
+
+       if (gpio_is_valid(gpio->gpio)) {
+               val = gpio_get_value(gpio->gpio);
+               val = gpio->invert ? !val : val;
+               if (gpio->jack)
+                       snd_soc_jack_report(gpio->jack, val, gpio->report);
+               enable_irq(gpio_to_irq(gpio->gpio));
+       }
+
+       if (!machine->clock_enabled) {
+               machine->clock_enabled = 1;
+               tegra_alt_asoc_utils_clk_enable(&machine->audio_clock);
+       }
+
+       return 0;
+}
+
 static const struct snd_soc_dapm_route tegra_t210ref_audio_map[] = {
 };
 
@@ -453,6 +510,9 @@ static struct snd_soc_card snd_soc_tegra_t210ref = {
        .name = "tegra-t210ref",
        .owner = THIS_MODULE,
        .remove = tegra_t210ref_remove,
+       .suspend_post = tegra_t210ref_suspend_post,
+       .suspend_pre = tegra_t210ref_suspend_pre,
+       .resume_pre = tegra_t210ref_resume_pre,
        .controls = tegra_t210ref_controls,
        .num_controls = ARRAY_SIZE(tegra_t210ref_controls),
        .dapm_widgets = tegra_t210ref_dapm_widgets,