summaryrefslogtreecommitdiff
path: root/recipes/linux/linux-openmoko-2.6.32/0016-Enable-display-before-trying-to-set-mode-or-base.patch
blob: 4e7a8abe10d3b096d3b6091c1a8dac40dd9f5505 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
From 986df52e3e02a1cdbf43eafccd483f0f86c696bd Mon Sep 17 00:00:00 2001
From: Thomas White <taw@bitwiz.org.uk>
Date: Sun, 21 Mar 2010 20:55:18 +0100
Subject: [PATCH 16/16] Enable display before trying to set mode or base

This makes it possible to change mode when the screen is switched off.

Signed-off-by: Thomas White <taw@bitwiz.org.uk>
---
 drivers/mfd/glamo/glamo-display.c |   56 ++++++++++++++++++------------------
 1 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
index e56cdb4..24a1a31 100644
--- a/drivers/mfd/glamo/glamo-display.c
+++ b/drivers/mfd/glamo/glamo-display.c
@@ -267,9 +267,9 @@ static int glamo_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 	gdrm = gcrtc->gdrm;	/* Here it is! */
 
 	if ( !gcrtc->pixel_clock_on ) {
-		printk(KERN_WARNING "[glamo-drm] Refusing to set base while "
-		                    "pixel clock is off.\n");
-		return -EBUSY;
+		printk(KERN_WARNING "[glamo-drm] Display is off - "
+		                    "enabling it before setting base.\n");
+		glamo_lcd_power(gdrm, 1);
 	}
 
 	gfb = to_glamo_framebuffer(crtc->fb);
@@ -304,9 +304,9 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
 	gdrm = gcrtc->gdrm;	/* Here it is! */
 
 	if ( !gcrtc->pixel_clock_on ) {
-		printk(KERN_WARNING "[glamo-drm] Refusing to set mode while "
-		                    "pixel clock is off.\n");
-		return -EBUSY;
+		printk(KERN_WARNING "[glamo-drm] Display is off - "
+		                    "enabling it before setting mode.\n");
+		glamo_lcd_power(gdrm, 1);
 	}
 
 	glamo_lcd_cmd_mode(gdrm, 1);
@@ -380,28 +380,6 @@ static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
 }
 
 
-void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
-{
-	struct drm_crtc *crtc = gdrm->crtc;
-	struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
-
-	if ( mode ) {
-		glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-		gcrtc->pixel_clock_on = 1;
-		jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
-		if ( gcrtc->current_mode_set ) {
-			glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
-			                    &gcrtc->current_mode, 0, 0,
-			                    gcrtc->current_fb);
-		}
-	} else {
-		jbt6k74_setpower(JBT_POWER_MODE_OFF);
-		glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-		gcrtc->pixel_clock_on = 0;
-	}
-}
-
-
 static void glamo_crtc_prepare(struct drm_crtc *crtc)
 {
 }
@@ -862,6 +840,28 @@ int glamo_display_init(struct drm_device *dev)
 }
 
 
+void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
+{
+	struct drm_crtc *crtc = gdrm->crtc;
+	struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
+
+	if ( mode ) {
+		glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
+		gcrtc->pixel_clock_on = 1;
+		jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
+		if ( gcrtc->current_mode_set ) {
+			glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
+			                    &gcrtc->current_mode, 0, 0,
+			                    gcrtc->current_fb);
+		}
+	} else {
+		jbt6k74_setpower(JBT_POWER_MODE_OFF);
+		glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
+		gcrtc->pixel_clock_on = 0;
+	}
+}
+
+
 void glamo_display_suspend(struct glamodrm_handle *gdrm)
 {
 	/* do nothing */
-- 
1.7.0.2