From: Vaibhav Agarwal Date: Thu, 1 Sep 2016 06:08:41 +0000 (+0530) Subject: greybus: audio: Report jack events conditionally X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=cec89df44692fa8cff2a52542b11878ee49b0d69;p=linux-beck.git greybus: audio: Report jack events conditionally 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 Reviewed-by: Mark Greer Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/greybus/audio_module.c b/drivers/staging/greybus/audio_module.c index f764f007b543..d3284ab1dacf 100644 --- a/drivers/staging/greybus/audio_module.c +++ b/drivers/staging/greybus/audio_module.c @@ -21,7 +21,16 @@ 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",