You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Conflicts: drivers/net/wireless/libertas/if_cs.c drivers/net/wireless/rtlwifi/pci.c net/bluetooth/l2cap_sock.c
This commit is contained in:
@@ -46,40 +46,66 @@ void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
|
||||
if (!ccdev)
|
||||
return;
|
||||
bus = ccdev->bus;
|
||||
|
||||
/* We support SLOW only on 6..9 */
|
||||
if (ccdev->id.revision >= 10 && mode == SSB_CLKMODE_SLOW)
|
||||
mode = SSB_CLKMODE_DYNAMIC;
|
||||
|
||||
if (cc->capabilities & SSB_CHIPCO_CAP_PMU)
|
||||
return; /* PMU controls clockmode, separated function needed */
|
||||
SSB_WARN_ON(ccdev->id.revision >= 20);
|
||||
|
||||
/* chipcommon cores prior to rev6 don't support dynamic clock control */
|
||||
if (ccdev->id.revision < 6)
|
||||
return;
|
||||
/* chipcommon cores rev10 are a whole new ball game */
|
||||
|
||||
/* ChipCommon cores rev10+ need testing */
|
||||
if (ccdev->id.revision >= 10)
|
||||
return;
|
||||
|
||||
if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
|
||||
return;
|
||||
|
||||
switch (mode) {
|
||||
case SSB_CLKMODE_SLOW:
|
||||
case SSB_CLKMODE_SLOW: /* For revs 6..9 only */
|
||||
tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
|
||||
tmp |= SSB_CHIPCO_SLOWCLKCTL_FSLOW;
|
||||
chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
|
||||
break;
|
||||
case SSB_CLKMODE_FAST:
|
||||
ssb_pci_xtal(bus, SSB_GPIO_XTAL, 1); /* Force crystal on */
|
||||
tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
|
||||
tmp |= SSB_CHIPCO_SLOWCLKCTL_IPLL;
|
||||
chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
|
||||
if (ccdev->id.revision < 10) {
|
||||
ssb_pci_xtal(bus, SSB_GPIO_XTAL, 1); /* Force crystal on */
|
||||
tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
|
||||
tmp |= SSB_CHIPCO_SLOWCLKCTL_IPLL;
|
||||
chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
|
||||
} else {
|
||||
chipco_write32(cc, SSB_CHIPCO_SYSCLKCTL,
|
||||
(chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL) |
|
||||
SSB_CHIPCO_SYSCLKCTL_FORCEHT));
|
||||
/* udelay(150); TODO: not available in early init */
|
||||
}
|
||||
break;
|
||||
case SSB_CLKMODE_DYNAMIC:
|
||||
tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_IPLL;
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
|
||||
if ((tmp & SSB_CHIPCO_SLOWCLKCTL_SRC) != SSB_CHIPCO_SLOWCLKCTL_SRC_XTAL)
|
||||
tmp |= SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
|
||||
chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
|
||||
if (ccdev->id.revision < 10) {
|
||||
tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_IPLL;
|
||||
tmp &= ~SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
|
||||
if ((tmp & SSB_CHIPCO_SLOWCLKCTL_SRC) !=
|
||||
SSB_CHIPCO_SLOWCLKCTL_SRC_XTAL)
|
||||
tmp |= SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
|
||||
chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
|
||||
|
||||
/* for dynamic control, we have to release our xtal_pu "force on" */
|
||||
if (tmp & SSB_CHIPCO_SLOWCLKCTL_ENXTAL)
|
||||
ssb_pci_xtal(bus, SSB_GPIO_XTAL, 0);
|
||||
/* For dynamic control, we have to release our xtal_pu
|
||||
* "force on" */
|
||||
if (tmp & SSB_CHIPCO_SLOWCLKCTL_ENXTAL)
|
||||
ssb_pci_xtal(bus, SSB_GPIO_XTAL, 0);
|
||||
} else {
|
||||
chipco_write32(cc, SSB_CHIPCO_SYSCLKCTL,
|
||||
(chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL) &
|
||||
~SSB_CHIPCO_SYSCLKCTL_FORCEHT));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SSB_WARN_ON(1);
|
||||
@@ -260,6 +286,12 @@ void ssb_chipcommon_init(struct ssb_chipcommon *cc)
|
||||
if (cc->dev->id.revision >= 11)
|
||||
cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT);
|
||||
ssb_dprintk(KERN_INFO PFX "chipcommon status is 0x%x\n", cc->status);
|
||||
|
||||
if (cc->dev->id.revision >= 20) {
|
||||
chipco_write32(cc, SSB_CHIPCO_GPIOPULLUP, 0);
|
||||
chipco_write32(cc, SSB_CHIPCO_GPIOPULLDOWN, 0);
|
||||
}
|
||||
|
||||
ssb_pmu_init(cc);
|
||||
chipco_powercontrol_init(cc);
|
||||
ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
|
||||
|
||||
@@ -423,6 +423,8 @@ static void ssb_pmu_resources_init(struct ssb_chipcommon *cc)
|
||||
|
||||
switch (bus->chip_id) {
|
||||
case 0x4312:
|
||||
min_msk = 0xCBB;
|
||||
break;
|
||||
case 0x4322:
|
||||
/* We keep the default settings:
|
||||
* min_msk = 0xCBB
|
||||
|
||||
@@ -21,6 +21,8 @@ static u16 ssb_pcie_mdio_read(struct ssb_pcicore *pc, u8 device, u8 address);
|
||||
static void ssb_pcie_mdio_write(struct ssb_pcicore *pc, u8 device,
|
||||
u8 address, u16 data);
|
||||
|
||||
static void ssb_commit_settings(struct ssb_bus *bus);
|
||||
|
||||
static inline
|
||||
u32 pcicore_read32(struct ssb_pcicore *pc, u16 offset)
|
||||
{
|
||||
@@ -412,6 +414,16 @@ static int pcicore_is_in_hostmode(struct ssb_pcicore *pc)
|
||||
* Workarounds.
|
||||
**************************************************/
|
||||
|
||||
static void ssb_pcicore_fix_sprom_core_index(struct ssb_pcicore *pc)
|
||||
{
|
||||
u16 tmp = pcicore_read16(pc, SSB_PCICORE_SPROM(0));
|
||||
if (((tmp & 0xF000) >> 12) != pc->dev->core_index) {
|
||||
tmp &= ~0xF000;
|
||||
tmp |= (pc->dev->core_index << 12);
|
||||
pcicore_write16(pc, SSB_PCICORE_SPROM(0), tmp);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 ssb_pcicore_polarity_workaround(struct ssb_pcicore *pc)
|
||||
{
|
||||
return (ssb_pcie_read(pc, 0x204) & 0x10) ? 0xC0 : 0x80;
|
||||
@@ -430,6 +442,76 @@ static void ssb_pcicore_serdes_workaround(struct ssb_pcicore *pc)
|
||||
ssb_pcie_mdio_write(pc, serdes_pll_device, 1, tmp & ~0x4000);
|
||||
}
|
||||
|
||||
static void ssb_pcicore_pci_setup_workarounds(struct ssb_pcicore *pc)
|
||||
{
|
||||
struct ssb_device *pdev = pc->dev;
|
||||
struct ssb_bus *bus = pdev->bus;
|
||||
u32 tmp;
|
||||
|
||||
tmp = pcicore_read32(pc, SSB_PCICORE_SBTOPCI2);
|
||||
tmp |= SSB_PCICORE_SBTOPCI_PREF;
|
||||
tmp |= SSB_PCICORE_SBTOPCI_BURST;
|
||||
pcicore_write32(pc, SSB_PCICORE_SBTOPCI2, tmp);
|
||||
|
||||
if (pdev->id.revision < 5) {
|
||||
tmp = ssb_read32(pdev, SSB_IMCFGLO);
|
||||
tmp &= ~SSB_IMCFGLO_SERTO;
|
||||
tmp |= 2;
|
||||
tmp &= ~SSB_IMCFGLO_REQTO;
|
||||
tmp |= 3 << SSB_IMCFGLO_REQTO_SHIFT;
|
||||
ssb_write32(pdev, SSB_IMCFGLO, tmp);
|
||||
ssb_commit_settings(bus);
|
||||
} else if (pdev->id.revision >= 11) {
|
||||
tmp = pcicore_read32(pc, SSB_PCICORE_SBTOPCI2);
|
||||
tmp |= SSB_PCICORE_SBTOPCI_MRM;
|
||||
pcicore_write32(pc, SSB_PCICORE_SBTOPCI2, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc)
|
||||
{
|
||||
u32 tmp;
|
||||
u8 rev = pc->dev->id.revision;
|
||||
|
||||
if (rev == 0 || rev == 1) {
|
||||
/* TLP Workaround register. */
|
||||
tmp = ssb_pcie_read(pc, 0x4);
|
||||
tmp |= 0x8;
|
||||
ssb_pcie_write(pc, 0x4, tmp);
|
||||
}
|
||||
if (rev == 1) {
|
||||
/* DLLP Link Control register. */
|
||||
tmp = ssb_pcie_read(pc, 0x100);
|
||||
tmp |= 0x40;
|
||||
ssb_pcie_write(pc, 0x100, tmp);
|
||||
}
|
||||
|
||||
if (rev == 0) {
|
||||
const u8 serdes_rx_device = 0x1F;
|
||||
|
||||
ssb_pcie_mdio_write(pc, serdes_rx_device,
|
||||
2 /* Timer */, 0x8128);
|
||||
ssb_pcie_mdio_write(pc, serdes_rx_device,
|
||||
6 /* CDR */, 0x0100);
|
||||
ssb_pcie_mdio_write(pc, serdes_rx_device,
|
||||
7 /* CDR BW */, 0x1466);
|
||||
} else if (rev == 3 || rev == 4 || rev == 5) {
|
||||
/* TODO: DLLP Power Management Threshold */
|
||||
ssb_pcicore_serdes_workaround(pc);
|
||||
/* TODO: ASPM */
|
||||
} else if (rev == 7) {
|
||||
/* TODO: No PLL down */
|
||||
}
|
||||
|
||||
if (rev >= 6) {
|
||||
/* Miscellaneous Configuration Fixup */
|
||||
tmp = pcicore_read16(pc, SSB_PCICORE_SPROM(5));
|
||||
if (!(tmp & 0x8000))
|
||||
pcicore_write16(pc, SSB_PCICORE_SPROM(5),
|
||||
tmp | 0x8000);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
* Generic and Clientmode operation code.
|
||||
**************************************************/
|
||||
@@ -449,6 +531,8 @@ void ssb_pcicore_init(struct ssb_pcicore *pc)
|
||||
if (!ssb_device_is_enabled(dev))
|
||||
ssb_device_enable(dev, 0);
|
||||
|
||||
ssb_pcicore_fix_sprom_core_index(pc);
|
||||
|
||||
#ifdef CONFIG_SSB_PCICORE_HOSTMODE
|
||||
pc->hostmode = pcicore_is_in_hostmode(pc);
|
||||
if (pc->hostmode)
|
||||
@@ -457,7 +541,10 @@ void ssb_pcicore_init(struct ssb_pcicore *pc)
|
||||
if (!pc->hostmode)
|
||||
ssb_pcicore_init_clientmode(pc);
|
||||
|
||||
/* Additional always once-executed workarounds */
|
||||
ssb_pcicore_serdes_workaround(pc);
|
||||
/* TODO: ASPM */
|
||||
/* TODO: Clock Request Update */
|
||||
}
|
||||
|
||||
static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address)
|
||||
@@ -522,7 +609,7 @@ static u16 ssb_pcie_mdio_read(struct ssb_pcicore *pc, u8 device, u8 address)
|
||||
pcicore_write32(pc, mdio_data, v);
|
||||
/* Wait for the device to complete the transaction */
|
||||
udelay(10);
|
||||
for (i = 0; i < 200; i++) {
|
||||
for (i = 0; i < max_retries; i++) {
|
||||
v = pcicore_read32(pc, mdio_control);
|
||||
if (v & 0x100 /* Trans complete */) {
|
||||
udelay(10);
|
||||
@@ -646,48 +733,10 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc,
|
||||
if (pc->setup_done)
|
||||
goto out;
|
||||
if (pdev->id.coreid == SSB_DEV_PCI) {
|
||||
tmp = pcicore_read32(pc, SSB_PCICORE_SBTOPCI2);
|
||||
tmp |= SSB_PCICORE_SBTOPCI_PREF;
|
||||
tmp |= SSB_PCICORE_SBTOPCI_BURST;
|
||||
pcicore_write32(pc, SSB_PCICORE_SBTOPCI2, tmp);
|
||||
|
||||
if (pdev->id.revision < 5) {
|
||||
tmp = ssb_read32(pdev, SSB_IMCFGLO);
|
||||
tmp &= ~SSB_IMCFGLO_SERTO;
|
||||
tmp |= 2;
|
||||
tmp &= ~SSB_IMCFGLO_REQTO;
|
||||
tmp |= 3 << SSB_IMCFGLO_REQTO_SHIFT;
|
||||
ssb_write32(pdev, SSB_IMCFGLO, tmp);
|
||||
ssb_commit_settings(bus);
|
||||
} else if (pdev->id.revision >= 11) {
|
||||
tmp = pcicore_read32(pc, SSB_PCICORE_SBTOPCI2);
|
||||
tmp |= SSB_PCICORE_SBTOPCI_MRM;
|
||||
pcicore_write32(pc, SSB_PCICORE_SBTOPCI2, tmp);
|
||||
}
|
||||
ssb_pcicore_pci_setup_workarounds(pc);
|
||||
} else {
|
||||
WARN_ON(pdev->id.coreid != SSB_DEV_PCIE);
|
||||
//TODO: Better make defines for all these magic PCIE values.
|
||||
if ((pdev->id.revision == 0) || (pdev->id.revision == 1)) {
|
||||
/* TLP Workaround register. */
|
||||
tmp = ssb_pcie_read(pc, 0x4);
|
||||
tmp |= 0x8;
|
||||
ssb_pcie_write(pc, 0x4, tmp);
|
||||
}
|
||||
if (pdev->id.revision == 0) {
|
||||
const u8 serdes_rx_device = 0x1F;
|
||||
|
||||
ssb_pcie_mdio_write(pc, serdes_rx_device,
|
||||
2 /* Timer */, 0x8128);
|
||||
ssb_pcie_mdio_write(pc, serdes_rx_device,
|
||||
6 /* CDR */, 0x0100);
|
||||
ssb_pcie_mdio_write(pc, serdes_rx_device,
|
||||
7 /* CDR BW */, 0x1466);
|
||||
} else if (pdev->id.revision == 1) {
|
||||
/* DLLP Link Control register. */
|
||||
tmp = ssb_pcie_read(pc, 0x100);
|
||||
tmp |= 0x40;
|
||||
ssb_pcie_write(pc, 0x100, tmp);
|
||||
}
|
||||
ssb_pcicore_pcie_setup_workarounds(pc);
|
||||
}
|
||||
pc->setup_done = 1;
|
||||
out:
|
||||
|
||||
+11
-12
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user