From 08f211e0775ee1e29993fd072968e17a51c5ec14 Mon Sep 17 00:00:00 2001 From: mokopatches 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 --- 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