diff options
Diffstat (limited to 'drivers/ssb/driver_chipcommon_pmu.c')
| -rw-r--r-- | drivers/ssb/driver_chipcommon_pmu.c | 29 | 
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c index 4c0f6d883dd..7b0bce93676 100644 --- a/drivers/ssb/driver_chipcommon_pmu.c +++ b/drivers/ssb/driver_chipcommon_pmu.c @@ -675,3 +675,32 @@ u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc)  		return 0;  	}  } + +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid) +{ +	u32 pmu_ctl = 0; + +	switch (cc->dev->bus->chip_id) { +	case 0x4322: +		ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11100070); +		ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x1014140a); +		ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888854); +		if (spuravoid == 1) +			ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05201828); +		else +			ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05001828); +		pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD; +		break; +	case 43222: +		/* TODO: BCM43222 requires updating PLLs too */ +		return; +	default: +		ssb_printk(KERN_ERR PFX +			   "Unknown spuravoidance settings for chip 0x%04X, not changing PLL\n", +			   cc->dev->bus->chip_id); +		return; +	} + +	chipco_set32(cc, SSB_CHIPCO_PMU_CTL, pmu_ctl); +} +EXPORT_SYMBOL_GPL(ssb_pmu_spuravoid_pllupdate);  |