aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/bcma/driver_chipcommon_pmu.c20
-rw-r--r--drivers/bcma/sprom.c6
-rw-r--r--include/linux/bcma/bcma_driver_chipcommon.h18
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. */
94void 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
93void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 111void 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);
342extern void bcma_chipco_suspend(struct bcma_drv_cc *cc); 358extern void bcma_chipco_suspend(struct bcma_drv_cc *cc);
343extern void bcma_chipco_resume(struct bcma_drv_cc *cc); 359extern void bcma_chipco_resume(struct bcma_drv_cc *cc);
344 360
361void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable);
362
345extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, 363extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc,
346 u32 ticks); 364 u32 ticks);
347 365