Module Name: src Committed By: skrll Date: Tue Aug 13 07:20:23 UTC 2024
Modified Files: src/sys/arch/arm/sunxi: sun6i_dma.c sunxi_gpio.c sunxi_gpio.h sunxi_sid.c sunxi_usbphy.c src/sys/arch/riscv/conf: GENERIC64 files.generic64 std.riscv std.riscv64 Added Files: src/sys/arch/riscv/sunxi: files.sunxi sun20i_d1_ccu.c sun20i_d1_ccu.h sun20i_d1_gpio.c Log Message: risc-v: Allwinner D1 support Add the Allwinnder D1 support provided by Rui-Xiang Guo and updated but me. https://mail-index.netbsd.org/port-riscv/2024/08/04/msg000127.html Only driver listed as attaching in https://github.com/picohive/netbsd-mangopi-mq-pro/blob/main/boot.log have been added. There is no need for the platform stuff as the board's u-boot is able to load bootriscv64.efi and boot a generic kernel. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/sunxi/sun6i_dma.c cvs rdiff -u -r1.38 -r1.39 src/sys/arch/arm/sunxi/sunxi_gpio.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/sunxi/sunxi_gpio.h cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/sunxi/sunxi_sid.c cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/sunxi/sunxi_usbphy.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/riscv/conf/GENERIC64 cvs rdiff -u -r1.2 -r1.3 src/sys/arch/riscv/conf/files.generic64 cvs rdiff -u -r1.1 -r1.2 src/sys/arch/riscv/conf/std.riscv cvs rdiff -u -r1.3 -r1.4 src/sys/arch/riscv/conf/std.riscv64 cvs rdiff -u -r0 -r1.1 src/sys/arch/riscv/sunxi/files.sunxi \ src/sys/arch/riscv/sunxi/sun20i_d1_ccu.c \ src/sys/arch/riscv/sunxi/sun20i_d1_ccu.h \ src/sys/arch/riscv/sunxi/sun20i_d1_gpio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/sunxi/sun6i_dma.c diff -u src/sys/arch/arm/sunxi/sun6i_dma.c:1.15 src/sys/arch/arm/sunxi/sun6i_dma.c:1.16 --- src/sys/arch/arm/sunxi/sun6i_dma.c:1.15 Wed May 5 10:24:04 2021 +++ src/sys/arch/arm/sunxi/sun6i_dma.c Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sun6i_dma.c,v 1.15 2021/05/05 10:24:04 jmcneill Exp $ */ +/* $NetBSD: sun6i_dma.c,v 1.16 2024/08/13 07:20:23 skrll Exp $ */ /*- * Copyright (c) 2014-2017 Jared McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_ddb.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sun6i_dma.c,v 1.15 2021/05/05 10:24:04 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sun6i_dma.c,v 1.16 2024/08/13 07:20:23 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -151,6 +151,16 @@ static const struct sun6idma_config sun8 .widths = WIDTHS_1_2_4, }; +static const struct sun6idma_config sun20i_d1_dma_config = { + .num_channels = 16, + .autogate = true, + .autogate_reg = 0x28, + .autogate_mask = 0x4, + .burst_mask = __BITS(7,6), + .bursts = BURSTS_1_4_8_16, + .widths = WIDTHS_1_2_4_8, +}; + static const struct sun6idma_config sun50i_a64_dma_config = { .num_channels = 8, .autogate = true, @@ -170,6 +180,8 @@ static const struct device_compatible_en .data = &sun8i_h3_dma_config }, { .compat = "allwinner,sun8i-v3s-dma", .data = &sun8i_v3s_dma_config }, + { .compat = "allwinner,sun20i-d1-dma", + .data = &sun20i_d1_dma_config }, { .compat = "allwinner,sun50i-a64-dma", .data = &sun50i_a64_dma_config }, Index: src/sys/arch/arm/sunxi/sunxi_gpio.c diff -u src/sys/arch/arm/sunxi/sunxi_gpio.c:1.38 src/sys/arch/arm/sunxi/sunxi_gpio.c:1.39 --- src/sys/arch/arm/sunxi/sunxi_gpio.c:1.38 Tue Jun 28 05:19:03 2022 +++ src/sys/arch/arm/sunxi/sunxi_gpio.c Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_gpio.c,v 1.38 2022/06/28 05:19:03 skrll Exp $ */ +/* $NetBSD: sunxi_gpio.c,v 1.39 2024/08/13 07:20:23 skrll Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_soc.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c,v 1.38 2022/06/28 05:19:03 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c,v 1.39 2024/08/13 07:20:23 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -121,6 +121,10 @@ static const struct device_compatible_en { .compat = "allwinner,sun9i-a80-r-pinctrl", .data = &sun9i_a80_r_padconf }, #endif +#ifdef SOC_SUN20I_D1 + { .compat = "allwinner,sun20i-d1-pinctrl", + .data = &sun20i_d1_padconf }, +#endif #ifdef SOC_SUN50I_A64 { .compat = "allwinner,sun50i-a64-pinctrl", .data = &sun50i_a64_padconf }, Index: src/sys/arch/arm/sunxi/sunxi_gpio.h diff -u src/sys/arch/arm/sunxi/sunxi_gpio.h:1.10 src/sys/arch/arm/sunxi/sunxi_gpio.h:1.11 --- src/sys/arch/arm/sunxi/sunxi_gpio.h:1.10 Tue Jun 28 05:19:03 2022 +++ src/sys/arch/arm/sunxi/sunxi_gpio.h Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_gpio.h,v 1.10 2022/06/28 05:19:03 skrll Exp $ */ +/* $NetBSD: sunxi_gpio.h,v 1.11 2024/08/13 07:20:23 skrll Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -34,7 +34,7 @@ #include "opt_soc.h" -#define SUNXI_GPIO_MAXFUNC 8 +#define SUNXI_GPIO_MAXFUNC 15 struct sunxi_gpio_pins { const char *name; @@ -88,6 +88,10 @@ extern const struct sunxi_gpio_padconf s extern const struct sunxi_gpio_padconf sun9i_a80_r_padconf; #endif +#ifdef SOC_SUN20I_D1 +extern const struct sunxi_gpio_padconf sun20i_d1_padconf; +#endif + #ifdef SOC_SUN50I_A64 extern const struct sunxi_gpio_padconf sun50i_a64_padconf; extern const struct sunxi_gpio_padconf sun50i_a64_r_padconf; Index: src/sys/arch/arm/sunxi/sunxi_sid.c diff -u src/sys/arch/arm/sunxi/sunxi_sid.c:1.7 src/sys/arch/arm/sunxi/sunxi_sid.c:1.8 --- src/sys/arch/arm/sunxi/sunxi_sid.c:1.7 Wed Jan 27 03:10:20 2021 +++ src/sys/arch/arm/sunxi/sunxi_sid.c Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_sid.c,v 1.7 2021/01/27 03:10:20 thorpej Exp $ */ +/* $NetBSD: sunxi_sid.c,v 1.8 2024/08/13 07:20:23 skrll Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_sid.c,v 1.7 2021/01/27 03:10:20 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_sid.c,v 1.8 2024/08/13 07:20:23 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -59,6 +59,7 @@ static const struct device_compatible_en { .compat = "allwinner,sun7i-a20-sid", .data = &sun4i_a10_sid_config }, { .compat = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_sid_config }, { .compat = "allwinner,sun8i-a83t-sid", .data = &sun8i_h3_sid_config }, + { .compat = "allwinner,sun20i-d1-sid", .data = &sun8i_h3_sid_config }, { .compat = "allwinner,sun50i-a64-sid", .data = &sun8i_h3_sid_config }, DEVICE_COMPAT_EOL }; Index: src/sys/arch/arm/sunxi/sunxi_usbphy.c diff -u src/sys/arch/arm/sunxi/sunxi_usbphy.c:1.17 src/sys/arch/arm/sunxi/sunxi_usbphy.c:1.18 --- src/sys/arch/arm/sunxi/sunxi_usbphy.c:1.17 Tue Jun 28 05:19:03 2022 +++ src/sys/arch/arm/sunxi/sunxi_usbphy.c Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_usbphy.c,v 1.17 2022/06/28 05:19:03 skrll Exp $ */ +/* $NetBSD: sunxi_usbphy.c,v 1.18 2024/08/13 07:20:23 skrll Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -28,7 +28,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_usbphy.c,v 1.17 2022/06/28 05:19:03 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_usbphy.c,v 1.18 2024/08/13 07:20:23 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -80,6 +80,7 @@ enum sunxi_usbphy_type { USBPHY_A31, USBPHY_A64, USBPHY_A83T, + USBPHY_D1, USBPHY_H3, USBPHY_H6, }; @@ -92,6 +93,7 @@ static const struct device_compatible_en { .compat = "allwinner,sun8i-a83t-usb-phy", .value = USBPHY_A83T }, { .compat = "allwinner,sun8i-h3-usb-phy", .value = USBPHY_H3 }, { .compat = "allwinner,sun8i-v3s-usb-phy", .value = USBPHY_H3 }, + { .compat = "allwinner,sun20i-d1-usb-phy", .value = USBPHY_D1 }, { .compat = "allwinner,sun50i-a64-usb-phy", .value = USBPHY_A64 }, { .compat = "allwinner,sun50i-h6-usb-phy", .value = USBPHY_H6 }, DEVICE_COMPAT_EOL @@ -150,6 +152,7 @@ sunxi_usbphy_write(struct sunxi_usbphy_s case USBPHY_A31: reg = PHYCTL_A10; break; + case USBPHY_D1: case USBPHY_H3: case USBPHY_H6: case USBPHY_A64: @@ -233,6 +236,7 @@ sunxi_usbphy_enable(device_t dev, void * phy0_reroute = false; break; case USBPHY_A64: + case USBPHY_D1: case USBPHY_H3: case USBPHY_H6: disc_thresh = 0x3; Index: src/sys/arch/riscv/conf/GENERIC64 diff -u src/sys/arch/riscv/conf/GENERIC64:1.9 src/sys/arch/riscv/conf/GENERIC64:1.10 --- src/sys/arch/riscv/conf/GENERIC64:1.9 Fri Feb 9 08:51:49 2024 +++ src/sys/arch/riscv/conf/GENERIC64 Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC64,v 1.9 2024/02/09 08:51:49 skrll Exp $ +# $NetBSD: GENERIC64,v 1.10 2024/08/13 07:20:23 skrll Exp $ # # GENERIC machine description file # @@ -49,11 +49,23 @@ options DEBUG # expensive debugging ch # Cache controller ccache* at fdt? # SiFive FU[57]40 L2 Cache -# Clock controller +# Fixed Voltage/Current Regulators +fregulator* at fdt? pass 4 + +# Clock and reset controller jh7100clkc* at fdt? pass 2 # StarFive JH7100 clock controller +sun20id1ccu* at fdt? pass 2 # Allwinner D1/D1s CCU + +# Security ID EFUSE +sunxisid* at fdt? pass 4 # Allwinner SID + +# DMA +sun6idma* at fdt? pass 4 # Allwinner DMA controller (sun6i) # Pin control jh7100pinctrl* at fdt? pass 2 # StarFive JH7100 pinctrl driver +sunxigpio* at fdt? pass 3 # Allwinner GPIO +gpio* at gpiobus? # SDMMC dwcmmc* at fdt? # DesignWare SD/MMC @@ -65,6 +77,9 @@ ld3 at sdmmc3 ld* at sdmmc? bwfm* at sdmmc? # Broadcom BCM43xxx WiFi Interface +# USB PHY +sunxiusbphy* at fdt? # Allwinner USB PHY + # USB jh71x0usb* at fdt? # StarFive JH71x0 usb Index: src/sys/arch/riscv/conf/files.generic64 diff -u src/sys/arch/riscv/conf/files.generic64:1.2 src/sys/arch/riscv/conf/files.generic64:1.3 --- src/sys/arch/riscv/conf/files.generic64:1.2 Tue Jan 16 09:06:46 2024 +++ src/sys/arch/riscv/conf/files.generic64 Tue Aug 13 07:20:23 2024 @@ -1,4 +1,4 @@ -# $NetBSD: files.generic64,v 1.2 2024/01/16 09:06:46 skrll Exp $ +# $NetBSD: files.generic64,v 1.3 2024/08/13 07:20:23 skrll Exp $ # # Generic (RV64) kernel configuration info # @@ -6,3 +6,4 @@ # Add other board / vendor files here include "arch/riscv/sifive/files.sifive" include "arch/riscv/starfive/files.starfive" +include "arch/riscv/sunxi/files.sunxi" Index: src/sys/arch/riscv/conf/std.riscv diff -u src/sys/arch/riscv/conf/std.riscv:1.1 src/sys/arch/riscv/conf/std.riscv:1.2 --- src/sys/arch/riscv/conf/std.riscv:1.1 Sat Mar 28 16:13:56 2015 +++ src/sys/arch/riscv/conf/std.riscv Tue Aug 13 07:20:23 2024 @@ -1,5 +1,5 @@ # -# $NetBSD: std.riscv,v 1.1 2015/03/28 16:13:56 matt Exp $ +# $NetBSD: std.riscv,v 1.2 2024/08/13 07:20:23 skrll Exp $ # machine riscv @@ -8,6 +8,8 @@ include "conf/std" options EXEC_ELF32 options EXEC_SCRIPT +options SOC_SUN20I_D1 + #no defflag COMPAT_09 #no defflag COMPAT_10 #no defflag COMPAT_11 Index: src/sys/arch/riscv/conf/std.riscv64 diff -u src/sys/arch/riscv/conf/std.riscv64:1.3 src/sys/arch/riscv/conf/std.riscv64:1.4 --- src/sys/arch/riscv/conf/std.riscv64:1.3 Sun May 7 12:41:48 2023 +++ src/sys/arch/riscv/conf/std.riscv64 Tue Aug 13 07:20:23 2024 @@ -1,5 +1,5 @@ # -# $NetBSD: std.riscv64,v 1.3 2023/05/07 12:41:48 skrll Exp $ +# $NetBSD: std.riscv64,v 1.4 2024/08/13 07:20:23 skrll Exp $ # machine riscv @@ -8,6 +8,8 @@ include "conf/std" options EXEC_SCRIPT options EXEC_ELF64 +options SOC_SUN20I_D1 + makeoptions LP64="yes" #no defflag COMPAT_09 Added files: Index: src/sys/arch/riscv/sunxi/files.sunxi diff -u /dev/null src/sys/arch/riscv/sunxi/files.sunxi:1.1 --- /dev/null Tue Aug 13 07:20:23 2024 +++ src/sys/arch/riscv/sunxi/files.sunxi Tue Aug 13 07:20:23 2024 @@ -0,0 +1,50 @@ +# $NetBSD: files.sunxi,v 1.1 2024/08/13 07:20:23 skrll Exp $ +# +# Configuration info for Allwinner sunxi family SoCs +# +# + +# CCU +define sunxi_ccu +file arch/arm/sunxi/sunxi_ccu.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_div.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_fixed_factor.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_fractional.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_gate.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_mux.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_nm.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_nkmp.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_phase.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_prediv.c sunxi_ccu +file arch/arm/sunxi/sunxi_ccu_display.c sunxi_ccu + +# CCU (D1/D1s) +device sun20id1ccu: sunxi_ccu +attach sun20id1ccu at fdt with sunxi_d1_ccu +file arch/riscv/sunxi/sun20i_d1_ccu.c sunxi_d1_ccu + +# GPIO +device sunxigpio: gpiobus +attach sunxigpio at fdt with sunxi_gpio +file arch/arm/sunxi/sunxi_gpio.c sunxi_gpio +file arch/riscv/sunxi/sun20i_d1_gpio.c sunxi_gpio & soc_sun20i_d1 + +# DMA controller (sun6i) +device sun6idma +attach sun6idma at fdt with sun6i_dma +file arch/arm/sunxi/sun6i_dma.c sun6i_dma + +# Security ID EFUSE +device sunxisid +attach sunxisid at fdt with sunxi_sid +file arch/arm/sunxi/sunxi_sid.c sunxi_sid + +# USB PHY +device sunxiusbphy +attach sunxiusbphy at fdt with sunxi_usbphy +file arch/arm/sunxi/sunxi_usbphy.c sunxi_usbphy + +# SOC parameters +defflag opt_soc.h SOC_SUNXI +defflag opt_soc.h SOC_SUN20I: SOC_SUNXI +defflag opt_soc.h SOC_SUN20I_D1: SOC_SUN20I Index: src/sys/arch/riscv/sunxi/sun20i_d1_ccu.c diff -u /dev/null src/sys/arch/riscv/sunxi/sun20i_d1_ccu.c:1.1 --- /dev/null Tue Aug 13 07:20:23 2024 +++ src/sys/arch/riscv/sunxi/sun20i_d1_ccu.c Tue Aug 13 07:20:23 2024 @@ -0,0 +1,550 @@ +/* $NetBSD: sun20i_d1_ccu.c,v 1.1 2024/08/13 07:20:23 skrll Exp $ */ + +/*- + * Copyright (c) 2024 Rui-Xiang Guo + * 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. + */ + +#include <sys/cdefs.h> + +__KERNEL_RCSID(1, "$NetBSD: sun20i_d1_ccu.c,v 1.1 2024/08/13 07:20:23 skrll Exp $"); + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/systm.h> + +#include <dev/fdt/fdtvar.h> + +#include <arm/sunxi/sunxi_ccu.h> +#include <riscv/sunxi/sun20i_d1_ccu.h> + +#define PLL_CPU_CTRL_REG 0x000 +#define PLL_DDR_CTRL_REG 0x010 +#define PLL_PERI_CTRL_REG 0x020 +#define PLL_AUDIO1_CTRL_REG 0x080 +#define PSI_CLK_REG 0x510 +#define APB0_CLK_REG 0x520 +#define APB1_CLK_REG 0x524 +#define MBUS_CLK_REG 0x540 +#define DE_BGR_REG 0x60c +#define DI_BGR_REG 0x62c +#define G2D_BGR_REG 0x63c +#define CE_BGR_REG 0x68c +#define VE_BGR_REG 0x69c +#define DMA_BGR_REG 0x70c +#define MSGBOX_BGR_REG 0x71c +#define SPINLOCK_BGR_REG 0x72c +#define HSTIMER_BGR_REG 0x73c +#define AVS_CLK_REG 0x740 +#define DBGSYS_BGR_REG 0x78c +#define PWM_BGR_REG 0x7ac +#define IOMMU_BGR_REG 0x7bc +#define DRAM_CLK_REG 0x800 +#define MBUS_MAT_CLK_GATING_REG 0x804 +#define DRAM_BGR_REG 0x80c +#define SMHC0_CLK_REG 0x830 +#define SMHC1_CLK_REG 0x834 +#define SMHC2_CLK_REG 0x838 +#define SMHC_BGR_REG 0x84c +#define UART_BGR_REG 0x90c +#define TWI_BGR_REG 0x91c +#define SPI_BGR_REG 0x96c +#define EMAC_BGR_REG 0x97c +#define IRTX_BGR_REG 0x9cc +#define GPADC_BGR_REG 0x9ec +#define THS_BGR_REG 0x9fc +#define I2S_BGR_REG 0xa20 +#define OWA_BGR_REG 0xa2c +#define DMIC_BGR_REG 0xa4c +#define AUDIO_CODEC_BGR_REG 0xa5c +#define USB0_CLK_REG 0xa70 +#define USB1_CLK_REG 0xa74 +#define USB_BGR_REG 0xa8c +#define LRADC_BGR_REG 0xa9c +#define DPSS_TOP_BGR_REG 0xabc +#define HDMI_BGR_REG 0xb1c +#define DSI_BGR_REG 0xb4c +#define TCONLCD_BGR_REG 0xb7c +#define TCONTV_BGR_REG 0xb9c +#define LVDS_BGR_REG 0xbac +#define TVE_BGR_REG 0xbbc +#define TVD_BGR_REG 0xbdc +#define LEDC_BGR_REG 0xbfc +#define CSI_BGR_REG 0xc1c +#define TPADC_BGR_REG 0xc5c +#define DSP_BGR_REG 0xc7c +#define RISCV_CFG_BGR_REG 0xd0c + +static int sun20i_d1_ccu_match(device_t, cfdata_t, void *); +static void sun20i_d1_ccu_attach(device_t, device_t, void *); + +static const struct device_compatible_entry compat_data[] = { + { .compat = "allwinner,sun20i-d1-ccu" }, + DEVICE_COMPAT_EOL +}; + +CFATTACH_DECL_NEW(sunxi_d1_ccu, sizeof(struct sunxi_ccu_softc), + sun20i_d1_ccu_match, sun20i_d1_ccu_attach, NULL, NULL); + +static struct sunxi_ccu_reset sun20i_d1_ccu_resets[] = { + SUNXI_CCU_RESET(D1_RST_MBUS, MBUS_CLK_REG, 30), + + SUNXI_CCU_RESET(D1_RST_BUS_DE, DE_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DI, DI_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_G2D, G2D_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_CE, CE_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_VE, VE_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DMA, DMA_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_MSGBOX0, MSGBOX_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_MSGBOX1, MSGBOX_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_MSGBOX2, MSGBOX_BGR_REG, 18), + + SUNXI_CCU_RESET(D1_RST_BUS_SPINLOCK, SPINLOCK_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_HSTIMER, HSTIMER_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DBGSYS, DBGSYS_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_PWM, PWM_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DRAM, DRAM_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_MMC0, SMHC_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_MMC1, SMHC_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_MMC2, SMHC_BGR_REG, 18), + + SUNXI_CCU_RESET(D1_RST_BUS_UART0, UART_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_UART1, UART_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_UART2, UART_BGR_REG, 18), + SUNXI_CCU_RESET(D1_RST_BUS_UART3, UART_BGR_REG, 19), + SUNXI_CCU_RESET(D1_RST_BUS_UART4, UART_BGR_REG, 20), + SUNXI_CCU_RESET(D1_RST_BUS_UART5, UART_BGR_REG, 21), + + SUNXI_CCU_RESET(D1_RST_BUS_I2C0, TWI_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_I2C1, TWI_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_I2C2, TWI_BGR_REG, 18), + SUNXI_CCU_RESET(D1_RST_BUS_I2C3, TWI_BGR_REG, 19), + + SUNXI_CCU_RESET(D1_RST_BUS_SPI0, SPI_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_SPI1, SPI_BGR_REG, 17), + + SUNXI_CCU_RESET(D1_RST_BUS_EMAC, EMAC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_IRTX, IRTX_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_GPADC, GPADC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_THS, THS_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_I2S0, I2S_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_I2S1, I2S_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_I2S2, I2S_BGR_REG, 18), + + SUNXI_CCU_RESET(D1_RST_BUS_SPDIF, OWA_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DMIC, DMIC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_AUDIO, AUDIO_CODEC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_USB_PHY0, USB0_CLK_REG, 30), + + SUNXI_CCU_RESET(D1_RST_USB_PHY1, USB1_CLK_REG, 30), + + SUNXI_CCU_RESET(D1_RST_BUS_OHCI0, USB_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_OHCI1, USB_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_EHCI0, USB_BGR_REG, 20), + SUNXI_CCU_RESET(D1_RST_BUS_EHCI1, USB_BGR_REG, 21), + SUNXI_CCU_RESET(D1_RST_BUS_OTG, USB_BGR_REG, 24), + + SUNXI_CCU_RESET(D1_RST_BUS_LRADC, LRADC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DPSS_TOP, DPSS_TOP_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_HDMI_SUB, HDMI_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_HDMI_MAIN, HDMI_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DSI, DSI_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_TCONLCD, TCONLCD_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_TCONTV, TCONTV_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_LVDS, LVDS_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_TVE_TOP, TVE_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_TVE, TVE_BGR_REG, 17), + + SUNXI_CCU_RESET(D1_RST_BUS_TVD_TOP, TVD_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_TVD, TVD_BGR_REG, 17), + + SUNXI_CCU_RESET(D1_RST_BUS_LEDC, LEDC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_CSI, CSI_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_TPADC, TPADC_BGR_REG, 16), + + SUNXI_CCU_RESET(D1_RST_BUS_DSP, DSP_BGR_REG, 16), + SUNXI_CCU_RESET(D1_RST_BUS_DSP_CFG, DSP_BGR_REG, 17), + SUNXI_CCU_RESET(D1_RST_BUS_DSP_DBG, DSP_BGR_REG, 18), + + SUNXI_CCU_RESET(D1_RST_BUS_RISCV_CFG, RISCV_CFG_BGR_REG, 16), +}; + +static const char *psi_parents[] = { "hosc", "losc", "iosc", "pll_periph" }; +static const char *apb_parents[] = { "hosc", "losc", "psi", "pll_periph" }; +static const char *dram_parents[] = { "pll_ddr", "pll_audio1_div2", "pll_periph_2x", "pll_periph_800m" }; +static const char *mmc_parents[] = { "hosc", "pll_periph", "pll_periph_2x", "pll_audio1_div2" }; +static const char *mmc2_parents[] = { "pll_periph", "pll_periph_2x", "pll_periph_800m", "pll_audio1_div2" }; + +static struct sunxi_ccu_clk sun20i_d1_ccu_clks[] = { + SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_CPU, "pll_cpu", "hosc", + PLL_CPU_CTRL_REG, /* reg */ + __BITS(15,8), /* n */ + 0, /* k */ + 0, /* m */ + 0, /* p */ + __BIT(31), /* enable */ + __BIT(28), /* lock */ + NULL, /* table */ + SUNXI_CCU_NKMP_SCALE_CLOCK), + + SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_DDR, "pll_ddr", "hosc", + PLL_DDR_CTRL_REG, /* reg */ + __BITS(15,8), /* n */ + 0, /* k */ + __BIT(1), /* m */ + __BIT(0), /* p */ + __BIT(31), /* enable */ + __BIT(28), /* lock */ + NULL, /* table */ + SUNXI_CCU_NKMP_SCALE_CLOCK), + + SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_PERIPH_2X, "pll_periph_2x", "hosc", + PLL_PERI_CTRL_REG, /* reg */ + __BITS(15,8), /* n */ + 0, /* k */ + __BIT(1), /* m */ + __BITS(18,16), /* p */ + __BIT(31), /* enable */ + __BIT(28), /* lock */ + NULL, /* table */ + SUNXI_CCU_NKMP_SCALE_CLOCK), + + SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_PERIPH_800M, "pll_periph_800m", "hosc", + PLL_PERI_CTRL_REG, /* reg */ + __BITS(15,8), /* n */ + 0, /* k */ + __BIT(1), /* m */ + __BITS(22,20), /* p */ + __BIT(31), /* enable */ + __BIT(28), /* lock */ + NULL, /* table */ + SUNXI_CCU_NKMP_SCALE_CLOCK), + + SUNXI_CCU_FIXED_FACTOR(D1_CLK_PLL_PERIPH, "pll_periph", "pll_periph_2x", 2, 1), + + SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_AUDIO1, "pll_audio1_div2", "hosc", + PLL_AUDIO1_CTRL_REG, /* reg */ + __BITS(15,8), /* n */ + 0, /* k */ + __BIT(1), /* m */ + __BITS(18,16), /* p */ + __BIT(31), /* enable */ + __BIT(28), /* lock */ + NULL, /* table */ + SUNXI_CCU_NKMP_SCALE_CLOCK), + + SUNXI_CCU_NM(D1_CLK_PSI, "psi", psi_parents, + PSI_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(1,0), /* m */ + __BITS(25,24), /* sel */ + 0, /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + + SUNXI_CCU_NM(D1_CLK_APB0, "apb0", apb_parents, + APB0_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(4,0), /* m */ + __BITS(25,24), /* sel */ + 0, /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + + SUNXI_CCU_NM(D1_CLK_APB1, "apb1", apb_parents, + APB1_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(4,0), /* m */ + __BITS(25,24), /* sel */ + 0, /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + + SUNXI_CCU_FIXED_FACTOR(D1_CLK_MBUS, "mbus", "dram", 4, 1), + + SUNXI_CCU_NM(D1_CLK_DRAM, "dram", dram_parents, + DRAM_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(1,0), /* m */ + __BITS(26,24), /* sel */ + __BIT(31), /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + + SUNXI_CCU_NM(D1_CLK_MMC0, "mmc0", mmc_parents, + SMHC0_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(3,0), /* m */ + __BITS(26,24), /* sel */ + __BIT(31), /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + SUNXI_CCU_NM(D1_CLK_MMC1, "mmc1", mmc_parents, + SMHC1_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(3,0), /* m */ + __BITS(26,24), /* sel */ + __BIT(31), /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + SUNXI_CCU_NM(D1_CLK_MMC2, "mmc2", mmc2_parents, + SMHC2_CLK_REG, /* reg */ + __BITS(9,8), /* n */ + __BITS(3,0), /* m */ + __BITS(26,24), /* sel */ + __BIT(31), /* enable */ + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), + + SUNXI_CCU_GATE(D1_CLK_BUS_DE, "bus-de", "psi", + DE_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_DI, "bus-di", "psi", + DI_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_G2D, "bus-g2d", "psi", + G2D_BGR_REG ,0), + + SUNXI_CCU_GATE(D1_CLK_BUS_CE, "bus-ce", "psi", + CE_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_VE, "bus-ve", "psi", + VE_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_DMA, "bus-dma", "psi", + DMA_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_MSGBOX0, "bus-msgbox0", "psi", + MSGBOX_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_MSGBOX1, "bus-msgbox1", "psi", + MSGBOX_BGR_REG, 1), + SUNXI_CCU_GATE(D1_CLK_BUS_MSGBOX2, "bus-msgbox2", "psi", + MSGBOX_BGR_REG, 2), + + SUNXI_CCU_GATE(D1_CLK_BUS_SPINLOCK, "bus-spinlock", "psi", + SPINLOCK_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_HSTIMER, "bus-hstimer", "psi", + HSTIMER_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_AVS, "avs", "hosc", + AVS_CLK_REG, 31), + + SUNXI_CCU_GATE(D1_CLK_BUS_DBGSYS, "bus-dbgsys", "psi", + DBGSYS_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_PWM, "bus-pwm", "apb0", + PWM_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_IOMMU, "bus-iommu", "apb0", + IOMMU_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_MBUS_DMA, "mbus-dma", "mbus", + MBUS_MAT_CLK_GATING_REG, 0), + SUNXI_CCU_GATE(D1_CLK_MBUS_VE, "mbus-ve", "mbus", + MBUS_MAT_CLK_GATING_REG, 1), + SUNXI_CCU_GATE(D1_CLK_MBUS_CE, "mbus-ce", "mbus", + MBUS_MAT_CLK_GATING_REG, 2), + SUNXI_CCU_GATE(D1_CLK_MBUS_TVIN, "mbus-tvin", "mbus", + MBUS_MAT_CLK_GATING_REG, 7), + SUNXI_CCU_GATE(D1_CLK_MBUS_CSI, "mbus-csi", "mbus", + MBUS_MAT_CLK_GATING_REG, 8), + SUNXI_CCU_GATE(D1_CLK_MBUS_G2D, "mbus-g2d", "mbus", + MBUS_MAT_CLK_GATING_REG, 10), + SUNXI_CCU_GATE(D1_CLK_MBUS_RISCV, "mbus-riscv", "mbus", + MBUS_MAT_CLK_GATING_REG, 11), + + SUNXI_CCU_GATE(D1_CLK_BUS_DRAM, "bus-dram", "psi", + DRAM_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_MMC0, "bus-mmc0", "psi", + SMHC_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_MMC1, "bus-mmc1", "psi", + SMHC_BGR_REG, 1), + SUNXI_CCU_GATE(D1_CLK_BUS_MMC2, "bus-mmc2", "psi", + SMHC_BGR_REG, 2), + + SUNXI_CCU_GATE(D1_CLK_BUS_UART0, "bus-uart0", "apb1", + UART_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_UART1, "bus-uart1", "apb1", + UART_BGR_REG, 1), + SUNXI_CCU_GATE(D1_CLK_BUS_UART2, "bus-uart2", "apb1", + UART_BGR_REG, 2), + SUNXI_CCU_GATE(D1_CLK_BUS_UART3, "bus-uart3", "apb1", + UART_BGR_REG, 3), + SUNXI_CCU_GATE(D1_CLK_BUS_UART4, "bus-uart4", "apb1", + UART_BGR_REG, 4), + SUNXI_CCU_GATE(D1_CLK_BUS_UART5, "bus-uart5", "apb1", + UART_BGR_REG, 5), + + SUNXI_CCU_GATE(D1_CLK_BUS_I2C0, "bus-i2c0", "apb1", + TWI_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_I2C1, "bus-i2c1", "apb1", + TWI_BGR_REG, 1), + SUNXI_CCU_GATE(D1_CLK_BUS_I2C2, "bus-i2c2", "apb1", + TWI_BGR_REG, 2), + SUNXI_CCU_GATE(D1_CLK_BUS_I2C3, "bus-i2c3", "apb1", + TWI_BGR_REG, 3), + + SUNXI_CCU_GATE(D1_CLK_BUS_SPI0, "bus-spi0", "psi", + SPI_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_SPI1, "bus-spi1", "psi", + SPI_BGR_REG, 1), + + SUNXI_CCU_GATE(D1_CLK_BUS_EMAC, "bus-emac", "psi", + EMAC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_IRTX, "bus-irtx", "apb0", + IRTX_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_GPADC, "bus-gpadc", "apb0", + GPADC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_THS, "bus-ths", "apb0", + THS_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_I2S0, "bus-i2s0", "apb0", + I2S_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_I2S1, "bus-i2s1", "apb0", + I2S_BGR_REG, 1), + SUNXI_CCU_GATE(D1_CLK_BUS_I2S2, "bus-i2s2", "apb0", + I2S_BGR_REG, 2), + + SUNXI_CCU_GATE(D1_CLK_BUS_SPDIF, "bus-spdif", "apb0", + OWA_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_DMIC, "bus-dmic", "apb0", + DMIC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_AUDIO, "bus-audio", "apb0", + AUDIO_CODEC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_OHCI0, "bus-ohci0", "psi", + USB_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_OHCI1, "bus-ohci1", "psi", + USB_BGR_REG, 1), + SUNXI_CCU_GATE(D1_CLK_BUS_EHCI0, "bus-ehci0", "psi", + USB_BGR_REG, 4), + SUNXI_CCU_GATE(D1_CLK_BUS_EHCI1, "bus-ehci1", "psi", + USB_BGR_REG, 5), + SUNXI_CCU_GATE(D1_CLK_BUS_OTG, "bus-otg", "psi", + USB_BGR_REG, 8), + + SUNXI_CCU_GATE(D1_CLK_BUS_LRADC, "bus-lradc", "apb0", + LRADC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_DPSS_TOP, "bus-dpss-top", "psi", + DPSS_TOP_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_HDMI, "bus-hdmi", "psi", + HDMI_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_DSI, "bus-dsi", "psi", + DSI_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_TCONLCD, "bus-tconlcd", "psi", + TCONLCD_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_TCONTV, "bus-tcontv", "psi", + TCONTV_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_TVE_TOP, "bus-tve-top", "psi", + TVE_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_TVE, "bus-tve", "psi", + TVE_BGR_REG, 1), + + SUNXI_CCU_GATE(D1_CLK_BUS_TVD_TOP, "bus-tvd-top", "psi", + TVD_BGR_REG, 0), + SUNXI_CCU_GATE(D1_CLK_BUS_TVD, "bus-tvd", "psi", + TVD_BGR_REG, 1), + + SUNXI_CCU_GATE(D1_CLK_BUS_LEDC, "bus-ledc", "psi", + LEDC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_CSI, "bus-csi", "psi", + CSI_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_TPADC, "bus-tpadc", "apb0", + TPADC_BGR_REG, 0), + + SUNXI_CCU_GATE(D1_CLK_BUS_DSP_CFG, "bus-dsp-cfg", "psi", + DSP_BGR_REG, 1), + + SUNXI_CCU_GATE(D1_CLK_BUS_RISCV_CFG, "bus-riscv-cfg", "psi", + RISCV_CFG_BGR_REG, 0), +}; + +static int +sun20i_d1_ccu_match(device_t parent, cfdata_t cf, void *aux) +{ + struct fdt_attach_args * const faa = aux; + + return of_compatible_match(faa->faa_phandle, compat_data); +} + +static void +sun20i_d1_ccu_attach(device_t parent, device_t self, void *aux) +{ + struct sunxi_ccu_softc * const sc = device_private(self); + struct fdt_attach_args * const faa = aux; + + sc->sc_dev = self; + sc->sc_phandle = faa->faa_phandle; + sc->sc_bst = faa->faa_bst; + + sc->sc_resets = sun20i_d1_ccu_resets; + sc->sc_nresets = __arraycount(sun20i_d1_ccu_resets); + + sc->sc_clks = sun20i_d1_ccu_clks; + sc->sc_nclks = __arraycount(sun20i_d1_ccu_clks); + + if (sunxi_ccu_attach(sc) != 0) + return; + + aprint_naive("\n"); + aprint_normal(": D1 CCU\n"); + + sunxi_ccu_print(sc); +} Index: src/sys/arch/riscv/sunxi/sun20i_d1_ccu.h diff -u /dev/null src/sys/arch/riscv/sunxi/sun20i_d1_ccu.h:1.1 --- /dev/null Tue Aug 13 07:20:23 2024 +++ src/sys/arch/riscv/sunxi/sun20i_d1_ccu.h Tue Aug 13 07:20:23 2024 @@ -0,0 +1,249 @@ +/* $NetBSD: sun20i_d1_ccu.h,v 1.1 2024/08/13 07:20:23 skrll Exp $ */ + +/*- + * Copyright (c) 2024 Rui-Xiang Guo + * 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. + */ + +#ifndef __CCU_D1_H__ +#define __CCU_D1_H__ + +#define D1_CLK_PLL_CPU 0 +#define D1_CLK_PLL_DDR 1 +#define D1_CLK_PLL_PERIPH_4X 2 +#define D1_CLK_PLL_PERIPH_2X 3 +#define D1_CLK_PLL_PERIPH_800M 4 +#define D1_CLK_PLL_PERIPH 5 +#define D1_CLK_PLL_PERIPH_DIV3 6 +#define D1_CLK_PLL_VIDEO0_4X 7 +#define D1_CLK_PLL_VIDEO0_2X 8 +#define D1_CLK_PLL_VIDEO0 9 +#define D1_CLK_PLL_VIDEO1_4X 10 +#define D1_CLK_PLL_VIDEO1_2X 11 +#define D1_CLK_PLL_VIDEO1 12 +#define D1_CLK_PLL_VE 13 +#define D1_CLK_PLL_AUDIO0_4X 14 +#define D1_CLK_PLL_AUDIO0_2X 15 +#define D1_CLK_PLL_AUDIO0 16 +#define D1_CLK_PLL_AUDIO1 17 +#define D1_CLK_PLL_AUDIO1_DIV2 18 +#define D1_CLK_PLL_AUDIO1_DIV5 19 +#define D1_CLK_CPU 20 +#define D1_CLK_CPU_AXI 21 +#define D1_CLK_CPU_APB 22 +#define D1_CLK_PSI 23 +#define D1_CLK_APB0 24 +#define D1_CLK_APB1 25 +#define D1_CLK_MBUS 26 +#define D1_CLK_DE 27 +#define D1_CLK_BUS_DE 28 +#define D1_CLK_DI 29 +#define D1_CLK_BUS_DI 30 +#define D1_CLK_G2D 31 +#define D1_CLK_BUS_G2D 32 +#define D1_CLK_CE 33 +#define D1_CLK_BUS_CE 34 +#define D1_CLK_VE 35 +#define D1_CLK_BUS_VE 36 +#define D1_CLK_BUS_DMA 37 +#define D1_CLK_BUS_MSGBOX0 38 +#define D1_CLK_BUS_MSGBOX1 39 +#define D1_CLK_BUS_MSGBOX2 40 +#define D1_CLK_BUS_SPINLOCK 41 +#define D1_CLK_BUS_HSTIMER 42 +#define D1_CLK_AVS 43 +#define D1_CLK_BUS_DBGSYS 44 +#define D1_CLK_BUS_PWM 45 +#define D1_CLK_BUS_IOMMU 46 +#define D1_CLK_DRAM 47 +#define D1_CLK_MBUS_DMA 48 +#define D1_CLK_MBUS_VE 49 +#define D1_CLK_MBUS_CE 50 +#define D1_CLK_MBUS_TVIN 51 +#define D1_CLK_MBUS_CSI 52 +#define D1_CLK_MBUS_G2D 53 +#define D1_CLK_MBUS_RISCV 54 +#define D1_CLK_BUS_DRAM 55 +#define D1_CLK_MMC0 56 +#define D1_CLK_MMC1 57 +#define D1_CLK_MMC2 58 +#define D1_CLK_BUS_MMC0 59 +#define D1_CLK_BUS_MMC1 60 +#define D1_CLK_BUS_MMC2 61 +#define D1_CLK_BUS_UART0 62 +#define D1_CLK_BUS_UART1 63 +#define D1_CLK_BUS_UART2 64 +#define D1_CLK_BUS_UART3 65 +#define D1_CLK_BUS_UART4 66 +#define D1_CLK_BUS_UART5 67 +#define D1_CLK_BUS_I2C0 68 +#define D1_CLK_BUS_I2C1 69 +#define D1_CLK_BUS_I2C2 70 +#define D1_CLK_BUS_I2C3 71 +#define D1_CLK_SPI0 72 +#define D1_CLK_SPI1 73 +#define D1_CLK_BUS_SPI0 74 +#define D1_CLK_BUS_SPI1 75 +#define D1_CLK_EMAC_25M 76 +#define D1_CLK_BUS_EMAC 77 +#define D1_CLK_IRTX 78 +#define D1_CLK_BUS_IRTX 79 +#define D1_CLK_BUS_GPADC 80 +#define D1_CLK_BUS_THS 81 +#define D1_CLK_I2S0 82 +#define D1_CLK_I2S1 83 +#define D1_CLK_I2S2 84 +#define D1_CLK_I2S2_ASRC 85 +#define D1_CLK_BUS_I2S0 86 +#define D1_CLK_BUS_I2S1 87 +#define D1_CLK_BUS_I2S2 88 +#define D1_CLK_SPDIF_TX 89 +#define D1_CLK_SPDIF_RX 90 +#define D1_CLK_BUS_SPDIF 91 +#define D1_CLK_DMIC 92 +#define D1_CLK_BUS_DMIC 93 +#define D1_CLK_AUDIO_DAC 94 +#define D1_CLK_AUDIO_ADC 95 +#define D1_CLK_BUS_AUDIO 96 +#define D1_CLK_USB_PHY0 97 +#define D1_CLK_USB_PHY1 98 +#define D1_CLK_BUS_OHCI0 99 +#define D1_CLK_BUS_OHCI1 100 +#define D1_CLK_BUS_EHCI0 101 +#define D1_CLK_BUS_EHCI1 102 +#define D1_CLK_BUS_OTG 103 +#define D1_CLK_BUS_LRADC 104 +#define D1_CLK_BUS_DPSS_TOP 105 +#define D1_CLK_HDMI_24M 106 +#define D1_CLK_HDMI_CEC_32K 107 +#define D1_CLK_HDMI_CEC 108 +#define D1_CLK_BUS_HDMI 109 +#define D1_CLK_DSI 110 +#define D1_CLK_BUS_DSI 111 +#define D1_CLK_TCONLCD 112 +#define D1_CLK_BUS_TCONLCD 113 +#define D1_CLK_TCONTV 114 +#define D1_CLK_BUS_TCONTV 115 +#define D1_CLK_TVE 116 +#define D1_CLK_BUS_TVE_TOP 117 +#define D1_CLK_BUS_TVE 118 +#define D1_CLK_TVD 119 +#define D1_CLK_BUS_TVD_TOP 120 +#define D1_CLK_BUS_TVD 121 +#define D1_CLK_LEDC 122 +#define D1_CLK_BUS_LEDC 123 +#define D1_CLK_CSI_TOP 124 +#define D1_CLK_CSI_MCLK 125 +#define D1_CLK_BUS_CSI 126 +#define D1_CLK_TPADC 127 +#define D1_CLK_BUS_TPADC 128 +#define D1_CLK_BUS_TZMA 129 +#define D1_CLK_DSP 130 +#define D1_CLK_BUS_DSP_CFG 131 +#define D1_CLK_RISCV 132 +#define D1_CLK_RISCV_AXI 133 +#define D1_CLK_BUS_RISCV_CFG 134 +#define D1_CLK_FANOUT_24M 135 +#define D1_CLK_FANOUT_12M 136 +#define D1_CLK_FANOUT_16M 137 +#define D1_CLK_FANOUT_25M 138 +#define D1_CLK_FANOUT_32K 139 +#define D1_CLK_FANOUT_27M 140 +#define D1_CLK_FANOUT_PCLK 141 +#define D1_CLK_FANOUT0 142 +#define D1_CLK_FANOUT1 143 +#define D1_CLK_FANOUT2 144 +#define D1_CLK_BUS_CAN0 145 +#define D1_CLK_BUS_CAN1 146 + +#define D1_RST_MBUS 0 +#define D1_RST_BUS_DE 1 +#define D1_RST_BUS_DI 2 +#define D1_RST_BUS_G2D 3 +#define D1_RST_BUS_CE 4 +#define D1_RST_BUS_VE 5 +#define D1_RST_BUS_DMA 6 +#define D1_RST_BUS_MSGBOX0 7 +#define D1_RST_BUS_MSGBOX1 8 +#define D1_RST_BUS_MSGBOX2 9 +#define D1_RST_BUS_SPINLOCK 10 +#define D1_RST_BUS_HSTIMER 11 +#define D1_RST_BUS_DBGSYS 12 +#define D1_RST_BUS_PWM 13 +#define D1_RST_BUS_DRAM 14 +#define D1_RST_BUS_MMC0 15 +#define D1_RST_BUS_MMC1 16 +#define D1_RST_BUS_MMC2 17 +#define D1_RST_BUS_UART0 18 +#define D1_RST_BUS_UART1 19 +#define D1_RST_BUS_UART2 20 +#define D1_RST_BUS_UART3 21 +#define D1_RST_BUS_UART4 22 +#define D1_RST_BUS_UART5 23 +#define D1_RST_BUS_I2C0 24 +#define D1_RST_BUS_I2C1 25 +#define D1_RST_BUS_I2C2 26 +#define D1_RST_BUS_I2C3 27 +#define D1_RST_BUS_SPI0 28 +#define D1_RST_BUS_SPI1 29 +#define D1_RST_BUS_EMAC 30 +#define D1_RST_BUS_IRTX 31 +#define D1_RST_BUS_GPADC 32 +#define D1_RST_BUS_THS 33 +#define D1_RST_BUS_I2S0 34 +#define D1_RST_BUS_I2S1 35 +#define D1_RST_BUS_I2S2 36 +#define D1_RST_BUS_SPDIF 37 +#define D1_RST_BUS_DMIC 38 +#define D1_RST_BUS_AUDIO 39 +#define D1_RST_USB_PHY0 40 +#define D1_RST_USB_PHY1 41 +#define D1_RST_BUS_OHCI0 42 +#define D1_RST_BUS_OHCI1 43 +#define D1_RST_BUS_EHCI0 44 +#define D1_RST_BUS_EHCI1 45 +#define D1_RST_BUS_OTG 46 +#define D1_RST_BUS_LRADC 47 +#define D1_RST_BUS_DPSS_TOP 48 +#define D1_RST_BUS_HDMI_SUB 49 +#define D1_RST_BUS_HDMI_MAIN 50 +#define D1_RST_BUS_DSI 51 +#define D1_RST_BUS_TCONLCD 52 +#define D1_RST_BUS_TCONTV 53 +#define D1_RST_BUS_LVDS 54 +#define D1_RST_BUS_TVE 55 +#define D1_RST_BUS_TVE_TOP 56 +#define D1_RST_BUS_TVD 57 +#define D1_RST_BUS_TVD_TOP 58 +#define D1_RST_BUS_LEDC 59 +#define D1_RST_BUS_CSI 60 +#define D1_RST_BUS_TPADC 61 +#define D1_RST_BUS_DSP 62 +#define D1_RST_BUS_DSP_CFG 63 +#define D1_RST_BUS_DSP_DBG 64 +#define D1_RST_BUS_RISCV_CFG 65 +#define D1_RST_BUS_CAN0 66 +#define D1_RST_BUS_CAN1 67 + +#endif /* __CCU_D1_H__ */ Index: src/sys/arch/riscv/sunxi/sun20i_d1_gpio.c diff -u /dev/null src/sys/arch/riscv/sunxi/sun20i_d1_gpio.c:1.1 --- /dev/null Tue Aug 13 07:20:23 2024 +++ src/sys/arch/riscv/sunxi/sun20i_d1_gpio.c Tue Aug 13 07:20:23 2024 @@ -0,0 +1,139 @@ +/* $NetBSD: sun20i_d1_gpio.c,v 1.1 2024/08/13 07:20:23 skrll Exp $ */ + +/*- + * Copyright (c) 2024 Rui-Xiang Guo + * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. + * + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: sun20i_d1_gpio.c,v 1.1 2024/08/13 07:20:23 skrll Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/types.h> + +#include <arm/sunxi/sunxi_gpio.h> + +static const struct sunxi_gpio_pins d1_pins[] = { + {"PB0", 1, 0, {"gpio_in", "gpio_out", "pwm3", "ir", "i2c2", "spi1", "uart0", "uart2", "spdif", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 0}, + {"PB1", 1, 1, {"gpio_in", "gpio_out", "pwm4", "i2s2", "i2c2", "i2s2", "uart0", "uart2", "ir", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 1}, + {"PB2", 1, 2, {"gpio_in", "gpio_out", "lcd0", "i2s2", "i2c0", "i2s2", "lcd0", "uart4", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 2}, + {"PB3", 1, 3, {"gpio_in", "gpio_out", "lcd0", "i2s2", "i2c0", "i2s2", "lcd0", "uart4", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 3}, + {"PB4", 1, 4, {"gpio_in", "gpio_out", "lcd0", "i2s2", "i2c1", "i2s2", "lcd0", "uart5", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 4}, + {"PB5", 1, 5, {"gpio_in", "gpio_out", "lcd0", "i2s2", "i2c1", "pwm0", "lcd0", "uart5", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 5}, + {"PB6", 1, 6, {"gpio_in", "gpio_out", "lcd0", "i2s2", "i2c3", "pwm1", "lcd0", "uart3", "cpu", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 6}, + {"PB7", 1, 7, {"gpio_in", "gpio_out", "lcd0", "i2s2", "i2c3", "ir", "lcd0", "uart3", "cpu", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 7}, + {"PB8", 1, 8, {"gpio_in", "gpio_out", "dmic", "pwm5", "i2c2", "spi1", "uart0", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 8}, + {"PB9", 1, 9, {"gpio_in", "gpio_out", "dmic", "pwm6", "i2c2", "spi1", "uart0", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 9}, + {"PB10", 1, 10, {"gpio_in", "gpio_out", "dmic", "pwm7", "i2c0", "spi1", "clk", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 10}, + {"PB11", 1, 11, {"gpio_in", "gpio_out", "dmic", "pwm2", "i2c0", "spi1", "clk", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 11}, + {"PB12", 1, 12, {"gpio_in", "gpio_out", "dmic", "pwm0", "spdif", "spi1", "clk", "ir", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 12}, + + {"PC0", 2, 0, {"gpio_in", "gpio_out", "uart2", "i2c2", "ledc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 0}, + {"PC1", 2, 1, {"gpio_in", "gpio_out", "uart2", "i2c2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 1}, + {"PC2", 2, 2, {"gpio_in", "gpio_out", "spi0", "mmc2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 2}, + {"PC3", 2, 3, {"gpio_in", "gpio_out", "spi0", "mmc2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 3}, + {"PC4", 2, 4, {"gpio_in", "gpio_out", "spi0", "mmc2", "boot", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 4}, + {"PC5", 2, 5, {"gpio_in", "gpio_out", "spi0", "mmc2", "boot", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 5}, + {"PC6", 2, 6, {"gpio_in", "gpio_out", "spi0", "mmc2", "uart3", "i2c3", "dbg", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 6}, + {"PC7", 2, 7, {"gpio_in", "gpio_out", "spi0", "mmc2", "uart3", "i2c3", "tcon", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 7}, + + {"PD0", 3, 0, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "i2c0", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 0}, + {"PD1", 3, 1, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 1}, + {"PD2", 3, 2, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 2}, + {"PD3", 3, 3, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 3}, + {"PD4", 3, 4, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 4}, + {"PD5", 3, 5, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart5", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 5}, + {"PD6", 3, 6, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart5", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 6}, + {"PD7", 3, 7, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart4", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 7}, + {"PD8", 3, 8, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart4", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 8}, + {"PD9", 3, 9, {"gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "pwm6", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 9}, + {"PD10", 3, 10, {"gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 10}, + {"PD11", 3, 11, {"gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 11}, + {"PD12", 3, 12, {"gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "i2c0", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 12}, + {"PD13", 3, 13, {"gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 13}, + {"PD14", 3, 14, {"gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 14}, + {"PD15", 3, 15, {"gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "ir", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 15}, + {"PD16", 3, 16, {"gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm0", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 16}, + {"PD17", 3, 17, {"gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm1", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 17}, + {"PD18", 3, 18, {"gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 18}, + {"PD19", 3, 19, {"gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 19}, + {"PD20", 3, 20, {"gpio_in", "gpio_out", "lcd0", "i2c2", "dmic", "pwm4", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 20}, + {"PD21", 3, 21, {"gpio_in", "gpio_out", "lcd0", "i2c2", "uart1", "pwm5", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 21}, + {"PD22", 3, 22, {"gpio_in", "gpio_out", "spdif", "ir", "uart1", "pwm7", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 22}, + + {"PE0", 4, 0, {"gpio_in", "gpio_out", "ncsi0", "uart2", "i2c1", "lcd0", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 0}, + {"PE1", 4, 1, {"gpio_in", "gpio_out", "ncsi0", "uart2", "i2c1", "lcd0", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 1}, + {"PE2", 4, 2, {"gpio_in", "gpio_out", "ncsi0", "uart2", "i2c0", "clk", "uart0", NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 2}, + {"PE3", 4, 3, {"gpio_in", "gpio_out", "ncsi0", "uart2", "i2c0", "clk", "uart0", NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 3}, + {"PE4", 4, 4, {"gpio_in", "gpio_out", "ncsi0", "uart4", "i2c2", "clk", "jtag", "jtag", "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 4}, + {"PE5", 4, 5, {"gpio_in", "gpio_out", "ncsi0", "uart4", "i2c2", "ledc", "jtag", "jtag", "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 5}, + {"PE6", 4, 6, {"gpio_in", "gpio_out", "ncsi0", "uart5", "i2c3", "spdif", "jtag", "jtag", "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 6}, + {"PE7", 4, 7, {"gpio_in", "gpio_out", "ncsi0", "uart5", "i2c3", "spdif", "jtag", "jtag", "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 7}, + {"PE8", 4, 8, {"gpio_in", "gpio_out", "ncsi0", "uart1", "pwm2", "uart3", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 8}, + {"PE9", 4, 9, {"gpio_in", "gpio_out", "ncsi0", "uart1", "pwm3", "uart3", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 9}, + {"PE10", 4, 10, {"gpio_in", "gpio_out", "ncsi0", "uart1", "pwm4", "ir", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 10}, + {"PE11", 4, 11, {"gpio_in", "gpio_out", "ncsi0", "uart1", "i2s0", "i2s0", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 11}, + {"PE12", 4, 12, {"gpio_in", "gpio_out", "i2c2", "ncsi0", "i2s0", "i2s0", NULL, NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 12}, + {"PE13", 4, 13, {"gpio_in", "gpio_out", "i2c2", "pwm5", "i2s0", "i2s0", "dmic", NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 13}, + {"PE14", 4, 14, {"gpio_in", "gpio_out", "i2c1", "jtag", "i2s0", "i2s0", "dmic", NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 14}, + {"PE15", 4, 15, {"gpio_in", "gpio_out", "i2c1", "jtag", "pwm6", "i2s0", "dmic", NULL, "emac", NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 15}, + {"PE16", 4, 16, {"gpio_in", "gpio_out", "i2c3", "jtag", "pwm7", "i2s0", "dmic", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 16}, + {"PE17", 4, 17, {"gpio_in", "gpio_out", "i2c3", "jtag", "ir", "i2s0", "dmic", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 17}, + + {"PF0", 5, 0, {"gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", "i2s2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 0}, + {"PF1", 5, 1, {"gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", "i2s2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 1}, + {"PF2", 5, 2, {"gpio_in", "gpio_out", "mmc0", "uart0", "i2c0", "ledc", "spdif", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 2}, + {"PF3", 5, 3, {"gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 3}, + {"PF4", 5, 4, {"gpio_in", "gpio_out", "mmc0", "uart0", "i2c0", "pwm6", "ir", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 4}, + {"PF5", 5, 5, {"gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 5}, + {"PF6", 5, 6, {"gpio_in", "gpio_out", NULL, "spdif", "ir", "i2s2", "pwm5", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 6}, + + {"PG0", 6, 0, {"gpio_in", "gpio_out", "mmc1", "uart3", "emac", "pwm7", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 0}, + {"PG1", 6, 1, {"gpio_in", "gpio_out", "mmc1", "uart3", "emac", "pwm6", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 1}, + {"PG2", 6, 2, {"gpio_in", "gpio_out", "mmc1", "uart3", "emac", "uart4", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 2}, + {"PG3", 6, 3, {"gpio_in", "gpio_out", "mmc1", "uart3", "emac", "uart4", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 3}, + {"PG4", 6, 4, {"gpio_in", "gpio_out", "mmc1", "uart5", "emac", "pwm5", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 4}, + {"PG5", 6, 5, {"gpio_in", "gpio_out", "mmc1", "uart5", "emac", "pwm4", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 5}, + {"PG6", 6, 6, {"gpio_in", "gpio_out", "uart1", "i2c2", "emac", "pwm1", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 6}, + {"PG7", 6, 7, {"gpio_in", "gpio_out", "uart1", "i2c2", "emac", "spdif", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 7}, + {"PG8", 6, 8, {"gpio_in", "gpio_out", "uart1", "i2c1", "emac", "uart3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 8}, + {"PG9", 6, 9, {"gpio_in", "gpio_out", "uart1", "i2c1", "emac", "uart3", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 9}, + {"PG10", 6, 10, {"gpio_in", "gpio_out", "pwm3", "i2c3", "emac", "clk", "ir", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 10}, + {"PG11", 6, 11, {"gpio_in", "gpio_out", "i2s1", "i2c3", "emac", "clk", "tcon", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 11}, + {"PG12", 6, 12, {"gpio_in", "gpio_out", "i2s1", "i2c0", "emac", "clk", "pwm0", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 12}, + {"PG13", 6, 13, {"gpio_in", "gpio_out", "i2s1", "i2c0", "emac", "pwm2", "ledc", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 13}, + {"PG14", 6, 14, {"gpio_in", "gpio_out", "i2s1", "i2c2", "emac", "i2s1", "spi0", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 14}, + {"PG15", 6, 15, {"gpio_in", "gpio_out", "i2s1", "i2c2", "emac", "i2s1", "spi0", "uart1", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 15}, + {"PG16", 6, 16, {"gpio_in", "gpio_out", "ir", "tcon", "pwm5", "clk", "spdif", "ledc", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 16}, + {"PG17", 6, 17, {"gpio_in", "gpio_out", "uart2", "i2c3", "pwm7", "clk", "ir", "uart0", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 17}, + {"PG18", 6, 18, {"gpio_in", "gpio_out", "uart2", "i2c3", "pwm6", "clk", "spdif", "uart0", NULL, NULL, NULL, NULL, NULL, NULL, "irq"}, 14, 18}, +}; + +const struct sunxi_gpio_padconf sun20i_d1_padconf = { + .npins = __arraycount(d1_pins), + .pins = d1_pins, +};