svn commit: r300184 - head/sys/dev/siba

Adrian Chadd adrian at FreeBSD.org
Thu May 19 04:11:01 UTC 2016


Author: adrian
Date: Thu May 19 04:11:00 2016
New Revision: 300184
URL: https://svnweb.freebsd.org/changeset/base/300184

Log:
  [siba] implement PMU behaviour for chips with a separate PMU module.
  
  * PMU controls the clock setup
  * Correctly set idle low power handling
  * Use a hard-coded powerup delay for some of the newer hardware
    (including the BCM4322, which I've tested with.)
  
  Tested:
  
  * BCM4322, 2G + 5G STA mode
  
  Obtained from:	Linux b43 (PMU behaviour)

Modified:
  head/sys/dev/siba/siba_core.c

Modified: head/sys/dev/siba/siba_core.c
==============================================================================
--- head/sys/dev/siba/siba_core.c	Thu May 19 04:03:41 2016	(r300183)
+++ head/sys/dev/siba/siba_core.c	Thu May 19 04:11:00 2016	(r300184)
@@ -774,6 +774,13 @@ siba_cc_clock(struct siba_cc *scc, enum 
 	if (sd == NULL)
 		return;
 	siba = sd->sd_bus;
+
+	/*
+	 * PMU controls clockmode; separate function is needed
+	 */
+	if (scc->scc_caps & SIBA_CC_CAPS_PMU)
+		return;
+
 	/*
 	 * chipcommon < r6 (no dynamic clock control)
 	 * chipcommon >= r10 (unknown)
@@ -930,6 +937,7 @@ siba_cc_pmu_init(struct siba_cc *scc)
 	DPRINTF(siba, SIBA_DEBUG_PMU, "PMU(r%u) found (caps %#x)\n",
 	    scc->scc_pmu.rev, pmucap);
 
+#if 0
 	if (scc->scc_pmu.rev >= 1) {
 		if (siba->siba_chiprev < 2 && siba->siba_chipid == 0x4325)
 			SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL,
@@ -938,6 +946,12 @@ siba_cc_pmu_init(struct siba_cc *scc)
 			SIBA_CC_SET32(scc, SIBA_CC_PMUCTL,
 			    SIBA_CC_PMUCTL_NOILP);
 	}
+#endif
+	if (scc->scc_pmu.rev == 1) {
+		SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL, ~SIBA_CC_PMUCTL_NOILP);
+	} else {
+		SIBA_CC_SET32(scc, SIBA_CC_PMUCTL, SIBA_CC_PMUCTL_NOILP);
+	}
 
 	/* initialize PLL & PMU resources */
 	switch (siba->siba_chipid) {
@@ -1070,8 +1084,22 @@ siba_cc_powerup_delay(struct siba_cc *sc
 	struct siba_softc *siba = scc->scc_dev->sd_bus;
 	int min;
 
-	if (siba->siba_type != SIBA_TYPE_PCI ||
-	    !(scc->scc_caps & SIBA_CC_CAPS_PWCTL))
+	if (siba->siba_type != SIBA_TYPE_PCI)
+		return;
+
+	if (scc->scc_caps & SIBA_CC_CAPS_PMU) {
+		if ((siba->siba_chipid == 0x4312) ||
+		    (siba->siba_chipid == 0x4322) ||
+		    (siba->siba_chipid == 0x4328)) {
+			scc->scc_powerup_delay = 7000;
+		} else {
+			/* 0x4325 is marked as TODO */
+			scc->scc_powerup_delay = 15000;
+		}
+		return;
+	}
+
+	if (!(scc->scc_caps & SIBA_CC_CAPS_PWCTL))
 		return;
 
 	min = siba_cc_clockfreq(scc, 0);


More information about the svn-src-head mailing list