Author: manu
Date: Mon Sep  5 20:17:18 2016
New Revision: 305436
URL: https://svnweb.freebsd.org/changeset/base/305436

Log:
  MFC r302472
  Add support for Allwinner A13.
  
  Reviewed by:  jmcneill
  Relnotes:     yes
  Differential Revision:        https://reviews.freebsd.org/D6809

Added:
  stable/11/sys/arm/allwinner/a13/
     - copied from r302472, head/sys/arm/allwinner/a13/
Modified:
  stable/11/sys/arm/allwinner/a10_codec.c
  stable/11/sys/arm/allwinner/a10_ehci.c
  stable/11/sys/arm/allwinner/a10_gpio.c
  stable/11/sys/arm/allwinner/allwinner_machdep.c
  stable/11/sys/arm/allwinner/aw_ccu.c
  stable/11/sys/arm/allwinner/clk/aw_gate.c
  stable/11/sys/arm/allwinner/clk/aw_pll.c
  stable/11/sys/arm/allwinner/clk/aw_usbclk.c
  stable/11/sys/arm/allwinner/std.a10
  stable/11/sys/arm/conf/A10
  stable/11/sys/conf/options.arm
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/arm/allwinner/a10_codec.c
==============================================================================
--- stable/11/sys/arm/allwinner/a10_codec.c     Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/a10_codec.c     Mon Sep  5 20:17:18 2016        
(r305436)
@@ -720,13 +720,19 @@ CHANNEL_DECLARE(a10codec_chan);
  * Device interface
  */
 
+static struct ofw_compat_data compat_data[] = {
+       {"allwinner,sun4i-a10-codec", 1},
+       {"allwinner,sun7i-a20-codec", 1},
+       {NULL, 0},
+};
+
 static int
 a10codec_probe(device_t dev)
 {
        if (!ofw_bus_status_okay(dev))
                return (ENXIO);
 
-       if (!ofw_bus_is_compatible(dev, "allwinner,sun7i-a20-codec"))
+       if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
                return (ENXIO);
 
        device_set_desc(dev, "Allwinner Audio Codec");

Modified: stable/11/sys/arm/allwinner/a10_ehci.c
==============================================================================
--- stable/11/sys/arm/allwinner/a10_ehci.c      Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/a10_ehci.c      Mon Sep  5 20:17:18 2016        
(r305436)
@@ -112,6 +112,7 @@ static const struct aw_ehci_conf a31_ehc
 
 static struct ofw_compat_data compat_data[] = {
        { "allwinner,sun4i-a10-ehci",   (uintptr_t)&a10_ehci_conf },
+       { "allwinner,sun5i-a13-ehci",   (uintptr_t)&a10_ehci_conf },
        { "allwinner,sun6i-a31-ehci",   (uintptr_t)&a31_ehci_conf },
        { "allwinner,sun7i-a20-ehci",   (uintptr_t)&a10_ehci_conf },
        { "allwinner,sun8i-a83t-ehci",  (uintptr_t)&a31_ehci_conf },

Modified: stable/11/sys/arm/allwinner/a10_gpio.c
==============================================================================
--- stable/11/sys/arm/allwinner/a10_gpio.c      Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/a10_gpio.c      Mon Sep  5 20:17:18 2016        
(r305436)
@@ -80,6 +80,11 @@ __FBSDID("$FreeBSD$");
 extern const struct allwinner_padconf a10_padconf;
 #endif
 
+/* Defined in a13_padconf.c */
+#ifdef SOC_ALLWINNER_A13
+extern const struct allwinner_padconf a13_padconf;
+#endif
+
 /* Defined in a20_padconf.c */
 #ifdef SOC_ALLWINNER_A20
 extern const struct allwinner_padconf a20_padconf;
@@ -115,6 +120,9 @@ static struct ofw_compat_data compat_dat
 #ifdef SOC_ALLWINNER_A10
        {"allwinner,sun4i-a10-pinctrl",         (uintptr_t)&a10_padconf},
 #endif
+#ifdef SOC_ALLWINNER_A13
+       {"allwinner,sun5i-a13-pinctrl",         (uintptr_t)&a13_padconf},
+#endif
 #ifdef SOC_ALLWINNER_A20
        {"allwinner,sun7i-a20-pinctrl",         (uintptr_t)&a20_padconf},
 #endif

Modified: stable/11/sys/arm/allwinner/allwinner_machdep.c
==============================================================================
--- stable/11/sys/arm/allwinner/allwinner_machdep.c     Mon Sep  5 20:07:03 
2016        (r305435)
+++ stable/11/sys/arm/allwinner/allwinner_machdep.c     Mon Sep  5 20:17:18 
2016        (r305436)
@@ -68,6 +68,14 @@ a10_attach(platform_t plat)
 }
 
 static int
+a13_attach(platform_t plat)
+{
+       soc_type = ALLWINNERSOC_A13;
+       soc_family = ALLWINNERSOC_SUN5I;
+       return (0);
+}
+
+static int
 a20_attach(platform_t plat)
 {
        soc_type = ALLWINNERSOC_A20;
@@ -169,6 +177,17 @@ static platform_method_t a10_methods[] =
 FDT_PLATFORM_DEF(a10, "a10", 0, "allwinner,sun4i-a10", 200);
 #endif
 
+#if defined(SOC_ALLWINNER_A13)
+static platform_method_t a13_methods[] = {
+       PLATFORMMETHOD(platform_attach,         a13_attach),
+       PLATFORMMETHOD(platform_lastaddr,       allwinner_lastaddr),
+       PLATFORMMETHOD(platform_devmap_init,    allwinner_devmap_init),
+
+       PLATFORMMETHOD_END,
+};
+FDT_PLATFORM_DEF(a13, "a13", 0, "allwinner,sun5i-a13", 200);
+#endif
+
 #if defined(SOC_ALLWINNER_A20)
 static platform_method_t a20_methods[] = {
        PLATFORMMETHOD(platform_attach,         a20_attach),

Modified: stable/11/sys/arm/allwinner/aw_ccu.c
==============================================================================
--- stable/11/sys/arm/allwinner/aw_ccu.c        Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/aw_ccu.c        Mon Sep  5 20:17:18 2016        
(r305436)
@@ -76,6 +76,7 @@ struct aw_ccu_softc {
 
 static struct ofw_compat_data compat_data[] = {
        { "allwinner,sun4i-a10",        CLOCK_CCU },
+       { "allwinner,sun5i-a13",        CLOCK_CCU },
        { "allwinner,sun7i-a20",        CLOCK_CCU },
        { "allwinner,sun6i-a31",        CLOCK_CCU },
        { "allwinner,sun6i-a31s",       CLOCK_CCU },

Modified: stable/11/sys/arm/allwinner/clk/aw_gate.c
==============================================================================
--- stable/11/sys/arm/allwinner/clk/aw_gate.c   Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/clk/aw_gate.c   Mon Sep  5 20:17:18 2016        
(r305436)
@@ -60,6 +60,13 @@ static struct ofw_compat_data compat_dat
        { "allwinner,sun4i-a10-apb1-gates-clk",
          (uintptr_t)"Allwinner APB1 Clock Gates" },
 
+       { "allwinner,sun5i-a13-ahb-gates-clk",
+         (uintptr_t)"Allwinner AHB Clock Gates" },
+       { "allwinner,sun5i-a13-apb0-gates-clk",
+         (uintptr_t)"Allwinner APB0 Clock Gates" },
+       { "allwinner,sun5i-a13-apb1-gates-clk",
+         (uintptr_t)"Allwinner APB1 Clock Gates" },
+
        { "allwinner,sun7i-a20-ahb-gates-clk",
          (uintptr_t)"Allwinner AHB Clock Gates" },
        { "allwinner,sun7i-a20-apb0-gates-clk",

Modified: stable/11/sys/arm/allwinner/clk/aw_pll.c
==============================================================================
--- stable/11/sys/arm/allwinner/clk/aw_pll.c    Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/clk/aw_pll.c    Mon Sep  5 20:17:18 2016        
(r305436)
@@ -49,6 +49,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dt-bindings/clock/sun4i-a10-pll2.h>
 
+#include <arm/allwinner/allwinner_machdep.h>
+
 #include "clkdev_if.h"
 
 #define        AW_PLL_ENABLE                   (1 << 31)
@@ -101,6 +103,13 @@ __FBSDID("$FreeBSD$");
 
 #define        A10_PLL2_POST_DIV               (0xf << 26)
 
+#define        A13_PLL2_POST_DIV               (0xf << 26)
+#define        A13_PLL2_POST_DIV_SHIFT         26
+#define        A13_PLL2_FACTOR_N               (0x7f << 8)
+#define        A13_PLL2_FACTOR_N_SHIFT         8
+#define        A13_PLL2_PRE_DIV                (0x1f << 0)
+#define        A13_PLL2_PRE_DIV_SHIFT          0
+
 #define        A23_PLL1_FACTOR_N               (0x1f << 8)
 #define        A23_PLL1_FACTOR_N_SHIFT         8
 #define        A23_PLL1_FACTOR_K               (0x3 << 4)
@@ -159,6 +168,7 @@ enum aw_pll_type {
        AWPLL_A10_PLL3,
        AWPLL_A10_PLL5,
        AWPLL_A10_PLL6,
+       AWPLL_A13_PLL2,
        AWPLL_A23_PLL1,
        AWPLL_A31_PLL1,
        AWPLL_A31_PLL6,
@@ -462,6 +472,81 @@ a10_pll6_set_freq(struct aw_pll_sc *sc, 
 }
 
 static int
+a13_pll2_recalc(struct aw_pll_sc *sc, uint64_t *freq)
+{
+       uint32_t val, post_div, n, pre_div;
+
+       DEVICE_LOCK(sc);
+       PLL_READ(sc, &val);
+       DEVICE_UNLOCK(sc);
+
+       post_div = ((val & A13_PLL2_POST_DIV) >> A13_PLL2_POST_DIV_SHIFT) + 1;
+       if (post_div == 0)
+               post_div = 1;
+       n = (val & A13_PLL2_FACTOR_N) >> A13_PLL2_FACTOR_N_SHIFT;
+       if (n == 0)
+               n = 1;
+       pre_div = ((val & A13_PLL2_PRE_DIV) >> A13_PLL2_PRE_DIV_SHIFT) + 1;
+       if (pre_div == 0)
+               pre_div = 1;
+
+       switch (sc->id) {
+       case SUN4I_A10_PLL2_1X:
+               *freq = (*freq * 2 * n) / pre_div / post_div / 2;
+               break;
+       case SUN4I_A10_PLL2_2X:
+               *freq = (*freq * 2 * n) / pre_div / 4;
+               break;
+       case SUN4I_A10_PLL2_4X:
+               *freq = (*freq * 2 * n) / pre_div / 2;
+               break;
+       case SUN4I_A10_PLL2_8X:
+               *freq = (*freq * 2 * n) / pre_div;
+               break;
+       default:
+               return (EINVAL);
+       }
+
+       return (0);
+}
+
+static int
+a13_pll2_set_freq(struct aw_pll_sc *sc, uint64_t fin, uint64_t *fout,
+    int flags)
+{
+       uint32_t val, post_div, n, pre_div;
+
+       if (sc->id != SUN4I_A10_PLL2_1X)
+               return (ENXIO);
+
+       /*
+        * Audio Codec needs PLL2-1X to be either 24576000 or 22579200.
+        *
+        * PLL2-1X output frequency is (48MHz * n) / pre_div / post_div / 2.
+        * To get as close as possible to the desired rate, we use a
+        * pre-divider of 21 and a post-divider of 4. With these values,
+        * a multiplier of 86 or 79 gets us close to the target rates.
+        */
+       if (*fout != 24576000 && *fout != 22579200)
+               return (EINVAL);
+
+       pre_div = 21;
+       post_div = 4;
+       n = (*fout * pre_div * post_div * 2) / (2 * fin);
+
+       DEVICE_LOCK(sc);
+       PLL_READ(sc, &val);
+       val &= ~(A13_PLL2_POST_DIV | A13_PLL2_FACTOR_N | A13_PLL2_PRE_DIV);
+       val |= ((post_div - 1) << A13_PLL2_POST_DIV_SHIFT);
+       val |= (n << A13_PLL2_FACTOR_N_SHIFT);
+       val |= ((pre_div - 1) << A13_PLL2_PRE_DIV_SHIFT);
+       PLL_WRITE(sc, val);
+       DEVICE_UNLOCK(sc);
+
+       return (0);
+}
+
+static int
 a23_pll1_recalc(struct aw_pll_sc *sc, uint64_t *freq)
 {
        uint32_t val, m, n, k, p;
@@ -591,6 +676,7 @@ static struct aw_pll_funcs aw_pll_func[]
        PLL(AWPLL_A10_PLL3, a10_pll3_recalc, a10_pll3_set_freq, a10_pll3_init),
        PLL(AWPLL_A10_PLL5, a10_pll5_recalc, NULL, NULL),
        PLL(AWPLL_A10_PLL6, a10_pll6_recalc, a10_pll6_set_freq, a10_pll6_init),
+       PLL(AWPLL_A13_PLL2, a13_pll2_recalc, a13_pll2_set_freq, NULL),
        PLL(AWPLL_A23_PLL1, a23_pll1_recalc, NULL, NULL),
        PLL(AWPLL_A31_PLL1, a31_pll1_recalc, NULL, NULL),
        PLL(AWPLL_A31_PLL6, a31_pll6_recalc, NULL, a31_pll6_init),
@@ -603,6 +689,7 @@ static struct ofw_compat_data compat_dat
        { "allwinner,sun4i-a10-pll3-clk",       AWPLL_A10_PLL3 },
        { "allwinner,sun4i-a10-pll5-clk",       AWPLL_A10_PLL5 },
        { "allwinner,sun4i-a10-pll6-clk",       AWPLL_A10_PLL6 },
+       { "allwinner,sun5i-a13-pll2-clk",       AWPLL_A13_PLL2 },
        { "allwinner,sun6i-a31-pll1-clk",       AWPLL_A31_PLL1 },
        { "allwinner,sun6i-a31-pll6-clk",       AWPLL_A31_PLL6 },
        { "allwinner,sun8i-a23-pll1-clk",       AWPLL_A23_PLL1 },

Modified: stable/11/sys/arm/allwinner/clk/aw_usbclk.c
==============================================================================
--- stable/11/sys/arm/allwinner/clk/aw_usbclk.c Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/clk/aw_usbclk.c Mon Sep  5 20:17:18 2016        
(r305436)
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
 
 enum aw_usbclk_type {
        AW_A10_USBCLK = 1,
+       AW_A13_USBCLK,
        AW_A31_USBCLK,
        AW_A83T_USBCLK,
        AW_H3_USBCLK,
@@ -68,6 +69,7 @@ enum aw_usbclk_type {
 
 static struct ofw_compat_data compat_data[] = {
        { "allwinner,sun4i-a10-usb-clk",        AW_A10_USBCLK },
+       { "allwinner,sun5i-a13-usb-clk",        AW_A13_USBCLK },
        { "allwinner,sun6i-a31-usb-clk",        AW_A31_USBCLK },
        { "allwinner,sun8i-a83t-usb-clk",       AW_A83T_USBCLK },
        { "allwinner,sun8i-h3-usb-clk",         AW_H3_USBCLK },

Modified: stable/11/sys/arm/allwinner/std.a10
==============================================================================
--- stable/11/sys/arm/allwinner/std.a10 Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/arm/allwinner/std.a10 Mon Sep  5 20:17:18 2016        
(r305436)
@@ -10,3 +10,4 @@ options       KERNVIRTADDR=0xc0200000
 
 files          "../allwinner/files.allwinner"
 files          "../allwinner/files.a10"
+files          "../allwinner/a13/files.a13"

Modified: stable/11/sys/arm/conf/A10
==============================================================================
--- stable/11/sys/arm/conf/A10  Mon Sep  5 20:07:03 2016        (r305435)
+++ stable/11/sys/arm/conf/A10  Mon Sep  5 20:17:18 2016        (r305436)
@@ -26,6 +26,7 @@ include       "../allwinner/std.a10"
 options        INTRNG
 
 options        SOC_ALLWINNER_A10
+options        SOC_ALLWINNER_A13
 
 options        HZ=100
 options        SCHED_4BSD              # 4BSD scheduler
@@ -68,6 +69,8 @@ device                iic
 device         twsi
 device         axp209                  # AXP209 Power Management Unit
 
+device         pcf8563                 # RTC
+
 # GPIO
 device         gpio
 device         gpioled
@@ -96,6 +99,9 @@ device                emac
 # USB ethernet support, requires miibus
 device         miibus
 
+# Sound support
+device         sound
+
 # Pinmux
 device         fdt_pinctrl
 

Modified: stable/11/sys/conf/options.arm
==============================================================================
--- stable/11/sys/conf/options.arm      Mon Sep  5 20:07:03 2016        
(r305435)
+++ stable/11/sys/conf/options.arm      Mon Sep  5 20:17:18 2016        
(r305436)
@@ -41,6 +41,7 @@ SOCDEV_VA             opt_global.h
 PV_STATS               opt_pmap.h
 QEMU_WORKAROUNDS       opt_global.h
 SOC_ALLWINNER_A10      opt_global.h
+SOC_ALLWINNER_A13      opt_global.h
 SOC_ALLWINNER_A20      opt_global.h
 SOC_ALLWINNER_A31      opt_global.h
 SOC_ALLWINNER_A31S     opt_global.h
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to