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); |