Author: loos
Date: Fri Jul  3 18:39:25 2015
New Revision: 285106
URL: https://svnweb.freebsd.org/changeset/base/285106

Log:
  Add the routines to activate the GMAC clock and setup the GMAC mode.
  
  Tested on Cubieboard 2 and Banana pi.

Modified:
  head/sys/arm/allwinner/a10_clk.c
  head/sys/arm/allwinner/a10_clk.h

Modified: head/sys/arm/allwinner/a10_clk.c
==============================================================================
--- head/sys/arm/allwinner/a10_clk.c    Fri Jul  3 17:54:41 2015        
(r285105)
+++ head/sys/arm/allwinner/a10_clk.c    Fri Jul  3 18:39:25 2015        
(r285106)
@@ -182,6 +182,38 @@ a10_clk_emac_activate(void)
        return (0);
 }
 
+int
+a10_clk_gmac_activate(phandle_t node)
+{
+       char *phy_type;
+       struct a10_ccm_softc *sc;
+       uint32_t reg_value;
+
+       sc = a10_ccm_sc;
+       if (sc == NULL)
+               return (ENXIO);
+
+       /* Gating AHB clock for GMAC */
+       reg_value = ccm_read_4(sc, CCM_AHB_GATING1);
+       reg_value |= CCM_AHB_GATING_GMAC;
+       ccm_write_4(sc, CCM_AHB_GATING1, reg_value);
+
+       /* Set GMAC mode. */
+       reg_value = CCM_GMAC_CLK_MII;
+       if (OF_getprop_alloc(node, "phy-type", 1, (void **)&phy_type) > 0) {
+               if (strcasecmp(phy_type, "rgmii") == 0)
+                       reg_value = CCM_GMAC_CLK_RGMII | CCM_GMAC_MODE_RGMII;
+               else if (strcasecmp(phy_type, "rgmii-bpi") == 0) {
+                       reg_value = CCM_GMAC_CLK_RGMII | CCM_GMAC_MODE_RGMII;
+                       reg_value |= (3 << CCM_GMAC_CLK_DELAY_SHIFT);
+               }
+               free(phy_type, M_OFWPROP);
+       }
+       ccm_write_4(sc, CCM_GMAC_CLK, reg_value);
+
+       return (0);
+}
+
 static void
 a10_clk_pll6_enable(void)
 {

Modified: head/sys/arm/allwinner/a10_clk.h
==============================================================================
--- head/sys/arm/allwinner/a10_clk.h    Fri Jul  3 17:54:41 2015        
(r285105)
+++ head/sys/arm/allwinner/a10_clk.h    Fri Jul  3 18:39:25 2015        
(r285106)
@@ -97,7 +97,16 @@
 #define        CCM_LVDS_CLK            0x014c
 #define        CCM_HDMI_CLK            0x0150
 #define        CCM_MALI400_CLK         0x0154
+#define        CCM_GMAC_CLK            0x0164
 
+#define        CCM_GMAC_CLK_DELAY_SHIFT        10
+#define        CCM_GMAC_CLK_MODE_MASK  0x7
+#define        CCM_GMAC_MODE_RGMII     (1 << 2)
+#define        CCM_GMAC_CLK_MII        0x0
+#define        CCM_GMAC_CLK_EXT_RGMII  0x1
+#define        CCM_GMAC_CLK_RGMII      0x2
+
+/* AHB_GATING_REG0 */
 #define        CCM_AHB_GATING_USB0     (1 << 0)
 #define        CCM_AHB_GATING_EHCI0    (1 << 1)
 #define        CCM_AHB_GATING_EHCI1    (1 << 3)
@@ -105,6 +114,9 @@
 #define        CCM_AHB_GATING_EMAC     (1 << 17)
 #define        CCM_AHB_GATING_SATA     (1 << 25)
 
+/* AHB_GATING_REG1 */
+#define        CCM_AHB_GATING_GMAC     (1 << 17)
+
 #define        CCM_USB_PHY             (1 << 8)
 #define        CCM_USB0_RESET          (1 << 0)
 #define        CCM_USB1_RESET          (1 << 1)
@@ -139,6 +151,7 @@
 int a10_clk_usb_activate(void);
 int a10_clk_usb_deactivate(void);
 int a10_clk_emac_activate(void);
+int a10_clk_gmac_activate(phandle_t);
 int a10_clk_ahci_activate(void);
 int a10_clk_mmc_activate(int);
 int a10_clk_mmc_cfg(int, int);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to