qcacld-3.0: Add force wake APIs support in PLD

As part of PCIe power management for new WLAN devices, it requires
asserting WAKE register before accessing any MMIO registers outside
first 4K range. Add the APIs support in PLD for WLAN host driver.

Change-Id: I307cc6688fca58a52a6eaf3982d675c7a85a6965
CRs-fixed: 2326459
This commit is contained in:
Yue Ma
2018-08-08 11:51:21 -07:00
committed by nshrivas
szülő 9c0e4800ea
commit fb3b78d7d2
3 fájl változott, egészen pontosan 121 új sor hozzáadva és 1 régi sor törölve

Fájl megtekintése

@@ -895,6 +895,94 @@ int pld_auto_resume(struct device *dev)
return ret;
}
/**
* pld_force_wake_request() - Request vote to assert WAKE register
* @dev: device
*
* Return: 0 for success
* Non zero failure code for errors
*/
int pld_force_wake_request(struct device *dev)
{
int ret = 0;
enum pld_bus_type type = pld_get_bus_type(dev);
switch (type) {
case PLD_BUS_TYPE_PCIE:
ret = pld_pcie_force_wake_request(dev);
break;
case PLD_BUS_TYPE_SNOC:
case PLD_BUS_TYPE_SDIO:
case PLD_BUS_TYPE_USB:
break;
default:
pr_err("Invalid device type %d\n", type);
ret = -EINVAL;
break;
}
return ret;
}
/**
* pld_is_device_awake() - Check if it's ready to access MMIO registers
* @dev: device
*
* Return: True for device awake
* False for device not awake
* Negative failure code for errors
*/
int pld_is_device_awake(struct device *dev)
{
int ret = true;
enum pld_bus_type type = pld_get_bus_type(dev);
switch (type) {
case PLD_BUS_TYPE_PCIE:
ret = pld_pcie_is_device_awake(dev);
break;
case PLD_BUS_TYPE_SNOC:
case PLD_BUS_TYPE_SDIO:
case PLD_BUS_TYPE_USB:
break;
default:
pr_err("Invalid device type %d\n", type);
ret = -EINVAL;
break;
}
return ret;
}
/**
* pld_force_wake_release() - Release vote to assert WAKE register
* @dev: device
*
* Return: 0 for success
* Non zero failure code for errors
*/
int pld_force_wake_release(struct device *dev)
{
int ret = 0;
enum pld_bus_type type = pld_get_bus_type(dev);
switch (type) {
case PLD_BUS_TYPE_PCIE:
ret = pld_pcie_force_wake_release(dev);
break;
case PLD_BUS_TYPE_SNOC:
case PLD_BUS_TYPE_SDIO:
case PLD_BUS_TYPE_USB:
break;
default:
pr_err("Invalid device type %d\n", type);
ret = -EINVAL;
break;
}
return ret;
}
/**
* pld_ce_request_irq() - Register IRQ for CE
* @dev: device

Fájl megtekintése

@@ -216,6 +216,21 @@ static inline int pld_pcie_auto_resume(struct device *dev)
return 0;
}
static inline int pld_pcie_force_wake_request(struct device *dev)
{
return 0;
}
static inline int pld_pcie_is_device_awake(struct device *dev)
{
return true;
}
static inline int pld_pcie_force_wake_release(struct device *dev)
{
return 0;
}
static inline void pld_pcie_lock_pm_sem(struct device *dev)
{
}
@@ -331,6 +346,21 @@ static inline int pld_pcie_auto_resume(struct device *dev)
return cnss_auto_resume(dev);
}
static inline int pld_pcie_force_wake_request(struct device *dev)
{
return cnss_pci_force_wake_request(dev);
}
static inline int pld_pcie_is_device_awake(struct device *dev)
{
return cnss_pci_is_device_awake(dev);
}
static inline int pld_pcie_force_wake_release(struct device *dev)
{
return cnss_pci_force_wake_release(dev);
}
static inline void pld_pcie_lock_pm_sem(struct device *dev)
{
cnss_lock_pm_sem(dev);