diff options
author | Michael Hanselmann <linux-kernel@hansmi.ch> | 2006-07-30 06:04:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-31 16:28:45 -0400 |
commit | 4b755999d6e0c1d988fb448289abb6c226cd8c36 (patch) | |
tree | 0310376a65b0d25af249554a133b5a799acf22f6 /arch/powerpc/platforms/powermac/backlight.c | |
parent | 994aad251acab32a5d40d4a9501dc3e736562b6d (diff) |
[PATCH] powermac: More powermac backlight fixes
This patch fixes several problems:
- The legacy backlight value might be set at interrupt time. Introduced
a worker to prevent it from directly calling the backlight code.
- via-pmu allows the backlight to be grabbed, in which case we need to
prevent other kernel code from changing the brightness.
- Don't send PMU requests in via-pmu-backlight when the machine is about
to sleep or waking up.
- More Kconfig fixes.
Signed-off-by: Michael Hanselmann <linux-kernel@hansmi.ch>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/powerpc/platforms/powermac/backlight.c')
-rw-r--r-- | arch/powerpc/platforms/powermac/backlight.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/arch/powerpc/platforms/powermac/backlight.c b/arch/powerpc/platforms/powermac/backlight.c index 74eed6b74cd6..d66415491055 100644 --- a/arch/powerpc/platforms/powermac/backlight.c +++ b/arch/powerpc/platforms/powermac/backlight.c | |||
@@ -10,19 +10,32 @@ | |||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/fb.h> | 11 | #include <linux/fb.h> |
12 | #include <linux/backlight.h> | 12 | #include <linux/backlight.h> |
13 | #include <linux/adb.h> | ||
14 | #include <linux/pmu.h> | ||
15 | #include <asm/atomic.h> | ||
13 | #include <asm/prom.h> | 16 | #include <asm/prom.h> |
14 | #include <asm/backlight.h> | 17 | #include <asm/backlight.h> |
15 | 18 | ||
16 | #define OLD_BACKLIGHT_MAX 15 | 19 | #define OLD_BACKLIGHT_MAX 15 |
17 | 20 | ||
18 | static void pmac_backlight_key_worker(void *data); | 21 | static void pmac_backlight_key_worker(void *data); |
22 | static void pmac_backlight_set_legacy_worker(void *data); | ||
23 | |||
19 | static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL); | 24 | static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL); |
25 | static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker, NULL); | ||
20 | 26 | ||
21 | /* Although this variable is used in interrupt context, it makes no sense to | 27 | /* Although these variables are used in interrupt context, it makes no sense to |
22 | * protect it. No user is able to produce enough key events per second and | 28 | * protect them. No user is able to produce enough key events per second and |
23 | * notice the errors that might happen. | 29 | * notice the errors that might happen. |
24 | */ | 30 | */ |
25 | static int pmac_backlight_key_queued; | 31 | static int pmac_backlight_key_queued; |
32 | static int pmac_backlight_set_legacy_queued; | ||
33 | |||
34 | /* The via-pmu code allows the backlight to be grabbed, in which case the | ||
35 | * in-kernel control of the brightness needs to be disabled. This should | ||
36 | * only be used by really old PowerBooks. | ||
37 | */ | ||
38 | static atomic_t kernel_backlight_disabled = ATOMIC_INIT(0); | ||
26 | 39 | ||
27 | /* Protect the pmac_backlight variable */ | 40 | /* Protect the pmac_backlight variable */ |
28 | DEFINE_MUTEX(pmac_backlight_mutex); | 41 | DEFINE_MUTEX(pmac_backlight_mutex); |
@@ -82,6 +95,9 @@ int pmac_backlight_curve_lookup(struct fb_info *info, int value) | |||
82 | 95 | ||
83 | static void pmac_backlight_key_worker(void *data) | 96 | static void pmac_backlight_key_worker(void *data) |
84 | { | 97 | { |
98 | if (atomic_read(&kernel_backlight_disabled)) | ||
99 | return; | ||
100 | |||
85 | mutex_lock(&pmac_backlight_mutex); | 101 | mutex_lock(&pmac_backlight_mutex); |
86 | if (pmac_backlight) { | 102 | if (pmac_backlight) { |
87 | struct backlight_properties *props; | 103 | struct backlight_properties *props; |
@@ -107,8 +123,12 @@ static void pmac_backlight_key_worker(void *data) | |||
107 | mutex_unlock(&pmac_backlight_mutex); | 123 | mutex_unlock(&pmac_backlight_mutex); |
108 | } | 124 | } |
109 | 125 | ||
126 | /* This function is called in interrupt context */ | ||
110 | void pmac_backlight_key(int direction) | 127 | void pmac_backlight_key(int direction) |
111 | { | 128 | { |
129 | if (atomic_read(&kernel_backlight_disabled)) | ||
130 | return; | ||
131 | |||
112 | /* we can receive multiple interrupts here, but the scheduled work | 132 | /* we can receive multiple interrupts here, but the scheduled work |
113 | * will run only once, with the last value | 133 | * will run only once, with the last value |
114 | */ | 134 | */ |
@@ -116,7 +136,7 @@ void pmac_backlight_key(int direction) | |||
116 | schedule_work(&pmac_backlight_key_work); | 136 | schedule_work(&pmac_backlight_key_work); |
117 | } | 137 | } |
118 | 138 | ||
119 | int pmac_backlight_set_legacy_brightness(int brightness) | 139 | static int __pmac_backlight_set_legacy_brightness(int brightness) |
120 | { | 140 | { |
121 | int error = -ENXIO; | 141 | int error = -ENXIO; |
122 | 142 | ||
@@ -145,6 +165,28 @@ int pmac_backlight_set_legacy_brightness(int brightness) | |||
145 | return error; | 165 | return error; |
146 | } | 166 | } |
147 | 167 | ||
168 | static void pmac_backlight_set_legacy_worker(void *data) | ||
169 | { | ||
170 | if (atomic_read(&kernel_backlight_disabled)) | ||
171 | return; | ||
172 | |||
173 | __pmac_backlight_set_legacy_brightness(pmac_backlight_set_legacy_queued); | ||
174 | } | ||
175 | |||
176 | /* This function is called in interrupt context */ | ||
177 | void pmac_backlight_set_legacy_brightness_pmu(int brightness) { | ||
178 | if (atomic_read(&kernel_backlight_disabled)) | ||
179 | return; | ||
180 | |||
181 | pmac_backlight_set_legacy_queued = brightness; | ||
182 | schedule_work(&pmac_backlight_set_legacy_work); | ||
183 | } | ||
184 | |||
185 | int pmac_backlight_set_legacy_brightness(int brightness) | ||
186 | { | ||
187 | return __pmac_backlight_set_legacy_brightness(brightness); | ||
188 | } | ||
189 | |||
148 | int pmac_backlight_get_legacy_brightness() | 190 | int pmac_backlight_get_legacy_brightness() |
149 | { | 191 | { |
150 | int result = -ENXIO; | 192 | int result = -ENXIO; |
@@ -167,6 +209,16 @@ int pmac_backlight_get_legacy_brightness() | |||
167 | return result; | 209 | return result; |
168 | } | 210 | } |
169 | 211 | ||
212 | void pmac_backlight_disable() | ||
213 | { | ||
214 | atomic_inc(&kernel_backlight_disabled); | ||
215 | } | ||
216 | |||
217 | void pmac_backlight_enable() | ||
218 | { | ||
219 | atomic_dec(&kernel_backlight_disabled); | ||
220 | } | ||
221 | |||
170 | EXPORT_SYMBOL_GPL(pmac_backlight); | 222 | EXPORT_SYMBOL_GPL(pmac_backlight); |
171 | EXPORT_SYMBOL_GPL(pmac_backlight_mutex); | 223 | EXPORT_SYMBOL_GPL(pmac_backlight_mutex); |
172 | EXPORT_SYMBOL_GPL(pmac_has_backlight_type); | 224 | EXPORT_SYMBOL_GPL(pmac_has_backlight_type); |