82 lines
2.4 KiB
Diff
Executable File
82 lines
2.4 KiB
Diff
Executable File
From 08f211e0775ee1e29993fd072968e17a51c5ec14 Mon Sep 17 00:00:00 2001
|
|
From: mokopatches <mokopatches@openmoko.org>
|
|
Date: Fri, 25 Jul 2008 23:05:22 +0100
|
|
Subject: [PATCH] glamo-cmdqueue-bandaid.patch
|
|
[ Stop kernel from hanging every once in a while during Glamo
|
|
initialization. ]
|
|
|
|
debug-glamo-fb-cmdqueue-wait-timeout.patch
|
|
|
|
From: warmcat <andy@warmcat.com>
|
|
---
|
|
drivers/mfd/glamo/glamo-fb.c | 30 +++++++++++++++++++++++++++---
|
|
1 files changed, 27 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/mfd/glamo/glamo-fb.c b/drivers/mfd/glamo/glamo-fb.c
|
|
index 394a0ad..f0d7600 100644
|
|
--- a/drivers/mfd/glamo/glamo-fb.c
|
|
+++ b/drivers/mfd/glamo/glamo-fb.c
|
|
@@ -553,12 +553,20 @@ static inline int glamofb_cmdq_empty(struct glamofb_handle *gfb)
|
|
|
|
void glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
|
|
{
|
|
+ int timeout = 2000;
|
|
+
|
|
dev_dbg(gfb->dev, "glamofb_cmd_mode(gfb=%p, on=%d)\n", gfb, on);
|
|
if (on) {
|
|
dev_dbg(gfb->dev, "%s: waiting for cmdq empty: ",
|
|
__FUNCTION__);
|
|
- while (!glamofb_cmdq_empty(gfb))
|
|
+ while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
|
|
yield();
|
|
+ if (timeout < 0) {
|
|
+ printk(KERN_ERR"*************"
|
|
+ "glamofb cmd_queue never got empty"
|
|
+ "*************\n");
|
|
+ return;
|
|
+ }
|
|
dev_dbg(gfb->dev, "empty!\n");
|
|
|
|
/* display the entire frame then switch to command */
|
|
@@ -568,8 +576,16 @@ void glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
|
|
|
|
/* wait until LCD is idle */
|
|
dev_dbg(gfb->dev, "waiting for LCD idle: ");
|
|
- while (!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12))
|
|
+ timeout = 2000;
|
|
+ while ((!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12)) &&
|
|
+ (timeout--))
|
|
yield();
|
|
+ if (timeout < 0) {
|
|
+ printk(KERN_ERR"*************"
|
|
+ "glamofb lcd never idle"
|
|
+ "*************\n");
|
|
+ return;
|
|
+ }
|
|
dev_dbg(gfb->dev, "idle!\n");
|
|
|
|
msleep(90);
|
|
@@ -589,10 +605,18 @@ EXPORT_SYMBOL_GPL(glamofb_cmd_mode);
|
|
|
|
int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val)
|
|
{
|
|
+ int timeout = 2000;
|
|
+
|
|
dev_dbg(gfb->dev, "%s: waiting for cmdq empty\n",
|
|
__FUNCTION__);
|
|
- while (!glamofb_cmdq_empty(gfb))
|
|
+ while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
|
|
yield();
|
|
+ if (timeout < 0) {
|
|
+ printk(KERN_ERR"*************"
|
|
+ "glamofb cmd_queue never got empty"
|
|
+ "*************\n");
|
|
+ return 1;
|
|
+ }
|
|
dev_dbg(gfb->dev, "idle, writing 0x%04x\n", val);
|
|
|
|
reg_write(gfb, GLAMO_REG_LCD_COMMAND1, val);
|
|
--
|
|
1.5.6.3
|
|
|