greybus: audio: Report jack removal along with module removal
authorVaibhav Agarwal <vaibhav.agarwal@linaro.org>
Fri, 5 Aug 2016 12:46:30 +0000 (18:16 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 5 Aug 2016 18:14:48 +0000 (20:14 +0200)
For GB module with jack slot supported, headset/headphone can still
be inserted at the time of module removal. In this case, above layer is
unaware about jack removal event which happened due to module removal.
This may lead to inconsistent state in above HAL layer.  Fix this by
reporting jack removal event explicitly.

Signed-off-by: Vaibhav Agarwal <vaibhav.agarwal@linaro.org>
Reviewed-by: Mark Greer <mgreer@animalcreek.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/audio_codec.c

index cf86f51a83a2c5aaa3a9924fb4684e0e9fdc99ec..3eb3d2cf014a096338178a45a62e4019160e8b23 100644 (file)
@@ -909,6 +909,7 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
        struct snd_soc_codec *codec = gbcodec->codec;
        struct snd_card *card = codec->card->snd_card;
        struct snd_soc_jack *jack, *next_j;
+       int mask;
 
        dev_dbg(codec->dev, "Unregister %s module\n", module->name);
 
@@ -922,8 +923,16 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
 #ifdef CONFIG_SND_JACK
        /* free jack devices for this module from codec->jack_list */
        list_for_each_entry_safe(jack, next_j, &codec->jack_list, list) {
-               if ((jack == &module->headset_jack)
-                   || (jack == &module->button_jack)) {
+               if (jack == &module->headset_jack)
+                       mask = GBCODEC_JACK_MASK;
+               else if (jack == &module->button_jack)
+                       mask = GBCODEC_JACK_BUTTON_MASK;
+               else
+                       mask = 0;
+               if (mask) {
+                       dev_dbg(module->dev, "Report %s removal\n",
+                               jack->jack->id);
+                       snd_soc_jack_report(jack, 0, mask);
                        snd_device_free(codec->card->snd_card, jack->jack);
                        list_del(&jack->list);
                }