Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -uNpr sunxi.orig/files.sunxi sunxi/files.sunxi
- --- sunxi.orig/files.sunxi 2020-01-02 15:55:43.055618955 +0900
- +++ sunxi/files.sunxi 2020-01-04 11:19:05.708944696 +0900
- @@ -52,6 +52,11 @@ device sun8ih3rccu: sunxi_ccu
- attach sun8ih3rccu at fdt with sunxi_h3_r_ccu
- file arch/arm/sunxi/sun8i_h3_r_ccu.c sunxi_h3_r_ccu
- +# CCU (V3s)
- +device sun8iv3sccu: sunxi_ccu
- +attach sun8iv3sccu at fdt with sunxi_v3s_ccu
- +file arch/arm/sunxi/sun8i_v3s_ccu.c sunxi_v3s_ccu
- +
- # CCU (A80)
- device sun9ia80ccu: sunxi_ccu
- attach sun9ia80ccu at fdt with sunxi_a80_ccu
- @@ -131,6 +136,7 @@ file arch/arm/sunxi/sun6i_a31_gpio.c su
- file arch/arm/sunxi/sun7i_a20_gpio.c sunxi_gpio & soc_sun7i_a20
- file arch/arm/sunxi/sun8i_a83t_gpio.c sunxi_gpio & soc_sun8i_a83t
- file arch/arm/sunxi/sun8i_h3_gpio.c sunxi_gpio & soc_sun8i_h3
- +file arch/arm/sunxi/sun8i_v3s_gpio.c sunxi_gpio & soc_sun8i_v3s
- file arch/arm/sunxi/sun9i_a80_gpio.c sunxi_gpio & soc_sun9i_a80
- file arch/arm/sunxi/sun50i_a64_gpio.c sunxi_gpio & soc_sun50i_a64
- file arch/arm/sunxi/sun50i_h6_gpio.c sunxi_gpio & soc_sun50i_h6
- @@ -383,6 +389,7 @@ defflag opt_soc.h SOC_SUN7I_A20: SOC_S
- defflag opt_soc.h SOC_SUN8I: SOC_SUNXI
- defflag opt_soc.h SOC_SUN8I_A83T: SOC_SUN8I, SOC_SUNXI_MC
- defflag opt_soc.h SOC_SUN8I_H3: SOC_SUN8I
- +defflag opt_soc.h SOC_SUN8I_V3S: SOC_SUN8I
- defflag opt_soc.h SOC_SUN9I: SOC_SUNXI
- defflag opt_soc.h SOC_SUN9I_A80: SOC_SUN9I, SOC_SUNXI_MC
- defflag opt_soc.h SOC_SUN50I: SOC_SUNXI
- diff -uNpr sunxi.orig/sun8i_v3s_ccu.c sunxi/sun8i_v3s_ccu.c
- --- sunxi.orig/sun8i_v3s_ccu.c 1970-01-01 09:00:00.000000000 +0900
- +++ sunxi/sun8i_v3s_ccu.c 2020-01-04 11:34:09.593703367 +0900
- @@ -0,0 +1,426 @@
- +/* $NetBSD: sun8i_v3s_ccu.c,v 1.5 2017/11/09 21:52:32 jmcneill Exp $ */
- +
- +/*-
- + * Copyright (c) 2017 Jared McNeill <[email protected]>
- + * 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: sun8i_v3s_ccu.c,v 1.5 2017/11/09 21:52:32 jmcneill 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 <arm/sunxi/sun8i_v3s_ccu.h>
- +
- +#define PLL_CPU_CTRL_REG 0x000
- +#define PLL_AUDIO_CTRL_REG 0x008
- +#define PLL_VIDEO_CTRL_REG 0x010
- +#define PLL_VE_CTRL_REG 0x018
- +#define PLL_DDR0_CTRL_REG 0x020
- +#define PLL_PERIPH0_CTRL_REG 0x028
- +#define PLL_ISP_CTRL_REG 0x02c
- +#define PLL_PERIPH1_CTRL_REG 0x044
- +#define PLL_DDR1_CTRL_REG 0x04c
- +#define CPU_AXI_CFG_REG 0x050
- +#define AHB1_APB1_CFG_REG 0x054
- +#define APB2_CFG_REG 0x058
- +#define AHB2_CFG_REG 0x05c
- +#define BUS_CLK_GATING_REG0 0x060
- +#define BUS_CLK_GATING_REG1 0x064
- +#define BUS_CLK_GATING_REG2 0x068
- +#define BUS_CLK_GATING_REG3 0x06c
- +#define BUS_CLK_GATING_REG4 0x070
- +#define SDMMC0_CLK_REG 0x088
- +#define SDMMC1_CLK_REG 0x08c
- +#define SDMMC2_CLK_REG 0x090
- +#define CE_CLK_REG 0x09c
- +#define SPI0_CLK_REG 0x0a0
- +#define USBPHY_CFG_REG 0x0cc
- +#define DRAM_CFG_REG 0x0f4
- +#define PLL_DDR1_CFG_REG 0x0f8
- +#define MBUS_RST_REG 0x0fc
- +#define DRAM_CLK_GATING_REG 0x100
- +#define DE_CLK_REG 0x104
- +#define TCON_CLK_REG 0x118
- +#define CSI_MISC_CLK_REG 0x130
- +#define CSI_CLK_REG 0x134
- +#define VE_CLK_REG 0x13c
- +#define AC_DIG_CLK_REG 0x140
- +#define AVS_CLK_REG 0x144
- +#define MBUS_CLK_REG 0x15c
- +#define MIPI_CSI_REG 0x16c
- +#define BUS_SOFT_RST_REG0 0x2c0
- +#define BUS_SOFT_RST_REG1 0x2c4
- +#define BUS_SOFT_RST_REG2 0x2c8
- +#define BUS_SOFT_RST_REG3 0x2d0
- +#define BUS_SOFT_RST_REG4 0x2d8
- +
- +static int sun8i_v3s_ccu_match(device_t, cfdata_t, void *);
- +static void sun8i_v3s_ccu_attach(device_t, device_t, void *);
- +
- +static const char * const compatible[] = {
- + "allwinner,sun8i-v3s-ccu",
- + NULL
- +};
- +
- +CFATTACH_DECL_NEW(sunxi_v3s_ccu, sizeof(struct sunxi_ccu_softc),
- + sun8i_v3s_ccu_match, sun8i_v3s_ccu_attach, NULL, NULL);
- +
- +static struct sunxi_ccu_reset sun8i_v3s_ccu_resets[] = {
- + SUNXI_CCU_RESET(V3S_RST_USB_PHY0, USBPHY_CFG_REG, 0),
- +
- + SUNXI_CCU_RESET(V3S_RST_MBUS, MBUS_RST_REG, 31),
- +
- + SUNXI_CCU_RESET(V3S_RST_BUS_CE, BUS_SOFT_RST_REG0, 5),
- + SUNXI_CCU_RESET(V3S_RST_BUS_DMA, BUS_SOFT_RST_REG0, 6),
- + SUNXI_CCU_RESET(V3S_RST_BUS_MMC0, BUS_SOFT_RST_REG0, 8),
- + SUNXI_CCU_RESET(V3S_RST_BUS_MMC1, BUS_SOFT_RST_REG0, 9),
- + SUNXI_CCU_RESET(V3S_RST_BUS_MMC2, BUS_SOFT_RST_REG0, 10),
- + SUNXI_CCU_RESET(V3S_RST_BUS_DRAM, BUS_SOFT_RST_REG0, 14),
- + SUNXI_CCU_RESET(V3S_RST_BUS_EMAC, BUS_SOFT_RST_REG0, 17),
- + SUNXI_CCU_RESET(V3S_RST_BUS_HSTIMER, BUS_SOFT_RST_REG0, 19),
- + SUNXI_CCU_RESET(V3S_RST_BUS_SPI0, BUS_SOFT_RST_REG0, 20),
- + SUNXI_CCU_RESET(V3S_RST_BUS_OTG, BUS_SOFT_RST_REG0, 24),
- + SUNXI_CCU_RESET(V3S_RST_BUS_EHCI0, BUS_SOFT_RST_REG0, 26),
- + SUNXI_CCU_RESET(V3S_RST_BUS_OHCI0, BUS_SOFT_RST_REG0, 29),
- +
- + SUNXI_CCU_RESET(V3S_RST_BUS_VE, BUS_SOFT_RST_REG1, 0),
- + SUNXI_CCU_RESET(V3S_RST_BUS_TCON0, BUS_SOFT_RST_REG1, 4),
- + SUNXI_CCU_RESET(V3S_RST_BUS_CSI, BUS_SOFT_RST_REG1, 8),
- + SUNXI_CCU_RESET(V3S_RST_BUS_DE, BUS_SOFT_RST_REG1, 12),
- + SUNXI_CCU_RESET(V3S_RST_BUS_DBG, BUS_SOFT_RST_REG1, 31),
- +
- + SUNXI_CCU_RESET(V3S_RST_BUS_EPHY, BUS_SOFT_RST_REG2, 2),
- +
- + SUNXI_CCU_RESET(V3S_RST_BUS_CODEC, BUS_SOFT_RST_REG3, 0),
- +
- + SUNXI_CCU_RESET(V3S_RST_BUS_I2C0, BUS_SOFT_RST_REG4, 0),
- + SUNXI_CCU_RESET(V3S_RST_BUS_I2C1, BUS_SOFT_RST_REG4, 1),
- + SUNXI_CCU_RESET(V3S_RST_BUS_UART0, BUS_SOFT_RST_REG4, 16),
- + SUNXI_CCU_RESET(V3S_RST_BUS_UART1, BUS_SOFT_RST_REG4, 17),
- + SUNXI_CCU_RESET(V3S_RST_BUS_UART2, BUS_SOFT_RST_REG4, 18),
- + /* V3S_RST_BUS_I2S0 is missing */
- +};
- +
- +static const char *ahb1_parents[] = { "losc", "hosc", "axi", "pll_periph0" };
- +static const char *ahb2_parents[] = { "ahb1", "pll_periph0" };
- +static const char *apb1_parents[] = { "ahb1" };
- +static const char *apb2_parents[] = { "losc", "hosc", "pll_periph0" };
- +static const char *mod_parents[] = { "hosc", "pll_periph0", "pll_periph1" };
- +static const char *de_parents[] = { "pll_video", "pll_periph0" };
- +static const char *tcon_parents[] = { "pll_video", "pll_periph0" };
- +
- +static const struct sunxi_ccu_nkmp_tbl sun8i_v3s_cpu_table[] = {
- + { 60000000, 9, 0, 0, 2 },
- + { 66000000, 10, 0, 0, 2 },
- + { 72000000, 11, 0, 0, 2 },
- + { 78000000, 12, 0, 0, 2 },
- + { 84000000, 13, 0, 0, 2 },
- + { 90000000, 14, 0, 0, 2 },
- + { 96000000, 15, 0, 0, 2 },
- + { 102000000, 16, 0, 0, 2 },
- + { 108000000, 17, 0, 0, 2 },
- + { 114000000, 18, 0, 0, 2 },
- + { 120000000, 9, 0, 0, 1 },
- + { 132000000, 10, 0, 0, 1 },
- + { 144000000, 11, 0, 0, 1 },
- + { 156000000, 12, 0, 0, 1 },
- + { 168000000, 13, 0, 0, 1 },
- + { 180000000, 14, 0, 0, 1 },
- + { 192000000, 15, 0, 0, 1 },
- + { 204000000, 16, 0, 0, 1 },
- + { 216000000, 17, 0, 0, 1 },
- + { 228000000, 18, 0, 0, 1 },
- + { 240000000, 9, 0, 0, 0 },
- + { 264000000, 10, 0, 0, 0 },
- + { 288000000, 11, 0, 0, 0 },
- + { 312000000, 12, 0, 0, 0 },
- + { 336000000, 13, 0, 0, 0 },
- + { 360000000, 14, 0, 0, 0 },
- + { 384000000, 15, 0, 0, 0 },
- + { 408000000, 16, 0, 0, 0 },
- + { 432000000, 17, 0, 0, 0 },
- + { 456000000, 18, 0, 0, 0 },
- + { 480000000, 19, 0, 0, 0 },
- + { 504000000, 20, 0, 0, 0 },
- + { 528000000, 21, 0, 0, 0 },
- + { 552000000, 22, 0, 0, 0 },
- + { 576000000, 23, 0, 0, 0 },
- + { 600000000, 24, 0, 0, 0 },
- + { 624000000, 25, 0, 0, 0 },
- + { 648000000, 26, 0, 0, 0 },
- + { 672000000, 27, 0, 0, 0 },
- + { 696000000, 28, 0, 0, 0 },
- + { 720000000, 29, 0, 0, 0 },
- + { 768000000, 15, 1, 0, 0 },
- + { 792000000, 10, 2, 0, 0 },
- + { 816000000, 16, 1, 0, 0 },
- + { 864000000, 17, 1, 0, 0 },
- + { 912000000, 18, 1, 0, 0 },
- + { 936000000, 12, 2, 0, 0 },
- + { 960000000, 19, 1, 0, 0 },
- + { 1008000000, 20, 1, 0, 0 },
- + { 1056000000, 21, 1, 0, 0 },
- + { 1080000000, 14, 2, 0, 0 },
- + { 1104000000, 22, 1, 0, 0 },
- + { 1152000000, 23, 1, 0, 0 },
- + { 1200000000, 24, 1, 0, 0 },
- + { 1224000000, 16, 2, 0, 0 },
- + { 1248000000, 25, 1, 0, 0 },
- + { 1296000000, 26, 1, 0, 0 },
- + { 1344000000, 27, 1, 0, 0 },
- + { 1368000000, 18, 2, 0, 0 },
- + { 1392000000, 28, 1, 0, 0 },
- + { 1440000000, 29, 1, 0, 0 },
- + { 1512000000, 20, 2, 0, 0 },
- + { 1536000000, 15, 3, 0, 0 },
- + { 1584000000, 21, 2, 0, 0 },
- + { 1632000000, 16, 3, 0, 0 },
- + { 1656000000, 22, 2, 0, 0 },
- + { 1728000000, 23, 2, 0, 0 },
- + { 1800000000, 24, 2, 0, 0 },
- + { 1824000000, 18, 3, 0, 0 },
- + { 1872000000, 25, 2, 0, 0 },
- + { 0 }
- +};
- +
- +static const struct sunxi_ccu_nkmp_tbl sun8i_v3s_ac_dig_table[] = {
- + { 24576000, 13, 0, 0, 13 },
- + { 0 }
- +};
- +
- +static struct sunxi_ccu_clk sun8i_v3s_ccu_clks[] = {
- + SUNXI_CCU_NKMP_TABLE(V3S_CLK_CPU, "pll_cpu", "hosc",
- + PLL_CPU_CTRL_REG, /* reg */
- + __BITS(12,8), /* n */
- + __BITS(5,4), /* k */
- + __BITS(1,0), /* m */
- + __BITS(17,16), /* p */
- + __BIT(31), /* enable */
- + __BIT(28), /* lock */
- + sun8i_v3s_cpu_table, /* table */
- + SUNXI_CCU_NKMP_SCALE_CLOCK | SUNXI_CCU_NKMP_FACTOR_P_POW2),
- +
- + SUNXI_CCU_NKMP(V3S_CLK_PLL_PERIPH0, "pll_periph0", "hosc",
- + PLL_PERIPH0_CTRL_REG, /* reg */
- + __BITS(12,8), /* n */
- + __BITS(5,4), /* k */
- + 0, /* m */
- + __BITS(17,16), /* p */
- + __BIT(31), /* enable */
- + SUNXI_CCU_NKMP_DIVIDE_BY_TWO),
- +
- + SUNXI_CCU_FRACTIONAL(V3S_CLK_PLL_VIDEO, "pll_video", "hosc",
- + PLL_VIDEO_CTRL_REG, /* reg */
- + __BITS(14,8), /* m */
- + 16, /* m_min */
- + 50, /* m_max */
- + __BIT(24), /* div_en */
- + __BIT(25), /* frac_sel */
- + 270000000, 297000000, /* frac values */
- + __BITS(3,0), /* prediv */
- + 4, /* prediv_val */
- + __BIT(31), /* enable */
- + SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
- +
- + SUNXI_CCU_NKMP_TABLE(V3S_CLK_PLL_AUDIO_BASE, "pll_audio", "hosc",
- + PLL_AUDIO_CTRL_REG, /* reg */
- + __BITS(14,8), /* n */
- + 0, /* k */
- + __BITS(4,0), /* m */
- + __BITS(19,16), /* p */
- + __BIT(31), /* enable */
- + __BIT(28), /* lock */
- + sun8i_v3s_ac_dig_table, /* table */
- + 0),
- +
- + SUNXI_CCU_PREDIV(V3S_CLK_AHB1, "ahb1", ahb1_parents,
- + AHB1_APB1_CFG_REG, /* reg */
- + __BITS(7,6), /* prediv */
- + __BIT(3), /* prediv_sel */
- + __BITS(5,4), /* div */
- + __BITS(13,12), /* sel */
- + SUNXI_CCU_PREDIV_POWER_OF_TWO),
- +
- + SUNXI_CCU_PREDIV(V3S_CLK_AHB2, "ahb2", ahb2_parents,
- + AHB2_CFG_REG, /* reg */
- + 0, /* prediv */
- + __BIT(1), /* prediv_sel */
- + 0, /* div */
- + __BITS(1,0), /* sel */
- + SUNXI_CCU_PREDIV_DIVIDE_BY_TWO),
- +
- + SUNXI_CCU_DIV(V3S_CLK_APB1, "apb1", apb1_parents,
- + AHB1_APB1_CFG_REG, /* reg */
- + __BITS(9,8), /* div */
- + 0, /* sel */
- + SUNXI_CCU_DIV_POWER_OF_TWO|SUNXI_CCU_DIV_ZERO_IS_ONE),
- +
- + SUNXI_CCU_NM(V3S_CLK_APB2, "apb2", apb2_parents,
- + APB2_CFG_REG, /* reg */
- + __BITS(17,16), /* n */
- + __BITS(4,0), /* m */
- + __BITS(25,24), /* sel */
- + 0, /* enable */
- + SUNXI_CCU_NM_POWER_OF_TWO),
- +
- + SUNXI_CCU_DIV_GATE(V3S_CLK_DE, "de", de_parents,
- + DE_CLK_REG, /* reg */
- + __BITS(3,0), /* div */
- + __BITS(26,24), /* sel */
- + __BIT(31), /* enable */
- + 0),
- +
- + SUNXI_CCU_NM(V3S_CLK_MMC0, "mmc0", mod_parents,
- + SDMMC0_CLK_REG, __BITS(17, 16), __BITS(3,0), __BITS(25, 24), __BIT(31),
- + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
- + SUNXI_CCU_PHASE(V3S_CLK_MMC0_SAMPLE, "mmc0_sample", "mmc0",
- + SDMMC0_CLK_REG, __BITS(22,20)),
- + SUNXI_CCU_PHASE(V3S_CLK_MMC0_OUTPUT, "mmc0_output", "mmc0",
- + SDMMC0_CLK_REG, __BITS(10,8)),
- + SUNXI_CCU_NM(V3S_CLK_MMC1, "mmc1", mod_parents,
- + SDMMC1_CLK_REG, __BITS(17, 16), __BITS(3,0), __BITS(25, 24), __BIT(31),
- + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
- + SUNXI_CCU_PHASE(V3S_CLK_MMC1_SAMPLE, "mmc1_sample", "mmc1",
- + SDMMC1_CLK_REG, __BITS(22,20)),
- + SUNXI_CCU_PHASE(V3S_CLK_MMC1_OUTPUT, "mmc1_output", "mmc1",
- + SDMMC1_CLK_REG, __BITS(10,8)),
- + SUNXI_CCU_NM(V3S_CLK_MMC2, "mmc2", mod_parents,
- + SDMMC2_CLK_REG, __BITS(17, 16), __BITS(3,0), __BITS(25, 24), __BIT(31),
- + SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
- + SUNXI_CCU_PHASE(V3S_CLK_MMC2_SAMPLE, "mmc2_sample", "mmc2",
- + SDMMC2_CLK_REG, __BITS(22,20)),
- + SUNXI_CCU_PHASE(V3S_CLK_MMC2_OUTPUT, "mmc2_output", "mmc2",
- + SDMMC2_CLK_REG, __BITS(10,8)),
- +
- + SUNXI_CCU_NM(V3S_CLK_SPI0, "spi0", mod_parents,
- + SPI0_CLK_REG, /* reg */
- + __BITS(17,16), /* n */
- + __BITS(3,0), /* m */
- + __BITS(25,24), /* sel */
- + __BIT(31), /* enable */
- + SUNXI_CCU_NM_ROUND_DOWN),
- +
- + SUNXI_CCU_GATE(V3S_CLK_AC_DIG, "ac_dig", "pll_audio",
- + AC_DIG_CLK_REG, 31),
- +
- + SUNXI_CCU_DIV_GATE(V3S_CLK_TCON0, "tcon", tcon_parents,
- + TCON_CLK_REG, /* reg */
- + __BITS(3,0), /* div */
- + __BITS(26,24), /* sel */
- + __BIT(31), /* enable */
- + 0),
- +
- + SUNXI_CCU_GATE(V3S_CLK_BUS_DMA, "bus-dma", "ahb1",
- + BUS_CLK_GATING_REG0, 6),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_MMC0, "bus-mmc0", "ahb1",
- + BUS_CLK_GATING_REG0, 8),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_MMC1, "bus-mmc1", "ahb1",
- + BUS_CLK_GATING_REG0, 9),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_MMC2, "bus-mmc2", "ahb1",
- + BUS_CLK_GATING_REG0, 10),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_EMAC, "bus-emac", "ahb2",
- + BUS_CLK_GATING_REG0, 17),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_SPI0, "bus-spi0", "ahb1",
- + BUS_CLK_GATING_REG0, 20),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_OTG, "bus-otg", "ahb2",
- + BUS_CLK_GATING_REG0, 24),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_EHCI0, "bus-ehci", "ahb2",
- + BUS_CLK_GATING_REG0, 26),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_OHCI0, "bus-ohci", "ahb2",
- + BUS_CLK_GATING_REG0, 29),
- +
- + SUNXI_CCU_GATE(V3S_CLK_BUS_VE, "bus-ve", "ahb1",
- + BUS_CLK_GATING_REG1, 0),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_TCON0, "bus-tcon", "ahb1",
- + BUS_CLK_GATING_REG1, 4),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_CSI, "bus-csi", "ahb1",
- + BUS_CLK_GATING_REG1, 8),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_DE, "bus-de", "ahb1",
- + BUS_CLK_GATING_REG1, 12),
- +
- + SUNXI_CCU_GATE(V3S_CLK_BUS_CODEC, "bus-codec", "apb1",
- + BUS_CLK_GATING_REG2, 0),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_PIO, "bus-pio", "apb1",
- + BUS_CLK_GATING_REG2, 5),
- +
- + SUNXI_CCU_GATE(V3S_CLK_BUS_I2C0, "bus-i2c0", "apb2",
- + BUS_CLK_GATING_REG3, 0),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_I2C1, "bus-i2c1", "apb2",
- + BUS_CLK_GATING_REG3, 1),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_UART0, "bus-uart0", "apb2",
- + BUS_CLK_GATING_REG3, 16),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_UART1, "bus-uart1", "apb2",
- + BUS_CLK_GATING_REG3, 17),
- + SUNXI_CCU_GATE(V3S_CLK_BUS_UART2, "bus-uart2", "apb2",
- + BUS_CLK_GATING_REG3, 18),
- +
- + SUNXI_CCU_GATE(V3S_CLK_BUS_EPHY, "bus-ephy", "ahb1",
- + BUS_CLK_GATING_REG4, 0),
- +
- + SUNXI_CCU_GATE(V3S_CLK_USB_PHY0, "usb-phy0", "hosc",
- + USBPHY_CFG_REG, 8),
- + SUNXI_CCU_GATE(V3S_CLK_USB_OHCI0, "usb-ohci", "hosc",
- + USBPHY_CFG_REG, 16),
- +};
- +
- +static int
- +sun8i_v3s_ccu_match(device_t parent, cfdata_t cf, void *aux)
- +{
- + struct fdt_attach_args * const faa = aux;
- +
- + return of_match_compatible(faa->faa_phandle, compatible);
- +}
- +
- +static void
- +sun8i_v3s_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 = sun8i_v3s_ccu_resets;
- + sc->sc_nresets = __arraycount(sun8i_v3s_ccu_resets);
- +
- + sc->sc_clks = sun8i_v3s_ccu_clks;
- + sc->sc_nclks = __arraycount(sun8i_v3s_ccu_clks);
- +
- + if (sunxi_ccu_attach(sc) != 0)
- + return;
- +
- + aprint_naive("\n");
- + aprint_normal(": V3s CCU\n");
- +
- + sunxi_ccu_print(sc);
- +}
- diff -uNpr sunxi.orig/sun8i_v3s_ccu.h sunxi/sun8i_v3s_ccu.h
- --- sunxi.orig/sun8i_v3s_ccu.h 1970-01-01 09:00:00.000000000 +0900
- +++ sunxi/sun8i_v3s_ccu.h 2020-01-04 11:16:24.151811569 +0900
- @@ -0,0 +1,124 @@
- +/* $NetBSD: sun8i_v3s_ccu.h,v 1.1 2017/08/25 00:07:03 jmcneill Exp $ */
- +
- +/*-
- + * Copyright (c) 2017 Jared McNeill <[email protected]>
- + * 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 _SUN8I_V3S_CCU_H
- +#define _SUN8I_V3S_CCU_H
- +
- +#define V3S_RST_USB_PHY0 0
- +#define V3S_RST_MBUS 1
- +#define V3S_RST_BUS_CE 5
- +#define V3S_RST_BUS_DMA 6
- +#define V3S_RST_BUS_MMC0 7
- +#define V3S_RST_BUS_MMC1 8
- +#define V3S_RST_BUS_MMC2 9
- +#define V3S_RST_BUS_DRAM 11
- +#define V3S_RST_BUS_EMAC 12
- +#define V3S_RST_BUS_HSTIMER 14
- +#define V3S_RST_BUS_SPI0 15
- +#define V3S_RST_BUS_OTG 17
- +#define V3S_RST_BUS_EHCI0 18
- +#define V3S_RST_BUS_OHCI0 22
- +#define V3S_RST_BUS_VE 26
- +#define V3S_RST_BUS_TCON0 27
- +#define V3S_RST_BUS_CSI 30
- +#define V3S_RST_BUS_DE 34
- +#define V3S_RST_BUS_DBG 38
- +#define V3S_RST_BUS_EPHY 39
- +#define V3S_RST_BUS_CODEC 40
- +#define V3S_RST_BUS_I2C0 46
- +#define V3S_RST_BUS_I2C1 47
- +#define V3S_RST_BUS_UART0 49
- +#define V3S_RST_BUS_UART1 50
- +#define V3S_RST_BUS_UART2 51
- +#define V3S_RST_BUS_I2S0 52
- +
- +#define V3S_CLK_PLL_CPU 0 /*XXX*/
- +#define V3S_CLK_PLL_AUDIO_BASE 1 /*XXX*/
- +#define V3S_CLK_PLL_VIDEO 6 /*XXX*/
- +#define V3S_CLK_PLL_PERIPH0 8 /*XXX*/
- +#define V3S_CLK_CPU 14
- +#define V3S_CLK_AHB1 16 /*XXX*/
- +#define V3S_CLK_APB1 17 /*XXX*/
- +#define V3S_CLK_APB2 18 /*XXX*/
- +#define V3S_CLK_AHB2 19 /*XXX*/
- +#define V3S_CLK_BUS_CE 20
- +#define V3S_CLK_BUS_DMA 21
- +#define V3S_CLK_BUS_MMC0 22
- +#define V3S_CLK_BUS_MMC1 23
- +#define V3S_CLK_BUS_MMC2 24
- +#define V3S_CLK_BUS_DRAM 25
- +#define V3S_CLK_BUS_EMAC 26
- +#define V3S_CLK_BUS_HSTIMER 27
- +#define V3S_CLK_BUS_SPI0 28
- +#define V3S_CLK_BUS_OTG 29
- +#define V3S_CLK_BUS_EHCI0 30
- +#define V3S_CLK_BUS_OHCI0 31
- +#define V3S_CLK_BUS_VE 32
- +#define V3S_CLK_BUS_TCON0 33
- +#define V3S_CLK_BUS_CSI 34
- +#define V3S_CLK_BUS_DE 35
- +#define V3S_CLK_BUS_CODEC 36
- +#define V3S_CLK_BUS_PIO 37
- +#define V3S_CLK_BUS_I2C0 38
- +#define V3S_CLK_BUS_I2C1 39
- +#define V3S_CLK_BUS_UART0 40
- +#define V3S_CLK_BUS_UART1 41
- +#define V3S_CLK_BUS_UART2 42
- +#define V3S_CLK_BUS_EPHY 43
- +#define V3S_CLK_BUS_DBG 44
- +#define V3S_CLK_MMC0 45
- +#define V3S_CLK_MMC0_SAMPLE 46
- +#define V3S_CLK_MMC0_OUTPUT 47
- +#define V3S_CLK_MMC1 48
- +#define V3S_CLK_MMC1_SAMPLE 49
- +#define V3S_CLK_MMC1_OUTPUT 50
- +#define V3S_CLK_MMC2 51
- +#define V3S_CLK_MMC2_SAMPLE 52
- +#define V3S_CLK_MMC2_OUTPUT 53
- +#define V3S_CLK_CE 54
- +#define V3S_CLK_SPI0 55
- +#define V3S_CLK_USB_PHY0 56
- +#define V3S_CLK_USB_OHCI0 57
- +#define V3S_CLK_DRAM_VE 59
- +#define V3S_CLK_DRAM_CSI 60
- +#define V3S_CLK_DRAM_EHCI 61
- +#define V3S_CLK_DRAM_OHCI 62
- +#define V3S_CLK_DE 63
- +#define V3S_CLK_TCON0 64
- +#define V3S_CLK_CSI_MISC 65
- +#define V3S_CLK_CSI0_MCLK 66
- +#define V3S_CLK_CSI1_SCLK 67
- +#define V3S_CLK_CSI1_MCLK 68
- +#define V3S_CLK_VE 69
- +#define V3S_CLK_AC_DIG 70
- +#define V3S_CLK_AVS 71
- +#define V3S_CLK_MIPI_CSI 73
- +#define V3S_CLK_BUS_I2S0 75
- +#define V3S_CLK_I2S0 76
- +
- +#endif /* !_SUN8I_V3S_CCU_H */
- diff -uNpr sunxi.orig/sun8i_v3s_gpio.c sunxi/sun8i_v3s_gpio.c
- --- sunxi.orig/sun8i_v3s_gpio.c 1970-01-01 09:00:00.000000000 +0900
- +++ sunxi/sun8i_v3s_gpio.c 2020-01-04 11:20:30.335881350 +0900
- @@ -0,0 +1,103 @@
- +/* $NetBSD: sun8i_v3s_gpio.c,v 1.3 2018/04/03 16:01:25 bouyer Exp $ */
- +
- +/*-
- + * Copyright (c) 2017 Jared McNeill <[email protected]>
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions
- + * are met:
- + * 1. Redistributions of source code must retain the above copyright
- + * notice, this list of conditions and the following disclaimer.
- + * 2. Redistributions in binary form must reproduce the above copyright
- + * notice, this list of conditions and the following disclaimer in the
- + * documentation and/or other materials provided with the distribution.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- + * SUCH DAMAGE.
- + *
- + * $FreeBSD$
- + */
- +
- +#include <sys/cdefs.h>
- +__KERNEL_RCSID(0, "$NetBSD: sun8i_v3s_gpio.c,v 1.3 2018/04/03 16:01:25 bouyer 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 v3s_pins[] = {
- + { "PB0", 1, 0, { "gpio_in", "gpio_out", "uart2", NULL, NULL, NULL, "irq" }, 6, 0, 0 },
- + { "PB1", 1, 1, { "gpio_in", "gpio_out", "uart2", NULL, NULL, NULL, "irq" }, 6, 1, 0 },
- + { "PB2", 1, 2, { "gpio_in", "gpio_out", "uart2", NULL, NULL, NULL, "irq" }, 6, 2, 0 },
- + { "PB3", 1, 3, { "gpio_in", "gpio_out", "uart2", NULL, NULL, NULL, "irq" }, 6, 3, 0 },
- + { "PB4", 1, 4, { "gpio_in", "gpio_out", "pwm0", NULL, NULL, NULL, "irq" }, 6, 4, 0 },
- + { "PB5", 1, 5, { "gpio_in", "gpio_out", "pwm1", NULL, NULL, NULL, "irq" }, 6, 5, 0 },
- + { "PB6", 1, 6, { "gpio_in", "gpio_out", "i2c0", NULL, NULL, NULL, "irq" }, 6, 6, 0 },
- + { "PB7", 1, 7, { "gpio_in", "gpio_out", "i2c0", NULL, NULL, NULL, "irq" }, 6, 7, 0 },
- + { "PB8", 1, 8, { "gpio_in", "gpio_out", "i2c1", "uart0", NULL, NULL, "irq" }, 6, 8, 0 },
- + { "PB9", 1, 9, { "gpio_in", "gpio_out", "i2c1", "uart0", NULL, NULL, "irq" }, 6, 9, 0 },
- +
- + { "PC0", 2, 0, { "gpio_in", "gpio_out", "mmc2", "spi0" } },
- + { "PC1", 2, 1, { "gpio_in", "gpio_out", "mmc2", "spi0" } },
- + { "PC2", 2, 2, { "gpio_in", "gpio_out", "mmc2", "spi0" } },
- + { "PC3", 2, 3, { "gpio_in", "gpio_out", "mmc2", "spi0" } },
- +
- + { "PE0", 4, 0, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE1", 4, 1, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE2", 4, 2, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE3", 4, 3, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE4", 4, 4, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE5", 4, 5, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE6", 4, 6, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE7", 4, 7, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE8", 4, 8, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE9", 4, 9, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE10", 4, 10, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE11", 4, 11, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE12", 4, 12, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE13", 4, 13, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE14", 4, 14, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE15", 4, 15, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE16", 4, 16, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE17", 4, 17, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE18", 4, 18, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE19", 4, 19, { "gpio_in", "gpio_out", "csi", "lcd" } },
- + { "PE20", 4, 20, { "gpio_in", "gpio_out", "csi", "mipi" } },
- + { "PE21", 4, 21, { "gpio_in", "gpio_out", "csi", "i2c1", "uart1" } },
- + { "PE22", 4, 22, { "gpio_in", "gpio_out", "csi", "i2c1", "uart1" } },
- + { "PE23", 4, 23, { "gpio_in", "gpio_out", NULL, "lcd", "uart1" } },
- + { "PE24", 4, 24, { "gpio_in", "gpio_out", NULL, "lcd", "uart1" } },
- +
- + { "PF0", 5, 0, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
- + { "PF1", 5, 1, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
- + { "PF2", 5, 2, { "gpio_in", "gpio_out", "mmc0", "uart0" } },
- + { "PF3", 5, 3, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
- + { "PF4", 5, 4, { "gpio_in", "gpio_out", "mmc0", "uart0" } },
- + { "PF5", 5, 5, { "gpio_in", "gpio_out", "mmc0", "jtag" } },
- + { "PF6", 5, 6, { "gpio_in", "gpio_out" } },
- +
- + { "PG0", 6, 0, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "irq" }, 6, 0, 1 },
- + { "PG1", 6, 1, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "irq" }, 6, 1, 1 },
- + { "PG2", 6, 2, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "irq" }, 6, 2, 1 },
- + { "PG3", 6, 3, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "irq" }, 6, 3, 1 },
- + { "PG4", 6, 4, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "irq" }, 6, 4, 1 },
- + { "PG5", 6, 5, { "gpio_in", "gpio_out", "mmc1", NULL, NULL, NULL, "irq" }, 6, 5, 1 },
- +};
- +
- +const struct sunxi_gpio_padconf sun8i_v3s_padconf = {
- + .npins = __arraycount(v3s_pins),
- + .pins = v3s_pins,
- +};
- diff -uNpr sunxi.orig/sunxi_gpio.c sunxi/sunxi_gpio.c
- --- sunxi.orig/sunxi_gpio.c 2020-01-02 15:55:43.069575547 +0900
- +++ sunxi/sunxi_gpio.c 2020-01-04 05:29:11.133565388 +0900
- @@ -101,6 +101,9 @@ static const struct of_compat_data compa
- { "allwinner,sun8i-h3-pinctrl", (uintptr_t)&sun8i_h3_padconf },
- { "allwinner,sun8i-h3-r-pinctrl", (uintptr_t)&sun8i_h3_r_padconf },
- #endif
- +#ifdef SOC_SUN8I_V3S
- + { "allwinner,sun8i-v3s-pinctrl", (uintptr_t)&sun8i_v3s_padconf },
- +#endif
- #ifdef SOC_SUN9I_A80
- { "allwinner,sun9i-a80-pinctrl", (uintptr_t)&sun9i_a80_padconf },
- { "allwinner,sun9i-a80-r-pinctrl", (uintptr_t)&sun9i_a80_r_padconf },
- diff -uNpr sunxi.orig/sunxi_gpio.h sunxi/sunxi_gpio.h
- --- sunxi.orig/sunxi_gpio.h 2020-01-02 15:55:43.070144754 +0900
- +++ sunxi/sunxi_gpio.h 2020-01-04 11:21:46.703407675 +0900
- @@ -79,6 +79,10 @@ extern const struct sunxi_gpio_padconf s
- extern const struct sunxi_gpio_padconf sun8i_h3_r_padconf;
- #endif
- +#ifdef SOC_SUN8I_V3S
- +extern const struct sunxi_gpio_padconf sun8i_v3s_padconf;
- +#endif
- +
- #ifdef SOC_SUN9I_A80
- extern const struct sunxi_gpio_padconf sun9i_a80_padconf;
- extern const struct sunxi_gpio_padconf sun9i_a80_r_padconf;
- diff -uNpr sunxi.orig/sunxi_timer.c sunxi/sunxi_timer.c
- --- sunxi.orig/sunxi_timer.c 2020-01-02 15:55:43.080029809 +0900
- +++ sunxi/sunxi_timer.c 2020-01-02 16:57:06.170666181 +0900
- @@ -91,9 +91,11 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_timer.
- #define LOSC_CTRL_OSC32K_AUTO_SWT_EN __BIT(14)
- #define LOSC_CTRL_OSC32K_SEL __BIT(0)
- -static const char * const compatible[] = {
- - "allwinner,sun4i-a10-timer",
- - NULL
- +static const struct of_compat_data compat_data[] = {
- + { "allwinner,sun4i-a10-timer", 6 },
- + { "allwinner,sun8i-v3s-timer", 3 },
- + { "allwinner,suniv-f1c100s-timer", 3 },
- + { NULL }
- };
- struct sunxi_timer_softc {
- @@ -103,6 +105,8 @@ struct sunxi_timer_softc {
- int sc_phandle;
- struct clk *sc_clk;
- + int sc_ntimers;
- +
- struct timecounter sc_tc;
- struct timecounter sc_tc_losc;
- };
- @@ -178,7 +182,7 @@ sunxi_timer_match(device_t parent, cfdat
- {
- struct fdt_attach_args * const faa = aux;
- - return of_match_compatible(faa->faa_phandle, compatible);
- + return of_match_compat_data(faa->faa_phandle, compat_data);
- }
- static void
- @@ -211,6 +215,7 @@ sunxi_timer_attach(device_t parent, devi
- aprint_error(": couldn't map registers\n");
- return;
- }
- + sc->sc_ntimers = of_search_compatible(phandle, compat_data)->data;
- aprint_naive("\n");
- aprint_normal(": Timer\n");
- @@ -230,9 +235,6 @@ sunxi_timer_attach(device_t parent, devi
- TIMER_WRITE(sc, TMR2_CTRL_REG,
- __SHIFTIN(TMR2_CTRL_CLK_SRC_OSC24M, TMR2_CTRL_CLK_SRC) |
- TMR2_CTRL_RELOAD | TMR2_CTRL_EN);
- - /* Enable Timer 4 (timecounter for LOSC) */
- - TIMER_WRITE(sc, TMR4_INTV_VALUE_REG, ~0u);
- - TIMER_WRITE(sc, TMR4_CTRL_REG, TMR4_CTRL_RELOAD | TMR4_CTRL_EN);
- /* Timecounter setup */
- tc->tc_get_timecount = sunxi_timer_get_timecount;
- @@ -242,26 +244,31 @@ sunxi_timer_attach(device_t parent, devi
- tc->tc_quality = 200;
- tc->tc_priv = sc;
- tc_init(tc);
- - tc_losc->tc_get_timecount = sunxi_timer_get_timecount_losc;
- - tc_losc->tc_counter_mask = ~0u;
- - tc_losc->tc_frequency = 32768;
- - tc_losc->tc_name = "LOSC";
- - tc_losc->tc_quality = 150;
- - tc_losc->tc_priv = sc;
- - /*
- - * LOSC is optional to implement in hardware.
- - * Make sure it ticks before registering it.
- - */
- - reg = __SHIFTIN(LOSC_CTRL_KEY_FIELD_V, LOSC_CTRL_KEY_FIELD) |
- - LOSC_CTRL_OSC32K_AUTO_SWT_EN |
- - LOSC_CTRL_OSC32K_SEL;
- - TIMER_WRITE(sc, LOSC_CTRL_REG, reg);
- - ticks = sunxi_timer_get_timecount_losc(tc_losc);
- - delay(100);
- - if (ticks != sunxi_timer_get_timecount_losc(tc_losc))
- - tc_init(tc_losc);
- - else
- - TIMER_WRITE(sc, LOSC_CTRL_REG, reg & ~LOSC_CTRL_OSC32K_SEL);
- +
- + /* Timer 4 (timecounter for LOSC) is optional */
- + if (sc->sc_ntimers > 3) {
- + tc_losc->tc_get_timecount = sunxi_timer_get_timecount_losc;
- + tc_losc->tc_counter_mask = ~0u;
- + tc_losc->tc_frequency = 32768;
- + tc_losc->tc_name = "LOSC";
- + tc_losc->tc_quality = 150;
- + tc_losc->tc_priv = sc;
- +
- + /* Make sure it ticks before registering it. */
- + TIMER_WRITE(sc, TMR4_INTV_VALUE_REG, ~0u);
- + TIMER_WRITE(sc, TMR4_CTRL_REG, TMR4_CTRL_RELOAD | TMR4_CTRL_EN);
- + reg = __SHIFTIN(LOSC_CTRL_KEY_FIELD_V, LOSC_CTRL_KEY_FIELD) |
- + LOSC_CTRL_OSC32K_AUTO_SWT_EN |
- + LOSC_CTRL_OSC32K_SEL;
- + TIMER_WRITE(sc, LOSC_CTRL_REG, reg);
- + ticks = sunxi_timer_get_timecount_losc(tc_losc);
- + delay(100);
- + if (ticks != sunxi_timer_get_timecount_losc(tc_losc))
- + tc_init(tc_losc);
- + else
- + TIMER_WRITE(sc, LOSC_CTRL_REG,
- + reg & ~LOSC_CTRL_OSC32K_SEL);
- + }
- /* Use this as the OS timer in UP configurations */
- if (!arm_has_mpext_p) {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement