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

Adrian Chadd adrian at FreeBSD.org
Thu May 12 15:18:37 UTC 2016


Author: adrian
Date: Thu May 12 15:18:36 2016
New Revision: 299534
URL: https://svnweb.freebsd.org/changeset/base/299534

Log:
  [siba] add extra methods for chipcommon access and PLL configuration.
  
  This is needed by the PHY-N bwn(4) support.
  
  Obtained from:	Linux b43 (definitions)

Modified:
  head/sys/dev/siba/siba_core.c
  head/sys/dev/siba/sibareg.h
  head/sys/dev/siba/sibavar.h

Modified: head/sys/dev/siba/siba_core.c
==============================================================================
--- head/sys/dev/siba/siba_core.c	Thu May 12 14:41:53 2016	(r299533)
+++ head/sys/dev/siba/siba_core.c	Thu May 12 15:18:36 2016	(r299534)
@@ -2720,3 +2720,124 @@ siba_sprom_get_core_power_info(device_t 
 	return (0);
 }
 
+void
+siba_pmu_spuravoid_pllupdate(device_t dev, int spur_avoid)
+{
+	struct siba_dev_softc *sd = device_get_ivars(dev);
+	struct siba_softc *siba = sd->sd_bus;
+	struct siba_cc *scc;
+
+	scc = &siba->siba_cc;
+
+	if (scc->scc_dev == NULL) {
+		device_printf(dev, "%s: called; no pmu\n", __func__);
+		return;
+	}
+
+	switch (siba_get_chipid(dev)) {
+	case 0x4322:
+		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11100070);
+		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x1014140a);
+		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888854);
+		if (spur_avoid == 1)
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x05201828);
+		else
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x05001828);
+		break;
+	case 43222:
+		if (spur_avoid == 1) {
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11500008);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x0C000C06);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x0F600a08);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, 0x00000000);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL4, 0x2001E920);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888815);
+		} else {
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11100008);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x0c000c06);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x03000a08);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, 0x00000000);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL4, 0x200005c0);
+			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888855);
+		}
+		break;
+	default:
+		device_printf(dev,
+		    "%s: unknown spur avoidance settings for chip 0x%04x\n",
+		    __func__,
+		    siba_get_chipid(dev));
+		return;
+	}
+
+	/* Both chips above use the same update */
+	SIBA_CC_SET32(scc, SIBA_CC_PMUCTL, SIBA_CC_PMUCTL_PLL_UPD);
+}
+
+void
+siba_cc_set32(device_t dev, uint32_t reg, uint32_t val)
+{
+	struct siba_dev_softc *sd = device_get_ivars(dev);
+	struct siba_softc *siba = sd->sd_bus;
+	struct siba_cc *scc;
+
+	scc = &siba->siba_cc;
+
+	if (scc->scc_dev == NULL) {
+		device_printf(dev, "%s: called; no pmu\n", __func__);
+		return;
+	}
+
+	SIBA_CC_SET32(scc, reg, val);
+}
+
+void
+siba_cc_mask32(device_t dev, uint32_t reg, uint32_t mask)
+{
+	struct siba_dev_softc *sd = device_get_ivars(dev);
+	struct siba_softc *siba = sd->sd_bus;
+	struct siba_cc *scc;
+
+	scc = &siba->siba_cc;
+
+	if (scc->scc_dev == NULL) {
+		device_printf(dev, "%s: called; no pmu\n", __func__);
+		return;
+	}
+
+	SIBA_CC_MASK32(scc, reg, mask);
+}
+
+uint32_t
+siba_cc_read32(device_t dev, uint32_t reg)
+{
+	struct siba_dev_softc *sd = device_get_ivars(dev);
+	struct siba_softc *siba = sd->sd_bus;
+	struct siba_cc *scc;
+
+	scc = &siba->siba_cc;
+
+	if (scc->scc_dev == NULL) {
+		device_printf(dev, "%s: called; no pmu\n", __func__);
+		return 0xffffffff;
+	}
+
+	return SIBA_CC_READ32(scc, reg);
+}
+
+void
+siba_cc_write32(device_t dev, uint32_t reg, uint32_t val)
+{
+	struct siba_dev_softc *sd = device_get_ivars(dev);
+	struct siba_softc *siba = sd->sd_bus;
+	struct siba_cc *scc;
+
+	scc = &siba->siba_cc;
+
+	if (scc->scc_dev == NULL) {
+		device_printf(dev, "%s: called; no pmu\n", __func__);
+		return;
+	}
+
+	SIBA_CC_WRITE32(scc, reg, val);
+}
+

Modified: head/sys/dev/siba/sibareg.h
==============================================================================
--- head/sys/dev/siba/sibareg.h	Thu May 12 14:41:53 2016	(r299533)
+++ head/sys/dev/siba/sibareg.h	Thu May 12 15:18:36 2016	(r299534)
@@ -81,6 +81,7 @@
 #define	SIBA_CC_UART0			0x0300		/* offset of UART0 */
 #define	SIBA_CC_UART1			0x0400		/* offset of UART1 */
 #define	SIBA_CC_PMUCTL			0x0600		/* PMU control */
+#define	SIBA_CC_PMUCTL_PLL_UPD		0x00000400
 #define	SIBA_CC_PMUCTL_ILP		0xffff0000	/* mask */
 #define	SIBA_CC_PMUCTL_NOILP		0x00000200
 #define	SIBA_CC_PMUCTL_XF		0x0000007c	/* crystal freq */
@@ -92,6 +93,8 @@
 #define	SIBA_CC_PMU_TABSEL		0x0620
 #define	SIBA_CC_PMU_DEPMSK		0x0624
 #define	SIBA_CC_PMU_UPDNTM		0x0628
+#define	SIBA_CC_CHIPCTL_ADDR		0x0650
+#define	SIBA_CC_CHIPCTL_DATA		0x0654
 #define	SIBA_CC_REGCTL_ADDR		0x0658
 #define	SIBA_CC_REGCTL_DATA		0x065c
 #define	SIBA_CC_PLLCTL_ADDR		0x0660
@@ -109,11 +112,13 @@
 #define	SIBA_CC_PMU1_PLL0		0
 #define	SIBA_CC_PMU1_PLL0_P1DIV		0x00f00000
 #define	SIBA_CC_PMU1_PLL0_P2DIV		0x0f000000
+#define	SIBA_CC_PMU1_PLL1		1
 #define	SIBA_CC_PMU1_PLL2		2
 #define	SIBA_CC_PMU1_PLL2_NDIVMODE	0x000e0000
 #define	SIBA_CC_PMU1_PLL2_NDIVINT	0x1ff00000
 #define	SIBA_CC_PMU1_PLL3		3
 #define	SIBA_CC_PMU1_PLL3_NDIVFRAC	0x00ffffff
+#define	SIBA_CC_PMU1_PLL4		4
 #define	SIBA_CC_PMU1_PLL5		5
 #define	SIBA_CC_PMU1_PLL5_CLKDRV	0xffffff00
 

Modified: head/sys/dev/siba/sibavar.h
==============================================================================
--- head/sys/dev/siba/sibavar.h	Thu May 12 14:41:53 2016	(r299533)
+++ head/sys/dev/siba/sibavar.h	Thu May 12 15:18:36 2016	(r299534)
@@ -611,5 +611,10 @@ uint32_t	siba_gpio_get(device_t);
 void		siba_fix_imcfglobug(device_t);
 int		siba_sprom_get_core_power_info(device_t, int,
 		    struct siba_sprom_core_pwr_info *);
+void		siba_pmu_spuravoid_pllupdate(device_t, int);
+void		siba_cc_set32(device_t dev, uint32_t, uint32_t);
+void		siba_cc_mask32(device_t dev, uint32_t, uint32_t);
+uint32_t	siba_cc_read32(device_t dev, uint32_t);
+void		siba_cc_write32(device_t dev, uint32_t, uint32_t);
 
 #endif /* _SIBA_SIBAVAR_H_ */


More information about the svn-src-head mailing list