Hi Adrian,

* Adrian Hunter <adrian.hun...@nokia.com> [2010-11-30 15:23:47 +0200]:

> From 8c0f4490d93b67326ff24f6ce1c7e925b08d96b3 Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hun...@nokia.com>
> Date: Mon, 22 Nov 2010 11:32:48 +0200
> Subject: [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to 
> nostandby
> 
> In a couple of OMAP errata cases, sDMA M idle mode must be
> set temporarily to nostandby.  If two DMA users were to do
> that at the same time, a race condition would arise.
> Prevent that by using a spin lock and counting up/down the
> number of times nostandby is set/reset.
> 
> Signed-off-by: Adrian Hunter <adrian.hun...@nokia.com>
> ---
>  arch/arm/plat-omap/dma.c |   59 ++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 44 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
> index a863f55..6158c99 100644
> --- a/arch/arm/plat-omap/dma.c
> +++ b/arch/arm/plat-omap/dma.c
> @@ -139,6 +139,9 @@ static spinlock_t dma_chan_lock;
>  static struct omap_dma_lch *dma_chan;
>  static void __iomem *omap_dma_base;
>  
> +static u32 midlemode_saved;
> +static int midlemode_save_cnt;
> +
>  static const u8 omap1_dma_irq[OMAP1_LOGICAL_DMA_CH_COUNT] = {
>       INT_DMA_CH0_6, INT_DMA_CH1_7, INT_DMA_CH2_8, INT_DMA_CH3,
>       INT_DMA_CH4, INT_DMA_CH5, INT_1610_DMA_CH6, INT_1610_DMA_CH7,
> @@ -1016,6 +1019,41 @@ void omap_start_dma(int lch)
>  }
>  EXPORT_SYMBOL(omap_start_dma);
>  
> +static void midlemode_nostandby(void)
> +{
> +     unsigned long flags;
> +
> +     spin_lock_irqsave(&dma_chan_lock, flags);
> +     if (!midlemode_save_cnt) {
> +             u32 l;
> +
> +             midlemode_saved = dma_read(OCP_SYSCONFIG);
> +             l = midlemode_saved;
> +             l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;
> +             l |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE);
> +             dma_write(l, OCP_SYSCONFIG);
> +     }
> +     midlemode_save_cnt += 1;
> +     spin_unlock_irqrestore(&dma_chan_lock, flags);

The latest DMA hwmod patch series is already taken care of this
issue through the API's:
https://patchwork.kernel.org/patch/372231/

-Manjunath
[...]
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to