linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] OMAP: DMA: Fix omapfb/lcdc on OMAP1510 broken when PM set
@ 2009-11-05 18:51 Janusz Krzysztofik
  2009-11-09 21:14 ` Tony Lindgren
  0 siblings, 1 reply; 3+ messages in thread
From: Janusz Krzysztofik @ 2009-11-05 18:51 UTC (permalink / raw)
  To: linux-arm-kernel

With CONFIG_PM=y, the omapfb/lcdc device on Amstrad Delta, after initially
starting correctly, breaks with the following error messages:

omapfb omapfb: resetting (status 0xffffff96,reset count 1)
...
omapfb omapfb: resetting (status 0xffffff96,reset count 100)
omapfb omapfb: too many reset attempts, giving up.

Looking closer at this I have found that it had been broken almost 2 years ago
with commit 2418996e3b100114edb2ae110d5d4acb928909d2, PM fixes for OMAP1.

The definite reason for broken omapfb/lcdc behavoiur in PM mode
appeared to be ARM_IDLECT1:IDLIF_ARM (bit 6) put into idle regardless of LCD
DMA possibly running. The bit were set based on return value of the
omap_dma_running() function that did not check for dedicated LCD DMA
channel status. The patch below fixes this.

Created against linux-2.6.32-rc6

Tested on Amstrad Delta

Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>

---
Tuesday 03 November 2009 21:10:48 Tony Lindgren wrote:
> * Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> [091103 12:05]:
> > Sorry, I've not checked for new mail before posting this one and missed
> > your acceptance for my idea of fixing all omap1510, not only ams_delta.
> > If there are no more comments, I'll submit v3 with cpu_is_omap1510()
> > replacing machine_is_ams_delta().
>
> Sounds good to me.
>
> Tony

--- linux-2.6.32-rc6/arch/arm/plat-omap/dma.c.orig	2009-11-03 20:37:49.000000000 +0100
+++ linux-2.6.32-rc6/arch/arm/plat-omap/dma.c	2009-11-05 19:30:39.000000000 +0100
@@ -1108,6 +1108,14 @@ int omap_dma_running(void)
 {
 	int lch;
 
+	/*
+	 * On OMAP1510, internal LCD controller will start the transfer
+	 * when it gets enabled, so assume DMA running if LCD enabled.
+	 */
+	if (cpu_is_omap1510())
+		if (omap_readw(0xfffec000 + 0x00) & (1 << 0))
+			return 1;
+
 	/* Check if LCD DMA is running */
 	if (cpu_is_omap16xx())
 		if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v3] OMAP: DMA: Fix omapfb/lcdc on OMAP1510 broken when PM set
  2009-11-05 18:51 [PATCH v3] OMAP: DMA: Fix omapfb/lcdc on OMAP1510 broken when PM set Janusz Krzysztofik
@ 2009-11-09 21:14 ` Tony Lindgren
  2009-11-10  2:50   ` Janusz Krzysztofik
  0 siblings, 1 reply; 3+ messages in thread
From: Tony Lindgren @ 2009-11-09 21:14 UTC (permalink / raw)
  To: linux-arm-kernel

* Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> [091105 10:52]:
> With CONFIG_PM=y, the omapfb/lcdc device on Amstrad Delta, after initially
> starting correctly, breaks with the following error messages:
> 
> omapfb omapfb: resetting (status 0xffffff96,reset count 1)
> ...
> omapfb omapfb: resetting (status 0xffffff96,reset count 100)
> omapfb omapfb: too many reset attempts, giving up.
> 
> Looking closer at this I have found that it had been broken almost 2 years ago
> with commit 2418996e3b100114edb2ae110d5d4acb928909d2, PM fixes for OMAP1.
> 
> The definite reason for broken omapfb/lcdc behavoiur in PM mode
> appeared to be ARM_IDLECT1:IDLIF_ARM (bit 6) put into idle regardless of LCD
> DMA possibly running. The bit were set based on return value of the
> omap_dma_running() function that did not check for dedicated LCD DMA
> channel status. The patch below fixes this.
> 
> Created against linux-2.6.32-rc6
> 
> Tested on Amstrad Delta
> 
> Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
> 
> ---
> Tuesday 03 November 2009 21:10:48 Tony Lindgren wrote:
> > * Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> [091103 12:05]:
> > > Sorry, I've not checked for new mail before posting this one and missed
> > > your acceptance for my idea of fixing all omap1510, not only ams_delta.
> > > If there are no more comments, I'll submit v3 with cpu_is_omap1510()
> > > replacing machine_is_ams_delta().
> >
> > Sounds good to me.
> >
> > Tony
> 
> --- linux-2.6.32-rc6/arch/arm/plat-omap/dma.c.orig	2009-11-03 20:37:49.000000000 +0100
> +++ linux-2.6.32-rc6/arch/arm/plat-omap/dma.c	2009-11-05 19:30:39.000000000 +0100
> @@ -1108,6 +1108,14 @@ int omap_dma_running(void)
>  {
>  	int lch;
>  
> +	/*
> +	 * On OMAP1510, internal LCD controller will start the transfer
> +	 * when it gets enabled, so assume DMA running if LCD enabled.
> +	 */
> +	if (cpu_is_omap1510())
> +		if (omap_readw(0xfffec000 + 0x00) & (1 << 0))
> +			return 1;
> +
>  	/* Check if LCD DMA is running */
>  	if (cpu_is_omap16xx())
>  		if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN)

Can you please use some define rather than the 0xfffec000 register
above?

Regards,

Tony

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v3] OMAP: DMA: Fix omapfb/lcdc on OMAP1510 broken when PM set
  2009-11-09 21:14 ` Tony Lindgren
@ 2009-11-10  2:50   ` Janusz Krzysztofik
  0 siblings, 0 replies; 3+ messages in thread
From: Janusz Krzysztofik @ 2009-11-10  2:50 UTC (permalink / raw)
  To: linux-arm-kernel

Monday 09 November 2009 22:14:24 Tony Lindgren napisa?(a):
> * Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> [091105 10:52]:
> > With CONFIG_PM=y, the omapfb/lcdc device on Amstrad Delta, after
> > initially starting correctly, breaks with the following error messages:
> >
> > omapfb omapfb: resetting (status 0xffffff96,reset count 1)
> > ...
> > omapfb omapfb: resetting (status 0xffffff96,reset count 100)
> > omapfb omapfb: too many reset attempts, giving up.
> >
> > Looking closer at this I have found that it had been broken almost 2
> > years ago with commit 2418996e3b100114edb2ae110d5d4acb928909d2, PM fixes
> > for OMAP1.
> >
> > The definite reason for broken omapfb/lcdc behavoiur in PM mode
> > appeared to be ARM_IDLECT1:IDLIF_ARM (bit 6) put into idle regardless of
> > LCD DMA possibly running. The bit were set based on return value of the
> > omap_dma_running() function that did not check for dedicated LCD DMA
> > channel status. The patch below fixes this.
> >
> > Created against linux-2.6.32-rc6
> >
> > Tested on Amstrad Delta
> >
> > Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
> >
> > ---
> >
> > Tuesday 03 November 2009 21:10:48 Tony Lindgren wrote:
> > > * Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> [091103 12:05]:
> > > > Sorry, I've not checked for new mail before posting this one and
> > > > missed your acceptance for my idea of fixing all omap1510, not only
> > > > ams_delta. If there are no more comments, I'll submit v3 with
> > > > cpu_is_omap1510() replacing machine_is_ams_delta().
> > >
> > > Sounds good to me.
> > >
> > > Tony
> >
> > --- linux-2.6.32-rc6/arch/arm/plat-omap/dma.c.orig	2009-11-03 20:37:49.000000000 +0100
> > +++ linux-2.6.32-rc6/arch/arm/plat-omap/dma.c	2009-11-05 19:30:39.000000000 +0100
> > @@ -1108,6 +1108,14 @@ int omap_dma_running(void)
> >  {
> >  	int lch;
> >
> > +	/*
> > +	 * On OMAP1510, internal LCD controller will start the transfer
> > +	 * when it gets enabled, so assume DMA running if LCD enabled.
> > +	 */
> > +	if (cpu_is_omap1510())
> > +		if (omap_readw(0xfffec000 + 0x00) & (1 << 0))
> > +			return 1;
> > +
> >  	/* Check if LCD DMA is running */
> >  	if (cpu_is_omap16xx())
> >  		if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN)
>
> Can you please use some define rather than the 0xfffec000 register
> above?

Tony,
Sure. Expect a follow up very soon.

Thanks,
Janusz

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-11-10  2:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-11-05 18:51 [PATCH v3] OMAP: DMA: Fix omapfb/lcdc on OMAP1510 broken when PM set Janusz Krzysztofik
2009-11-09 21:14 ` Tony Lindgren
2009-11-10  2:50   ` Janusz Krzysztofik

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).