* [PATCH 0/2] Minor DMA fixes
@ 2010-11-30 13:23 Adrian Hunter
2010-11-30 13:23 ` [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby Adrian Hunter
2010-11-30 13:23 ` [PATCH 2/2] OMAP: DMA: clear interrupt status correctly Adrian Hunter
0 siblings, 2 replies; 15+ messages in thread
From: Adrian Hunter @ 2010-11-30 13:23 UTC (permalink / raw)
To: Tony Lindgren
Cc: Santosh Shilimkar, Manjunatha GK, Adrian Hunter,
linux-omap Mailing List
Hi
Adrian Hunter (2):
OMAP: DMA: prevent races while setting M idle mode to nostandby
OMAP: DMA: clear interrupt status correctly
arch/arm/plat-omap/dma.c | 66 ++++++++++++++++++++++++++++++++-------------
1 files changed, 47 insertions(+), 19 deletions(-)
Regards
Adrian
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby
2010-11-30 13:23 [PATCH 0/2] Minor DMA fixes Adrian Hunter
@ 2010-11-30 13:23 ` Adrian Hunter
2010-11-30 14:24 ` Santosh Shilimkar
` (2 more replies)
2010-11-30 13:23 ` [PATCH 2/2] OMAP: DMA: clear interrupt status correctly Adrian Hunter
1 sibling, 3 replies; 15+ messages in thread
From: Adrian Hunter @ 2010-11-30 13:23 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Manjunatha GK, Santosh Shilimkar,
linux-omap Mailing List
>From 8c0f4490d93b67326ff24f6ce1c7e925b08d96b3 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@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.hunter@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);
+}
+
+static void midlemode_restore(void)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&dma_chan_lock, flags);
+ midlemode_save_cnt -= 1;
+ if (!midlemode_save_cnt) {
+ u32 l;
+
+ l = dma_read(OCP_SYSCONFIG);
+ l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;
+ l |= midlemode_saved & DMA_SYSCONFIG_MIDLEMODE_MASK;
+ dma_write(l, OCP_SYSCONFIG);
+ }
+ spin_unlock_irqrestore(&dma_chan_lock, flags);
+}
+
void omap_stop_dma(int lch)
{
u32 l;
@@ -1028,16 +1066,10 @@ void omap_stop_dma(int lch)
/* OMAP3 Errata i541: sDMA FIFO draining does not finish */
if (cpu_is_omap34xx() && (l & OMAP_DMA_CCR_SEL_SRC_DST_SYNC)) {
int i = 0;
- u32 sys_cf;
/* Configure No-Standby */
- l = dma_read(OCP_SYSCONFIG);
- sys_cf = l;
- l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;
- l |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE);
- dma_write(l , OCP_SYSCONFIG);
+ midlemode_nostandby();
- l = dma_read(CCR(lch));
l &= ~OMAP_DMA_CCR_EN;
dma_write(l, CCR(lch));
@@ -1053,7 +1085,7 @@ void omap_stop_dma(int lch)
printk(KERN_ERR "DMA drain did not complete on "
"lch %d\n", lch);
/* Restore OCP_SYSCONFIG */
- dma_write(sys_cf, OCP_SYSCONFIG);
+ midlemode_restore();
} else {
l &= ~OMAP_DMA_CCR_EN;
dma_write(l, CCR(lch));
@@ -1711,7 +1743,6 @@ int omap_stop_dma_chain_transfers(int chain_id)
{
int *channels;
u32 l, i;
- u32 sys_cf;
/* Check for input params */
if (unlikely((chain_id < 0 || chain_id >= dma_lch_count))) {
@@ -1730,11 +1761,9 @@ int omap_stop_dma_chain_transfers(int chain_id)
* DMA Errata:
* Special programming model needed to disable DMA before end of block
*/
- sys_cf = dma_read(OCP_SYSCONFIG);
- l = sys_cf;
- /* Middle mode reg set no Standby */
- l &= ~((1 << 12)|(1 << 13));
- dma_write(l, OCP_SYSCONFIG);
+
+ /* M idle mode reg set no Standby */
+ midlemode_nostandby();
for (i = 0; i < dma_linked_lch[chain_id].no_of_lchs_linked; i++) {
@@ -1754,7 +1783,7 @@ int omap_stop_dma_chain_transfers(int chain_id)
OMAP_DMA_CHAIN_QINIT(chain_id);
/* Errata - put in the old value */
- dma_write(sys_cf, OCP_SYSCONFIG);
+ midlemode_restore();
return 0;
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
2010-11-30 13:23 [PATCH 0/2] Minor DMA fixes Adrian Hunter
2010-11-30 13:23 ` [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby Adrian Hunter
@ 2010-11-30 13:23 ` Adrian Hunter
2010-11-30 14:25 ` Santosh Shilimkar
1 sibling, 1 reply; 15+ messages in thread
From: Adrian Hunter @ 2010-11-30 13:23 UTC (permalink / raw)
To: Tony Lindgren
Cc: Santosh Shilimkar, Manjunatha GK, Adrian Hunter,
linux-omap Mailing List
>From 85934ded48552fde84b083575ac2006f1542324b Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Wed, 24 Nov 2010 13:23:21 +0200
Subject: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
When clearing the DMA channel, clear all status bits.
When handling a DMA interrupt, clear only the interrupt
status bits that have been read and are passed to the
channel's interrupt handler, not every status bit.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/plat-omap/dma.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index 6158c99..3300e67 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -49,7 +49,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
#endif
#define OMAP_DMA_ACTIVE 0x01
-#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
+#define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
@@ -2010,7 +2010,7 @@ static int omap2_dma_handle_ch(int ch)
printk(KERN_INFO "DMA misaligned error with device %d\n",
dma_chan[ch].dev_id);
- dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(ch));
+ dma_write(status, CSR(ch));
dma_write(1 << ch, IRQSTATUS_L0);
/* read back the register to flush the write */
dma_read(IRQSTATUS_L0);
@@ -2030,10 +2030,9 @@ static int omap2_dma_handle_ch(int ch)
OMAP_DMA_CHAIN_INCQHEAD(chain_id);
status = dma_read(CSR(ch));
+ dma_write(status, CSR(ch));
}
- dma_write(status, CSR(ch));
-
if (likely(dma_chan[ch].callback != NULL))
dma_chan[ch].callback(ch, status, dma_chan[ch].data);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* RE: [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby
2010-11-30 13:23 ` [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby Adrian Hunter
@ 2010-11-30 14:24 ` Santosh Shilimkar
2010-12-01 12:21 ` Peter Ujfalusi
2010-12-01 19:11 ` G, Manjunath Kondaiah
2 siblings, 0 replies; 15+ messages in thread
From: Santosh Shilimkar @ 2010-11-30 14:24 UTC (permalink / raw)
To: Adrian Hunter, Tony Lindgren
Cc: Manjunath Kondaiah G, linux-omap Mailing List
> -----Original Message-----
> From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
> Sent: Tuesday, November 30, 2010 6:54 PM
> To: Tony Lindgren
> Cc: Adrian Hunter; Manjunatha GK; Santosh Shilimkar; linux-omap Mailing
> List
> Subject: [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode
to
> nostandby
>
> From 8c0f4490d93b67326ff24f6ce1c7e925b08d96b3 Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@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.hunter@nokia.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.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);
> +}
> +
> +static void midlemode_restore(void)
> +{
> + unsigned long flags;
> +
> + spin_lock_irqsave(&dma_chan_lock, flags);
> + midlemode_save_cnt -= 1;
> + if (!midlemode_save_cnt) {
> + u32 l;
> +
> + l = dma_read(OCP_SYSCONFIG);
> + l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;
> + l |= midlemode_saved & DMA_SYSCONFIG_MIDLEMODE_MASK;
> + dma_write(l, OCP_SYSCONFIG);
> + }
> + spin_unlock_irqrestore(&dma_chan_lock, flags);
> +}
> +
> void omap_stop_dma(int lch)
> {
> u32 l;
> @@ -1028,16 +1066,10 @@ void omap_stop_dma(int lch)
> /* OMAP3 Errata i541: sDMA FIFO draining does not finish */
> if (cpu_is_omap34xx() && (l & OMAP_DMA_CCR_SEL_SRC_DST_SYNC)) {
> int i = 0;
> - u32 sys_cf;
>
> /* Configure No-Standby */
> - l = dma_read(OCP_SYSCONFIG);
> - sys_cf = l;
> - l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;
> - l |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE);
> - dma_write(l , OCP_SYSCONFIG);
> + midlemode_nostandby();
>
> - l = dma_read(CCR(lch));
> l &= ~OMAP_DMA_CCR_EN;
> dma_write(l, CCR(lch));
>
> @@ -1053,7 +1085,7 @@ void omap_stop_dma(int lch)
> printk(KERN_ERR "DMA drain did not complete on "
> "lch %d\n", lch);
> /* Restore OCP_SYSCONFIG */
> - dma_write(sys_cf, OCP_SYSCONFIG);
> + midlemode_restore();
> } else {
> l &= ~OMAP_DMA_CCR_EN;
> dma_write(l, CCR(lch));
> @@ -1711,7 +1743,6 @@ int omap_stop_dma_chain_transfers(int chain_id)
> {
> int *channels;
> u32 l, i;
> - u32 sys_cf;
>
> /* Check for input params */
> if (unlikely((chain_id < 0 || chain_id >= dma_lch_count))) {
> @@ -1730,11 +1761,9 @@ int omap_stop_dma_chain_transfers(int chain_id)
> * DMA Errata:
> * Special programming model needed to disable DMA before end of
> block
> */
> - sys_cf = dma_read(OCP_SYSCONFIG);
> - l = sys_cf;
> - /* Middle mode reg set no Standby */
> - l &= ~((1 << 12)|(1 << 13));
> - dma_write(l, OCP_SYSCONFIG);
> +
> + /* M idle mode reg set no Standby */
> + midlemode_nostandby();
>
> for (i = 0; i < dma_linked_lch[chain_id].no_of_lchs_linked; i++) {
>
> @@ -1754,7 +1783,7 @@ int omap_stop_dma_chain_transfers(int chain_id)
> OMAP_DMA_CHAIN_QINIT(chain_id);
>
> /* Errata - put in the old value */
> - dma_write(sys_cf, OCP_SYSCONFIG);
> + midlemode_restore();
>
> return 0;
> }
> --
> 1.7.0.4
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
2010-11-30 13:23 ` [PATCH 2/2] OMAP: DMA: clear interrupt status correctly Adrian Hunter
@ 2010-11-30 14:25 ` Santosh Shilimkar
2010-12-21 20:29 ` Tony Lindgren
0 siblings, 1 reply; 15+ messages in thread
From: Santosh Shilimkar @ 2010-11-30 14:25 UTC (permalink / raw)
To: Adrian Hunter, Tony Lindgren
Cc: Manjunath Kondaiah G, linux-omap Mailing List
> -----Original Message-----
> From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
> Sent: Tuesday, November 30, 2010 6:54 PM
> To: Tony Lindgren
> Cc: Santosh Shilimkar; Manjunatha GK; Adrian Hunter; linux-omap Mailing
> List
> Subject: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
>
> From 85934ded48552fde84b083575ac2006f1542324b Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@nokia.com>
> Date: Wed, 24 Nov 2010 13:23:21 +0200
> Subject: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
>
> When clearing the DMA channel, clear all status bits.
>
> When handling a DMA interrupt, clear only the interrupt
> status bits that have been read and are passed to the
> channel's interrupt handler, not every status bit.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
> arch/arm/plat-omap/dma.c | 7 +++----
> 1 files changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
> index 6158c99..3300e67 100644
> --- a/arch/arm/plat-omap/dma.c
> +++ b/arch/arm/plat-omap/dma.c
> @@ -49,7 +49,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
> #endif
>
> #define OMAP_DMA_ACTIVE 0x01
> -#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
> +#define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
>
> #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
>
> @@ -2010,7 +2010,7 @@ static int omap2_dma_handle_ch(int ch)
> printk(KERN_INFO "DMA misaligned error with device %d\n",
> dma_chan[ch].dev_id);
>
> - dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(ch));
> + dma_write(status, CSR(ch));
> dma_write(1 << ch, IRQSTATUS_L0);
> /* read back the register to flush the write */
> dma_read(IRQSTATUS_L0);
> @@ -2030,10 +2030,9 @@ static int omap2_dma_handle_ch(int ch)
> OMAP_DMA_CHAIN_INCQHEAD(chain_id);
>
> status = dma_read(CSR(ch));
> + dma_write(status, CSR(ch));
> }
>
> - dma_write(status, CSR(ch));
> -
> if (likely(dma_chan[ch].callback != NULL))
> dma_chan[ch].callback(ch, status, dma_chan[ch].data);
>
> --
> 1.7.0.4
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby
2010-11-30 13:23 ` [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby Adrian Hunter
2010-11-30 14:24 ` Santosh Shilimkar
@ 2010-12-01 12:21 ` Peter Ujfalusi
2010-12-01 19:11 ` G, Manjunath Kondaiah
2 siblings, 0 replies; 15+ messages in thread
From: Peter Ujfalusi @ 2010-12-01 12:21 UTC (permalink / raw)
To: Hunter Adrian (Nokia-MS/Helsinki)
Cc: Tony Lindgren, Manjunatha GK, Santosh Shilimkar,
linux-omap Mailing List
On Tuesday 30 November 2010 15:23:47 Hunter Adrian (Nokia-MS/Helsinki) wrote:
> From 8c0f4490d93b67326ff24f6ce1c7e925b08d96b3 Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@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.hunter@nokia.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby
2010-11-30 13:23 ` [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby Adrian Hunter
2010-11-30 14:24 ` Santosh Shilimkar
2010-12-01 12:21 ` Peter Ujfalusi
@ 2010-12-01 19:11 ` G, Manjunath Kondaiah
2 siblings, 0 replies; 15+ messages in thread
From: G, Manjunath Kondaiah @ 2010-12-01 19:11 UTC (permalink / raw)
To: Adrian Hunter; +Cc: Tony Lindgren, Santosh Shilimkar, linux-omap Mailing List
Hi Adrian,
* Adrian Hunter <adrian.hunter@nokia.com> [2010-11-30 15:23:47 +0200]:
> From 8c0f4490d93b67326ff24f6ce1c7e925b08d96b3 Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@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.hunter@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
[...]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
2010-11-30 14:25 ` Santosh Shilimkar
@ 2010-12-21 20:29 ` Tony Lindgren
2011-01-05 9:58 ` Adrian Hunter
0 siblings, 1 reply; 15+ messages in thread
From: Tony Lindgren @ 2010-12-21 20:29 UTC (permalink / raw)
To: Santosh Shilimkar
Cc: Adrian Hunter, Manjunath Kondaiah G, linux-omap Mailing List
* Santosh Shilimkar <santosh.shilimkar@ti.com> [101130 06:15]:
> > -----Original Message-----
> > From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
> > Sent: Tuesday, November 30, 2010 6:54 PM
> > To: Tony Lindgren
> > Cc: Santosh Shilimkar; Manjunatha GK; Adrian Hunter; linux-omap Mailing
> > List
> > Subject: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
> >
> > From 85934ded48552fde84b083575ac2006f1542324b Mon Sep 17 00:00:00 2001
> > From: Adrian Hunter <adrian.hunter@nokia.com>
> > Date: Wed, 24 Nov 2010 13:23:21 +0200
> > Subject: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
> >
> > When clearing the DMA channel, clear all status bits.
> >
> > When handling a DMA interrupt, clear only the interrupt
> > status bits that have been read and are passed to the
> > channel's interrupt handler, not every status bit.
> >
> > Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Adrian, care to refresh this one against the devel-dma
branch that has the hwmod changes?
Looks like at least the CSR_CLEAR_MASK is still wrong
in the current code.
Regards,
Tony
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
2010-12-21 20:29 ` Tony Lindgren
@ 2011-01-05 9:58 ` Adrian Hunter
2011-01-05 17:27 ` Kevin Hilman
0 siblings, 1 reply; 15+ messages in thread
From: Adrian Hunter @ 2011-01-05 9:58 UTC (permalink / raw)
To: Tony Lindgren
Cc: Santosh Shilimkar, Manjunath Kondaiah G, linux-omap Mailing List
From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Wed, 24 Nov 2010 13:23:21 +0200
Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
When clearing the DMA channel, clear all status bits.
When handling a DMA interrupt, clear only the interrupt
status bits that have been read and are passed to the
channel's interrupt handler, not every status bit.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
arch/arm/plat-omap/dma.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index c4b2b47..8536308 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -53,7 +53,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
#endif
#define OMAP_DMA_ACTIVE 0x01
-#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
+#define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
@@ -1873,7 +1873,7 @@ static int omap2_dma_handle_ch(int ch)
printk(KERN_INFO "DMA misaligned error with device %d\n",
dma_chan[ch].dev_id);
- p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, ch);
+ p->dma_write(status, CSR, ch);
p->dma_write(1 << ch, IRQSTATUS_L0, ch);
/* read back the register to flush the write */
p->dma_read(IRQSTATUS_L0, ch);
@@ -1893,10 +1893,9 @@ static int omap2_dma_handle_ch(int ch)
OMAP_DMA_CHAIN_INCQHEAD(chain_id);
status = p->dma_read(CSR, ch);
+ p->dma_write(status, CSR, ch);
}
- p->dma_write(status, CSR, ch);
-
if (likely(dma_chan[ch].callback != NULL))
dma_chan[ch].callback(ch, status, dma_chan[ch].data);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] OMAP: DMA: clear interrupt status correctly
2011-01-05 9:58 ` Adrian Hunter
@ 2011-01-05 17:27 ` Kevin Hilman
2011-01-19 10:24 ` [PATCH] " Adrian Hunter
0 siblings, 1 reply; 15+ messages in thread
From: Kevin Hilman @ 2011-01-05 17:27 UTC (permalink / raw)
To: Adrian Hunter
Cc: Tony Lindgren, Santosh Shilimkar, Manjunath Kondaiah G,
linux-omap Mailing List
Adrian Hunter <adrian.hunter@nokia.com> writes:
> From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@nokia.com>
> Date: Wed, 24 Nov 2010 13:23:21 +0200
> Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
>
> When clearing the DMA channel, clear all status bits.
>
> When handling a DMA interrupt, clear only the interrupt
> status bits that have been read and are passed to the
> channel's interrupt handler, not every status bit.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Looks like a fix that should go into 2.6.38-rc2. Can you repost and Cc
linux-arm-kernel as well?
Thanks,
Kevin
> ---
> arch/arm/plat-omap/dma.c | 7 +++----
> 1 files changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
> index c4b2b47..8536308 100644
> --- a/arch/arm/plat-omap/dma.c
> +++ b/arch/arm/plat-omap/dma.c
> @@ -53,7 +53,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
> #endif
> #define OMAP_DMA_ACTIVE 0x01
> -#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
> +#define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
> #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
> @@ -1873,7 +1873,7 @@ static int omap2_dma_handle_ch(int ch)
> printk(KERN_INFO "DMA misaligned error with device %d\n",
> dma_chan[ch].dev_id);
> - p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, ch);
> + p->dma_write(status, CSR, ch);
> p->dma_write(1 << ch, IRQSTATUS_L0, ch);
> /* read back the register to flush the write */
> p->dma_read(IRQSTATUS_L0, ch);
> @@ -1893,10 +1893,9 @@ static int omap2_dma_handle_ch(int ch)
> OMAP_DMA_CHAIN_INCQHEAD(chain_id);
> status = p->dma_read(CSR, ch);
> + p->dma_write(status, CSR, ch);
> }
> - p->dma_write(status, CSR, ch);
> -
> if (likely(dma_chan[ch].callback != NULL))
> dma_chan[ch].callback(ch, status, dma_chan[ch].data);
> --
> 1.7.0.4
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH] OMAP: DMA: clear interrupt status correctly
2011-01-05 17:27 ` Kevin Hilman
@ 2011-01-19 10:24 ` Adrian Hunter
2011-01-19 22:23 ` Tony Lindgren
0 siblings, 1 reply; 15+ messages in thread
From: Adrian Hunter @ 2011-01-19 10:24 UTC (permalink / raw)
To: Kevin Hilman
Cc: Tony Lindgren, Santosh Shilimkar, Manjunath Kondaiah G,
linux-omap Mailing List, linux-arm-kernel@lists.infradead.org
From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Wed, 24 Nov 2010 13:23:21 +0200
Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
When clearing the DMA channel, clear all status bits.
When handling a DMA interrupt, clear only the interrupt
status bits that have been read and are passed to the
channel's interrupt handler, not every status bit.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/plat-omap/dma.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index c4b2b47..8536308 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -53,7 +53,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
#endif
#define OMAP_DMA_ACTIVE 0x01
-#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
+#define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
@@ -1873,7 +1873,7 @@ static int omap2_dma_handle_ch(int ch)
printk(KERN_INFO "DMA misaligned error with device %d\n",
dma_chan[ch].dev_id);
- p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, ch);
+ p->dma_write(status, CSR, ch);
p->dma_write(1 << ch, IRQSTATUS_L0, ch);
/* read back the register to flush the write */
p->dma_read(IRQSTATUS_L0, ch);
@@ -1893,10 +1893,9 @@ static int omap2_dma_handle_ch(int ch)
OMAP_DMA_CHAIN_INCQHEAD(chain_id);
status = p->dma_read(CSR, ch);
+ p->dma_write(status, CSR, ch);
}
- p->dma_write(status, CSR, ch);
-
if (likely(dma_chan[ch].callback != NULL))
dma_chan[ch].callback(ch, status, dma_chan[ch].data);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] OMAP: DMA: clear interrupt status correctly
2011-01-19 10:24 ` [PATCH] " Adrian Hunter
@ 2011-01-19 22:23 ` Tony Lindgren
2011-01-19 22:44 ` Tony Lindgren
0 siblings, 1 reply; 15+ messages in thread
From: Tony Lindgren @ 2011-01-19 22:23 UTC (permalink / raw)
To: Adrian Hunter
Cc: Kevin Hilman, Santosh Shilimkar, Manjunath Kondaiah G,
linux-omap Mailing List, linux-arm-kernel@lists.infradead.org
* Adrian Hunter <adrian.hunter@nokia.com> [110119 02:23]:
>
> From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@nokia.com>
> Date: Wed, 24 Nov 2010 13:23:21 +0200
> Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
>
> When clearing the DMA channel, clear all status bits.
>
> When handling a DMA interrupt, clear only the interrupt
> status bits that have been read and are passed to the
> channel's interrupt handler, not every status bit.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Thanks, will queue as a fix.
Tony
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] OMAP: DMA: clear interrupt status correctly
2011-01-19 22:23 ` Tony Lindgren
@ 2011-01-19 22:44 ` Tony Lindgren
2011-01-20 3:44 ` G, Manjunath Kondaiah
2011-01-20 11:10 ` Adrian Hunter
0 siblings, 2 replies; 15+ messages in thread
From: Tony Lindgren @ 2011-01-19 22:44 UTC (permalink / raw)
To: Adrian Hunter
Cc: Kevin Hilman, Santosh Shilimkar, Manjunath Kondaiah G,
linux-omap Mailing List, linux-arm-kernel@lists.infradead.org
* Tony Lindgren <tony@atomide.com> [110119 14:23]:
> * Adrian Hunter <adrian.hunter@nokia.com> [110119 02:23]:
> >
> > From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
> > From: Adrian Hunter <adrian.hunter@nokia.com>
> > Date: Wed, 24 Nov 2010 13:23:21 +0200
> > Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
> >
> > When clearing the DMA channel, clear all status bits.
> >
> > When handling a DMA interrupt, clear only the interrupt
> > status bits that have been read and are passed to the
> > channel's interrupt handler, not every status bit.
> >
> > Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
>
> Thanks, will queue as a fix.
This did not apply for some reason, I've applied it manually.
Please check that I got it right in omap-fixes branch soonish.
Let me know if it needs updating.
Tony
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] OMAP: DMA: clear interrupt status correctly
2011-01-19 22:44 ` Tony Lindgren
@ 2011-01-20 3:44 ` G, Manjunath Kondaiah
2011-01-20 11:10 ` Adrian Hunter
1 sibling, 0 replies; 15+ messages in thread
From: G, Manjunath Kondaiah @ 2011-01-20 3:44 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Kevin Hilman, Santosh Shilimkar,
linux-omap Mailing List, linux-arm-kernel@lists.infradead.org
On Wed, Jan 19, 2011 at 02:44:07PM -0800, Tony Lindgren wrote:
> * Tony Lindgren <tony@atomide.com> [110119 14:23]:
> > * Adrian Hunter <adrian.hunter@nokia.com> [110119 02:23]:
> > >
> > > From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
> > > From: Adrian Hunter <adrian.hunter@nokia.com>
> > > Date: Wed, 24 Nov 2010 13:23:21 +0200
> > > Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
> > >
> > > When clearing the DMA channel, clear all status bits.
> > >
> > > When handling a DMA interrupt, clear only the interrupt
> > > status bits that have been read and are passed to the
> > > channel's interrupt handler, not every status bit.
> > >
> > > Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
> >
> > Thanks, will queue as a fix.
>
> This did not apply for some reason, I've applied it manually.
> Please check that I got it right in omap-fixes branch soonish.
> Let me know if it needs updating.
Looks like the commit message is missing:
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
you can also add:
Acked-by: G, Manjunath Kondaiah <manjugk@ti.com>
-Manjunath
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] OMAP: DMA: clear interrupt status correctly
2011-01-19 22:44 ` Tony Lindgren
2011-01-20 3:44 ` G, Manjunath Kondaiah
@ 2011-01-20 11:10 ` Adrian Hunter
1 sibling, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2011-01-20 11:10 UTC (permalink / raw)
To: Tony Lindgren
Cc: Kevin Hilman, Santosh Shilimkar, Manjunath Kondaiah G,
linux-omap Mailing List, linux-arm-kernel@lists.infradead.org
On 20/01/11 00:44, Tony Lindgren wrote:
> * Tony Lindgren<tony@atomide.com> [110119 14:23]:
>> * Adrian Hunter<adrian.hunter@nokia.com> [110119 02:23]:
>>>
>>> From fffa19df17d73c1ed2e8c65c0b6604ee1dddff84 Mon Sep 17 00:00:00 2001
>>> From: Adrian Hunter<adrian.hunter@nokia.com>
>>> Date: Wed, 24 Nov 2010 13:23:21 +0200
>>> Subject: [PATCH] OMAP: DMA: clear interrupt status correctly
>>>
>>> When clearing the DMA channel, clear all status bits.
>>>
>>> When handling a DMA interrupt, clear only the interrupt
>>> status bits that have been read and are passed to the
>>> channel's interrupt handler, not every status bit.
>>>
>>> Signed-off-by: Adrian Hunter<adrian.hunter@nokia.com>
>>
>> Thanks, will queue as a fix.
>
> This did not apply for some reason, I've applied it manually.
> Please check that I got it right in omap-fixes branch soonish.
> Let me know if it needs updating.
Looks fine
>
> Tony
>
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2011-01-20 11:10 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-30 13:23 [PATCH 0/2] Minor DMA fixes Adrian Hunter
2010-11-30 13:23 ` [PATCH 1/2] OMAP: DMA: prevent races while setting M idle mode to nostandby Adrian Hunter
2010-11-30 14:24 ` Santosh Shilimkar
2010-12-01 12:21 ` Peter Ujfalusi
2010-12-01 19:11 ` G, Manjunath Kondaiah
2010-11-30 13:23 ` [PATCH 2/2] OMAP: DMA: clear interrupt status correctly Adrian Hunter
2010-11-30 14:25 ` Santosh Shilimkar
2010-12-21 20:29 ` Tony Lindgren
2011-01-05 9:58 ` Adrian Hunter
2011-01-05 17:27 ` Kevin Hilman
2011-01-19 10:24 ` [PATCH] " Adrian Hunter
2011-01-19 22:23 ` Tony Lindgren
2011-01-19 22:44 ` Tony Lindgren
2011-01-20 3:44 ` G, Manjunath Kondaiah
2011-01-20 11:10 ` Adrian Hunter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).