aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/audio_module.c
diff options
context:
space:
mode:
authorVaibhav Agarwal <vaibhav.agarwal@linaro.org>2016-09-01 11:38:41 +0530
committerGreg Kroah-Hartman <gregkh@google.com>2016-09-02 14:13:39 +0200
commitcec89df44692fa8cff2a52542b11878ee49b0d69 (patch)
tree40965715772c88f738faeff0de53a0a77c82e3f1 /drivers/staging/greybus/audio_module.c
parentgreybus: audio: Fetch jack_mask, button_mask from module's topology data (diff)
downloadlinux-dev-cec89df44692fa8cff2a52542b11878ee49b0d69.tar.xz
linux-dev-cec89df44692fa8cff2a52542b11878ee49b0d69.zip
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 <vaibhav.agarwal@linaro.org> Reviewed-by: Mark Greer <mgreer@animalcreek.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/audio_module.c')
-rw-r--r--drivers/staging/greybus/audio_module.c36
1 files changed, 29 insertions, 7 deletions
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",