diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index 00d3f2a1fd3f..2e01ae9528f2 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -2810,6 +2810,72 @@ void cnss_remove_pm_qos(void) } EXPORT_SYMBOL(cnss_remove_pm_qos); +void cnss_pci_request_pm_qos_type(int latency_type, u32 qos_val) +{ + if (!penv) { + pr_err("%s: penv is NULL\n", __func__); + return; + } + + pm_qos_add_request(&penv->qos_request, latency_type, qos_val); +} +EXPORT_SYMBOL(cnss_pci_request_pm_qos_type); + +void cnss_pci_request_pm_qos(u32 qos_val) +{ + if (!penv) { + pr_err("%s: penv is NULL\n", __func__); + return; + } + + pm_qos_add_request(&penv->qos_request, PM_QOS_CPU_DMA_LATENCY, qos_val); +} +EXPORT_SYMBOL(cnss_pci_request_pm_qos); + +void cnss_pci_remove_pm_qos(void) +{ + if (!penv) { + pr_err("%s: penv is NULL\n", __func__); + return; + } + + pm_qos_remove_request(&penv->qos_request); +} +EXPORT_SYMBOL(cnss_pci_remove_pm_qos); + +int cnss_pci_request_bus_bandwidth(int bandwidth) +{ + int ret = 0; + + if (!penv) + return -ENODEV; + + if (!penv->bus_client) + return -ENOSYS; + + switch (bandwidth) { + case CNSS_BUS_WIDTH_NONE: + case CNSS_BUS_WIDTH_LOW: + case CNSS_BUS_WIDTH_MEDIUM: + case CNSS_BUS_WIDTH_HIGH: + ret = msm_bus_scale_client_update_request( + penv->bus_client, bandwidth); + if (!ret) { + penv->current_bandwidth_vote = bandwidth; + } else { + pr_err("%s: could not set bus bandwidth %d, ret = %d\n", + __func__, bandwidth, ret); + } + break; + + default: + pr_err("%s: Invalid request %d", __func__, bandwidth); + ret = -EINVAL; + } + return ret; +} +EXPORT_SYMBOL(cnss_pci_request_bus_bandwidth); + int cnss_request_bus_bandwidth(int bandwidth) { int ret = 0; diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c index baf81d851688..7cdd2a033caf 100644 --- a/drivers/net/wireless/cnss/cnss_sdio.c +++ b/drivers/net/wireless/cnss/cnss_sdio.c @@ -125,6 +125,44 @@ static const struct sdio_device_id ar6k_id_table[] = { }; MODULE_DEVICE_TABLE(sdio, ar6k_id_table); +void cnss_sdio_request_pm_qos_type(int latency_type, u32 qos_val) +{ + if (!cnss_pdata) + return; + + pr_debug("%s: PM QoS value: %d\n", __func__, qos_val); + pm_qos_add_request(&cnss_pdata->qos_request, latency_type, qos_val); +} +EXPORT_SYMBOL(cnss_sdio_request_pm_qos_type); + +int cnss_sdio_request_bus_bandwidth(int bandwidth) +{ + return 0; +} +EXPORT_SYMBOL(cnss_sdio_request_bus_bandwidth); + +void cnss_sdio_request_pm_qos(u32 qos_val) +{ + if (!cnss_pdata) + return; + + pr_debug("%s: PM QoS value: %d\n", __func__, qos_val); + pm_qos_add_request( + &cnss_pdata->qos_request, + PM_QOS_CPU_DMA_LATENCY, qos_val); +} +EXPORT_SYMBOL(cnss_sdio_request_pm_qos); + +void cnss_sdio_remove_pm_qos(void) +{ + if (!cnss_pdata) + return; + + pm_qos_remove_request(&cnss_pdata->qos_request); + pr_debug("%s: PM QoS removed\n", __func__); +} +EXPORT_SYMBOL(cnss_sdio_remove_pm_qos); + int cnss_request_bus_bandwidth(int bandwidth) { return 0; diff --git a/include/net/cnss.h b/include/net/cnss.h index cfda3cdfa128..71b8d9a27f46 100644 --- a/include/net/cnss.h +++ b/include/net/cnss.h @@ -122,6 +122,8 @@ extern void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver); extern int cnss_get_fw_files(struct cnss_fw_files *pfw_files); extern int cnss_get_fw_files_for_target(struct cnss_fw_files *pfw_files, u32 target_type, u32 target_version); +extern int cnss_pci_request_bus_bandwidth(int bandwidth); +extern int cnss_sdio_request_bus_bandwidth(int bandwidth); extern int cnss_request_bus_bandwidth(int bandwidth); extern int cnss_get_sha_hash(const u8 *data, u32 data_len, @@ -140,6 +142,15 @@ extern void cnss_release_pm_sem(void); extern void cnss_request_pm_qos_type(int latency_type, u32 qos_val); extern void cnss_request_pm_qos(u32 qos_val); extern void cnss_remove_pm_qos(void); + +extern void cnss_pci_request_pm_qos_type(int latency_type, u32 qos_val); +extern void cnss_pci_request_pm_qos(u32 qos_val); +extern void cnss_pci_remove_pm_qos(void); + +extern void cnss_sdio_request_pm_qos_type(int latency_type, u32 qos_val); +extern void cnss_sdio_request_pm_qos(u32 qos_val); +extern void cnss_sdio_remove_pm_qos(void); + extern int cnss_get_platform_cap(struct cnss_platform_cap *cap); extern void cnss_set_driver_status(enum cnss_driver_status driver_status);