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_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to