diff --git a/drivers/platform/msm/ipa_fmwk/ipa_fmwk.c b/drivers/platform/msm/ipa_fmwk/ipa_fmwk.c index f51247e6bea8..da9a4ad1945c 100644 --- a/drivers/platform/msm/ipa_fmwk/ipa_fmwk.c +++ b/drivers/platform/msm/ipa_fmwk/ipa_fmwk.c @@ -623,6 +623,40 @@ bool ipa_is_ready(void) } EXPORT_SYMBOL(ipa_is_ready); +#ifdef CONFIG_DEEPSLEEP +int ipa_fmwk_deepsleep_entry_ipa(void) +{ + if (!ipa_fmwk_ctx) { + pr_err("ipa framework hasn't been initialized yet\n"); + return -EPERM; + } + + mutex_lock(&ipa_fmwk_ctx->lock); + ipa_fmwk_ctx->ipa_ready = false; + mutex_unlock(&ipa_fmwk_ctx->lock); + pr_info("IPA driver is now in exit state\n"); + + return 0; +} +EXPORT_SYMBOL(ipa_fmwk_deepsleep_entry_ipa); + +int ipa_fmwk_deepsleep_exit_ipa(void) +{ + if (!ipa_fmwk_ctx) { + pr_err("ipa framework hasn't been initialized yet\n"); + return -EPERM; + } + + mutex_lock(&ipa_fmwk_ctx->lock); + ipa_trigger_ipa_ready_cbs(); + ipa_fmwk_ctx->ipa_ready = true; + mutex_unlock(&ipa_fmwk_ctx->lock); + pr_info("IPA driver is now in ready state\n"); + return 0; +} +EXPORT_SYMBOL(ipa_fmwk_deepsleep_exit_ipa); +#endif + int ipa_register_ipa_ready_cb(void(*ipa_ready_cb)(void *user_data), void *user_data) { diff --git a/include/linux/ipa.h b/include/linux/ipa.h index df5f9c8f9087..4abae4525832 100644 --- a/include/linux/ipa.h +++ b/include/linux/ipa.h @@ -1762,6 +1762,12 @@ bool ipa_is_ready(void); void ipa_proxy_clk_vote(void); void ipa_proxy_clk_unvote(void); +#ifdef CONFIG_DEEPSLEEP +int ipa_fmwk_deepsleep_entry_ipa(void); + +int ipa_fmwk_deepsleep_exit_ipa(void); +#endif + enum ipa_hw_type ipa_get_hw_type(void); const struct ipa_gsi_ep_config *ipa_get_gsi_ep_info( @@ -2165,6 +2171,16 @@ static inline bool ipa_is_ready(void) return false; } +static inline int ipa_fmwk_deepsleep_entry_ipa(void) +{ + return -EPERM; +} + +static inline int ipa_fmwk_deepsleep_exit_ipa(void) +{ + return -EPERM; +} + static inline enum ipa_hw_type ipa_get_hw_type(void) { return IPA_HW_None;