aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bcma/driver_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/bcma/driver_pci.c')
-rw-r--r--drivers/bcma/driver_pci.c65
1 files changed, 60 insertions, 5 deletions
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index cf7a476a519f..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 **************************************************/
@@ -262,7 +288,7 @@ out:
262} 288}
263EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl); 289EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl);
264 290
265void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend) 291static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
266{ 292{
267 u32 w; 293 u32 w;
268 294
@@ -274,4 +300,33 @@ void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
274 bcma_pcie_write(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG, w); 300 bcma_pcie_write(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG, w);
275 bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG); 301 bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG);
276} 302}
277EXPORT_SYMBOL_GPL(bcma_core_pci_extend_L1timer); 303
304void bcma_core_pci_up(struct bcma_bus *bus)
305{
306 struct bcma_drv_pci *pc;
307
308 if (bus->hosttype != BCMA_HOSTTYPE_PCI)
309 return;
310
311 pc = &bus->drv_pci[0];
312
313 bcma_core_pci_power_save(pc, true);
314
315 bcma_core_pci_extend_L1timer(pc, true);
316}
317EXPORT_SYMBOL_GPL(bcma_core_pci_up);
318
319void bcma_core_pci_down(struct bcma_bus *bus)
320{
321 struct bcma_drv_pci *pc;
322
323 if (bus->hosttype != BCMA_HOSTTYPE_PCI)
324 return;
325
326 pc = &bus->drv_pci[0];
327
328 bcma_core_pci_extend_L1timer(pc, false);
329
330 bcma_core_pci_power_save(pc, false);
331}
332EXPORT_SYMBOL_GPL(bcma_core_pci_down);