diff --git a/drivers/net/wireless/cnss/cnss.c b/drivers/net/wireless/cnss/cnss.c index dad93253cf1a66f073cd5a8ce679829b74f83555..6be665ec88198d312b000a5c544a6e5253420f4b 100644 --- a/drivers/net/wireless/cnss/cnss.c +++ b/drivers/net/wireless/cnss/cnss.c @@ -1057,6 +1057,20 @@ void cnss_pm_wake_lock_destroy(struct wakeup_source *ws) } EXPORT_SYMBOL(cnss_pm_wake_lock_destroy); +#ifdef CONFIG_PCI_MSM +int cnss_wlan_pm_control(bool vote) +{ + if (!penv || !penv->pdev) + return -ENODEV; + + return msm_pcie_pm_control( + vote ? MSM_PCIE_DISABLE_PC : MSM_PCIE_ENABLE_PC, + cnss_get_pci_dev_bus_number(penv->pdev), + penv->pdev, NULL, PM_OPTIONS); +} +EXPORT_SYMBOL(cnss_wlan_pm_control); +#endif + void cnss_flush_work(void *work) { struct work_struct *cnss_work = work; diff --git a/include/net/cnss.h b/include/net/cnss.h index 00e4c22a754f1207bfdda7fcf4085cc9d0a70284..2ffe6d9dca3f243318515c37f395fe538b48c8ac 100644 --- a/include/net/cnss.h +++ b/include/net/cnss.h @@ -93,6 +93,9 @@ extern void cnss_pm_wake_lock(struct wakeup_source *ws); extern void cnss_pm_wake_lock_timeout(struct wakeup_source *ws, ulong msec); extern void cnss_pm_wake_lock_release(struct wakeup_source *ws); extern void cnss_pm_wake_lock_destroy(struct wakeup_source *ws); +#ifdef CONFIG_PCI_MSM +extern int cnss_wlan_pm_control(bool vote); +#endif extern int cnss_set_cpus_allowed_ptr(struct task_struct *task, ulong cpu); extern void cnss_request_pm_qos(u32 qos_val);