diff options
Diffstat (limited to 'drivers/bcma/driver_pci.c')
-rw-r--r-- | drivers/bcma/driver_pci.c | 65 |
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 | ||
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 | **************************************************/ |
@@ -262,7 +288,7 @@ out: | |||
262 | } | 288 | } |
263 | EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl); | 289 | EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl); |
264 | 290 | ||
265 | void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend) | 291 | static 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 | } |
277 | EXPORT_SYMBOL_GPL(bcma_core_pci_extend_L1timer); | 303 | |
304 | void 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 | } | ||
317 | EXPORT_SYMBOL_GPL(bcma_core_pci_up); | ||
318 | |||
319 | void 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 | } | ||
332 | EXPORT_SYMBOL_GPL(bcma_core_pci_down); | ||