Thread (3 messages) 3 messages, 2 authors, 2009-11-10

Re: [PATCH v3] OMAP: DMA: Fix omapfb/lcdc on OMAP1510 broken when PM set

From: Janusz Krzysztofik <hidden>
Date: 2009-11-10 02:56:27
Also in: linux-arm-kernel, linux-omap, lkml

Monday 09 November 2009 22:14:24 Tony Lindgren napisał(a):
* Janusz Krzysztofik [off-list ref] [091105 10:52]:
quoted
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 <redacted>

---

Tuesday 03 November 2009 21:10:48 Tony Lindgren wrote:
quoted
* Janusz Krzysztofik [off-list ref] [091103 12:05]:
quoted
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
--
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help