ASoC: rt1015p: move SDB control from trigger to DAPM
authorTzung-Bi Shih <tzungbi@google.com>
Fri, 11 Dec 2020 05:12:23 +0000 (13:12 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 11 Dec 2020 13:22:18 +0000 (13:22 +0000)
Moves SDB control from DAI ops trigger to DAPM.  As long as BCLK
and LRCLK are ready, SDB can be toggled earlier.

Changes from using gpiod_set_value() to gpiod_set_value_cansleep()
because it executes in non-atomic context.

Signed-off-by: Tzung-Bi Shih <tzungbi@google.com>
Link: https://lore.kernel.org/r/20201211051224.2307349-2-tzungbi@google.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt1015p.c

index 59bb6068227082db6ee9ab5308b25dd030cb6230..ee9dfa2dbbf0c2d928a49ab0c64338a79cfc6aee 100644 (file)
 
 struct rt1015p_priv {
        struct gpio_desc *sdb;
-       int sdb_switch;
 };
 
-static int rt1015p_daiops_trigger(struct snd_pcm_substream *substream,
-               int cmd, struct snd_soc_dai *dai)
+static int rt1015p_sdb_event(struct snd_soc_dapm_widget *w,
+               struct snd_kcontrol *kcontrol, int event)
 {
-       struct snd_soc_component *component = dai->component;
+       struct snd_soc_component *component =
+               snd_soc_dapm_to_component(w->dapm);
        struct rt1015p_priv *rt1015p =
                snd_soc_component_get_drvdata(component);
 
        if (!rt1015p->sdb)
                return 0;
 
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-       case SNDRV_PCM_TRIGGER_RESUME:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               if (rt1015p->sdb_switch) {
-                       gpiod_set_value(rt1015p->sdb, 1);
-                       dev_dbg(component->dev, "set sdb to 1");
-               }
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               gpiod_set_value_cansleep(rt1015p->sdb, 1);
+               dev_dbg(component->dev, "set sdb to 1");
                break;
-       case SNDRV_PCM_TRIGGER_STOP:
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-               gpiod_set_value(rt1015p->sdb, 0);
+       case SND_SOC_DAPM_POST_PMD:
+               gpiod_set_value_cansleep(rt1015p->sdb, 0);
                dev_dbg(component->dev, "set sdb to 0");
                break;
+       default:
+               break;
        }
 
        return 0;
 }
 
-static int rt1015p_sdb_event(struct snd_soc_dapm_widget *w,
-               struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_component *component =
-               snd_soc_dapm_to_component(w->dapm);
-       struct rt1015p_priv *rt1015p =
-               snd_soc_component_get_drvdata(component);
-
-       if (event & SND_SOC_DAPM_POST_PMU)
-               rt1015p->sdb_switch = 1;
-       else if (event & SND_SOC_DAPM_POST_PMD)
-               rt1015p->sdb_switch = 0;
-
-       return 0;
-}
-
 static const struct snd_soc_dapm_widget rt1015p_dapm_widgets[] = {
        SND_SOC_DAPM_OUTPUT("Speaker"),
        SND_SOC_DAPM_OUT_DRV_E("SDB", SND_SOC_NOPM, 0, 0, NULL, 0,
                        rt1015p_sdb_event,
-                       SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
+                       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 };
 
 static const struct snd_soc_dapm_route rt1015p_dapm_routes[] = {
@@ -91,10 +71,6 @@ static const struct snd_soc_component_driver rt1015p_component_driver = {
        .non_legacy_dai_naming  = 1,
 };
 
-static const struct snd_soc_dai_ops rt1015p_dai_ops = {
-       .trigger        = rt1015p_daiops_trigger,
-};
-
 static struct snd_soc_dai_driver rt1015p_dai_driver = {
        .name = "HiFi",
        .playback = {
@@ -104,7 +80,6 @@ static struct snd_soc_dai_driver rt1015p_dai_driver = {
                .channels_min   = 1,
                .channels_max   = 2,
        },
-       .ops    = &rt1015p_dai_ops,
 };
 
 static int rt1015p_platform_probe(struct platform_device *pdev)