From owner-svn-src-stable-11@freebsd.org Mon Sep 5 20:17:21 2016 Return-Path: Delivered-To: svn-src-stable-11@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2C9F3B96F64; Mon, 5 Sep 2016 20:17:21 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0169ABBE; Mon, 5 Sep 2016 20:17:20 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u85KHKKv061181; Mon, 5 Sep 2016 20:17:20 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u85KHJbc061169; Mon, 5 Sep 2016 20:17:19 GMT (envelope-from manu@FreeBSD.org) Message-Id: <201609052017.u85KHJbc061169@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Mon, 5 Sep 2016 20:17:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r305436 - in stable/11/sys: arm/allwinner arm/allwinner/a13 arm/allwinner/clk arm/conf conf X-SVN-Group: stable-11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-11@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for only the 11-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Sep 2016 20:17:21 -0000 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 +#include + #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