diff --git a/dsp/msm-audio-event-notify.c b/dsp/msm-audio-event-notify.c index 6eb537d78c..3f02ebb6a7 100644 --- a/dsp/msm-audio-event-notify.c +++ b/dsp/msm-audio-event-notify.c @@ -13,6 +13,7 @@ #include static ATOMIC_NOTIFIER_HEAD(msm_aud_evt_notifier_list); +static BLOCKING_NOTIFIER_HEAD(msm_aud_evt_blocking_notifier_list); /** * msm_aud_evt_register_client - register a client notifier @@ -43,3 +44,38 @@ int msm_aud_evt_notifier_call_chain(unsigned long val, void *v) return atomic_notifier_call_chain(&msm_aud_evt_notifier_list, val, v); } EXPORT_SYMBOL_GPL(msm_aud_evt_notifier_call_chain); + +/** + * msm_aud_evt_blocking_register_client - register a client notifier + * @nb: notifier block to callback on events + */ +int msm_aud_evt_blocking_register_client(struct notifier_block *nb) +{ + return blocking_notifier_chain_register( + &msm_aud_evt_blocking_notifier_list, nb); +} +EXPORT_SYMBOL(msm_aud_evt_blocking_register_client); + +/** + * msm_aud_evt_unregister_client - unregister a client notifier + * @nb: notifier block to callback on events + */ +int msm_aud_evt_blocking_unregister_client(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister( + &msm_aud_evt_blocking_notifier_list, nb); +} +EXPORT_SYMBOL(msm_aud_evt_blocking_unregister_client); + +/** + * msm_aud_evt_notifier_call_chain - notify clients of fb_events + * @val: event or enum maintained by caller + * @v: private data pointer + * + */ +int msm_aud_evt_blocking_notifier_call_chain(unsigned long val, void *v) +{ + return blocking_notifier_call_chain( + &msm_aud_evt_blocking_notifier_list, val, v); +} +EXPORT_SYMBOL_GPL(msm_aud_evt_blocking_notifier_call_chain); diff --git a/include/dsp/msm-audio-event-notify.h b/include/dsp/msm-audio-event-notify.h index 5b85ad7e26..fc47eff8ab 100644 --- a/include/dsp/msm-audio-event-notify.h +++ b/include/dsp/msm-audio-event-notify.h @@ -20,6 +20,9 @@ int msm_aud_evt_register_client(struct notifier_block *nb); int msm_aud_evt_unregister_client(struct notifier_block *nb); int msm_aud_evt_notifier_call_chain(unsigned long val, void *v); +int msm_aud_evt_blocking_register_client(struct notifier_block *nb); +int msm_aud_evt_blocking_unregister_client(struct notifier_block *nb); +int msm_aud_evt_blocking_notifier_call_chain(unsigned long val, void *v); #else static inline int msm_aud_evt_register_client(struct notifier_block *nb) { @@ -35,10 +38,31 @@ static inline int msm_aud_evt_notifier_call_chain(unsigned long val, void *v) { return -ENOSYS; } + +static inline int msm_aud_evt_blocking_register_client( + struct notifier_block *nb) +{ + return -ENOSYS; +} + +static inline int msm_aud_evt_blocking_unregister_client( + struct notifier_block *nb) +{ + return -ENOSYS; +} + +static inline int msm_aud_evt_blocking_notifier_call_chain( + unsigned long val, void *v) +{ + return -ENOSYS; +} #endif enum { MSM_AUD_DC_EVENT = 1, + SWR_WAKE_IRQ_REGISTER, + SWR_WAKE_IRQ_DEREGISTER, + SWR_WAKE_IRQ_EVENT, }; #endif