Module Name: src Committed By: jmcneill Date: Fri Dec 5 14:36:44 UTC 2014
Modified Files: src/sys/arch/arm/allwinner: awin_board.c awin_io.c awin_mmc.c awin_reg.h awin_var.h src/sys/arch/evbarm/conf: ALLWINNER_A80 Log Message: A80 MMC support. Works for SD card slot on Cubie4, but not eMMC yet. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/arch/arm/allwinner/awin_board.c cvs rdiff -u -r1.31 -r1.32 src/sys/arch/arm/allwinner/awin_io.c cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/allwinner/awin_mmc.c cvs rdiff -u -r1.59 -r1.60 src/sys/arch/arm/allwinner/awin_reg.h cvs rdiff -u -r1.28 -r1.29 src/sys/arch/arm/allwinner/awin_var.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/conf/ALLWINNER_A80 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/allwinner/awin_board.c diff -u src/sys/arch/arm/allwinner/awin_board.c:1.30 src/sys/arch/arm/allwinner/awin_board.c:1.31 --- src/sys/arch/arm/allwinner/awin_board.c:1.30 Fri Dec 5 01:13:11 2014 +++ src/sys/arch/arm/allwinner/awin_board.c Fri Dec 5 14:36:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: awin_board.c,v 1.30 2014/12/05 01:13:11 jmcneill Exp $ */ +/* $NetBSD: awin_board.c,v 1.31 2014/12/05 14:36:44 jmcneill Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: awin_board.c,v 1.30 2014/12/05 01:13:11 jmcneill Exp $"); +__KERNEL_RCSID(1, "$NetBSD: awin_board.c,v 1.31 2014/12/05 14:36:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -128,8 +128,8 @@ awin_cpu_clk(void) #if defined(ALLWINNER_A80) const uint32_t c0cpux = bus_space_read_4(&awin_bs_tag, awin_core_bsh, AWIN_A80_CCU_OFFSET + AWIN_A80_CCU_PLL_C0CPUX_CTRL_REG); - const u_int p = (c0cpux & AWIN_A80_CCU_PLL_OUT_EXT_DIVP) ? 4 : 1; - const u_int n = __SHIFTOUT(c0cpux, AWIN_A80_CCU_PLL_FACTOR_N); + const u_int p = (c0cpux & AWIN_A80_CCU_PLL_CxCPUX_OUT_EXT_DIVP) ? 4 : 1; + const u_int n = __SHIFTOUT(c0cpux, AWIN_A80_CCU_PLL_CxCPUX_FACTOR_N); ci->ci_data.cpu_cc_freq = ((uint64_t)AWIN_REF_FREQ * n) / p; #else @@ -333,6 +333,8 @@ awin_pll6_enable(void) bus_space_tag_t bst = &awin_bs_tag; bus_space_handle_t bsh = awin_core_bsh; + KASSERT(awin_chip_id() != AWIN_CHIP_ID_A80); + /* * SATA needs PLL6 to be a 100MHz clock. */ @@ -549,6 +551,7 @@ awin_pll5x_get_rate(void) unsigned int n, k, p; KASSERT(awin_chip_id() != AWIN_CHIP_ID_A31); + KASSERT(awin_chip_id() != AWIN_CHIP_ID_A80); const uint32_t cfg = bus_space_read_4(bst, bsh, AWIN_CCM_OFFSET + AWIN_PLL5_CFG_REG); @@ -567,6 +570,8 @@ awin_pll6_get_rate(void) bus_space_handle_t bsh = awin_core_bsh; unsigned int n, k, m; + KASSERT(awin_chip_id() != AWIN_CHIP_ID_A80); + const uint32_t cfg = bus_space_read_4(bst, bsh, AWIN_CCM_OFFSET + AWIN_PLL6_CFG_REG); @@ -582,3 +587,22 @@ awin_pll6_get_rate(void) return (AWIN_REF_FREQ * n * k) / m; } + +uint32_t +awin_periph0_get_rate(void) +{ + bus_space_tag_t bst = &awin_bs_tag; + bus_space_handle_t bsh = awin_core_bsh; + unsigned int n, idiv, odiv; + + KASSERT(awin_chip_id() == AWIN_CHIP_ID_A80); + + const uint32_t cfg = bus_space_read_4(bst, bsh, + AWIN_A80_CCU_OFFSET + AWIN_A80_CCU_PLL_PERIPH0_CTRL_REG); + + n = __SHIFTOUT(cfg, AWIN_A80_CCU_PLL_PERIPH0_FACTOR_N); + idiv = __SHIFTOUT(cfg, AWIN_A80_CCU_PLL_PERIPH0_INPUT_DIV) + 1; + odiv = __SHIFTOUT(cfg, AWIN_A80_CCU_PLL_PERIPH0_OUTPUT_DIV) + 1; + + return ((AWIN_REF_FREQ * n) / idiv) / odiv; +} Index: src/sys/arch/arm/allwinner/awin_io.c diff -u src/sys/arch/arm/allwinner/awin_io.c:1.31 src/sys/arch/arm/allwinner/awin_io.c:1.32 --- src/sys/arch/arm/allwinner/awin_io.c:1.31 Fri Dec 5 11:53:43 2014 +++ src/sys/arch/arm/allwinner/awin_io.c Fri Dec 5 14:36:44 2014 @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: awin_io.c,v 1.31 2014/12/05 11:53:43 jmcneill Exp $"); +__KERNEL_RCSID(1, "$NetBSD: awin_io.c,v 1.32 2014/12/05 14:36:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -204,11 +204,23 @@ awinio_attach(device_t parent, device_t sc->sc_dmat = &awin_dma_tag; sc->sc_coherent_dmat = &awin_coherent_dma_tag; - bus_space_subregion(sc->sc_bst, sc->sc_bsh, AWIN_CCM_OFFSET, 0x1000, - &sc->sc_ccm_bsh); + switch (awin_chip_id()) { + case AWIN_CHIP_ID_A80: + bus_space_subregion(sc->sc_bst, sc->sc_bsh, + AWIN_A80_CCU_SCLK_OFFSET, 0x1000, &sc->sc_ccm_bsh); + break; + default: + bus_space_subregion(sc->sc_bst, sc->sc_bsh, AWIN_CCM_OFFSET, + 0x1000, &sc->sc_ccm_bsh); + break; + } aprint_naive("\n"); - aprint_normal(": %s (0x%04x)\n", chip_name, chip_id); + aprint_normal(": %s", chip_name); + if ((chip_id & 0xff00) != 0xff00) { + aprint_normal(" (0x%04x)\n", chip_id); + } + aprint_normal("\n"); const struct awin_locators * const eloc = awin_locators + __arraycount(awin_locators); Index: src/sys/arch/arm/allwinner/awin_mmc.c diff -u src/sys/arch/arm/allwinner/awin_mmc.c:1.16 src/sys/arch/arm/allwinner/awin_mmc.c:1.17 --- src/sys/arch/arm/allwinner/awin_mmc.c:1.16 Thu Dec 4 03:03:44 2014 +++ src/sys/arch/arm/allwinner/awin_mmc.c Fri Dec 5 14:36:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: awin_mmc.c,v 1.16 2014/12/04 03:03:44 jmcneill Exp $ */ +/* $NetBSD: awin_mmc.c,v 1.17 2014/12/05 14:36:44 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "locators.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: awin_mmc.c,v 1.16 2014/12/04 03:03:44 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: awin_mmc.c,v 1.17 2014/12/05 14:36:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -46,7 +46,14 @@ __KERNEL_RCSID(0, "$NetBSD: awin_mmc.c,v #include <arm/allwinner/awin_var.h> #define AWIN_MMC_NDESC 16 -#define AWIN_MMC_DMA_FTRGLEVEL 0x20070008 +#define AWIN_MMC_DMA_FTRGLEVEL_A20 0x20070008 +#define AWIN_MMC_DMA_FTRGLEVEL_A80 0x200f0010 + +static const struct awin_gpio_pinset awin_mmc_pinsets_a80[4] = { + [0] = { 'F', AWIN_A80_PIO_PF_SDMMC0_FUNC, AWIN_A80_PIO_PF_SDMMC0_PINS }, + [1] = { 'G', AWIN_A80_PIO_PG_SDMMC1_FUNC, AWIN_A80_PIO_PG_SDMMC1_PINS }, + [2] = { 'C', AWIN_A80_PIO_PC_SDMMC2_FUNC, AWIN_A80_PIO_PC_SDMMC2_PINS }, +}; static int awin_mmc_match(device_t, cfdata_t, void *); static void awin_mmc_attach(device_t, device_t, void *); @@ -88,6 +95,7 @@ struct awin_mmc_softc { bus_space_tag_t sc_bst; bus_space_handle_t sc_bsh; bus_space_handle_t sc_clk_bsh; + bus_space_handle_t sc_comm_bsh; bus_dma_tag_t sc_dmat; bool sc_use_dma; @@ -99,10 +107,12 @@ struct awin_mmc_softc { int sc_mmc_width; int sc_mmc_present; + int sc_mmc_port; device_t sc_sdmmc_dev; uint32_t sc_fifo_reg; + uint32_t sc_dma_ftrglevel; uint32_t sc_idma_xferlen; bus_dma_segment_t sc_idma_segs[1]; @@ -203,13 +213,12 @@ awin_mmc_attach(device_t parent, device_ sc->sc_dev = self; sc->sc_bst = aio->aio_core_bst; sc->sc_dmat = aio->aio_dmat; + sc->sc_mmc_port = loc->loc_port; mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_BIO); cv_init(&sc->sc_intr_cv, "awinmmcirq"); cv_init(&sc->sc_idst_cv, "awinmmcdma"); bus_space_subregion(sc->sc_bst, aio->aio_core_bsh, loc->loc_offset, loc->loc_size, &sc->sc_bsh); - bus_space_subregion(sc->sc_bst, aio->aio_ccm_bsh, - AWIN_SD0_CLK_REG + (loc->loc_port * 4), 0, &sc->sc_clk_bsh); sc->sc_use_dma = true; prop_dictionary_get_bool(cfg, "dma", &sc->sc_use_dma); @@ -217,15 +226,47 @@ awin_mmc_attach(device_t parent, device_ aprint_naive("\n"); aprint_normal(": SD3.0 (%s)\n", sc->sc_use_dma ? "DMA" : "PIO"); - awin_pll6_enable(); + if (awin_chip_id() == AWIN_CHIP_ID_A80) { + + if (awin_mmc_pinsets_a80[loc->loc_port].pinset_group) { + awin_gpio_pinset_acquire( + &awin_mmc_pinsets_a80[loc->loc_port]); + } + + bus_space_subregion(sc->sc_bst, aio->aio_ccm_bsh, + AWIN_A80_CCU_SCLK_SDMMC0_CLK_REG + (loc->loc_port * 4), 4, + &sc->sc_clk_bsh); + bus_space_subregion(sc->sc_bst, aio->aio_core_bsh, + AWIN_A80_SDMMC_COMM_OFFSET + (loc->loc_port * 4), 4, + &sc->sc_comm_bsh); + awin_reg_set_clear(aio->aio_core_bst, aio->aio_ccm_bsh, + AWIN_A80_CCU_SCLK_BUS_CLK_GATING0_REG, + AWIN_A80_CCU_SCLK_BUS_CLK_GATING0_SD, 0); + awin_reg_set_clear(aio->aio_core_bst, aio->aio_ccm_bsh, + AWIN_A80_CCU_SCLK_BUS_SOFT_RST0_REG, + AWIN_A80_CCU_SCLK_BUS_SOFT_RST0_SD, 0); + + const uint32_t comm = bus_space_read_4(sc->sc_bst, + sc->sc_comm_bsh, 0); + bus_space_write_4(sc->sc_bst, sc->sc_comm_bsh, 0, + comm | + AWIN_A80_SDMMC_COMM_SDC_RESET_SW | + AWIN_A80_SDMMC_COMM_SDC_CLOCK_SW); + delay(1000); + } else { + bus_space_subregion(sc->sc_bst, aio->aio_ccm_bsh, + AWIN_SD0_CLK_REG + (loc->loc_port * 4), 4, &sc->sc_clk_bsh); + + awin_pll6_enable(); - awin_reg_set_clear(aio->aio_core_bst, aio->aio_ccm_bsh, - AWIN_AHB_GATING0_REG, - AWIN_AHB_GATING0_SDMMC0 << loc->loc_port, 0); - if (awin_chip_id() == AWIN_CHIP_ID_A31) { awin_reg_set_clear(aio->aio_core_bst, aio->aio_ccm_bsh, - AWIN_A31_AHB_RESET0_REG, - AWIN_A31_AHB_RESET0_SD0_RST << loc->loc_port, 0); + AWIN_AHB_GATING0_REG, + AWIN_AHB_GATING0_SDMMC0 << loc->loc_port, 0); + if (awin_chip_id() == AWIN_CHIP_ID_A31) { + awin_reg_set_clear(aio->aio_core_bst, aio->aio_ccm_bsh, + AWIN_A31_AHB_RESET0_REG, + AWIN_A31_AHB_RESET0_SD0_RST << loc->loc_port, 0); + } } if (prop_dictionary_get_cstring_nocopy(cfg, "detect-gpio", &pin_name)) { @@ -253,10 +294,19 @@ awin_mmc_attach(device_t parent, device_ } } - if (awin_chip_id() == AWIN_CHIP_ID_A31) { + switch (awin_chip_id()) { + case AWIN_CHIP_ID_A80: sc->sc_fifo_reg = AWIN_A31_MMC_FIFO; - } else { + sc->sc_dma_ftrglevel = AWIN_MMC_DMA_FTRGLEVEL_A80; + break; + case AWIN_CHIP_ID_A31: + sc->sc_fifo_reg = AWIN_A31_MMC_FIFO; + sc->sc_dma_ftrglevel = AWIN_MMC_DMA_FTRGLEVEL_A20; + break; + default: sc->sc_fifo_reg = AWIN_MMC_FIFO; + sc->sc_dma_ftrglevel = AWIN_MMC_DMA_FTRGLEVEL_A20; + break; } if (sc->sc_use_dma) { @@ -293,7 +343,7 @@ awin_mmc_attach_i(device_t self) saa.saa_sct = &awin_mmc_chip_functions; saa.saa_sch = sc; saa.saa_clkmin = 400; - saa.saa_clkmax = 50000; + saa.saa_clkmax = awin_chip_id() == AWIN_CHIP_ID_A80 ? 48000 : 50000; saa.saa_caps = SMC_CAPS_4BIT_MODE| SMC_CAPS_8BIT_MODE| SMC_CAPS_SD_HIGHSPEED| @@ -394,13 +444,28 @@ static int awin_mmc_host_reset(sdmmc_chipset_handle_t sch) { struct awin_mmc_softc *sc = sch; + int retry = 1000; #ifdef AWIN_MMC_DEBUG aprint_normal_dev(sc->sc_dev, "host reset\n"); #endif + if (awin_chip_id() == AWIN_CHIP_ID_A80) { + if (sc->sc_mmc_port == 2 || sc->sc_mmc_port == 3) { + MMC_WRITE(sc, AWIN_MMC_HWRST, 0); + delay(10); + MMC_WRITE(sc, AWIN_MMC_HWRST, 1); + delay(300); + } + } + MMC_WRITE(sc, AWIN_MMC_GCTRL, MMC_READ(sc, AWIN_MMC_GCTRL) | AWIN_MMC_GCTRL_RESET); + while (--retry > 0) { + if (!(MMC_READ(sc, AWIN_MMC_GCTRL) & AWIN_MMC_GCTRL_RESET)) + break; + delay(100); + } MMC_WRITE(sc, AWIN_MMC_IMASK, AWIN_MMC_INT_CMD_DONE | AWIN_MMC_INT_ERROR | @@ -487,6 +552,24 @@ awin_mmc_update_clock(struct awin_mmc_so if (retry == 0) { aprint_error_dev(sc->sc_dev, "timeout updating clock\n"); +#ifdef AWIN_MMC_DEBUG + device_printf(sc->sc_dev, "GCTRL: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_GCTRL)); + device_printf(sc->sc_dev, "CLKCR: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_CLKCR)); + device_printf(sc->sc_dev, "TIMEOUT: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_TIMEOUT)); + device_printf(sc->sc_dev, "WIDTH: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_WIDTH)); + device_printf(sc->sc_dev, "CMD: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_CMD)); + device_printf(sc->sc_dev, "MINT: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_MINT)); + device_printf(sc->sc_dev, "RINT: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_RINT)); + device_printf(sc->sc_dev, "STATUS: 0x%08x\n", + MMC_READ(sc, AWIN_MMC_STATUS)); +#endif return ETIMEDOUT; } @@ -498,16 +581,23 @@ awin_mmc_bus_clock(sdmmc_chipset_handle_ { struct awin_mmc_softc *sc = sch; uint32_t odly, sdly, clkcr, clksrc, n, m; - u_int pll_freq = awin_pll6_get_rate() / 1000; u_int osc24m_freq = AWIN_REF_FREQ / 1000; + uint32_t pll_freq; + + if (awin_chip_id() == AWIN_CHIP_ID_A80) { + pll_freq = awin_periph0_get_rate() / 1000; + } else { + pll_freq = awin_pll6_get_rate() / 1000; + } #ifdef AWIN_MMC_DEBUG - aprint_normal_dev(sc->sc_dev, "freq = %d\n", freq); + aprint_normal_dev(sc->sc_dev, "freq = %d, pll_freq = %d\n", + freq, pll_freq); #endif if (freq <= 400) { odly = 0; - sdly = awin_chip_id() == AWIN_CHIP_ID_A31 ? 0 : 7; + sdly = 0; clksrc = AWIN_SD_CLK_SRC_SEL_OSC24M; n = 2; m = ((osc24m_freq / (1 << n)) / freq) - 1; @@ -515,24 +605,26 @@ awin_mmc_bus_clock(sdmmc_chipset_handle_ odly = 0; sdly = 5; clksrc = AWIN_SD_CLK_SRC_SEL_PLL6; - n = 0; - m = (pll_freq / freq) - 1; + n = awin_chip_id() == AWIN_CHIP_ID_A80 ? 2 : 0; + m = ((pll_freq / freq) / (1 << n)) - 1; } else if (freq <= 50000) { - odly = 3; - sdly = 5; + odly = awin_chip_id() == AWIN_CHIP_ID_A80 ? 5 : 3; + sdly = awin_chip_id() == AWIN_CHIP_ID_A80 ? 4 : 5; clksrc = AWIN_SD_CLK_SRC_SEL_PLL6; - n = 0; - m = (pll_freq / freq) - 1; + n = awin_chip_id() == AWIN_CHIP_ID_A80 ? 2 : 0; + m = ((pll_freq / freq) / (1 << n)) - 1; } else { /* UHS speeds not implemented yet */ return 1; } clkcr = MMC_READ(sc, AWIN_MMC_CLKCR); - clkcr &= ~AWIN_MMC_CLKCR_CARDCLKON; - MMC_WRITE(sc, AWIN_MMC_CLKCR, clkcr); - if (awin_mmc_update_clock(sc) != 0) - return 1; + if (clkcr & AWIN_MMC_CLKCR_CARDCLKON) { + clkcr &= ~AWIN_MMC_CLKCR_CARDCLKON; + MMC_WRITE(sc, AWIN_MMC_CLKCR, clkcr); + if (awin_mmc_update_clock(sc) != 0) + return 1; + } if (freq) { @@ -707,7 +799,7 @@ awin_mmc_dma_prepare(struct awin_mmc_sof val |= AWIN_MMC_IDST_TRANSMIT_INT; MMC_WRITE(sc, AWIN_MMC_IDIE, val); MMC_WRITE(sc, AWIN_MMC_DLBA, desc_paddr); - MMC_WRITE(sc, AWIN_MMC_FTRGLEVEL, AWIN_MMC_DMA_FTRGLEVEL); + MMC_WRITE(sc, AWIN_MMC_FTRGLEVEL, sc->sc_dma_ftrglevel); return 0; } @@ -765,6 +857,11 @@ awin_mmc_exec_command(sdmmc_chipset_hand sc->sc_intr_rint = 0; + if (awin_chip_id() == AWIN_CHIP_ID_A80) { + MMC_WRITE(sc, AWIN_MMC_A12A, + (cmdval & AWIN_MMC_CMD_SEND_AUTO_STOP) ? 0 : 0xffff); + } + MMC_WRITE(sc, AWIN_MMC_ARG, cmd->c_arg); #ifdef AWIN_MMC_DEBUG Index: src/sys/arch/arm/allwinner/awin_reg.h diff -u src/sys/arch/arm/allwinner/awin_reg.h:1.59 src/sys/arch/arm/allwinner/awin_reg.h:1.60 --- src/sys/arch/arm/allwinner/awin_reg.h:1.59 Fri Dec 5 11:53:43 2014 +++ src/sys/arch/arm/allwinner/awin_reg.h Fri Dec 5 14:36:44 2014 @@ -631,6 +631,8 @@ #define AWIN_MMC_CBCR 0x0048 #define AWIN_MMC_BBCR 0x004C #define AWIN_MMC_DBGC 0x0050 +#define AWIN_MMC_A12A 0x0058 /* A80 */ +#define AWIN_MMC_HWRST 0x0078 /* A80 */ #define AWIN_MMC_DMAC 0x0080 #define AWIN_MMC_DLBA 0x0084 #define AWIN_MMC_IDST 0x0088 @@ -2654,6 +2656,7 @@ struct awin_a31_dma_desc { */ #define AWIN_A80_GIC_BASE 0x01c40000 +#define AWIN_A80_SDMMC_COMM_OFFSET 0x00013000 #define AWIN_A80_CCU_OFFSET 0x04400000 #define AWIN_A80_CCU_SCLK_OFFSET 0x04400400 #define AWIN_A80_PIO_OFFSET 0x04400800 @@ -2675,22 +2678,84 @@ struct awin_a31_dma_desc { #define AWIN_A80_TWI3_OFFSET 0x05403400 #define AWIN_A80_TWI4_OFFSET 0x05403800 -#define AWIN_A80_CCU_PLL_C0CPUX_CTRL_REG 0x0000 -#define AWIN_A80_CCU_PLL_C1CPUX_CTRL_REG 0x0000 +#define AWIN_A80_SDMMC_COMM_SDC_RESET_SW __BIT(18) +#define AWIN_A80_SDMMC_COMM_SDC_CLOCK_SW __BIT(16) -#define AWIN_A80_CCU_PLL_ENABLE __BIT(31) -#define AWIN_A80_CCU_PLL_LOCK_TIME __BITS(26,24) -#define AWIN_A80_CCU_PLL_OUT_EXT_DIVP __BIT(16) -#define AWIN_A80_CCU_PLL_FACTOR_N __BITS(15,8) -#define AWIN_A80_CCU_PLL_POSTDIV_M __BITS(1,0) +#define AWIN_A80_CCU_PLL_C0CPUX_CTRL_REG 0x0000 +#define AWIN_A80_CCU_PLL_C1CPUX_CTRL_REG 0x0004 +#define AWIN_A80_CCU_PLL_AUDIO_CTRL_REG 0x0008 +#define AWIN_A80_CCU_PLL_PERIPH0_CTRL_REG 0x000c +#define AWIN_A80_CCU_PLL_VE_CTRL_REG 0x0010 +#define AWIN_A80_CCU_PLL_DDR_CTRL_REG 0x0014 +#define AWIN_A80_CCU_PLL_VIDEO0_CTRL_REG 0x0018 +#define AWIN_A80_CCU_PLL_VIDEO1_CTRL_REG 0x001c +#define AWIN_A80_CCU_PLL_GPU_CTRL_REG 0x0020 +#define AWIN_A80_CCU_PLL_DE_CTRL_REG 0x0024 +#define AWIN_A80_CCU_PLL_ISP_CTRL_REG 0x0028 +#define AWIN_A80_CCU_PLL_PERIPH1_CTRL_REG 0x002c + +#define AWIN_A80_CCU_PLL_CxCPUX_ENABLE __BIT(31) +#define AWIN_A80_CCU_PLL_CxCPUX_LOCK_TIME __BITS(26,24) +#define AWIN_A80_CCU_PLL_CxCPUX_OUT_EXT_DIVP __BIT(16) +#define AWIN_A80_CCU_PLL_CxCPUX_FACTOR_N __BITS(15,8) +#define AWIN_A80_CCU_PLL_CxCPUX_POSTDIV_M __BITS(1,0) + +#define AWIN_A80_CCU_PLL_PERIPH0_ENABLE __BIT(31) +#define AWIN_A80_CCU_PLL_PERIPH0_SDM_ENABLE __BIT(24) +#define AWIN_A80_CCU_PLL_PERIPH0_OUTPUT_DIV __BIT(18) +#define AWIN_A80_CCU_PLL_PERIPH0_INPUT_DIV __BIT(16) +#define AWIN_A80_CCU_PLL_PERIPH0_FACTOR_N __BITS(15,8) + +#define AWIN_A80_CCU_SCLK_SDMMC0_CLK_REG 0x0010 +#define AWIN_A80_CCU_SCLK_SDMMC1_CLK_REG 0x0014 +#define AWIN_A80_CCU_SCLK_SDMMC2_CLK_REG 0x0018 +#define AWIN_A80_CCU_SCLK_SDMMC3_CLK_REG 0x001c + +#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING0_REG 0x0180 +#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING1_REG 0x0184 +#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING2_REG 0x0188 +#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING3_REG 0x0190 +#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING4_REG 0x0194 + +#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST0_REG 0x01a0 +#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST1_REG 0x01a4 +#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST2_REG 0x01a8 +#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST3_REG 0x01b0 +#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST4_REG 0x01b4 + +#define AWIN_A80_CCU_SCLK_BUS_CLK_GATING0_SD __BIT(8) + +#define AWIN_A80_CCU_SCLK_BUS_SOFT_RST0_SD __BIT(8) + +#define AWIN_A80_CCU_SCLK_SDMMC_SCLK_GATING __BIT(31) +#define AWIN_A80_CCU_SCLK_SDMMC_CLK_SRC_SEL __BITS(27,24) +#define AWIN_A80_CCU_SCLK_SDMMC_CLK_SRC_SEL_OSC24M 0 +#define AWIN_A80_CCU_SCLK_SDMMC_CLK_SRC_SEL_PERIPH0 1 +#define AWIN_A80_CCU_SCLK_SDMMC_SAMPLE_CLK_PHASE_CTR __BITS(22,20) +#define AWIN_A80_CCU_SCLK_SDMMC_CLK_DIV_RATIO_N __BITS(17,16) +#define AWIN_A80_CCU_SCLK_SDMMC_OUTPUT_CLK_PHASE_CTR __BITS(10,8) +#define AWIN_A80_CCU_SCLK_SDMMC_CLK_DIV_RATIO_M __BITS(3,0) #define AWIN_A80_PIO_PA_PINS 18 + #define AWIN_A80_PIO_PB_PINS 20 + #define AWIN_A80_PIO_PC_PINS 20 +#define AWIN_A80_PIO_PC_SDMMC2_FUNC 3 +#define AWIN_A80_PIO_PC_SDMMC2_PINS 0x0001ffc0 /* PC pins 16-6 */ + #define AWIN_A80_PIO_PD_PINS 28 + #define AWIN_A80_PIO_PE_PINS 21 + #define AWIN_A80_PIO_PF_PINS 6 +#define AWIN_A80_PIO_PF_SDMMC0_FUNC 2 +#define AWIN_A80_PIO_PF_SDMMC0_PINS 0x0000003f /* PF pins 5-0 */ + #define AWIN_A80_PIO_PG_PINS 16 +#define AWIN_A80_PIO_PG_SDMMC1_FUNC 2 +#define AWIN_A80_PIO_PG_SDMMC1_PINS 0x0000003f /* PG pins 5-0 */ + #define AWIN_A80_PIO_PH_PINS 22 #endif /* _ARM_ALLWINNER_AWIN_REG_H_ */ Index: src/sys/arch/arm/allwinner/awin_var.h diff -u src/sys/arch/arm/allwinner/awin_var.h:1.28 src/sys/arch/arm/allwinner/awin_var.h:1.29 --- src/sys/arch/arm/allwinner/awin_var.h:1.28 Fri Dec 5 01:13:11 2014 +++ src/sys/arch/arm/allwinner/awin_var.h Fri Dec 5 14:36:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: awin_var.h,v 1.28 2014/12/05 01:13:11 jmcneill Exp $ */ +/* $NetBSD: awin_var.h,v 1.29 2014/12/05 14:36:44 jmcneill Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. * All rights reserved. @@ -103,6 +103,7 @@ void awin_pll7_enable(void); void awin_pll3_set_rate(uint32_t); uint32_t awin_pll5x_get_rate(void); uint32_t awin_pll6_get_rate(void); +uint32_t awin_periph0_get_rate(void); void awin_cpu_hatch(struct cpu_info *); #define AWIN_CHIP_ID_A10 AWIN_SRAM_VER_KEY_A10 Index: src/sys/arch/evbarm/conf/ALLWINNER_A80 diff -u src/sys/arch/evbarm/conf/ALLWINNER_A80:1.1 src/sys/arch/evbarm/conf/ALLWINNER_A80:1.2 --- src/sys/arch/evbarm/conf/ALLWINNER_A80:1.1 Fri Dec 5 01:13:12 2014 +++ src/sys/arch/evbarm/conf/ALLWINNER_A80 Fri Dec 5 14:36:44 2014 @@ -1,4 +1,4 @@ -# $NetBSD: ALLWINNER_A80,v 1.1 2014/12/05 01:13:12 jmcneill Exp $ +# $NetBSD: ALLWINNER_A80,v 1.2 2014/12/05 14:36:44 jmcneill Exp $ # # ALLWINNER_A80 - Allwinner A80 boards (Cubieboard4, OptimusBoard, etc) # @@ -195,9 +195,13 @@ armgtmr0 at armperiph? # ARM Generic awinio0 at mainbus? # SD/MMC controllers -#awinmmc0 at awinio0 port 0 -#sdmmc* at awinmmc? -#ld* at sdmmc? +awinmmc0 at awinio0 port 0 +sdmmc0 at awinmmc0 +ld0 at sdmmc0 + +#awinmmc2 at awinio0 port 2 +#sdmmc2 at awinmmc2 +#ld2 at sdmmc2 # Interrupt Controller awinicu0 at awinio0