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 <[email protected]>
@@ -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