Module Name:    src
Committed By:   jmcneill
Date:           Wed Nov 12 17:38:14 UTC 2014

Modified Files:
        src/sys/arch/arm/allwinner: awin_dma_a10.c awin_hdmi.c awin_hdmiaudio.c

Log Message:
Add A20 HDMI audio support. Basically the same as A31, except we need to use 
dedicated DMA mode here (A31 DMA controller only supports "normal DMA" mode).


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/allwinner/awin_dma_a10.c \
    src/sys/arch/arm/allwinner/awin_hdmiaudio.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/allwinner/awin_hdmi.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/allwinner/awin_dma_a10.c
diff -u src/sys/arch/arm/allwinner/awin_dma_a10.c:1.2 src/sys/arch/arm/allwinner/awin_dma_a10.c:1.3
--- src/sys/arch/arm/allwinner/awin_dma_a10.c:1.2	Sun Oct 26 15:07:33 2014
+++ src/sys/arch/arm/allwinner/awin_dma_a10.c	Wed Nov 12 17:38:14 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_dma_a10.c,v 1.2 2014/10/26 15:07:33 jmcneill Exp $ */
+/* $NetBSD: awin_dma_a10.c,v 1.3 2014/11/12 17:38:14 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_ddb.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awin_dma_a10.c,v 1.2 2014/10/26 15:07:33 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awin_dma_a10.c,v 1.3 2014/11/12 17:38:14 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -179,7 +179,8 @@ awin_dma_a10_alloc(struct awin_dma_softc
 	uint32_t irqen;
 	uint8_t ch_count, index;
 
-	if (strcmp(type, "ddma") == 0) {
+	if (strcmp(type, "ddma") == 0 ||
+	    strcmp(type, "hdmiaudio") == 0) {
 		ch_list = awin_ddma_channels;
 		ch_count = DDMA_CHANNELS;
 	} else {
@@ -239,7 +240,11 @@ awin_dma_a10_get_config(void *priv)
 {
 	struct awin_dma_a10_channel *ch = priv;
 
-	return DMACH_READ(ch, AWIN_NDMA_CTL_REG);
+	if (ch->ch_type == CH_NDMA) {
+		return DMACH_READ(ch, AWIN_NDMA_CTL_REG);
+	} else {
+		return DMACH_READ(ch, AWIN_DDMA_CTL_REG);
+	}
 }
 
 static void
@@ -247,7 +252,11 @@ awin_dma_a10_set_config(void *priv, uint
 {
 	struct awin_dma_a10_channel *ch = priv;
 
-	DMACH_WRITE(ch, AWIN_NDMA_CTL_REG, val);
+	if (ch->ch_type == CH_NDMA) {
+		DMACH_WRITE(ch, AWIN_NDMA_CTL_REG, val);
+	} else {
+		DMACH_WRITE(ch, AWIN_DDMA_CTL_REG, val);
+	}
 }
 
 static int
@@ -275,6 +284,11 @@ awin_dma_a10_transfer(void *priv, paddr_
 		DMACH_WRITE(ch, AWIN_DDMA_SRC_START_ADDR_REG, src);
 		DMACH_WRITE(ch, AWIN_DDMA_DEST_START_ADDR_REG, dst);
 		DMACH_WRITE(ch, AWIN_DDMA_BC_REG, nbytes);
+		DMACH_WRITE(ch, AWIN_DDMA_PARA_REG,
+		    __SHIFTIN(31, AWIN_DDMA_PARA_DST_DATA_BLK_SIZ) |
+		    __SHIFTIN(7, AWIN_DDMA_PARA_DST_WAIT_CYC) |
+		    __SHIFTIN(31, AWIN_DDMA_PARA_SRC_DATA_BLK_SIZ) |
+		    __SHIFTIN(7, AWIN_DDMA_PARA_SRC_WAIT_CYC));
 
 		cfg |= AWIN_DDMA_CTL_DMA_LOADING;
 		awin_dma_a10_set_config(ch, cfg);
Index: src/sys/arch/arm/allwinner/awin_hdmiaudio.c
diff -u src/sys/arch/arm/allwinner/awin_hdmiaudio.c:1.2 src/sys/arch/arm/allwinner/awin_hdmiaudio.c:1.3
--- src/sys/arch/arm/allwinner/awin_hdmiaudio.c:1.2	Tue Nov 11 17:14:38 2014
+++ src/sys/arch/arm/allwinner/awin_hdmiaudio.c	Wed Nov 12 17:38:14 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_hdmiaudio.c,v 1.2 2014/11/11 17:14:38 jmcneill Exp $ */
+/* $NetBSD: awin_hdmiaudio.c,v 1.3 2014/11/12 17:38:14 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awin_hdmiaudio.c,v 1.2 2014/11/11 17:14:38 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awin_hdmiaudio.c,v 1.3 2014/11/12 17:38:14 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -602,18 +602,33 @@ awin_hdmiaudio_trigger_output(void *priv
 	dmacfg = 0;
 	dmacfg |= __SHIFTIN(AWIN_DMA_CTL_DATA_WIDTH_32,
 			    AWIN_DMA_CTL_DST_DATA_WIDTH);
-	dmacfg |= __SHIFTIN(AWIN_DMA_CTL_BURST_LEN_4,
-			    AWIN_DMA_CTL_DST_BURST_LEN);
-	dmacfg |= __SHIFTIN(AWIN_DMA_CTL_DATA_WIDTH_16,
+	dmacfg |= __SHIFTIN(AWIN_DMA_CTL_DATA_WIDTH_32,
 			    AWIN_DMA_CTL_SRC_DATA_WIDTH);
-	dmacfg |= __SHIFTIN(AWIN_DMA_CTL_BURST_LEN_4,
-			    AWIN_DMA_CTL_SRC_BURST_LEN);
 	dmacfg |= AWIN_DMA_CTL_BC_REMAINING;
-	dmacfg |= AWIN_NDMA_CTL_DST_ADDR_NOINCR;
-	dmacfg |= __SHIFTIN(sc->sc_drqtype_hdmiaudio,
-			    AWIN_DMA_CTL_DST_DRQ_TYPE);
 	dmacfg |= __SHIFTIN(sc->sc_drqtype_sdram,
 			    AWIN_DMA_CTL_SRC_DRQ_TYPE);
+	if (awin_chip_id() == AWIN_CHIP_ID_A31) {
+		/* NDMA */
+		dmacfg |= __SHIFTIN(AWIN_DMA_CTL_BURST_LEN_4,
+				    AWIN_DMA_CTL_DST_BURST_LEN);
+		dmacfg |= __SHIFTIN(AWIN_DMA_CTL_BURST_LEN_4,
+				    AWIN_DMA_CTL_SRC_BURST_LEN);
+		dmacfg |= AWIN_NDMA_CTL_DST_ADDR_NOINCR;
+		dmacfg |= __SHIFTIN(sc->sc_drqtype_hdmiaudio,
+				    AWIN_DMA_CTL_DST_DRQ_TYPE);
+	} else {
+		/* DDMA */
+		dmacfg |= __SHIFTIN(AWIN_DMA_CTL_BURST_LEN_8,
+				    AWIN_DMA_CTL_DST_BURST_LEN);
+		dmacfg |= __SHIFTIN(AWIN_DMA_CTL_BURST_LEN_8,
+				    AWIN_DMA_CTL_SRC_BURST_LEN);
+		dmacfg |= __SHIFTIN(AWIN_DDMA_CTL_DMA_ADDR_IO,
+				    AWIN_DDMA_CTL_DST_ADDR_MODE);
+		dmacfg |= __SHIFTIN(AWIN_DDMA_CTL_DMA_ADDR_LINEAR,
+				    AWIN_DDMA_CTL_SRC_ADDR_MODE);
+		dmacfg |= __SHIFTIN(sc->sc_drqtype_hdmiaudio,
+				    AWIN_DDMA_CTL_DST_DRQ_TYPE);
+	}
 	awin_dma_set_config(sc->sc_pdma, dmacfg);
 
 	error = awin_hdmiaudio_play(sc);

Index: src/sys/arch/arm/allwinner/awin_hdmi.c
diff -u src/sys/arch/arm/allwinner/awin_hdmi.c:1.9 src/sys/arch/arm/allwinner/awin_hdmi.c:1.10
--- src/sys/arch/arm/allwinner/awin_hdmi.c:1.9	Tue Nov 11 19:22:32 2014
+++ src/sys/arch/arm/allwinner/awin_hdmi.c	Wed Nov 12 17:38:14 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_hdmi.c,v 1.9 2014/11/11 19:22:32 jmcneill Exp $ */
+/* $NetBSD: awin_hdmi.c,v 1.10 2014/11/12 17:38:14 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -32,7 +32,7 @@
 #define AWIN_HDMI_PLL	3	/* PLL7 or PLL3 */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awin_hdmi.c,v 1.9 2014/11/11 19:22:32 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awin_hdmi.c,v 1.10 2014/11/12 17:38:14 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -681,7 +681,11 @@ awin_hdmi_set_audiomode(struct awin_hdmi
 
 	/* DMA & FIFO control */
 	val = HDMI_READ(sc, AWIN_HDMI_ADMA_CTRL_REG);
-	val |= AWIN_HDMI_ADMA_CTRL_SRC_DMA_MODE;	/* NDMA */
+	if (awin_chip_id() == AWIN_CHIP_ID_A31) {
+		val |= AWIN_HDMI_ADMA_CTRL_SRC_DMA_MODE;	/* NDMA */
+	} else {
+		val &= ~AWIN_HDMI_ADMA_CTRL_SRC_DMA_MODE;	/* DDMA */
+	}
 	val &= ~AWIN_HDMI_ADMA_CTRL_SRC_DMA_SAMPLE_RATE;
 	val &= ~AWIN_HDMI_ADMA_CTRL_SRC_SAMPLE_LAYOUT;
 	val &= ~AWIN_HDMI_ADMA_CTRL_SRC_WORD_LEN;

Reply via email to