diff options
| author | Hauke Mehrtens <hauke@hauke-m.de> | 2013-08-23 18:32:33 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2013-08-26 14:09:03 -0400 |
| commit | 521deea64088bc885a76bd174241eaa3d3a6876f (patch) | |
| tree | a86d49829ec72acb03a15355f3b90420d06db336 /drivers/bcma | |
| parent | 780335acc815802dcee63d75f5589d43c3ccb402 (diff) | |
bcma: add bcma_core_pci_power_save()
This enables or disables power saving on the PCIe bus when the wifi is
in operation or not.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/bcma')
| -rw-r--r-- | drivers/bcma/driver_pci.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c index d51d1943a202..c9fd6943ce45 100644 --- a/drivers/bcma/driver_pci.c +++ b/drivers/bcma/driver_pci.c | |||
| @@ -31,7 +31,7 @@ static void bcma_pcie_write(struct bcma_drv_pci *pc, u32 address, u32 data) | |||
| 31 | pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_DATA, data); | 31 | pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_DATA, data); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy) | 34 | static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u16 phy) |
| 35 | { | 35 | { |
| 36 | u32 v; | 36 | u32 v; |
| 37 | int i; | 37 | int i; |
| @@ -55,7 +55,7 @@ static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy) | |||
| 55 | } | 55 | } |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address) | 58 | static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address) |
| 59 | { | 59 | { |
| 60 | int max_retries = 10; | 60 | int max_retries = 10; |
| 61 | u16 ret = 0; | 61 | u16 ret = 0; |
| @@ -98,7 +98,7 @@ static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address) | |||
| 98 | return ret; | 98 | return ret; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device, | 101 | static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device, |
| 102 | u8 address, u16 data) | 102 | u8 address, u16 data) |
| 103 | { | 103 | { |
| 104 | int max_retries = 10; | 104 | int max_retries = 10; |
| @@ -137,6 +137,13 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device, | |||
| 137 | pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0); | 137 | pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0); |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static u16 bcma_pcie_mdio_writeread(struct bcma_drv_pci *pc, u16 device, | ||
| 141 | u8 address, u16 data) | ||
| 142 | { | ||
| 143 | bcma_pcie_mdio_write(pc, device, address, data); | ||
| 144 | return bcma_pcie_mdio_read(pc, device, address); | ||
| 145 | } | ||
| 146 | |||
| 140 | /************************************************** | 147 | /************************************************** |
| 141 | * Workarounds. | 148 | * Workarounds. |
| 142 | **************************************************/ | 149 | **************************************************/ |
| @@ -203,6 +210,25 @@ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc) | |||
| 203 | } | 210 | } |
| 204 | } | 211 | } |
| 205 | 212 | ||
| 213 | static void bcma_core_pci_power_save(struct bcma_drv_pci *pc, bool up) | ||
| 214 | { | ||
| 215 | u16 data; | ||
| 216 | |||
| 217 | if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) { | ||
| 218 | data = up ? 0x74 : 0x7C; | ||
| 219 | bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1, | ||
| 220 | BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64); | ||
| 221 | bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1, | ||
| 222 | BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data); | ||
| 223 | } else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) { | ||
| 224 | data = up ? 0x75 : 0x7D; | ||
| 225 | bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1, | ||
| 226 | BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65); | ||
| 227 | bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1, | ||
| 228 | BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data); | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 206 | /************************************************** | 232 | /************************************************** |
| 207 | * Init. | 233 | * Init. |
| 208 | **************************************************/ | 234 | **************************************************/ |
| @@ -284,6 +310,8 @@ void bcma_core_pci_up(struct bcma_bus *bus) | |||
| 284 | 310 | ||
| 285 | pc = &bus->drv_pci[0]; | 311 | pc = &bus->drv_pci[0]; |
| 286 | 312 | ||
| 313 | bcma_core_pci_power_save(pc, true); | ||
| 314 | |||
| 287 | bcma_core_pci_extend_L1timer(pc, true); | 315 | bcma_core_pci_extend_L1timer(pc, true); |
| 288 | } | 316 | } |
| 289 | EXPORT_SYMBOL_GPL(bcma_core_pci_up); | 317 | EXPORT_SYMBOL_GPL(bcma_core_pci_up); |
| @@ -298,5 +326,7 @@ void bcma_core_pci_down(struct bcma_bus *bus) | |||
| 298 | pc = &bus->drv_pci[0]; | 326 | pc = &bus->drv_pci[0]; |
| 299 | 327 | ||
| 300 | bcma_core_pci_extend_L1timer(pc, false); | 328 | bcma_core_pci_extend_L1timer(pc, false); |
| 329 | |||
| 330 | bcma_core_pci_power_save(pc, false); | ||
| 301 | } | 331 | } |
| 302 | EXPORT_SYMBOL_GPL(bcma_core_pci_down); | 332 | EXPORT_SYMBOL_GPL(bcma_core_pci_down); |
