Module Name: src Committed By: jmcneill Date: Sat Jan 10 12:13:00 UTC 2015
Modified Files: src/sys/arch/arm/imx: imx23_apbdma.c imx23_apbdmareg.h imx23_apbdmavar.h Log Message: >From Petri Laakso <petri.laa...@asd.fi>: - Fix typo: AHBH should be APBH - Add support for APBX DMA - New function apbdma_wait(); wait for DMA completion To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/imx/imx23_apbdma.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/imx/imx23_apbdmareg.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/imx/imx23_apbdmavar.h 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/imx/imx23_apbdma.c diff -u src/sys/arch/arm/imx/imx23_apbdma.c:1.3 src/sys/arch/arm/imx/imx23_apbdma.c:1.4 --- src/sys/arch/arm/imx/imx23_apbdma.c:1.3 Sun Mar 3 10:33:56 2013 +++ src/sys/arch/arm/imx/imx23_apbdma.c Sat Jan 10 12:13:00 2015 @@ -1,4 +1,4 @@ -/* $Id: imx23_apbdma.c,v 1.3 2013/03/03 10:33:56 jkunz Exp $ */ +/* $Id: imx23_apbdma.c,v 1.4 2015/01/10 12:13:00 jmcneill Exp $ */ /* * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -92,10 +92,10 @@ apbdma_attach(device_t parent, device_t static u_int apbdma_attached = 0; if ((strncmp(device_xname(parent), "apbh", 4) == 0) && - (apbdma_attached & F_AHBH_DMA)) + (apbdma_attached & F_APBH_DMA)) return; if ((strncmp(device_xname(parent), "apbx", 4) == 0) && - (apbdma_attached & F_AHBX_DMA)) + (apbdma_attached & F_APBX_DMA)) return; sc->sc_dev = self; @@ -109,25 +109,30 @@ apbdma_attach(device_t parent, device_t } if (strncmp(device_xname(parent), "apbh", 4) == 0) - sc->flags = F_AHBH_DMA; + sc->flags = F_APBH_DMA; if (strncmp(device_xname(parent), "apbx", 4) == 0) - sc->flags = F_AHBX_DMA; + sc->flags = F_APBX_DMA; apbdma_reset(sc); apbdma_init(sc); - if (sc->flags & F_AHBH_DMA) - apbdma_attached |= F_AHBH_DMA; - if (sc->flags & F_AHBX_DMA) - apbdma_attached |= F_AHBX_DMA; + if (sc->flags & F_APBH_DMA) + apbdma_attached |= F_APBH_DMA; + if (sc->flags & F_APBX_DMA) + apbdma_attached |= F_APBX_DMA; sc_parent->dmac = self; /* Initialize mutex to control concurrent access from the drivers. */ mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_HIGH); - aprint_normal("\n"); + if (sc->flags & F_APBH_DMA) + aprint_normal(": APBH DMA\n"); + else if (sc->flags & F_APBX_DMA) + aprint_normal(": APBX DMA\n"); + else + panic("dma flag missing!\n"); return; } @@ -192,7 +197,7 @@ static void apbdma_init(struct apbdma_softc *sc) { - if (sc->flags & F_AHBH_DMA) { + if (sc->flags & F_APBH_DMA) { DMA_WR(sc, HW_APBH_CTRL0_SET, HW_APBH_CTRL0_AHB_BURST8_EN); DMA_WR(sc, HW_APBH_CTRL0_SET, HW_APBH_CTRL0_APB_BURST4_EN); } @@ -279,7 +284,7 @@ apbdma_chan_set_chain(struct apbdma_soft { uint32_t reg; - if (sc->flags & F_AHBH_DMA) + if (sc->flags & F_APBH_DMA) reg = HW_APB_CHN_NXTCMDAR(HW_APBH_CH0_NXTCMDAR, channel); else reg = HW_APB_CHN_NXTCMDAR(HW_APBX_CH0_NXTCMDAR, channel); @@ -301,7 +306,7 @@ apbdma_run(struct apbdma_softc *sc, unsi uint32_t reg; uint8_t val; - if (sc->flags & F_AHBH_DMA) { + if (sc->flags & F_APBH_DMA) { reg = HW_APB_CHN_SEMA(HW_APBH_CH0_SEMA, channel); val = __SHIFTIN(1, HW_APBH_CH0_SEMA_INCREMENT_SEMA); } else { @@ -324,7 +329,11 @@ apbdma_ack_intr(struct apbdma_softc *sc, { mutex_enter(&sc->sc_lock); - DMA_WR(sc, HW_APB_CTRL1_CLR, (1<<channel)); + if (sc->flags & F_APBH_DMA) { + DMA_WR(sc, HW_APB_CTRL1_CLR, (1<<channel)); + } else { + DMA_WR(sc, HW_APB_CTRL1_CLR, (1<<channel)); + } mutex_exit(&sc->sc_lock); return; @@ -383,11 +392,34 @@ apbdma_chan_reset(struct apbdma_softc *s mutex_enter(&sc->sc_lock); - DMA_WR(sc, HW_APB_CTRL0_SET, - __SHIFTIN((1<<channel), HW_APBH_CTRL0_RESET_CHANNEL)); - while(DMA_RD(sc, HW_APB_CTRL0) & HW_APBH_CTRL0_RESET_CHANNEL); + if (sc->flags & F_APBH_DMA) { + DMA_WR(sc, HW_APB_CTRL0_SET, + __SHIFTIN((1<<channel), HW_APBH_CTRL0_RESET_CHANNEL)); + while(DMA_RD(sc, HW_APB_CTRL0) & HW_APBH_CTRL0_RESET_CHANNEL); + } else { + DMA_WR(sc, HW_APBX_CHANNEL_CTRL_SET, + __SHIFTIN((1<<channel), HW_APBH_CTRL0_RESET_CHANNEL)); + while(DMA_RD(sc, HW_APBX_CHANNEL_CTRL) & (1<<channel)); + } mutex_exit(&sc->sc_lock); return; } + +void +apbdma_wait(struct apbdma_softc *sc, unsigned int channel) +{ + + mutex_enter(&sc->sc_lock); + + if (sc->flags & F_APBH_DMA) { + while (DMA_RD(sc, HW_APB_CHN_SEMA(HW_APBH_CH0_SEMA, channel)) & HW_APBH_CH0_SEMA_PHORE) + ; + } else { + while (DMA_RD(sc, HW_APB_CHN_SEMA(HW_APBX_CH0_SEMA, channel)) & HW_APBX_CH0_SEMA_PHORE) + ; + } + + mutex_exit(&sc->sc_lock); +} Index: src/sys/arch/arm/imx/imx23_apbdmareg.h diff -u src/sys/arch/arm/imx/imx23_apbdmareg.h:1.2 src/sys/arch/arm/imx/imx23_apbdmareg.h:1.3 --- src/sys/arch/arm/imx/imx23_apbdmareg.h:1.2 Sun Mar 3 10:33:56 2013 +++ src/sys/arch/arm/imx/imx23_apbdmareg.h Sat Jan 10 12:13:00 2015 @@ -1,4 +1,4 @@ -/* $Id: imx23_apbdmareg.h,v 1.2 2013/03/03 10:33:56 jkunz Exp $ */ +/* $Id: imx23_apbdmareg.h,v 1.3 2015/01/10 12:13:00 jmcneill Exp $ */ /* * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -66,4 +66,6 @@ #define HW_APB_CTRL2_CLR 0x028 #define HW_APB_CTRL2_TOG 0x02C +#define HW_APBX_CHANNEL_CTRL 0x30 +#define HW_APBX_CHANNEL_CTRL_SET 0x34 #endif /* !_ARM_IMX_IMX23_APBDMAREG_H_ */ Index: src/sys/arch/arm/imx/imx23_apbdmavar.h diff -u src/sys/arch/arm/imx/imx23_apbdmavar.h:1.1 src/sys/arch/arm/imx/imx23_apbdmavar.h:1.2 --- src/sys/arch/arm/imx/imx23_apbdmavar.h:1.1 Sun Mar 3 10:33:56 2013 +++ src/sys/arch/arm/imx/imx23_apbdmavar.h Sat Jan 10 12:13:00 2015 @@ -1,4 +1,4 @@ -/* $Id: imx23_apbdmavar.h,v 1.1 2013/03/03 10:33:56 jkunz Exp $ */ +/* $Id: imx23_apbdmavar.h,v 1.2 2015/01/10 12:13:00 jmcneill Exp $ */ /* * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -58,8 +58,8 @@ #define APBDMA_CMD_DMA_SENSE 3 /* Flags. */ -#define F_AHBH_DMA __BIT(0) -#define F_AHBX_DMA __BIT(1) +#define F_APBH_DMA __BIT(0) +#define F_APBX_DMA __BIT(1) /* Number of channels. */ #define AHBH_DMA_CHANNELS 8 @@ -133,5 +133,6 @@ void apbdma_ack_intr(struct apbdma_softc void apbdma_ack_error_intr(struct apbdma_softc *, unsigned int); unsigned int apbdma_intr_status(struct apbdma_softc *, unsigned int); void apbdma_chan_reset(struct apbdma_softc *, unsigned int); +void apbdma_wait(struct apbdma_softc *, unsigned int); #endif /* !_ARM_IMX_IMX23_APBDMAVAR_H_ */