svn commit: r299113 - in head/sys: arm/allwinner arm/allwinner/a83t arm/allwinner/clk arm/conf conf
Jared McNeill
jmcneill at FreeBSD.org
Thu May 5 09:42:00 UTC 2016
Author: jmcneill
Date: Thu May 5 09:41:57 2016
New Revision: 299113
URL: https://svnweb.freebsd.org/changeset/base/299113
Log:
Add support for the Allwinner A83T (sun8iw6p1) SoC.
Clocks, GPIO, UART, SD card / eMMC, USB, watchdog, and ethernet are
supported. Note that the A83T contains two clusters of four Cortex-A7
CPUs, and only CPUs in first cluster are started for now.
Tested on a Sinovoip Banana Pi BPI-M3.
Added:
head/sys/arm/allwinner/a83t/
head/sys/arm/allwinner/a83t/a83t_padconf.c (contents, props changed)
head/sys/arm/allwinner/a83t/a83t_r_padconf.c (contents, props changed)
head/sys/arm/allwinner/a83t/files.a83t (contents, props changed)
head/sys/arm/allwinner/a83t/std.a83t (contents, props changed)
head/sys/arm/allwinner/clk/aw_cpusclk.c (contents, props changed)
Modified:
head/sys/arm/allwinner/a10_ehci.c
head/sys/arm/allwinner/a10_gpio.c
head/sys/arm/allwinner/allwinner_machdep.c
head/sys/arm/allwinner/allwinner_machdep.h
head/sys/arm/allwinner/aw_ccu.c
head/sys/arm/allwinner/aw_mp.c
head/sys/arm/allwinner/aw_mp.h
head/sys/arm/allwinner/aw_usbphy.c
head/sys/arm/allwinner/clk/aw_ahbclk.c
head/sys/arm/allwinner/clk/aw_apbclk.c
head/sys/arm/allwinner/clk/aw_gate.c
head/sys/arm/allwinner/clk/aw_gmacclk.c
head/sys/arm/allwinner/clk/aw_pll.c
head/sys/arm/allwinner/clk/aw_usbclk.c
head/sys/arm/allwinner/files.allwinner
head/sys/arm/allwinner/std.allwinner
head/sys/arm/conf/ALLWINNER
head/sys/conf/options.arm
Modified: head/sys/arm/allwinner/a10_ehci.c
==============================================================================
--- head/sys/arm/allwinner/a10_ehci.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/a10_ehci.c Thu May 5 09:41:57 2016 (r299113)
@@ -112,6 +112,7 @@ static struct ofw_compat_data compat_dat
{ "allwinner,sun4i-a10-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 },
{ NULL, (uintptr_t)NULL }
};
Modified: head/sys/arm/allwinner/a10_gpio.c
==============================================================================
--- head/sys/arm/allwinner/a10_gpio.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/a10_gpio.c Thu May 5 09:41:57 2016 (r299113)
@@ -99,6 +99,12 @@ extern const struct allwinner_padconf a3
extern const struct allwinner_padconf a31_r_padconf;
#endif
+/* Defined in a83t_padconf.c */
+#ifdef SOC_ALLWINNER_A83T
+extern const struct allwinner_padconf a83t_padconf;
+extern const struct allwinner_padconf a83t_r_padconf;
+#endif
+
static struct ofw_compat_data compat_data[] = {
#ifdef SOC_ALLWINNER_A10
{"allwinner,sun4i-a10-pinctrl", (uintptr_t)&a10_padconf},
@@ -115,6 +121,10 @@ static struct ofw_compat_data compat_dat
#if defined(SOC_ALLWINNER_A31) || defined(SOC_ALLWINNER_A31S)
{"allwinner,sun6i-a31-r-pinctrl", (uintptr_t)&a31_r_padconf},
#endif
+#ifdef SOC_ALLWINNER_A83T
+ {"allwinner,sun8i-a83t-pinctrl", (uintptr_t)&a83t_padconf},
+ {"allwinner,sun8i-a83t-r-pinctrl", (uintptr_t)&a83t_r_padconf},
+#endif
{NULL, 0}
};
Added: head/sys/arm/allwinner/a83t/a83t_padconf.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm/allwinner/a83t/a83t_padconf.c Thu May 5 09:41:57 2016 (r299113)
@@ -0,0 +1,162 @@
+/*-
+ * Copyright (c) 2016 Jared McNeill <jmcneill at invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/types.h>
+
+#include <arm/allwinner/allwinner_pinctrl.h>
+
+#ifdef SOC_ALLWINNER_A83T
+
+static const struct allwinner_pins a83t_pins[] = {
+ { "PB0", 1, 0, { "gpio_in", "gpio_out", "uart2", "jtag", NULL, NULL, "eint" } },
+ { "PB1", 1, 1, { "gpio_in", "gpio_out", "uart2", "jtag", NULL, NULL, "eint" } },
+ { "PB2", 1, 2, { "gpio_in", "gpio_out", "uart2", "jtag", NULL, NULL, "eint" } },
+ { "PB3", 1, 3, { "gpio_in", "gpio_out", "uart2", "jtag", NULL, NULL, "eint" } },
+ { "PB4", 1, 4, { "gpio_in", "gpio_out", "i2s0", "tdm", NULL, NULL, "eint" } },
+ { "PB5", 1, 5, { "gpio_in", "gpio_out", "i2s0", "tdm", NULL, NULL, "eint" } },
+ { "PB6", 1, 6, { "gpio_in", "gpio_out", "i2s0", "tdm", NULL, NULL, "eint" } },
+ { "PB7", 1, 7, { "gpio_in", "gpio_out", "i2s0", "tdm", NULL, NULL, "eint" } },
+ { "PB8", 1, 8, { "gpio_in", "gpio_out", "i2s0", "tdm", NULL, NULL, "eint" } },
+ { "PB9", 1, 9, { "gpio_in", "gpio_out", "uart0", NULL, NULL, NULL, "eint" } },
+ { "PB10", 1, 10, { "gpio_in", "gpio_out", "uart0", NULL, NULL, NULL, "eint" } },
+
+ { "PC0", 2, 0, { "gpio_in", "gpio_out", "nand", "spi0" } },
+ { "PC1", 2, 1, { "gpio_in", "gpio_out", "nand", "spi0" } },
+ { "PC2", 2, 2, { "gpio_in", "gpio_out", "nand", "spi0" } },
+ { "PC3", 2, 3, { "gpio_in", "gpio_out", "nand", "spi0" } },
+ { "PC4", 2, 4, { "gpio_in", "gpio_out", "nand" } },
+ { "PC5", 2, 5, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC6", 2, 6, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC7", 2, 7, { "gpio_in", "gpio_out", "nand" } },
+ { "PC8", 2, 8, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC9", 2, 9, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC10", 2, 10, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC11", 2, 11, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC12", 2, 12, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC13", 2, 13, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC14", 2, 14, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC15", 2, 15, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC16", 2, 16, { "gpio_in", "gpio_out", "nand", "mmc2" } },
+ { "PC17", 2, 17, { "gpio_in", "gpio_out", "nand" } },
+ { "PC18", 2, 18, { "gpio_in", "gpio_out", "nand" } },
+
+ { "PD2", 3, 2, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD3", 3, 3, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD4", 3, 4, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD5", 3, 5, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD6", 3, 6, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD7", 3, 7, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD10", 3, 10, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD11", 3, 11, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD12", 3, 12, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD13", 3, 13, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD14", 3, 14, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD15", 3, 15, { "gpio_in", "gpio_out", "lcd", NULL, "emac" } },
+ { "PD18", 3, 18, { "gpio_in", "gpio_out", "lcd", "lvds", "emac" } },
+ { "PD19", 3, 19, { "gpio_in", "gpio_out", "lcd", "lvds", "emac" } },
+ { "PD20", 3, 20, { "gpio_in", "gpio_out", "lcd", "lvds", "emac" } },
+ { "PD21", 3, 21, { "gpio_in", "gpio_out", "lcd", "lvds", "emac" } },
+ { "PD22", 3, 22, { "gpio_in", "gpio_out", "lcd", "lvds", "emac" } },
+ { "PD23", 3, 23, { "gpio_in", "gpio_out", "lcd", "lvds", "emac" } },
+ { "PD24", 3, 24, { "gpio_in", "gpio_out", "lcd", "lvds" } },
+ { "PD25", 3, 25, { "gpio_in", "gpio_out", "lcd", "lvds" } },
+ { "PD26", 3, 26, { "gpio_in", "gpio_out", "lcd", "lvds" } },
+ { "PD27", 3, 27, { "gpio_in", "gpio_out", "lcd", "lvds" } },
+ { "PD28", 3, 28, { "gpio_in", "gpio_out", "pwm" } },
+ { "PD29", 3, 29, { "gpio_in", "gpio_out" } },
+
+ { "PE0", 4, 0, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE1", 4, 1, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE2", 4, 2, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE3", 4, 3, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE4", 4, 4, { "gpio_in", "gpio_out", "csi" } },
+ { "PE5", 4, 5, { "gpio_in", "gpio_out", "csi" } },
+ { "PE6", 4, 6, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE7", 4, 7, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE8", 4, 8, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE9", 4, 9, { "gpio_in", "gpio_out", "csi", NULL, "ccir" } },
+ { "PE10", 4, 10, { "gpio_in", "gpio_out", "csi", "uart4", "ccir" } },
+ { "PE11", 4, 11, { "gpio_in", "gpio_out", "csi", "uart4", "ccir" } },
+ { "PE12", 4, 12, { "gpio_in", "gpio_out", "csi", "uart4", "ccir" } },
+ { "PE13", 4, 13, { "gpio_in", "gpio_out", "csi", "uart4", "ccir" } },
+ { "PE14", 4, 14, { "gpio_in", "gpio_out", "csi", "twi2" } },
+ { "PE15", 4, 15, { "gpio_in", "gpio_out", "csi", "twi2" } },
+ { "PE16", 4, 16, { "gpio_in", "gpio_out" } },
+ { "PE17", 4, 17, { "gpio_in", "gpio_out" } },
+ { "PE18", 4, 18, { "gpio_in", "gpio_out", NULL, "owa" } },
+ { "PE19", 4, 19, { "gpio_in", "gpio_out" } },
+
+ { "PF0", 5, 0, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
+ { "PF1", 5, 1, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
+ { "PF2", 5, 2, { "gpio_in", "gpio_out", "mmc0", "uart0" } },
+ { "PF3", 5, 3, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
+ { "PF4", 5, 4, { "gpio_in", "gpio_out", "mmc0", "uart0" } },
+ { "PF5", 5, 5, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
+ { "PF6", 5, 6, { "gpio_in", "gpio_out" } },
+
+ { "PG0", 6, 0, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "eint" } },
+ { "PG1", 6, 1, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "eint" } },
+ { "PG2", 6, 2, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "eint" } },
+ { "PG3", 6, 3, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "eint" } },
+ { "PG4", 6, 4, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "eint" } },
+ { "PG5", 6, 5, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "eint" } },
+ { "PG6", 6, 6, { "gpio_in", "gpio_out", "uart1", "spi1", NULL, NULL, "eint" } },
+ { "PG7", 6, 7, { "gpio_in", "gpio_out", "uart1", "spi1", NULL, NULL, "eint" } },
+ { "PG8", 6, 8, { "gpio_in", "gpio_out", "uart1", "spi1", NULL, NULL, "eint" } },
+ { "PG9", 6, 9, { "gpio_in", "gpio_out", "uart1", "spi1", NULL, NULL, "eint" } },
+ { "PG10", 6, 10, { "gpio_in", "gpio_out", "i2s1", "uart3", NULL, NULL, "eint" } },
+ { "PG11", 6, 11, { "gpio_in", "gpio_out", "i2s1", "uart3", NULL, NULL, "eint" } },
+ { "PG12", 6, 12, { "gpio_in", "gpio_out", "i2s1", "uart3", NULL, NULL, "eint" } },
+ { "PG13", 6, 13, { "gpio_in", "gpio_out", "i2s1", "uart3", NULL, NULL, "eint" } },
+
+ { "PH0", 7, 0, { "gpio_in", "gpio_out", "i2c0", NULL, NULL, NULL, "eint" } },
+ { "PH1", 7, 1, { "gpio_in", "gpio_out", "i2c0", NULL, NULL, NULL, "eint" } },
+ { "PH2", 7, 2, { "gpio_in", "gpio_out", "i2c1", NULL, NULL, NULL, "eint" } },
+ { "PH3", 7, 3, { "gpio_in", "gpio_out", "i2c1", NULL, NULL, NULL, "eint" } },
+ { "PH4", 7, 4, { "gpio_in", "gpio_out", "i2c2", NULL, NULL, NULL, "eint" } },
+ { "PH5", 7, 5, { "gpio_in", "gpio_out", "i2c2", NULL, NULL, NULL, "eint" } },
+ { "PH6", 7, 6, { "gpio_in", "gpio_out", "hdmiddc", NULL, NULL, NULL, "eint" } },
+ { "PH7", 7, 7, { "gpio_in", "gpio_out", "hdmiddc", NULL, NULL, NULL, "eint" } },
+ { "PH8", 7, 8, { "gpio_in", "gpio_out", "hdmiddc", NULL, NULL, NULL, "eint" } },
+ { "PH9", 7, 9, { "gpio_in", "gpio_out", NULL, NULL, NULL, NULL, "eint" } },
+ { "PH10", 7, 10, { "gpio_in", "gpio_out", NULL, NULL, NULL, NULL, "eint" } },
+ { "PH11", 7, 11, { "gpio_in", "gpio_out", NULL, NULL, NULL, NULL, "eint" } },
+};
+
+const struct allwinner_padconf a83t_padconf = {
+ .npins = nitems(a83t_pins),
+ .pins = a83t_pins,
+};
+
+#endif /* !SOC_ALLWINNER_A83T */
Added: head/sys/arm/allwinner/a83t/a83t_r_padconf.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm/allwinner/a83t/a83t_r_padconf.c Thu May 5 09:41:57 2016 (r299113)
@@ -0,0 +1,62 @@
+/*-
+ * Copyright (c) 2016 Jared McNeill <jmcneill at invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/types.h>
+
+#include <arm/allwinner/allwinner_pinctrl.h>
+
+#ifdef SOC_ALLWINNER_A83T
+
+static const struct allwinner_pins a83t_r_pins[] = {
+ { "PL0", 0, 0, { "gpio_in", "gpio_out", "s_rsb", "s_i2c", NULL, NULL, "eint" } },
+ { "PL1", 0, 1, { "gpio_in", "gpio_out", "s_rsb", "s_i2c", NULL, NULL, "eint" } },
+ { "PL2", 0, 2, { "gpio_in", "gpio_out", "s_uart", NULL, NULL, NULL, "eint" } },
+ { "PL3", 0, 3, { "gpio_in", "gpio_out", "s_uart", NULL, NULL, NULL, "eint" } },
+ { "PL4", 0, 4, { "gpio_in", "gpio_out", "s_jtag", NULL, NULL, NULL, "eint" } },
+ { "PL5", 0, 5, { "gpio_in", "gpio_out", "s_jtag", NULL, NULL, NULL, "eint" } },
+ { "PL6", 0, 6, { "gpio_in", "gpio_out", "s_jtag", NULL, NULL, NULL, "eint" } },
+ { "PL7", 0, 7, { "gpio_in", "gpio_out", "s_jtag", NULL, NULL, NULL, "eint" } },
+ { "PL8", 0, 8, { "gpio_in", "gpio_out", "s_i2c", NULL, NULL, NULL, "eint" } },
+ { "PL9", 0, 9, { "gpio_in", "gpio_out", "s_i2c", NULL, NULL, NULL, "eint" } },
+ { "PL10", 0, 10, { "gpio_in", "gpio_out", "s_pwm", NULL, NULL, NULL, "eint" } },
+ { "PL11", 0, 11, { "gpio_in", "gpio_out", NULL, NULL, NULL, "eint" } },
+ { "PL12", 0, 12, { "gpio_in", "gpio_out", "s_cir", NULL, NULL, NULL, "eint" } },
+};
+
+const struct allwinner_padconf a83t_r_padconf = {
+ .npins = nitems(a83t_r_pins),
+ .pins = a83t_r_pins,
+};
+
+#endif /* !SOC_ALLWINNER_A83T */
Added: head/sys/arm/allwinner/a83t/files.a83t
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm/allwinner/a83t/files.a83t Thu May 5 09:41:57 2016 (r299113)
@@ -0,0 +1,4 @@
+# $FreeBSD$
+
+arm/allwinner/a83t/a83t_padconf.c standard
+arm/allwinner/a83t/a83t_r_padconf.c standard
Added: head/sys/arm/allwinner/a83t/std.a83t
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm/allwinner/a83t/std.a83t Thu May 5 09:41:57 2016 (r299113)
@@ -0,0 +1,15 @@
+# Allwinner A83T common options
+#$FreeBSD$
+
+cpu CPU_CORTEXA
+machine arm armv6
+makeoptions CONF_CFLAGS="-march=armv7a"
+
+makeoptions KERNVIRTADDR=0xc0200000
+options KERNVIRTADDR=0xc0200000
+
+options IPI_IRQ_START=0
+options IPI_IRQ_END=15
+
+files "../allwinner/files.allwinner"
+files "../allwinner/a83t/files.a83t"
Modified: head/sys/arm/allwinner/allwinner_machdep.c
==============================================================================
--- head/sys/arm/allwinner/allwinner_machdep.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/allwinner_machdep.c Thu May 5 09:41:57 2016 (r299113)
@@ -94,6 +94,15 @@ a31s_attach(platform_t plat)
return (0);
}
+static int
+a83t_attach(platform_t plat)
+{
+ soc_type = ALLWINNERSOC_A83T;
+ soc_family = ALLWINNERSOC_SUN8I;
+
+ return (0);
+}
+
static vm_offset_t
allwinner_lastaddr(platform_t plat)
{
@@ -196,6 +205,21 @@ static platform_method_t a31s_methods[]
FDT_PLATFORM_DEF(a31s, "a31s", 0, "allwinner,sun6i-a31s", 200);
#endif
+#if defined(SOC_ALLWINNER_A83T)
+static platform_method_t a83t_methods[] = {
+ PLATFORMMETHOD(platform_attach, a83t_attach),
+ PLATFORMMETHOD(platform_lastaddr, allwinner_lastaddr),
+ PLATFORMMETHOD(platform_devmap_init, allwinner_devmap_init),
+
+#ifdef SMP
+ PLATFORMMETHOD(platform_mp_start_ap, a83t_mp_start_ap),
+ PLATFORMMETHOD(platform_mp_setmaxid, aw_mp_setmaxid),
+#endif
+ PLATFORMMETHOD_END,
+};
+FDT_PLATFORM_DEF(a83t, "a83t", 0, "allwinner,sun8i-a83t", 200);
+#endif
+
u_int
allwinner_soc_type(void)
{
Modified: head/sys/arm/allwinner/allwinner_machdep.h
==============================================================================
--- head/sys/arm/allwinner/allwinner_machdep.h Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/allwinner_machdep.h Thu May 5 09:41:57 2016 (r299113)
@@ -36,11 +36,13 @@
#define ALLWINNERSOC_A20 0x20000000
#define ALLWINNERSOC_A31 0x31000000
#define ALLWINNERSOC_A31S 0x31000001
+#define ALLWINNERSOC_A83T 0x83000000
#define ALLWINNERSOC_SUN4I 0x40000000
#define ALLWINNERSOC_SUN5I 0x50000000
#define ALLWINNERSOC_SUN6I 0x60000000
#define ALLWINNERSOC_SUN7I 0x70000000
+#define ALLWINNERSOC_SUN8I 0x80000000
u_int allwinner_soc_type(void);
u_int allwinner_soc_family(void);
Modified: head/sys/arm/allwinner/aw_ccu.c
==============================================================================
--- head/sys/arm/allwinner/aw_ccu.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/aw_ccu.c Thu May 5 09:41:57 2016 (r299113)
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <dev/fdt/simplebus.h>
+#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
@@ -53,40 +54,74 @@ __FBSDID("$FreeBSD$");
#define CCU_BASE 0x01c20000
#define CCU_SIZE 0x400
+#define PRCM_BASE 0x01f01400
+#define PRCM_SIZE 0x200
+
+#define SYSCTRL_BASE 0x01c00000
+#define SYSCTRL_SIZE 0x34
+
struct aw_ccu_softc {
struct simplebus_softc sc;
bus_space_tag_t bst;
- bus_space_handle_t bsh;
+ bus_space_handle_t ccu_bsh;
+ bus_space_handle_t prcm_bsh;
+ bus_space_handle_t sysctrl_bsh;
struct mtx mtx;
+ int flags;
};
+#define CLOCK_CCU (1 << 0)
+#define CLOCK_PRCM (1 << 1)
+#define CLOCK_SYSCTRL (1 << 2)
+
static struct ofw_compat_data compat_data[] = {
- { "allwinner,sun4i-a10", 1 },
- { "allwinner,sun7i-a20", 1 },
- { "allwinner,sun6i-a31", 1 },
- { "allwinner,sun6i-a31s", 1 },
+ { "allwinner,sun4i-a10", CLOCK_CCU },
+ { "allwinner,sun7i-a20", CLOCK_CCU },
+ { "allwinner,sun6i-a31", CLOCK_CCU },
+ { "allwinner,sun6i-a31s", CLOCK_CCU },
+ { "allwinner,sun8i-a83t", CLOCK_CCU|CLOCK_PRCM|CLOCK_SYSCTRL },
{ NULL, 0 }
};
static int
-aw_ccu_check_addr(bus_addr_t addr)
+aw_ccu_check_addr(struct aw_ccu_softc *sc, bus_addr_t addr,
+ bus_space_handle_t *pbsh, bus_size_t *poff)
{
- if (addr < CCU_BASE || addr >= (CCU_BASE + CCU_SIZE))
- return (EINVAL);
- return (0);
+ if (addr >= CCU_BASE && addr < (CCU_BASE + CCU_SIZE) &&
+ (sc->flags & CLOCK_CCU) != 0) {
+ *poff = addr - CCU_BASE;
+ *pbsh = sc->ccu_bsh;
+ return (0);
+ }
+ if (addr >= PRCM_BASE && addr < (PRCM_BASE + PRCM_SIZE) &&
+ (sc->flags & CLOCK_PRCM) != 0) {
+ *poff = addr - PRCM_BASE;
+ *pbsh = sc->prcm_bsh;
+ return (0);
+ }
+ if (addr >= SYSCTRL_BASE && addr < (SYSCTRL_BASE + SYSCTRL_SIZE) &&
+ (sc->flags & CLOCK_SYSCTRL) != 0) {
+ *poff = addr - SYSCTRL_BASE;
+ *pbsh = sc->sysctrl_bsh;
+ return (0);
+ }
+ return (EINVAL);
}
static int
aw_ccu_write_4(device_t dev, bus_addr_t addr, uint32_t val)
{
struct aw_ccu_softc *sc;
+ bus_space_handle_t bsh;
+ bus_size_t reg;
- if (aw_ccu_check_addr(addr) != 0)
+ sc = device_get_softc(dev);
+
+ if (aw_ccu_check_addr(sc, addr, &bsh, ®) != 0)
return (EINVAL);
- sc = device_get_softc(dev);
mtx_assert(&sc->mtx, MA_OWNED);
- bus_space_write_4(sc->bst, sc->bsh, addr - CCU_BASE, val);
+ bus_space_write_4(sc->bst, bsh, reg, val);
return (0);
}
@@ -95,13 +130,16 @@ static int
aw_ccu_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
{
struct aw_ccu_softc *sc;
+ bus_space_handle_t bsh;
+ bus_size_t reg;
+
+ sc = device_get_softc(dev);
- if (aw_ccu_check_addr(addr) != 0)
+ if (aw_ccu_check_addr(sc, addr, &bsh, ®) != 0)
return (EINVAL);
- sc = device_get_softc(dev);
mtx_assert(&sc->mtx, MA_OWNED);
- *val = bus_space_read_4(sc->bst, sc->bsh, addr - CCU_BASE);
+ *val = bus_space_read_4(sc->bst, bsh, reg);
return (0);
}
@@ -110,17 +148,20 @@ static int
aw_ccu_modify_4(device_t dev, bus_addr_t addr, uint32_t clr, uint32_t set)
{
struct aw_ccu_softc *sc;
+ bus_space_handle_t bsh;
+ bus_size_t reg;
uint32_t val;
- if (aw_ccu_check_addr(addr) != 0)
+ sc = device_get_softc(dev);
+
+ if (aw_ccu_check_addr(sc, addr, &bsh, ®) != 0)
return (EINVAL);
- sc = device_get_softc(dev);
mtx_assert(&sc->mtx, MA_OWNED);
- val = bus_space_read_4(sc->bst, sc->bsh, addr - CCU_BASE);
+ val = bus_space_read_4(sc->bst, bsh, reg);
val &= ~clr;
val |= set;
- bus_space_write_4(sc->bst, sc->bsh, addr - CCU_BASE, val);
+ bus_space_write_4(sc->bst, bsh, reg, val);
return (0);
}
@@ -143,20 +184,32 @@ aw_ccu_device_unlock(device_t dev)
mtx_unlock(&sc->mtx);
}
+static const struct ofw_compat_data *
+aw_ccu_search_compatible(void)
+{
+ const struct ofw_compat_data *compat;
+ phandle_t root;
+
+ root = OF_finddevice("/");
+ for (compat = compat_data; compat_data->ocd_str != NULL; compat++)
+ if (fdt_is_compatible(root, compat->ocd_str))
+ break;
+
+ return (compat);
+}
+
static int
aw_ccu_probe(device_t dev)
{
const char *name;
- device_t pdev;
name = ofw_bus_get_name(dev);
if (name == NULL || strcmp(name, "clocks") != 0)
return (ENXIO);
- pdev = device_get_parent(dev);
- if (ofw_bus_search_compatible(pdev, compat_data)->ocd_data == 0)
- return (0);
+ if (aw_ccu_search_compatible()->ocd_data == 0)
+ return (ENXIO);
device_set_desc(dev, "Allwinner Clock Control Unit");
return (BUS_PROBE_SPECIFIC);
@@ -175,15 +228,37 @@ aw_ccu_attach(device_t dev)
simplebus_init(dev, node);
+ sc->flags = aw_ccu_search_compatible()->ocd_data;
+
/*
- * Map CCU registers. The DT doesn't have a "reg" property for the
- * /clocks node and child nodes have conflicting "reg" properties.
+ * Map registers. The DT doesn't have a "reg" property
+ * for the /clocks node and child nodes have conflicting "reg"
+ * properties.
*/
sc->bst = bus_get_bus_tag(dev);
- error = bus_space_map(sc->bst, CCU_BASE, CCU_SIZE, 0, &sc->bsh);
- if (error != 0) {
- device_printf(dev, "couldn't map CCU: %d\n", error);
- return (error);
+ if (sc->flags & CLOCK_CCU) {
+ error = bus_space_map(sc->bst, CCU_BASE, CCU_SIZE, 0,
+ &sc->ccu_bsh);
+ if (error != 0) {
+ device_printf(dev, "couldn't map CCU: %d\n", error);
+ return (error);
+ }
+ }
+ if (sc->flags & CLOCK_PRCM) {
+ error = bus_space_map(sc->bst, PRCM_BASE, PRCM_SIZE, 0,
+ &sc->prcm_bsh);
+ if (error != 0) {
+ device_printf(dev, "couldn't map PRCM: %d\n", error);
+ return (error);
+ }
+ }
+ if (sc->flags & CLOCK_SYSCTRL) {
+ error = bus_space_map(sc->bst, SYSCTRL_BASE, SYSCTRL_SIZE, 0,
+ &sc->sysctrl_bsh);
+ if (error != 0) {
+ device_printf(dev, "couldn't map SYSCTRL: %d\n", error);
+ return (error);
+ }
}
mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF);
Modified: head/sys/arm/allwinner/aw_mp.c
==============================================================================
--- head/sys/arm/allwinner/aw_mp.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/aw_mp.c Thu May 5 09:41:57 2016 (r299113)
@@ -55,6 +55,9 @@ __FBSDID("$FreeBSD$");
#define CPUCFG_SIZE 0x400
#define PRCM_BASE 0x01f01400
#define PRCM_SIZE 0x800
+/* Register for multi-cluster SoC */
+#define CPUXCFG_BASE 0x01700000
+#define CPUXCFG_SIZE 0x400
#define CPU_OFFSET 0x40
#define CPU_OFFSET_CTL 0x04
@@ -80,6 +83,14 @@ __FBSDID("$FreeBSD$");
#define CPUCFG_DBGCTL0 0x1e0
#define CPUCFG_DBGCTL1 0x1e4
+#define CPUS_CL_RST(cl) (0x30 + (cluster) * 0x4)
+#define CPUX_CL_CTRL0(cl) (0x0 + (cluster) * 0x10)
+#define CPUX_CL_CTRL1(cl) (0x4 + (cluster) * 0x10)
+#define CPUX_CL_CPU_STATUS(cl) (0x30 + (cluster) * 0x4)
+#define CPUX_CL_RST(cl) (0x80 + (cluster) * 0x4)
+#define PRCM_CL_PWROFF(cl) (0x100 + (cluster) * 0x4)
+#define PRCM_CL_PWR_CLAMP(cl, cpu) (0x140 + (cluster) * 0x4 + (cpu) * 0x4)
+
void
aw_mp_setmaxid(platform_t plat)
{
@@ -202,3 +213,89 @@ a31_mp_start_ap(platform_t plat)
bus_space_unmap(fdtbus_bs_tag, cpucfg, CPUCFG_SIZE);
bus_space_unmap(fdtbus_bs_tag, prcm, PRCM_SIZE);
}
+
+static void
+aw_mc_mp_start_cpu(bus_space_handle_t cpuscfg, bus_space_handle_t cpuxcfg,
+ bus_space_handle_t prcm, int cluster, int cpu)
+{
+ uint32_t val;
+ int i;
+
+ /* Assert core reset */
+ val = bus_space_read_4(fdtbus_bs_tag, cpuxcfg, CPUX_CL_RST(cluster));
+ val &= ~(1 << cpu);
+ bus_space_write_4(fdtbus_bs_tag, cpuxcfg, CPUX_CL_RST(cluster), val);
+
+ /* Assert power-on reset */
+ val = bus_space_read_4(fdtbus_bs_tag, cpuscfg, CPUS_CL_RST(cluster));
+ val &= ~(1 << cpu);
+ bus_space_write_4(fdtbus_bs_tag, cpuscfg, CPUS_CL_RST(cluster), val);
+
+ /* Disable automatic L1 cache invalidate at reset */
+ val = bus_space_read_4(fdtbus_bs_tag, cpuxcfg, CPUX_CL_CTRL0(cluster));
+ val &= ~(1 << cpu);
+ bus_space_write_4(fdtbus_bs_tag, cpuxcfg, CPUX_CL_CTRL0(cluster), val);
+
+ /* Release power clamp */
+ for (i = 0; i <= CPU_PWR_CLAMP_STEPS; i++)
+ bus_space_write_4(fdtbus_bs_tag, prcm,
+ PRCM_CL_PWR_CLAMP(cluster, cpu), 0xff >> i);
+ while (bus_space_read_4(fdtbus_bs_tag, prcm,
+ PRCM_CL_PWR_CLAMP(cluster, cpu)) != 0)
+ ;
+
+ /* Clear power-off gating */
+ val = bus_space_read_4(fdtbus_bs_tag, prcm, PRCM_CL_PWROFF(cluster));
+ val &= ~(1 << cpu);
+ bus_space_write_4(fdtbus_bs_tag, prcm, PRCM_CL_PWROFF(cluster), val);
+
+ /* De-assert power-on reset */
+ val = bus_space_read_4(fdtbus_bs_tag, cpuscfg, CPUS_CL_RST(cluster));
+ val |= (1 << cpu);
+ bus_space_write_4(fdtbus_bs_tag, cpuscfg, CPUS_CL_RST(cluster), val);
+
+ /* De-assert core reset */
+ val = bus_space_read_4(fdtbus_bs_tag, cpuxcfg, CPUX_CL_RST(cluster));
+ val |= (1 << cpu);
+ bus_space_write_4(fdtbus_bs_tag, cpuxcfg, CPUX_CL_RST(cluster), val);
+}
+
+static void
+aw_mc_mp_start_ap(bus_space_handle_t cpuscfg, bus_space_handle_t cpuxcfg,
+ bus_space_handle_t prcm)
+{
+ int cluster, cpu;
+
+ KASSERT(mp_ncpus <= 4, ("multiple clusters not yet supported"));
+
+ dcache_wbinv_poc_all();
+
+ bus_space_write_4(fdtbus_bs_tag, cpuscfg, CPUCFG_P_REG0,
+ pmap_kextract((vm_offset_t)mpentry));
+
+ cluster = 0;
+ for (cpu = 1; cpu < mp_ncpus; cpu++)
+ aw_mc_mp_start_cpu(cpuscfg, cpuxcfg, prcm, cluster, cpu);
+}
+
+void
+a83t_mp_start_ap(platform_t plat)
+{
+ bus_space_handle_t cpuscfg, cpuxcfg, prcm;
+
+ if (bus_space_map(fdtbus_bs_tag, CPUCFG_BASE, CPUCFG_SIZE,
+ 0, &cpuscfg) != 0)
+ panic("Couldn't map the CPUCFG\n");
+ if (bus_space_map(fdtbus_bs_tag, CPUXCFG_BASE, CPUXCFG_SIZE,
+ 0, &cpuxcfg) != 0)
+ panic("Couldn't map the CPUXCFG\n");
+ if (bus_space_map(fdtbus_bs_tag, PRCM_BASE, PRCM_SIZE, 0,
+ &prcm) != 0)
+ panic("Couldn't map the PRCM\n");
+
+ aw_mc_mp_start_ap(cpuscfg, cpuxcfg, prcm);
+ armv7_sev();
+ bus_space_unmap(fdtbus_bs_tag, cpuxcfg, CPUXCFG_SIZE);
+ bus_space_unmap(fdtbus_bs_tag, cpuscfg, CPUCFG_SIZE);
+ bus_space_unmap(fdtbus_bs_tag, prcm, PRCM_SIZE);
+}
Modified: head/sys/arm/allwinner/aw_mp.h
==============================================================================
--- head/sys/arm/allwinner/aw_mp.h Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/aw_mp.h Thu May 5 09:41:57 2016 (r299113)
@@ -31,5 +31,6 @@
void aw_mp_setmaxid(platform_t plat);
void a20_mp_start_ap(platform_t plat);
void a31_mp_start_ap(platform_t plat);
+void a83t_mp_start_ap(platform_t plat);
#endif /* _AW_MP_H_ */
Modified: head/sys/arm/allwinner/aw_usbphy.c
==============================================================================
--- head/sys/arm/allwinner/aw_usbphy.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/aw_usbphy.c Thu May 5 09:41:57 2016 (r299113)
@@ -55,6 +55,7 @@ static struct ofw_compat_data compat_dat
{ "allwinner,sun5i-a13-usb-phy", 1 },
{ "allwinner,sun6i-a31-usb-phy", 1 },
{ "allwinner,sun7i-a20-usb-phy", 1 },
+ { "allwinner,sun8i-a83t-usb-phy", 1 },
{ NULL, 0 }
};
Modified: head/sys/arm/allwinner/clk/aw_ahbclk.c
==============================================================================
--- head/sys/arm/allwinner/clk/aw_ahbclk.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/clk/aw_ahbclk.c Thu May 5 09:41:57 2016 (r299113)
@@ -63,16 +63,35 @@ __FBSDID("$FreeBSD$");
#define A31_AHB1_CLK_SRC_SEL_MAX 3
#define A31_AHB1_CLK_SRC_SEL_SHIFT 12
+#define A83T_AHB1_CLK_SRC_SEL (0x3 << 12)
+#define A83T_AHB1_CLK_SRC_SEL_ISPLL(x) ((x) & 0x2)
+#define A83T_AHB1_CLK_SRC_SEL_MAX 3
+#define A83T_AHB1_CLK_SRC_SEL_SHIFT 12
+#define A83T_AHB1_PRE_DIV (0x3 << 6)
+#define A83T_AHB1_PRE_DIV_SHIFT 6
+#define A83T_AHB1_CLK_DIV_RATIO (0x3 << 4)
+#define A83T_AHB1_CLK_DIV_RATIO_SHIFT 4
+
+#define H3_AHB2_CLK_CFG (0x3 << 0)
+#define H3_AHB2_CLK_CFG_SHIFT 0
+#define H3_AHB2_CLK_CFG_AHB1 0
+#define H3_AHB2_CLK_CFG_PLL_PERIPH_DIV2 1
+#define H3_AHB2_CLK_CFG_MAX 1
+
enum aw_ahbclk_type {
AW_A10_AHB = 1,
AW_A13_AHB,
AW_A31_AHB1,
+ AW_A83T_AHB1,
+ AW_H3_AHB2,
};
static struct ofw_compat_data compat_data[] = {
{ "allwinner,sun4i-a10-ahb-clk", AW_A10_AHB },
{ "allwinner,sun5i-a13-ahb-clk", AW_A13_AHB },
{ "allwinner,sun6i-a31-ahb1-clk", AW_A31_AHB1 },
+ { "allwinner,sun8i-a83t-ahb1-clk", AW_A83T_AHB1 },
+ { "allwinner,sun8i-h3-ahb2-clk", AW_H3_AHB2 },
{ NULL, 0 }
};
@@ -113,6 +132,19 @@ aw_ahbclk_init(struct clknode *clk, devi
index = (val & A31_AHB1_CLK_SRC_SEL) >>
A31_AHB1_CLK_SRC_SEL_SHIFT;
break;
+ case AW_A83T_AHB1:
+ DEVICE_LOCK(sc);
+ AHBCLK_READ(sc, &val);
+ DEVICE_UNLOCK(sc);
+ index = (val & A83T_AHB1_CLK_SRC_SEL) >>
+ A83T_AHB1_CLK_SRC_SEL_SHIFT;
+ break;
+ case AW_H3_AHB2:
+ DEVICE_LOCK(sc);
+ AHBCLK_READ(sc, &val);
+ DEVICE_UNLOCK(sc);
+ index = (val & H3_AHB2_CLK_CFG) >> H3_AHB2_CLK_CFG_SHIFT;
+ break;
default:
return (ENXIO);
}
@@ -133,11 +165,10 @@ aw_ahbclk_recalc_freq(struct clknode *cl
AHBCLK_READ(sc, &val);
DEVICE_UNLOCK(sc);
- div = 1 << ((val & A10_AHB_CLK_DIV_RATIO) >>
- A10_AHB_CLK_DIV_RATIO_SHIFT);
-
switch (sc->type) {
case AW_A31_AHB1:
+ div = 1 << ((val & A10_AHB_CLK_DIV_RATIO) >>
+ A10_AHB_CLK_DIV_RATIO_SHIFT);
src_sel = (val & A31_AHB1_CLK_SRC_SEL) >>
A31_AHB1_CLK_SRC_SEL_SHIFT;
if (src_sel == A31_AHB1_CLK_SRC_SEL_PLL6)
@@ -146,7 +177,28 @@ aw_ahbclk_recalc_freq(struct clknode *cl
else
pre_div = 1;
break;
+ case AW_A83T_AHB1:
+ div = 1 << ((val & A83T_AHB1_CLK_DIV_RATIO) >>
+ A83T_AHB1_CLK_DIV_RATIO_SHIFT);
+ src_sel = (val & A83T_AHB1_CLK_SRC_SEL) >>
+ A83T_AHB1_CLK_SRC_SEL_SHIFT;
+ if (A83T_AHB1_CLK_SRC_SEL_ISPLL(src_sel))
+ pre_div = ((val & A83T_AHB1_PRE_DIV) >>
+ A83T_AHB1_PRE_DIV_SHIFT) + 1;
+ else
+ pre_div = 1;
+ break;
+ case AW_H3_AHB2:
+ src_sel = (val & H3_AHB2_CLK_CFG) >> H3_AHB2_CLK_CFG_SHIFT;
+ if (src_sel == H3_AHB2_CLK_CFG_PLL_PERIPH_DIV2)
+ div = 2;
+ else
+ div = 1;
+ pre_div = 1;
+ break;
default:
+ div = 1 << ((val & A10_AHB_CLK_DIV_RATIO) >>
+ A10_AHB_CLK_DIV_RATIO_SHIFT);
pre_div = 1;
break;
}
@@ -179,6 +231,26 @@ aw_ahbclk_set_mux(struct clknode *clk, i
AHBCLK_WRITE(sc, val);
DEVICE_UNLOCK(sc);
break;
+ case AW_A83T_AHB1:
+ if (index < 0 || index > A83T_AHB1_CLK_SRC_SEL_MAX)
+ return (ERANGE);
+ DEVICE_LOCK(sc);
+ AHBCLK_READ(sc, &val);
+ val &= ~A83T_AHB1_CLK_SRC_SEL;
+ val |= (index << A83T_AHB1_CLK_SRC_SEL_SHIFT);
+ AHBCLK_WRITE(sc, val);
+ DEVICE_UNLOCK(sc);
+ break;
+ case AW_H3_AHB2:
+ if (index < 0 || index > H3_AHB2_CLK_CFG)
+ return (ERANGE);
+ DEVICE_LOCK(sc);
+ AHBCLK_READ(sc, &val);
+ val &= ~H3_AHB2_CLK_CFG;
+ val |= (index << H3_AHB2_CLK_CFG_SHIFT);
+ AHBCLK_WRITE(sc, val);
+ DEVICE_UNLOCK(sc);
+ break;
default:
return (ENXIO);
}
Modified: head/sys/arm/allwinner/clk/aw_apbclk.c
==============================================================================
--- head/sys/arm/allwinner/clk/aw_apbclk.c Thu May 5 08:17:55 2016 (r299112)
+++ head/sys/arm/allwinner/clk/aw_apbclk.c Thu May 5 09:41:57 2016 (r299113)
@@ -49,24 +49,32 @@ __FBSDID("$FreeBSD$");
#include "clkdev_if.h"
-#define APB0_CLK_RATIO (0x3 << 8)
-#define APB0_CLK_RATIO_SHIFT 8
-#define APB1_CLK_SRC_SEL (0x3 << 24)
-#define APB1_CLK_SRC_SEL_SHIFT 24
-#define APB1_CLK_SRC_SEL_MAX 0x3
-#define APB1_CLK_RAT_N (0x3 << 16)
-#define APB1_CLK_RAT_N_SHIFT 16
-#define APB1_CLK_RAT_M (0x1f << 0)
-#define APB1_CLK_RAT_M_SHIFT 0
+#define A10_APB0_CLK_RATIO (0x3 << 8)
+#define A10_APB0_CLK_RATIO_SHIFT 8
+#define A10_APB1_CLK_SRC_SEL (0x3 << 24)
+#define A10_APB1_CLK_SRC_SEL_SHIFT 24
+#define A10_APB1_CLK_SRC_SEL_MAX 0x3
+#define A10_APB1_CLK_RAT_N (0x3 << 16)
+#define A10_APB1_CLK_RAT_N_SHIFT 16
+#define A10_APB1_CLK_RAT_M (0x1f << 0)
+#define A10_APB1_CLK_RAT_M_SHIFT 0
+#define A23_APB0_CLK_RATIO (0x3 << 0)
+#define A23_APB0_CLK_RATIO_SHIFT 0
+#define A83T_APB1_CLK_RATIO (0x3 << 8)
+#define A83T_APB1_CLK_RATIO_SHIFT 8
enum aw_apbclk_type {
AW_A10_APB0 = 1,
AW_A10_APB1,
+ AW_A23_APB0,
+ AW_A83T_APB1,
};
static struct ofw_compat_data compat_data[] = {
{ "allwinner,sun4i-a10-apb0-clk", AW_A10_APB0 },
{ "allwinner,sun4i-a10-apb1-clk", AW_A10_APB1 },
+ { "allwinner,sun8i-a23-apb0-clk", AW_A23_APB0 },
+ { "allwinner,sun8i-a83t-apb1-clk", AW_A83T_APB1 },
{ NULL, 0 }
};
@@ -91,13 +99,16 @@ aw_apbclk_init(struct clknode *clk, devi
switch (sc->type) {
case AW_A10_APB0:
+ case AW_A23_APB0:
+ case AW_A83T_APB1:
index = 0;
break;
case AW_A10_APB1:
DEVICE_LOCK(sc);
APBCLK_READ(sc, &val);
DEVICE_UNLOCK(sc);
- index = (val & APB1_CLK_SRC_SEL) >> APB1_CLK_SRC_SEL_SHIFT;
+ index = (val & A10_APB1_CLK_SRC_SEL) >>
+ A10_APB1_CLK_SRC_SEL_SHIFT;
break;
default:
return (ENXIO);
@@ -121,16 +132,29 @@ aw_apbclk_recalc_freq(struct clknode *cl
switch (sc->type) {
case AW_A10_APB0:
- div = 1 << ((val & APB0_CLK_RATIO) >> APB0_CLK_RATIO_SHIFT);
+ div = 1 << ((val & A10_APB0_CLK_RATIO) >>
+ A10_APB0_CLK_RATIO_SHIFT);
if (div == 1)
div = 2;
*freq = *freq / div;
break;
case AW_A10_APB1:
- n = 1 << ((val & APB1_CLK_RAT_N) >> APB1_CLK_RAT_N_SHIFT);
- m = ((val & APB1_CLK_RAT_N) >> APB1_CLK_RAT_M_SHIFT) + 1;
+ n = 1 << ((val & A10_APB1_CLK_RAT_N) >>
+ A10_APB1_CLK_RAT_N_SHIFT);
+ m = ((val & A10_APB1_CLK_RAT_N) >>
+ A10_APB1_CLK_RAT_M_SHIFT) + 1;
*freq = *freq / n / m;
break;
+ case AW_A23_APB0:
+ div = 1 << ((val & A23_APB0_CLK_RATIO) >>
+ A23_APB0_CLK_RATIO_SHIFT);
+ *freq = *freq / div;
+ break;
+ case AW_A83T_APB1:
+ div = ((val & A83T_APB1_CLK_RATIO) >>
+ A83T_APB1_CLK_RATIO_SHIFT) + 1;
+ *freq = *freq / div;
+ break;
default:
return (ENXIO);
}
@@ -149,13 +173,13 @@ aw_apbclk_set_mux(struct clknode *clk, i
if (sc->type != AW_A10_APB1)
return (ENXIO);
- if (index < 0 || index > APB1_CLK_SRC_SEL_MAX)
+ if (index < 0 || index > A10_APB1_CLK_SRC_SEL_MAX)
return (ERANGE);
DEVICE_LOCK(sc);
APBCLK_READ(sc, &val);
- val &= ~APB1_CLK_SRC_SEL;
- val |= (index << APB1_CLK_SRC_SEL_SHIFT);
+ val &= ~A10_APB1_CLK_SRC_SEL;
+ val |= (index << A10_APB1_CLK_SRC_SEL_SHIFT);
APBCLK_WRITE(sc, val);
DEVICE_UNLOCK(sc);
Added: head/sys/arm/allwinner/clk/aw_cpusclk.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm/allwinner/clk/aw_cpusclk.c Thu May 5 09:41:57 2016 (r299113)
@@ -0,0 +1,320 @@
+/*-
+ * Copyright (c) 2016 Jared McNeill <jmcneill at invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * Allwinner CPUS clock
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <machine/bus.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_subr.h>
+
+#include <dev/extres/clk/clk.h>
+
+#include "clkdev_if.h"
+
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-head
mailing list