All of lore.kernel.org
 help / color / mirror / Atom feed
From: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
To: Oleg Matcovschi <oleg.matcovschi@ti.com>
Cc: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	tony@atomide.com, linux@arm.linux.org.uk,
	jarkko.nikula@bitmer.com
Subject: Re: [PATCH v2] omap: dma: Clear status registers on enable/disable irq.
Date: Mon, 04 Jun 2012 23:53:06 +0200	[thread overview]
Message-ID: <2491206.Xgf8oVG38F@acer> (raw)
In-Reply-To: <1337117708-27215-1-git-send-email-oleg.matcovschi@ti.com>

On Tue, 15 May 2012 14:35:08 Oleg Matcovschi wrote:
> Use omap_disable_channel_irq() function instead of directly accessing CICR.
> The omap_disable_chanel_irq() function clears pending interrupts
> and disables interrupt on channel.
> Functions omap2_enable_irq_lch()/omap2_disable_irq_lch() clear interrupt
> status register.
> 
> 
> Signed-off-by: Oleg Matcovschi <oleg.matcovschi@ti.com>
> ---
> v1 initial revision
> v2 Review by Tony Lindgren

My Tested-by: on OMAP1 still valid for v2 if you care.

Thanks,
Janusz

> ---
>  arch/arm/plat-omap/dma.c |   59 +++++++++++++++++++++------------------------
>  1 files changed, 28 insertions(+), 31 deletions(-)
> 
> diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
> index 3ec7ec5..3d5d593 100644
> --- a/arch/arm/plat-omap/dma.c
> +++ b/arch/arm/plat-omap/dma.c
> @@ -563,22 +563,25 @@ EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);
>  
>  static inline void omap_enable_channel_irq(int lch)
>  {
> -	u32 status;
> -
>  	/* Clear CSR */
>  	if (cpu_class_is_omap1())
> -		status = p->dma_read(CSR, lch);
> -	else if (cpu_class_is_omap2())
> +		p->dma_read(CSR, lch);
> +	else
>  		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);
>  
>  	/* Enable some nice interrupts. */
>  	p->dma_write(dma_chan[lch].enabled_irqs, CICR, lch);
>  }
>  
> -static void omap_disable_channel_irq(int lch)
> +static inline void omap_disable_channel_irq(int lch)
>  {
> -	if (cpu_class_is_omap2())
> -		p->dma_write(0, CICR, lch);
> +	/* disable channel interrupts */
> +	p->dma_write(0, CICR, lch);
> +	/* Clear CSR */
> +	if (cpu_class_is_omap1())
> +		p->dma_read(CSR, lch);
> +	else
> +		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);
>  }
>  
>  void omap_enable_dma_irq(int lch, u16 bits)
> @@ -622,14 +625,14 @@ static inline void disable_lnk(int lch)
>  	l = p->dma_read(CLNK_CTRL, lch);
>  
>  	/* Disable interrupts */
> +	omap_disable_channel_irq(lch);
> +
>  	if (cpu_class_is_omap1()) {
> -		p->dma_write(0, CICR, lch);
>  		/* Set the STOP_LNK bit */
>  		l |= 1 << 14;
>  	}
>  
>  	if (cpu_class_is_omap2()) {
> -		omap_disable_channel_irq(lch);
>  		/* Clear the ENABLE_LNK bit */
>  		l &= ~(1 << 15);
>  	}
> @@ -647,6 +650,9 @@ static inline void omap2_enable_irq_lch(int lch)
>  		return;
>  
>  	spin_lock_irqsave(&dma_chan_lock, flags);
> +	/* clear IRQ STATUS */
> +	p->dma_write(1 << lch, IRQSTATUS_L0, lch);
> +	/* Enable interrupt */
>  	val = p->dma_read(IRQENABLE_L0, lch);
>  	val |= 1 << lch;
>  	p->dma_write(val, IRQENABLE_L0, lch);
> @@ -662,9 +668,12 @@ static inline void omap2_disable_irq_lch(int lch)
>  		return;
>  
>  	spin_lock_irqsave(&dma_chan_lock, flags);
> +	/* Disable interrupt */
>  	val = p->dma_read(IRQENABLE_L0, lch);
>  	val &= ~(1 << lch);
>  	p->dma_write(val, IRQENABLE_L0, lch);
> +	/* clear IRQ STATUS */
> +	p->dma_write(1 << lch, IRQSTATUS_L0, lch);
>  	spin_unlock_irqrestore(&dma_chan_lock, flags);
>  }
>  
> @@ -735,11 +744,8 @@ int omap_request_dma(int dev_id, const char *dev_name,
>  	}
>  
>  	if (cpu_class_is_omap2()) {
> -		omap2_enable_irq_lch(free_ch);
>  		omap_enable_channel_irq(free_ch);
> -		/* Clear the CSR register and IRQ status register */
> -		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, free_ch);
> -		p->dma_write(1 << free_ch, IRQSTATUS_L0, 0);
> +		omap2_enable_irq_lch(free_ch);
>  	}
>  
>  	*dma_ch_out = free_ch;
> @@ -758,27 +764,19 @@ void omap_free_dma(int lch)
>  		return;
>  	}
>  
> -	if (cpu_class_is_omap1()) {
> -		/* Disable all DMA interrupts for the channel. */
> -		p->dma_write(0, CICR, lch);
> -		/* Make sure the DMA transfer is stopped. */
> -		p->dma_write(0, CCR, lch);
> -	}
> -
> -	if (cpu_class_is_omap2()) {
> +	/* Disable interrupt for logical channel */
> +	if (cpu_class_is_omap2())
>  		omap2_disable_irq_lch(lch);
>  
> -		/* Clear the CSR register and IRQ status register */
> -		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);
> -		p->dma_write(1 << lch, IRQSTATUS_L0, lch);
> +	/* Disable all DMA interrupts for the channel. */
> +	omap_disable_channel_irq(lch);
>  
> -		/* Disable all DMA interrupts for the channel. */
> -		p->dma_write(0, CICR, lch);
> +	/* Make sure the DMA transfer is stopped. */
> +	p->dma_write(0, CCR, lch);
>  
> -		/* Make sure the DMA transfer is stopped. */
> -		p->dma_write(0, CCR, lch);
> +	/* Clear registers */
> +	if (cpu_class_is_omap2())
>  		omap_clear_dma(lch);
> -	}
>  
>  	spin_lock_irqsave(&dma_chan_lock, flags);
>  	dma_chan[lch].dev_id = -1;
> @@ -926,8 +924,7 @@ void omap_stop_dma(int lch)
>  	u32 l;
>  
>  	/* Disable all interrupts on the channel */
> -	if (cpu_class_is_omap1())
> -		p->dma_write(0, CICR, lch);
> +	omap_disable_channel_irq(lch);
>  
>  	l = p->dma_read(CCR, lch);
>  	if (IS_DMA_ERRATA(DMA_ERRATA_i541) &&
> 

WARNING: multiple messages have this Message-ID (diff)
From: jkrzyszt@tis.icnet.pl (Janusz Krzysztofik)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] omap: dma: Clear status registers on enable/disable irq.
Date: Mon, 04 Jun 2012 23:53:06 +0200	[thread overview]
Message-ID: <2491206.Xgf8oVG38F@acer> (raw)
In-Reply-To: <1337117708-27215-1-git-send-email-oleg.matcovschi@ti.com>

On Tue, 15 May 2012 14:35:08 Oleg Matcovschi wrote:
> Use omap_disable_channel_irq() function instead of directly accessing CICR.
> The omap_disable_chanel_irq() function clears pending interrupts
> and disables interrupt on channel.
> Functions omap2_enable_irq_lch()/omap2_disable_irq_lch() clear interrupt
> status register.
> 
> 
> Signed-off-by: Oleg Matcovschi <oleg.matcovschi@ti.com>
> ---
> v1 initial revision
> v2 Review by Tony Lindgren

My Tested-by: on OMAP1 still valid for v2 if you care.

Thanks,
Janusz

> ---
>  arch/arm/plat-omap/dma.c |   59 +++++++++++++++++++++------------------------
>  1 files changed, 28 insertions(+), 31 deletions(-)
> 
> diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
> index 3ec7ec5..3d5d593 100644
> --- a/arch/arm/plat-omap/dma.c
> +++ b/arch/arm/plat-omap/dma.c
> @@ -563,22 +563,25 @@ EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);
>  
>  static inline void omap_enable_channel_irq(int lch)
>  {
> -	u32 status;
> -
>  	/* Clear CSR */
>  	if (cpu_class_is_omap1())
> -		status = p->dma_read(CSR, lch);
> -	else if (cpu_class_is_omap2())
> +		p->dma_read(CSR, lch);
> +	else
>  		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);
>  
>  	/* Enable some nice interrupts. */
>  	p->dma_write(dma_chan[lch].enabled_irqs, CICR, lch);
>  }
>  
> -static void omap_disable_channel_irq(int lch)
> +static inline void omap_disable_channel_irq(int lch)
>  {
> -	if (cpu_class_is_omap2())
> -		p->dma_write(0, CICR, lch);
> +	/* disable channel interrupts */
> +	p->dma_write(0, CICR, lch);
> +	/* Clear CSR */
> +	if (cpu_class_is_omap1())
> +		p->dma_read(CSR, lch);
> +	else
> +		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);
>  }
>  
>  void omap_enable_dma_irq(int lch, u16 bits)
> @@ -622,14 +625,14 @@ static inline void disable_lnk(int lch)
>  	l = p->dma_read(CLNK_CTRL, lch);
>  
>  	/* Disable interrupts */
> +	omap_disable_channel_irq(lch);
> +
>  	if (cpu_class_is_omap1()) {
> -		p->dma_write(0, CICR, lch);
>  		/* Set the STOP_LNK bit */
>  		l |= 1 << 14;
>  	}
>  
>  	if (cpu_class_is_omap2()) {
> -		omap_disable_channel_irq(lch);
>  		/* Clear the ENABLE_LNK bit */
>  		l &= ~(1 << 15);
>  	}
> @@ -647,6 +650,9 @@ static inline void omap2_enable_irq_lch(int lch)
>  		return;
>  
>  	spin_lock_irqsave(&dma_chan_lock, flags);
> +	/* clear IRQ STATUS */
> +	p->dma_write(1 << lch, IRQSTATUS_L0, lch);
> +	/* Enable interrupt */
>  	val = p->dma_read(IRQENABLE_L0, lch);
>  	val |= 1 << lch;
>  	p->dma_write(val, IRQENABLE_L0, lch);
> @@ -662,9 +668,12 @@ static inline void omap2_disable_irq_lch(int lch)
>  		return;
>  
>  	spin_lock_irqsave(&dma_chan_lock, flags);
> +	/* Disable interrupt */
>  	val = p->dma_read(IRQENABLE_L0, lch);
>  	val &= ~(1 << lch);
>  	p->dma_write(val, IRQENABLE_L0, lch);
> +	/* clear IRQ STATUS */
> +	p->dma_write(1 << lch, IRQSTATUS_L0, lch);
>  	spin_unlock_irqrestore(&dma_chan_lock, flags);
>  }
>  
> @@ -735,11 +744,8 @@ int omap_request_dma(int dev_id, const char *dev_name,
>  	}
>  
>  	if (cpu_class_is_omap2()) {
> -		omap2_enable_irq_lch(free_ch);
>  		omap_enable_channel_irq(free_ch);
> -		/* Clear the CSR register and IRQ status register */
> -		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, free_ch);
> -		p->dma_write(1 << free_ch, IRQSTATUS_L0, 0);
> +		omap2_enable_irq_lch(free_ch);
>  	}
>  
>  	*dma_ch_out = free_ch;
> @@ -758,27 +764,19 @@ void omap_free_dma(int lch)
>  		return;
>  	}
>  
> -	if (cpu_class_is_omap1()) {
> -		/* Disable all DMA interrupts for the channel. */
> -		p->dma_write(0, CICR, lch);
> -		/* Make sure the DMA transfer is stopped. */
> -		p->dma_write(0, CCR, lch);
> -	}
> -
> -	if (cpu_class_is_omap2()) {
> +	/* Disable interrupt for logical channel */
> +	if (cpu_class_is_omap2())
>  		omap2_disable_irq_lch(lch);
>  
> -		/* Clear the CSR register and IRQ status register */
> -		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);
> -		p->dma_write(1 << lch, IRQSTATUS_L0, lch);
> +	/* Disable all DMA interrupts for the channel. */
> +	omap_disable_channel_irq(lch);
>  
> -		/* Disable all DMA interrupts for the channel. */
> -		p->dma_write(0, CICR, lch);
> +	/* Make sure the DMA transfer is stopped. */
> +	p->dma_write(0, CCR, lch);
>  
> -		/* Make sure the DMA transfer is stopped. */
> -		p->dma_write(0, CCR, lch);
> +	/* Clear registers */
> +	if (cpu_class_is_omap2())
>  		omap_clear_dma(lch);
> -	}
>  
>  	spin_lock_irqsave(&dma_chan_lock, flags);
>  	dma_chan[lch].dev_id = -1;
> @@ -926,8 +924,7 @@ void omap_stop_dma(int lch)
>  	u32 l;
>  
>  	/* Disable all interrupts on the channel */
> -	if (cpu_class_is_omap1())
> -		p->dma_write(0, CICR, lch);
> +	omap_disable_channel_irq(lch);
>  
>  	l = p->dma_read(CCR, lch);
>  	if (IS_DMA_ERRATA(DMA_ERRATA_i541) &&
> 

  parent reply	other threads:[~2012-06-04 21:57 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-15 21:35 [PATCH v2] omap: dma: Clear status registers on enable/disable irq Oleg Matcovschi
2012-05-15 21:35 ` Oleg Matcovschi
2012-06-01  7:36 ` Jarkko Nikula
2012-06-01  7:36   ` Jarkko Nikula
2012-06-04  6:13 ` Tony Lindgren
2012-06-04  6:13   ` Tony Lindgren
2012-06-05 18:28   ` Matcovschi, Oleg
2012-06-05 18:28     ` Matcovschi, Oleg
2012-06-04 21:53 ` Janusz Krzysztofik [this message]
2012-06-04 21:53   ` Janusz Krzysztofik
2012-06-05  6:39   ` Tony Lindgren
2012-06-05  6:39     ` Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2491206.Xgf8oVG38F@acer \
    --to=jkrzyszt@tis.icnet.pl \
    --cc=jarkko.nikula@bitmer.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=oleg.matcovschi@ti.com \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.