diff options
Diffstat (limited to 'drivers/ssb/main.c')
| -rw-r--r-- | drivers/ssb/main.c | 54 | 
1 files changed, 42 insertions, 12 deletions
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index e05ba6eefc7..f8a13f86321 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c @@ -1117,23 +1117,22 @@ static u32 ssb_tmslow_reject_bitmask(struct ssb_device *dev)  {  	u32 rev = ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_SSBREV; -	/* The REJECT bit changed position in TMSLOW between -	 * Backplane revisions. */ +	/* The REJECT bit seems to be different for Backplane rev 2.3 */  	switch (rev) {  	case SSB_IDLOW_SSBREV_22: -		return SSB_TMSLOW_REJECT_22; +	case SSB_IDLOW_SSBREV_24: +	case SSB_IDLOW_SSBREV_26: +		return SSB_TMSLOW_REJECT;  	case SSB_IDLOW_SSBREV_23:  		return SSB_TMSLOW_REJECT_23; -	case SSB_IDLOW_SSBREV_24:     /* TODO - find the proper REJECT bits */ -	case SSB_IDLOW_SSBREV_25:     /* same here */ -	case SSB_IDLOW_SSBREV_26:     /* same here */ +	case SSB_IDLOW_SSBREV_25:     /* TODO - find the proper REJECT bit */  	case SSB_IDLOW_SSBREV_27:     /* same here */ -		return SSB_TMSLOW_REJECT_23;	/* this is a guess */ +		return SSB_TMSLOW_REJECT;	/* this is a guess */  	default:  		printk(KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);  		WARN_ON(1);  	} -	return (SSB_TMSLOW_REJECT_22 | SSB_TMSLOW_REJECT_23); +	return (SSB_TMSLOW_REJECT | SSB_TMSLOW_REJECT_23);  }  int ssb_device_is_enabled(struct ssb_device *dev) @@ -1309,20 +1308,20 @@ EXPORT_SYMBOL(ssb_bus_may_powerdown);  int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl)  { -	struct ssb_chipcommon *cc;  	int err;  	enum ssb_clkmode mode;  	err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);  	if (err)  		goto error; -	cc = &bus->chipco; -	mode = dynamic_pctl ? SSB_CLKMODE_DYNAMIC : SSB_CLKMODE_FAST; -	ssb_chipco_set_clockmode(cc, mode);  #ifdef CONFIG_SSB_DEBUG  	bus->powered_up = 1;  #endif + +	mode = dynamic_pctl ? SSB_CLKMODE_DYNAMIC : SSB_CLKMODE_FAST; +	ssb_chipco_set_clockmode(&bus->chipco, mode); +  	return 0;  error:  	ssb_printk(KERN_ERR PFX "Bus powerup failed\n"); @@ -1330,6 +1329,37 @@ error:  }  EXPORT_SYMBOL(ssb_bus_powerup); +static void ssb_broadcast_value(struct ssb_device *dev, +				u32 address, u32 data) +{ +#ifdef CONFIG_SSB_DRIVER_PCICORE +	/* This is used for both, PCI and ChipCommon core, so be careful. */ +	BUILD_BUG_ON(SSB_PCICORE_BCAST_ADDR != SSB_CHIPCO_BCAST_ADDR); +	BUILD_BUG_ON(SSB_PCICORE_BCAST_DATA != SSB_CHIPCO_BCAST_DATA); +#endif + +	ssb_write32(dev, SSB_CHIPCO_BCAST_ADDR, address); +	ssb_read32(dev, SSB_CHIPCO_BCAST_ADDR); /* flush */ +	ssb_write32(dev, SSB_CHIPCO_BCAST_DATA, data); +	ssb_read32(dev, SSB_CHIPCO_BCAST_DATA); /* flush */ +} + +void ssb_commit_settings(struct ssb_bus *bus) +{ +	struct ssb_device *dev; + +#ifdef CONFIG_SSB_DRIVER_PCICORE +	dev = bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev; +#else +	dev = bus->chipco.dev; +#endif +	if (WARN_ON(!dev)) +		return; +	/* This forces an update of the cached registers. */ +	ssb_broadcast_value(dev, 0xFD8, 0); +} +EXPORT_SYMBOL(ssb_commit_settings); +  u32 ssb_admatch_base(u32 adm)  {  	u32 base = 0;  |