[PATCH] ssb: Implement fast powerup delay calculation
Gábor Stefanik
netrolller.3d at gmail.com
Sat May 1 12:29:06 EDT 2010
Implement fast powerup delay calculation, as described
in the recently updated specs. The 4325 part is coming soon.
Signed-off-by: Gábor Stefanik<netrolller.3d at gmail.com>
---
To people experiencing DMA errors: please test this patch, it touches
the PMU code, one of the suspected problem areas.
I'm submitting this patch using Thunderbird 3; so I cannot be held liable
if it gets damaged in transit. Blame Mozilla. :-)
Index: wireless-testing/drivers/ssb/driver_chipcommon.c
===================================================================
--- wireless-testing.orig/drivers/ssb/driver_chipcommon.c
+++ wireless-testing/drivers/ssb/driver_chipcommon.c
@@ -209,7 +209,24 @@ static void chipco_powercontrol_init(str
}
}
-static void calc_fast_powerup_delay(struct ssb_chipcommon *cc)
+static u16 pmu_fast_powerup_delay(struct ssb_chipcommon *cc)
+{
+ struct ssb_bus *bus = cc->dev->bus;
+
+ switch (bus->chip_id) {
+ case 0x4312:
+ case 0x4322:
+ case 0x4328:
+ return 7000;
+ case 0x4325:
+ /* TODO: */
+ default:
+ break;
+ }
+ return 15000;
+}
+
+static u16 calc_fast_powerup_delay(struct ssb_chipcommon *cc)
{
struct ssb_bus *bus = cc->dev->bus;
int minfreq;
@@ -217,26 +234,33 @@ static void calc_fast_powerup_delay(stru
u32 pll_on_delay;
if (bus->bustype != SSB_BUSTYPE_PCI)
- return;
+ return 0;
+ if (cc->capabilities& SSB_CHIPCO_CAP_PMU)
+ return pmu_fast_powerup_delay(cc);
if (!(cc->capabilities& SSB_CHIPCO_CAP_PCTL))
- return;
+ return 0;
minfreq = chipco_pctl_clockfreqlimit(cc, 0);
pll_on_delay = chipco_read32(cc, SSB_CHIPCO_PLLONDELAY);
tmp = (((pll_on_delay + 2) * 1000000) + (minfreq - 1)) / minfreq;
SSB_WARN_ON(tmp& ~0xFFFF);
- cc->fast_pwrup_delay = tmp;
+ return tmp;
}
void ssb_chipcommon_init(struct ssb_chipcommon *cc)
{
+ u16 delay;
+
if (!cc->dev)
return; /* We don't have a ChipCommon */
ssb_pmu_init(cc);
chipco_powercontrol_init(cc);
ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
- calc_fast_powerup_delay(cc);
+ delay = calc_fast_powerup_delay(cc);
+ ssb_printk(KERN_INFO PFX "fast_pwrup_delay is %d\n", delay);
+ cc->fast_pwrup_delay = delay;
+ ssb_write16(cc->dev, SSB_MMIO_POWERUP_DELAY, delay);
}
void ssb_chipco_suspend(struct ssb_chipcommon *cc)
Index: wireless-testing/include/linux/ssb/ssb_regs.h
===================================================================
--- wireless-testing.orig/include/linux/ssb/ssb_regs.h
+++ wireless-testing/include/linux/ssb/ssb_regs.h
@@ -26,6 +26,7 @@
#define SSB_EUART (SSB_EXTIF_BASE + 0x00800000)
#define SSB_LED (SSB_EXTIF_BASE + 0x00900000)
+#define SSB_MMIO_POWERUP_DELAY 0x06A8
/* Enumeration space constants */
#define SSB_CORE_SIZE 0x1000 /* Size of a core MMIO area */
More information about the b43-dev
mailing list