svn commit: r299127 - in user/ngie/detangle-rc: lib/libthr/thread share/man/man3 sys/arm/allwinner sys/arm/allwinner/a10 sys/arm/allwinner/a83t sys/arm/allwinner/clk sys/arm/arm sys/arm/broadcom/bc...

Garrett Cooper ngie at FreeBSD.org
Thu May 5 18:52:45 UTC 2016


Author: ngie
Date: Thu May  5 18:52:42 2016
New Revision: 299127
URL: https://svnweb.freebsd.org/changeset/base/299127

Log:
  MFhead at r299126

Added:
  user/ngie/detangle-rc/sys/arm/allwinner/a83t/
     - copied from r299126, head/sys/arm/allwinner/a83t/
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_cpusclk.c
     - copied unchanged from r299126, head/sys/arm/allwinner/clk/aw_cpusclk.c
  user/ngie/detangle-rc/sys/cddl/dev/fbt/mips/
     - copied from r299126, head/sys/cddl/dev/fbt/mips/
Modified:
  user/ngie/detangle-rc/lib/libthr/thread/thr_resume_np.c
  user/ngie/detangle-rc/lib/libthr/thread/thr_sig.c
  user/ngie/detangle-rc/share/man/man3/pthread_resume_np.3
  user/ngie/detangle-rc/share/man/man3/pthread_suspend_all_np.3
  user/ngie/detangle-rc/share/man/man3/pthread_suspend_np.3
  user/ngie/detangle-rc/sys/arm/allwinner/a10/a10_intc.c
  user/ngie/detangle-rc/sys/arm/allwinner/a10_ehci.c
  user/ngie/detangle-rc/sys/arm/allwinner/a10_gpio.c
  user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.c
  user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.h
  user/ngie/detangle-rc/sys/arm/allwinner/aw_ccu.c
  user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.c
  user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.h
  user/ngie/detangle-rc/sys/arm/allwinner/aw_nmi.c
  user/ngie/detangle-rc/sys/arm/allwinner/aw_usbphy.c
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_ahbclk.c
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_apbclk.c
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_gate.c
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_gmacclk.c
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_pll.c
  user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_usbclk.c
  user/ngie/detangle-rc/sys/arm/allwinner/files.allwinner
  user/ngie/detangle-rc/sys/arm/allwinner/std.allwinner
  user/ngie/detangle-rc/sys/arm/arm/genassym.c
  user/ngie/detangle-rc/sys/arm/arm/gic.c
  user/ngie/detangle-rc/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
  user/ngie/detangle-rc/sys/arm/broadcom/bcm2835/bcm2835_intr.c
  user/ngie/detangle-rc/sys/arm/broadcom/bcm2835/bcm2836.c
  user/ngie/detangle-rc/sys/arm/conf/ALLWINNER
  user/ngie/detangle-rc/sys/arm/freescale/imx/imx_gpio.c
  user/ngie/detangle-rc/sys/arm/mv/mpic.c
  user/ngie/detangle-rc/sys/arm/nvidia/tegra_gpio.c
  user/ngie/detangle-rc/sys/arm/ti/aintc.c
  user/ngie/detangle-rc/sys/arm/ti/ti_gpio.c
  user/ngie/detangle-rc/sys/arm64/arm64/gic_v3.c
  user/ngie/detangle-rc/sys/arm64/arm64/gic_v3_fdt.c
  user/ngie/detangle-rc/sys/arm64/arm64/gic_v3_its.c
  user/ngie/detangle-rc/sys/arm64/arm64/gic_v3_var.h
  user/ngie/detangle-rc/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
  user/ngie/detangle-rc/sys/cddl/dev/dtrace/mips/dtrace_asm.S
  user/ngie/detangle-rc/sys/cddl/dev/dtrace/mips/dtrace_subr.c
  user/ngie/detangle-rc/sys/conf/files.mips
  user/ngie/detangle-rc/sys/conf/options.arm
  user/ngie/detangle-rc/sys/dev/acpica/acpi_thermal.c
  user/ngie/detangle-rc/sys/dev/bhnd/bcma/bcma_subr.c
  user/ngie/detangle-rc/sys/dev/bhnd/bhnd_subr.c
  user/ngie/detangle-rc/sys/dev/bwn/if_bwn.c
  user/ngie/detangle-rc/sys/dev/bwn/if_bwnvar.h
  user/ngie/detangle-rc/sys/dev/mpr/mpr_sas.c
  user/ngie/detangle-rc/sys/dev/mps/mps_sas.c
  user/ngie/detangle-rc/sys/kern/subr_intr.c
  user/ngie/detangle-rc/sys/kern/subr_unit.c
  user/ngie/detangle-rc/sys/mips/mediatek/mtk_gpio_v1.c
  user/ngie/detangle-rc/sys/mips/mediatek/mtk_gpio_v2.c
  user/ngie/detangle-rc/sys/mips/mediatek/mtk_intr_gic.c
  user/ngie/detangle-rc/sys/mips/mediatek/mtk_intr_v1.c
  user/ngie/detangle-rc/sys/mips/mediatek/mtk_intr_v2.c
  user/ngie/detangle-rc/sys/mips/mips/exception.S
  user/ngie/detangle-rc/sys/mips/mips/mips_pic.c
  user/ngie/detangle-rc/sys/mips/mips/trap.c
  user/ngie/detangle-rc/sys/modules/bhnd/bhndb/Makefile
  user/ngie/detangle-rc/sys/modules/bhnd/bhndb_pci/Makefile
  user/ngie/detangle-rc/sys/sys/_bitset.h
  user/ngie/detangle-rc/sys/sys/_cpuset.h
  user/ngie/detangle-rc/sys/sys/bitset.h
  user/ngie/detangle-rc/sys/sys/cpuset.h
  user/ngie/detangle-rc/sys/sys/intr.h
  user/ngie/detangle-rc/sys/sys/pcpu.h
  user/ngie/detangle-rc/sys/sys/rman.h
Directory Properties:
  user/ngie/detangle-rc/   (props changed)
  user/ngie/detangle-rc/sys/cddl/contrib/opensolaris/   (props changed)

Modified: user/ngie/detangle-rc/lib/libthr/thread/thr_resume_np.c
==============================================================================
--- user/ngie/detangle-rc/lib/libthr/thread/thr_resume_np.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/lib/libthr/thread/thr_resume_np.c	Thu May  5 18:52:42 2016	(r299127)
@@ -91,7 +91,7 @@ static void
 resume_common(struct pthread *thread)
 {
 	/* Clear the suspend flag: */
-	thread->flags &= ~THR_FLAGS_NEED_SUSPEND;
+	thread->flags &= ~(THR_FLAGS_NEED_SUSPEND | THR_FLAGS_SUSPENDED);
 	thread->cycle++;
 	_thr_umtx_wake(&thread->cycle, 1, 0);
 }

Modified: user/ngie/detangle-rc/lib/libthr/thread/thr_sig.c
==============================================================================
--- user/ngie/detangle-rc/lib/libthr/thread/thr_sig.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/lib/libthr/thread/thr_sig.c	Thu May  5 18:52:42 2016	(r299127)
@@ -374,8 +374,7 @@ check_suspend(struct pthread *curthread)
 	 */
 	curthread->critical_count++;
 	THR_UMUTEX_LOCK(curthread, &(curthread)->lock);
-	while ((curthread->flags & (THR_FLAGS_NEED_SUSPEND |
-		THR_FLAGS_SUSPENDED)) == THR_FLAGS_NEED_SUSPEND) {
+	while ((curthread->flags & THR_FLAGS_NEED_SUSPEND) != 0) {
 		curthread->cycle++;
 		cycle = curthread->cycle;
 
@@ -392,7 +391,6 @@ check_suspend(struct pthread *curthread)
 		THR_UMUTEX_UNLOCK(curthread, &(curthread)->lock);
 		_thr_umtx_wait_uint(&curthread->cycle, cycle, NULL, 0);
 		THR_UMUTEX_LOCK(curthread, &(curthread)->lock);
-		curthread->flags &= ~THR_FLAGS_SUSPENDED;
 	}
 	THR_UMUTEX_UNLOCK(curthread, &(curthread)->lock);
 	curthread->critical_count--;

Modified: user/ngie/detangle-rc/share/man/man3/pthread_resume_np.3
==============================================================================
--- user/ngie/detangle-rc/share/man/man3/pthread_resume_np.3	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/share/man/man3/pthread_resume_np.3	Thu May  5 18:52:42 2016	(r299127)
@@ -57,7 +57,7 @@ function will fail if:
 The value specified by the
 .Fa tid
 argument is invalid.
-.It Bq ESRC
+.It Bq Er ESRC
 No thread could be found corresponding to the thread ID specified by the
 .Fa tid
 argument.

Modified: user/ngie/detangle-rc/share/man/man3/pthread_suspend_all_np.3
==============================================================================
--- user/ngie/detangle-rc/share/man/man3/pthread_suspend_all_np.3	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/share/man/man3/pthread_suspend_all_np.3	Thu May  5 18:52:42 2016	(r299127)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 13, 2003
+.Dd May 5, 2016
 .Dt PTHREAD_SUSPEND_ALL_NP 3
 .Os
 .Sh NAME
@@ -44,6 +44,13 @@ The only exception is the current thread
 the thread that called the
 .Fn pthread_suspend_all_np
 function.
+.Pp
+It is not safe for the caller of the
+.Fn pthread_suspend_all_np
+function to use any non-async signal safe functions, besides
+.Xr pthread_resume_all_np 3 ,
+until threads are resumed, unless measures are taken to ensure
+that all threads are suspended at safe points.
 .Sh SEE ALSO
 .Xr pthread_resume_all_np 3 ,
 .Xr pthread_resume_np 3 ,

Modified: user/ngie/detangle-rc/share/man/man3/pthread_suspend_np.3
==============================================================================
--- user/ngie/detangle-rc/share/man/man3/pthread_suspend_np.3	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/share/man/man3/pthread_suspend_np.3	Thu May  5 18:52:42 2016	(r299127)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 13, 2003
+.Dd May 5, 2016
 .Dt PTHREAD_SUSPEND_NP 3
 .Os
 .Sh NAME
@@ -40,6 +40,13 @@
 The
 .Fn pthread_suspend_np
 function, called on an active thread, causes it to suspend.
+.Pp
+It is not safe for the caller of the
+.Fn pthread_suspend_np
+function to use any non-async signal safe functions, except
+.Xr pthread_resume_np 3 ,
+until suspended thread is resumed, unless measures are taken to ensure
+that the thread is suspended at a safe point.
 .Sh RETURN VALUES
 If successful,
 .Fn pthread_suspend_np
@@ -56,7 +63,7 @@ An attempt was made to suspend the curre
 The value specified by the
 .Fa tid
 argument is invalid.
-.It Bq ESRC
+.It Bq Er ESRC
 No thread could be found corresponding to the thread ID specified by the
 .Fa tid
 argument.

Modified: user/ngie/detangle-rc/sys/arm/allwinner/a10/a10_intc.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/a10/a10_intc.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/a10/a10_intc.c	Thu May  5 18:52:42 2016	(r299127)
@@ -298,14 +298,18 @@ static int
 a10_intr_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+	struct intr_map_data_fdt *daf;
 	struct a10_aintc_softc *sc;
 
-	if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells != 1 ||
-	    data->fdt.cells[0] >= A10_INTR_MAX_NIRQS)
+	if (data->type != INTR_MAP_DATA_FDT)
+		return (ENOTSUP);
+
+	daf = (struct intr_map_data_fdt *)data;
+	if (daf->ncells != 1 || daf->cells[0] >= A10_INTR_MAX_NIRQS)
 		return (EINVAL);
 
 	sc = device_get_softc(dev);
-	*isrcp = &sc->isrcs[data->fdt.cells[0]].isrc;
+	*isrcp = &sc->isrcs[daf->cells[0]].isrc;
 	return (0);
 }
 

Modified: user/ngie/detangle-rc/sys/arm/allwinner/a10_ehci.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/a10_ehci.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/a10_ehci.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/a10_gpio.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/a10_gpio.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/a10_gpio.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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}
 };
 

Modified: user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.h
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.h	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/allwinner_machdep.h	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/aw_ccu.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/aw_ccu.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/aw_ccu.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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, &reg) != 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, &reg) != 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, &reg) != 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: user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.h
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.h	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/aw_mp.h	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/aw_nmi.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/aw_nmi.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/aw_nmi.c	Thu May  5 18:52:42 2016	(r299127)
@@ -188,16 +188,18 @@ static int
 aw_nmi_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+	struct intr_map_data_fdt *daf;
 	struct aw_nmi_softc *sc;
 	int error;
 	u_int irq;
 
-	sc = device_get_softc(dev);
 	if (data->type != INTR_MAP_DATA_FDT)
 		return (ENOTSUP);
 
-	error = aw_nmi_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-	    NULL, NULL);
+	sc = device_get_softc(dev);
+	daf = (struct intr_map_data_fdt *)data;
+
+	error = aw_nmi_map_fdt(dev, daf->ncells, daf->cells, &irq, NULL, NULL);
 	if (error == 0)
 		*isrcp = &sc->intr.isrc;
 
@@ -208,6 +210,7 @@ static int
 aw_nmi_setup_intr(device_t dev, struct intr_irqsrc *isrc,
     struct resource *res, struct intr_map_data *data)
 {
+	struct intr_map_data_fdt *daf;
 	struct aw_nmi_softc *sc;
 	struct aw_nmi_intr *nmi_intr;
 	int error, icfg;
@@ -215,14 +218,15 @@ aw_nmi_setup_intr(device_t dev, struct i
 	enum intr_trigger trig;
 	enum intr_polarity pol;
 
-	sc = device_get_softc(dev);
-	nmi_intr = (struct aw_nmi_intr *)isrc;
-
 	/* Get config for interrupt. */
 	if (data == NULL || data->type != INTR_MAP_DATA_FDT)
 		return (ENOTSUP);
-	error = aw_nmi_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-	    &pol, &trig);
+
+	sc = device_get_softc(dev);
+	nmi_intr = (struct aw_nmi_intr *)isrc;
+	daf = (struct intr_map_data_fdt *)data;
+
+	error = aw_nmi_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol, &trig);
 	if (error != 0)
 		return (error);
 	if (nmi_intr->irq != irq)

Modified: user/ngie/detangle-rc/sys/arm/allwinner/aw_usbphy.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/aw_usbphy.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/aw_usbphy.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_ahbclk.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_ahbclk.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_ahbclk.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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: user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_apbclk.c
==============================================================================
--- user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_apbclk.c	Thu May  5 18:43:31 2016	(r299126)
+++ user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_apbclk.c	Thu May  5 18:52:42 2016	(r299127)
@@ -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);
 

Copied: user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_cpusclk.c (from r299126, head/sys/arm/allwinner/clk/aw_cpusclk.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/ngie/detangle-rc/sys/arm/allwinner/clk/aw_cpusclk.c	Thu May  5 18:52:42 2016	(r299127, copy of r299126, head/sys/arm/allwinner/clk/aw_cpusclk.c)
@@ -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"
+
+#define	A80_CPUS_CLK_SRC_SEL			(0x3 << 16)
+#define	A80_CPUS_CLK_SRC_SEL_SHIFT		16
+#define	A80_CPUS_CLK_SRC_SEL_X32KI		0
+#define	A80_CPUS_CLK_SRC_SEL_OSC24M		1
+#define	A80_CPUS_CLK_SRC_SEL_PLL_PERIPH		2
+#define	A80_CPUS_CLK_SRC_SEL_PLL_AUDIO		3
+#define	A80_CPUS_POST_DIV			(0x1f << 8)
+#define	A80_CPUS_POST_DIV_SHIFT			8
+#define	A80_CPUS_CLK_RATIO			(0x3 << 4)
+#define	A80_CPUS_CLK_RATIO_SHIFT		4
+
+#define	A83T_CPUS_CLK_SRC_SEL			(0x3 << 16)
+#define	A83T_CPUS_CLK_SRC_SEL_SHIFT		16
+#define	A83T_CPUS_CLK_SRC_SEL_X32KI		0
+#define	A83T_CPUS_CLK_SRC_SEL_OSC24M		1
+#define	A83T_CPUS_CLK_SRC_SEL_PLL_PERIPH	2
+#define	A83T_CPUS_CLK_SRC_SEL_INTERNAL_OSC	3
+#define	A83T_CPUS_POST_DIV			(0x1f << 8)
+#define	A83T_CPUS_POST_DIV_SHIFT		8
+#define	A83T_CPUS_CLK_RATIO			(0x3 << 4)
+#define	A83T_CPUS_CLK_RATIO_SHIFT		4
+
+enum aw_cpusclk_type {
+	AW_A80_CPUS = 1,
+	AW_A83T_CPUS,
+};
+
+static struct ofw_compat_data compat_data[] = {
+	{ "allwinner,sun9i-a80-cpus-clk",	AW_A80_CPUS },
+	{ "allwinner,sun8i-a83t-cpus-clk",	AW_A83T_CPUS },
+	{ NULL, 0 }
+};
+
+struct aw_cpusclk_sc {
+	device_t		clkdev;
+	bus_addr_t		reg;
+	enum aw_cpusclk_type	type;
+};
+
+#define	CPUSCLK_READ(sc, val)	CLKDEV_READ_4((sc)->clkdev, (sc)->reg, (val))
+#define	CPUSCLK_WRITE(sc, val)	CLKDEV_WRITE_4((sc)->clkdev, (sc)->reg, (val))
+#define	DEVICE_LOCK(sc)		CLKDEV_DEVICE_LOCK((sc)->clkdev)
+#define	DEVICE_UNLOCK(sc)	CLKDEV_DEVICE_UNLOCK((sc)->clkdev)
+
+static int
+aw_cpusclk_init(struct clknode *clk, device_t dev)
+{
+	struct aw_cpusclk_sc *sc;
+	uint32_t val, mask, shift, index;
+
+	sc = clknode_get_softc(clk);
+
+	switch (sc->type) {
+	case AW_A80_CPUS:
+		mask = A80_CPUS_CLK_SRC_SEL;
+		shift = A80_CPUS_CLK_SRC_SEL_SHIFT;
+		break;
+	case AW_A83T_CPUS:
+		mask = A83T_CPUS_CLK_SRC_SEL;
+		shift = A83T_CPUS_CLK_SRC_SEL_SHIFT;
+		break;
+	default:
+		return (ENXIO);
+	}
+
+	DEVICE_LOCK(sc);
+	CPUSCLK_READ(sc, &val);
+	DEVICE_UNLOCK(sc);
+	index = (val & mask) >> shift;
+
+	clknode_init_parent_idx(clk, index);
+	return (0);
+}
+
+static int
+aw_cpusclk_recalc_freq(struct clknode *clk, uint64_t *freq)
+{

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-user mailing list