greybus: audio: Report jack events conditionally
authorVaibhav Agarwal <vaibhav.agarwal@linaro.org>
Thu, 1 Sep 2016 06:08:41 +0000 (11:38 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 2 Sep 2016 12:13:39 +0000 (14:13 +0200)
Now jack & jack-buttons are registered to snd_jack framework based on
the capability shared by module's topology data. Thus, jack events
should be reported to above snd framework only in case corresponding
jack type is registered. This patch adds additional checks to avoid
reporting fake jack events.

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_module.c

index f764f007b54326c6300345e349a4bcf0a645d921..d3284ab1dacfc8432eb72901d4593937b07f52c3 100644 (file)
 static int gbaudio_request_jack(struct gbaudio_module_info *module,
                                  struct gb_audio_jack_event_request *req)
 {
-       int report, button_status;
+       int report;
+       struct snd_jack *jack = module->headset_jack.jack;
+       struct snd_jack *btn_jack = module->button_jack.jack;
+
+       if (!jack) {
+               dev_err_ratelimited(module->dev,
+                       "Invalid jack event received:type: %u, event: %u\n",
+                       req->jack_attribute, req->event);
+               return -EINVAL;
+       }
 
        dev_warn_ratelimited(module->dev,
                             "Jack Event received: type: %u, event: %u\n",
@@ -29,19 +38,24 @@ static int gbaudio_request_jack(struct gbaudio_module_info *module,
 
        if (req->event == GB_AUDIO_JACK_EVENT_REMOVAL) {
                module->jack_type = 0;
-               button_status = module->button_status;
-               module->button_status = 0;
-               if (button_status)
+               if (btn_jack && module->button_status) {
                        snd_soc_jack_report(&module->button_jack, 0,
                                            module->button_mask);
+                       module->button_status = 0;
+               }
                snd_soc_jack_report(&module->headset_jack, 0,
                                    module->jack_mask);
                return 0;
        }
 
-       /* currently supports Headphone, Headset & Lineout only */
-       report &= ~module->jack_mask;
-       report |= req->jack_attribute & module->jack_mask;
+       report = req->jack_attribute & module->jack_mask;
+       if (!report) {
+               dev_err_ratelimited(module->dev,
+                       "Invalid jack event received:type: %u, event: %u\n",
+                       req->jack_attribute, req->event);
+               return -EINVAL;
+       }
+
        if (module->jack_type)
                dev_warn_ratelimited(module->dev,
                                     "Modifying jack from %d to %d\n",
@@ -57,6 +71,14 @@ static int gbaudio_request_button(struct gbaudio_module_info *module,
                                  struct gb_audio_button_event_request *req)
 {
        int soc_button_id, report;
+       struct snd_jack *btn_jack = module->button_jack.jack;
+
+       if (!btn_jack) {
+               dev_err_ratelimited(module->dev,
+                       "Invalid button event received:type: %u, event: %u\n",
+                       req->button_id, req->event);
+               return -EINVAL;
+       }
 
        dev_warn_ratelimited(module->dev,
                             "Button Event received: id: %u, event: %u\n",