diff options
-rw-r--r-- | drivers/bcma/driver_chipcommon_pmu.c | 20 | ||||
-rw-r--r-- | drivers/bcma/sprom.c | 6 | ||||
-rw-r--r-- | include/linux/bcma/bcma_driver_chipcommon.h | 18 |
3 files changed, 43 insertions, 1 deletions
diff --git a/drivers/bcma/driver_chipcommon_pmu.c b/drivers/bcma/driver_chipcommon_pmu.c index 5940c81e7e12..4bc10aa57bd4 100644 --- a/drivers/bcma/driver_chipcommon_pmu.c +++ b/drivers/bcma/driver_chipcommon_pmu.c | |||
@@ -90,6 +90,24 @@ void bcma_pmu_swreg_init(struct bcma_drv_cc *cc) | |||
90 | } | 90 | } |
91 | } | 91 | } |
92 | 92 | ||
93 | /* Disable to allow reading SPROM. Don't know the adventages of enabling it. */ | ||
94 | void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable) | ||
95 | { | ||
96 | struct bcma_bus *bus = cc->core->bus; | ||
97 | u32 val; | ||
98 | |||
99 | val = bcma_cc_read32(cc, BCMA_CC_CHIPCTL); | ||
100 | if (enable) { | ||
101 | val |= BCMA_CHIPCTL_4331_EXTPA_EN; | ||
102 | if (bus->chipinfo.pkg == 9 || bus->chipinfo.pkg == 11) | ||
103 | val |= BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5; | ||
104 | } else { | ||
105 | val &= ~BCMA_CHIPCTL_4331_EXTPA_EN; | ||
106 | val &= ~BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5; | ||
107 | } | ||
108 | bcma_cc_write32(cc, BCMA_CC_CHIPCTL, val); | ||
109 | } | ||
110 | |||
93 | void bcma_pmu_workarounds(struct bcma_drv_cc *cc) | 111 | void bcma_pmu_workarounds(struct bcma_drv_cc *cc) |
94 | { | 112 | { |
95 | struct bcma_bus *bus = cc->core->bus; | 113 | struct bcma_bus *bus = cc->core->bus; |
@@ -99,7 +117,7 @@ void bcma_pmu_workarounds(struct bcma_drv_cc *cc) | |||
99 | bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x7); | 117 | bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x7); |
100 | break; | 118 | break; |
101 | case 0x4331: | 119 | case 0x4331: |
102 | pr_err("Enabling Ext PA lines not implemented\n"); | 120 | /* BCM4331 workaround is SPROM-related, we put it in sprom.c */ |
103 | break; | 121 | break; |
104 | case 43224: | 122 | case 43224: |
105 | if (bus->chipinfo.rev == 0) { | 123 | if (bus->chipinfo.rev == 0) { |
diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c index 8b5b7856abe3..166ed13ec066 100644 --- a/drivers/bcma/sprom.c +++ b/drivers/bcma/sprom.c | |||
@@ -152,6 +152,9 @@ int bcma_sprom_get(struct bcma_bus *bus) | |||
152 | if (!sprom) | 152 | if (!sprom) |
153 | return -ENOMEM; | 153 | return -ENOMEM; |
154 | 154 | ||
155 | if (bus->chipinfo.id == 0x4331) | ||
156 | bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false); | ||
157 | |||
155 | /* Most cards have SPROM moved by additional offset 0x30 (48 dwords). | 158 | /* Most cards have SPROM moved by additional offset 0x30 (48 dwords). |
156 | * According to brcm80211 this applies to cards with PCIe rev >= 6 | 159 | * According to brcm80211 this applies to cards with PCIe rev >= 6 |
157 | * TODO: understand this condition and use it */ | 160 | * TODO: understand this condition and use it */ |
@@ -159,6 +162,9 @@ int bcma_sprom_get(struct bcma_bus *bus) | |||
159 | BCMA_CC_SPROM_PCIE6; | 162 | BCMA_CC_SPROM_PCIE6; |
160 | bcma_sprom_read(bus, offset, sprom); | 163 | bcma_sprom_read(bus, offset, sprom); |
161 | 164 | ||
165 | if (bus->chipinfo.id == 0x4331) | ||
166 | bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true); | ||
167 | |||
162 | err = bcma_sprom_valid(sprom); | 168 | err = bcma_sprom_valid(sprom); |
163 | if (err) | 169 | if (err) |
164 | goto out; | 170 | goto out; |
diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 6083725dd22e..a7ae33d06f24 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h | |||
@@ -283,6 +283,22 @@ | |||
283 | #define BCMA_CC_PPL_PCHI_OFF 5 | 283 | #define BCMA_CC_PPL_PCHI_OFF 5 |
284 | #define BCMA_CC_PPL_PCHI_MASK 0x0000003f | 284 | #define BCMA_CC_PPL_PCHI_MASK 0x0000003f |
285 | 285 | ||
286 | /* BCM4331 ChipControl numbers. */ | ||
287 | #define BCMA_CHIPCTL_4331_BT_COEXIST BIT(0) /* 0 disable */ | ||
288 | #define BCMA_CHIPCTL_4331_SECI BIT(1) /* 0 SECI is disabled (JATG functional) */ | ||
289 | #define BCMA_CHIPCTL_4331_EXT_LNA BIT(2) /* 0 disable */ | ||
290 | #define BCMA_CHIPCTL_4331_SPROM_GPIO13_15 BIT(3) /* sprom/gpio13-15 mux */ | ||
291 | #define BCMA_CHIPCTL_4331_EXTPA_EN BIT(4) /* 0 ext pa disable, 1 ext pa enabled */ | ||
292 | #define BCMA_CHIPCTL_4331_GPIOCLK_ON_SPROMCS BIT(5) /* set drive out GPIO_CLK on sprom_cs pin */ | ||
293 | #define BCMA_CHIPCTL_4331_PCIE_MDIO_ON_SPROMCS BIT(6) /* use sprom_cs pin as PCIE mdio interface */ | ||
294 | #define BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5 BIT(7) /* aband extpa will be at gpio2/5 and sprom_dout */ | ||
295 | #define BCMA_CHIPCTL_4331_OVR_PIPEAUXCLKEN BIT(8) /* override core control on pipe_AuxClkEnable */ | ||
296 | #define BCMA_CHIPCTL_4331_OVR_PIPEAUXPWRDOWN BIT(9) /* override core control on pipe_AuxPowerDown */ | ||
297 | #define BCMA_CHIPCTL_4331_PCIE_AUXCLKEN BIT(10) /* pcie_auxclkenable */ | ||
298 | #define BCMA_CHIPCTL_4331_PCIE_PIPE_PLLDOWN BIT(11) /* pcie_pipe_pllpowerdown */ | ||
299 | #define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4 BIT(16) /* enable bt_shd0 at gpio4 */ | ||
300 | #define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5 BIT(17) /* enable bt_shd1 at gpio5 */ | ||
301 | |||
286 | /* Data for the PMU, if available. | 302 | /* Data for the PMU, if available. |
287 | * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) | 303 | * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) |
288 | */ | 304 | */ |
@@ -342,6 +358,8 @@ extern void bcma_core_chipcommon_init(struct bcma_drv_cc *cc); | |||
342 | extern void bcma_chipco_suspend(struct bcma_drv_cc *cc); | 358 | extern void bcma_chipco_suspend(struct bcma_drv_cc *cc); |
343 | extern void bcma_chipco_resume(struct bcma_drv_cc *cc); | 359 | extern void bcma_chipco_resume(struct bcma_drv_cc *cc); |
344 | 360 | ||
361 | void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); | ||
362 | |||
345 | extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, | 363 | extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, |
346 | u32 ticks); | 364 | u32 ticks); |
347 | 365 | ||