aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-fb.c
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:11:11 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:11 +0000
commit9d6e27160ddcd316d5b5fc9a2caf74d340e2ba93 (patch)
tree886b71f218270ad3604cd343b877ed027eeda522 /drivers/mfd/glamo/glamo-fb.c
parent8f8c5a780d45850e42bca5b64b85ea831c9e4854 (diff)
glamo-resume-meddling.patch
Big chunk of trying to own Glamo resume and not really succeeding Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'drivers/mfd/glamo/glamo-fb.c')
-rw-r--r--drivers/mfd/glamo/glamo-fb.c77
1 files changed, 76 insertions, 1 deletions
diff --git a/drivers/mfd/glamo/glamo-fb.c b/drivers/mfd/glamo/glamo-fb.c
index b886c4e693b..26a6d29ddba 100644
--- a/drivers/mfd/glamo/glamo-fb.c
+++ b/drivers/mfd/glamo/glamo-fb.c
@@ -125,6 +125,12 @@ static int glamofb_run_script(struct glamofb_handle *glamo,
{
int i;
+ if (glamo->mach_info->glamo->suspending) {
+ dev_err(&glamo->mach_info->glamo->pdev->dev, "IGNORING glamofb_run_script while "
+ "suspended\n");
+ return -EBUSY;
+ }
+
for (i = 0; i < len; i++) {
struct glamo_script *line = &script[i];
@@ -144,6 +150,12 @@ static int glamofb_check_var(struct fb_var_screeninfo *var,
{
struct glamofb_handle *glamo = info->par;
+ if (glamo->mach_info->glamo->suspending) {
+ dev_err(&glamo->mach_info->glamo->pdev->dev, "IGNORING glamofb_check_var while "
+ "suspended\n");
+ return -EBUSY;
+ }
+
if (var->yres > glamo->mach_info->yres.max)
var->yres = glamo->mach_info->yres.max;
else if (var->yres < glamo->mach_info->yres.min)
@@ -240,6 +252,12 @@ static void __rotate_lcd(struct glamofb_handle *glamo, __u32 rotation)
{
int glamo_rot;
+ if (glamo->mach_info->glamo->suspending) {
+ dev_err(&glamo->mach_info->glamo->pdev->dev, "IGNORING rotate_lcd while "
+ "suspended\n");
+ return;
+ }
+
switch (rotation) {
case FB_ROTATE_UR:
glamo_rot = GLAMO_LCD_ROT_MODE_0;
@@ -305,6 +323,12 @@ static void glamofb_update_lcd_controller(struct glamofb_handle *glamo,
if (!glamo || !var)
return;
+ if (glamo->mach_info->glamo->suspending) {
+ dev_err(&glamo->mach_info->glamo->pdev->dev, "IGNORING glamofb_update_lcd_controller while "
+ "suspended\n");
+ return;
+ }
+
printk(KERN_ERR"glamofb_update_lcd_controller spin_lock_irqsave\n");
spin_lock_irqsave(&glamo->lock_cmd, flags);
@@ -405,6 +429,12 @@ static int glamofb_set_par(struct fb_info *info)
struct glamofb_handle *glamo = info->par;
struct fb_var_screeninfo *var = &info->var;
+ if (glamo->mach_info->glamo->suspending) {
+ dev_err(&glamo->mach_info->glamo->pdev->dev, "IGNORING glamofb_set_par while "
+ "suspended\n");
+ return -EBUSY;
+ }
+
switch (var->bits_per_pixel) {
case 16:
info->fix.visual = FB_VISUAL_TRUECOLOR;
@@ -469,6 +499,12 @@ static int glamofb_setcolreg(unsigned regno,
struct glamofb_handle *glamo = info->par;
unsigned int val;
+ if (glamo->mach_info->glamo->suspending) {
+ dev_err(&glamo->mach_info->glamo->pdev->dev, "IGNORING glamofb_set_par while "
+ "suspended\n");
+ return -EBUSY;
+ }
+
switch (glamo->fb->fix.visual) {
case FB_VISUAL_TRUECOLOR:
case FB_VISUAL_DIRECTCOLOR:
@@ -631,6 +667,12 @@ int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
{
int timeout = 2000000;
+ if (gfb->mach_info->glamo->suspending) {
+ dev_err(&gfb->mach_info->glamo->pdev->dev, "IGNORING glamofb_cmd_mode while "
+ "suspended\n");
+ return -EBUSY;
+ }
+
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: ",
@@ -688,6 +730,12 @@ int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val)
{
int timeout = 200000;
+ if (gfb->mach_info->glamo->suspending) {
+ dev_err(&gfb->mach_info->glamo->pdev->dev, "IGNORING glamofb_cmd_write while "
+ "suspended\n");
+ return -EBUSY;
+ }
+
dev_dbg(gfb->dev, "%s: waiting for cmdq empty\n", __FUNCTION__);
while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
yield();
@@ -799,7 +847,7 @@ static int __init glamofb_probe(struct platform_device *pdev)
}
glamofb->cursor_addr = fbinfo->screen_base + 0xf0000;
- platform_set_drvdata(pdev, fbinfo);
+ platform_set_drvdata(pdev, glamofb);
glamofb->mach_info = pdev->dev.platform_data;
@@ -891,9 +939,36 @@ static int glamofb_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_PM
+
+static int glamofb_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ struct glamofb_handle *gfb = platform_get_drvdata(pdev);
+
+ if (state.event & PM_EVENT_SLEEP)
+ fb_set_suspend(gfb->fb, 1);
+
+ return 0;
+}
+
+static int glamofb_resume(struct platform_device *pdev)
+{
+ struct glamofb_handle *gfb = platform_get_drvdata(pdev);
+
+ fb_set_suspend(gfb->fb, 0);
+
+ return 0;
+}
+#else
+#define glamo_suspend NULL
+#define glamo_resume NULL
+#endif
+
static struct platform_driver glamofb_driver = {
.probe = glamofb_probe,
.remove = glamofb_remove,
+ .suspend = glamofb_suspend,
+ .resume = glamofb_resume,
.driver = {
.name = "glamo-fb",
.owner = THIS_MODULE,