From 9ca8dc327c07d9bab90ba7bf8e4e6a5b99065dac Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Wed, 9 May 2018 17:41:11 -0700 Subject: [PATCH] soc: soundwire: Add support to listen for DC detection Add support to listen for DC detection event. Shutdown WSA on receiving DC detection event. CRs-Fixed: 2244131 Change-Id: Ifecab8bb9862976a647a161bad4c202b6e6459c7 Signed-off-by: Vignesh Kulothungan --- soc/swr-wcd-ctrl.c | 32 ++++++++++++++++++++++++++++++++ soc/swr-wcd-ctrl.h | 3 +++ 2 files changed, 35 insertions(+) diff --git a/soc/swr-wcd-ctrl.c b/soc/swr-wcd-ctrl.c index 38f8a3d86c2e..ade883c33bf4 100644 --- a/soc/swr-wcd-ctrl.c +++ b/soc/swr-wcd-ctrl.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "swrm_registers.h" #include "swr-wcd-ctrl.h" @@ -1393,6 +1394,32 @@ static int swrm_master_init(struct swr_mstr_ctrl *swrm) return ret; } +static int swrm_event_notify(struct notifier_block *self, + unsigned long action, void *data) +{ + struct swr_mstr_ctrl *swrm = container_of(self, struct swr_mstr_ctrl, + event_notifier); + if (!swrm || !swrm->pdev) { + pr_err("%s: swrm or pdev is NULL\n", __func__); + return -EINVAL; + } + if (action != MSM_AUD_DC_EVENT) { + dev_err(&swrm->pdev->dev, "%s: invalid event type: %lu\n", __func__, action); + return -EINVAL; + } + + schedule_work(&(swrm->dc_presence_work)); + + return 0; +} + +static void swrm_notify_work_fn(struct work_struct *work) +{ + struct swr_mstr_ctrl *swrm = container_of(work, struct swr_mstr_ctrl, + dc_presence_work); + swrm_wcd_notify(swrm->pdev, SWR_DEVICE_DOWN, NULL); +} + static int swrm_probe(struct platform_device *pdev) { struct swr_mstr_ctrl *swrm; @@ -1553,6 +1580,10 @@ static int swrm_probe(struct platform_device *pdev) pm_runtime_enable(&pdev->dev); pm_runtime_mark_last_busy(&pdev->dev); + INIT_WORK(&swrm->dc_presence_work, swrm_notify_work_fn); + swrm->event_notifier.notifier_call = swrm_event_notify; + msm_aud_evt_register_client(&swrm->event_notifier); + return 0; err_mstr_fail: swrm->reg_irq(swrm->handle, swr_mstr_interrupt, @@ -1583,6 +1614,7 @@ static int swrm_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); pm_runtime_set_suspended(&pdev->dev); swr_unregister_master(&swrm->master); + msm_aud_evt_unregister_client(&swrm->event_notifier); mutex_destroy(&swrm->mlock); mutex_destroy(&swrm->reslock); mutex_destroy(&swrm->force_down_lock); diff --git a/soc/swr-wcd-ctrl.h b/soc/swr-wcd-ctrl.h index dc8d7f51f34a..14b2b48dbb84 100644 --- a/soc/swr-wcd-ctrl.h +++ b/soc/swr-wcd-ctrl.h @@ -108,6 +108,9 @@ struct swr_mstr_ctrl { u8 num_cfg_devs; struct mutex force_down_lock; int force_down_state; + + struct notifier_block event_notifier; + struct work_struct dc_presence_work; }; #endif /* _SWR_WCD_CTRL_H */