Merge tag 'sound-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[sfrench/cifs-2.6.git] / sound / soc / codecs / rt298.c
index c291786dc82def3e777841b7f11aaff977f2ba37..b0b53d4f07df91b565c43cc470af063fe1aa8479 100644 (file)
@@ -326,39 +326,37 @@ static void rt298_jack_detect_work(struct work_struct *work)
                SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
 }
 
-int rt298_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack)
+static int rt298_mic_detect(struct snd_soc_component *component,
+                           struct snd_soc_jack *jack, void *data)
 {
+       struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
        struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component);
-       struct snd_soc_dapm_context *dapm;
-       bool hp = false;
-       bool mic = false;
-       int status = 0;
 
-       /* If jack in NULL, disable HS jack */
-       if (!jack) {
+       rt298->jack = jack;
+
+       if (jack) {
+               /* Enable IRQ */
+               if (rt298->jack->status & SND_JACK_HEADPHONE)
+                       snd_soc_dapm_force_enable_pin(dapm, "LDO1");
+               if (rt298->jack->status & SND_JACK_MICROPHONE) {
+                       snd_soc_dapm_force_enable_pin(dapm, "HV");
+                       snd_soc_dapm_force_enable_pin(dapm, "VREF");
+               }
+               regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x2);
+               /* Send an initial empty report */
+               snd_soc_jack_report(rt298->jack, rt298->jack->status,
+                                   SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
+       } else {
+               /* Disable IRQ */
                regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x0);
-               dapm = snd_soc_component_get_dapm(component);
+               snd_soc_dapm_disable_pin(dapm, "HV");
+               snd_soc_dapm_disable_pin(dapm, "VREF");
                snd_soc_dapm_disable_pin(dapm, "LDO1");
-               snd_soc_dapm_sync(dapm);
-               return 0;
        }
-
-       rt298->jack = jack;
-       regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x2);
-
-       rt298_jack_detect(rt298, &hp, &mic);
-       if (hp)
-               status |= SND_JACK_HEADPHONE;
-
-       if (mic)
-               status |= SND_JACK_MICROPHONE;
-
-       snd_soc_jack_report(rt298->jack, status,
-               SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
+       snd_soc_dapm_sync(dapm);
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(rt298_mic_detect);
 
 static int is_mclk_mode(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink)
@@ -1011,17 +1009,11 @@ static int rt298_probe(struct snd_soc_component *component)
        struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component);
 
        rt298->component = component;
+       INIT_DELAYED_WORK(&rt298->jack_detect_work, rt298_jack_detect_work);
 
-       if (rt298->i2c->irq) {
-               regmap_update_bits(rt298->regmap,
-                                       RT298_IRQ_CTRL, 0x2, 0x2);
-
-               INIT_DELAYED_WORK(&rt298->jack_detect_work,
-                                       rt298_jack_detect_work);
+       if (rt298->i2c->irq)
                schedule_delayed_work(&rt298->jack_detect_work,
-                                       msecs_to_jiffies(1250));
-       }
-
+                                     msecs_to_jiffies(1250));
        return 0;
 }
 
@@ -1030,6 +1022,7 @@ static void rt298_remove(struct snd_soc_component *component)
        struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component);
 
        cancel_delayed_work_sync(&rt298->jack_detect_work);
+       rt298->component = NULL;
 }
 
 #ifdef CONFIG_PM
@@ -1120,6 +1113,7 @@ static const struct snd_soc_component_driver soc_component_dev_rt298 = {
        .suspend                = rt298_suspend,
        .resume                 = rt298_resume,
        .set_bias_level         = rt298_set_bias_level,
+       .set_jack               = rt298_mic_detect,
        .controls               = rt298_snd_controls,
        .num_controls           = ARRAY_SIZE(rt298_snd_controls),
        .dapm_widgets           = rt298_dapm_widgets,
@@ -1128,7 +1122,6 @@ static const struct snd_soc_component_driver soc_component_dev_rt298 = {
        .num_dapm_routes        = ARRAY_SIZE(rt298_dapm_routes),
        .use_pmdown_time        = 1,
        .endianness             = 1,
-       .non_legacy_dai_naming  = 1,
 };
 
 static const struct regmap_config rt298_regmap = {