aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bcma
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2013-08-23 18:32:33 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-08-26 14:09:03 -0400
commit521deea64088bc885a76bd174241eaa3d3a6876f (patch)
treea86d49829ec72acb03a15355f3b90420d06db336 /drivers/bcma
parent780335acc815802dcee63d75f5589d43c3ccb402 (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.c36
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
34static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy) 34static 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
58static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address) 58static 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
101static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device, 101static 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
140static 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
213static 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}
289EXPORT_SYMBOL_GPL(bcma_core_pci_up); 317EXPORT_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}
302EXPORT_SYMBOL_GPL(bcma_core_pci_down); 332EXPORT_SYMBOL_GPL(bcma_core_pci_down);