diff options
-rw-r--r-- | drivers/video/backlight/Kconfig | 8 | ||||
-rw-r--r-- | drivers/video/backlight/Makefile | 2 | ||||
-rw-r--r-- | drivers/video/backlight/mbp_nvidia_bl.c | 366 |
3 files changed, 101 insertions, 275 deletions
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 39a4cd258d5..aa8cf9d2e34 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
@@ -244,12 +244,12 @@ config BACKLIGHT_MAX8925 | |||
244 | If you have a LCD backlight connected to the WLED output of MAX8925 | 244 | If you have a LCD backlight connected to the WLED output of MAX8925 |
245 | WLED output, say Y here to enable this driver. | 245 | WLED output, say Y here to enable this driver. |
246 | 246 | ||
247 | config BACKLIGHT_MBP_NVIDIA | 247 | config BACKLIGHT_MACBOOK |
248 | tristate "MacBook Pro Nvidia Backlight Driver" | 248 | tristate "MacBook Backlight Driver" |
249 | depends on X86 | 249 | depends on X86 |
250 | help | 250 | help |
251 | If you have an Apple Macbook Pro with Nvidia graphics hardware say Y | 251 | If you have an Apple Macbook say Y to enable a driver for its |
252 | to enable a driver for its backlight | 252 | backlight |
253 | 253 | ||
254 | config BACKLIGHT_TOSA | 254 | config BACKLIGHT_TOSA |
255 | tristate "Sharp SL-6000 Backlight Driver" | 255 | tristate "Sharp SL-6000 Backlight Driver" |
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 457996c97f5..988d7cd159e 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
@@ -27,7 +27,7 @@ obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o | |||
27 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o | 27 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o |
28 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o | 28 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o |
29 | obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o | 29 | obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o |
30 | obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o | 30 | obj-$(CONFIG_BACKLIGHT_MACBOOK) += mbp_nvidia_bl.o |
31 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o | 31 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o |
32 | obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o | 32 | obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o |
33 | obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o | 33 | obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o |
diff --git a/drivers/video/backlight/mbp_nvidia_bl.c b/drivers/video/backlight/mbp_nvidia_bl.c index 74c33944aa8..b22cfb24bd5 100644 --- a/drivers/video/backlight/mbp_nvidia_bl.c +++ b/drivers/video/backlight/mbp_nvidia_bl.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Backlight Driver for Nvidia 8600 in Macbook Pro | 2 | * Backlight Driver for Macbooks |
3 | * | 3 | * |
4 | * Copyright (c) Red Hat <mjg@redhat.com> | 4 | * Copyright (c) Red Hat <mjg@redhat.com> |
5 | * Based on code from Pommed: | 5 | * Based on code from Pommed: |
@@ -19,23 +19,27 @@ | |||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/backlight.h> | 22 | #include <linux/backlight.h> |
24 | #include <linux/err.h> | 23 | #include <linux/err.h> |
25 | #include <linux/dmi.h> | ||
26 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/pci.h> | ||
26 | #include <linux/acpi.h> | ||
27 | 27 | ||
28 | static struct backlight_device *mbp_backlight_device; | 28 | static struct backlight_device *mb_backlight_device; |
29 | 29 | ||
30 | /* Structure to be passed to the DMI_MATCH function. */ | 30 | struct hw_data { |
31 | struct dmi_match_data { | ||
32 | /* I/O resource to allocate. */ | 31 | /* I/O resource to allocate. */ |
33 | unsigned long iostart; | 32 | unsigned long iostart; |
34 | unsigned long iolen; | 33 | unsigned long iolen; |
35 | /* Backlight operations structure. */ | 34 | /* Backlight operations structure. */ |
36 | const struct backlight_ops backlight_ops; | 35 | const struct backlight_ops backlight_ops; |
36 | void (*set_brightness)(int); | ||
37 | }; | 37 | }; |
38 | 38 | ||
39 | static const struct hw_data *hw_data; | ||
40 | |||
41 | #define DRIVER "mb_backlight: " | ||
42 | |||
39 | /* Module parameters. */ | 43 | /* Module parameters. */ |
40 | static int debug; | 44 | static int debug; |
41 | module_param_named(debug, debug, int, 0644); | 45 | module_param_named(debug, debug, int, 0644); |
@@ -44,16 +48,21 @@ MODULE_PARM_DESC(debug, "Set to one to enable debugging messages."); | |||
44 | /* | 48 | /* |
45 | * Implementation for MacBooks with Intel chipset. | 49 | * Implementation for MacBooks with Intel chipset. |
46 | */ | 50 | */ |
51 | static void intel_chipset_set_brightness(int intensity) | ||
52 | { | ||
53 | outb(0x04 | (intensity << 4), 0xb3); | ||
54 | outb(0xbf, 0xb2); | ||
55 | } | ||
56 | |||
47 | static int intel_chipset_send_intensity(struct backlight_device *bd) | 57 | static int intel_chipset_send_intensity(struct backlight_device *bd) |
48 | { | 58 | { |
49 | int intensity = bd->props.brightness; | 59 | int intensity = bd->props.brightness; |
50 | 60 | ||
51 | if (debug) | 61 | if (debug) |
52 | printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n", | 62 | printk(KERN_DEBUG DRIVER "setting brightness to %d\n", |
53 | intensity); | 63 | intensity); |
54 | 64 | ||
55 | outb(0x04 | (intensity << 4), 0xb3); | 65 | intel_chipset_set_brightness(intensity); |
56 | outb(0xbf, 0xb2); | ||
57 | return 0; | 66 | return 0; |
58 | } | 67 | } |
59 | 68 | ||
@@ -66,35 +75,41 @@ static int intel_chipset_get_intensity(struct backlight_device *bd) | |||
66 | intensity = inb(0xb3) >> 4; | 75 | intensity = inb(0xb3) >> 4; |
67 | 76 | ||
68 | if (debug) | 77 | if (debug) |
69 | printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n", | 78 | printk(KERN_DEBUG DRIVER "read brightness of %d\n", |
70 | intensity); | 79 | intensity); |
71 | 80 | ||
72 | return intensity; | 81 | return intensity; |
73 | } | 82 | } |
74 | 83 | ||
75 | static const struct dmi_match_data intel_chipset_data = { | 84 | static const struct hw_data intel_chipset_data = { |
76 | .iostart = 0xb2, | 85 | .iostart = 0xb2, |
77 | .iolen = 2, | 86 | .iolen = 2, |
78 | .backlight_ops = { | 87 | .backlight_ops = { |
79 | .options = BL_CORE_SUSPENDRESUME, | 88 | .options = BL_CORE_SUSPENDRESUME, |
80 | .get_brightness = intel_chipset_get_intensity, | 89 | .get_brightness = intel_chipset_get_intensity, |
81 | .update_status = intel_chipset_send_intensity, | 90 | .update_status = intel_chipset_send_intensity, |
82 | } | 91 | }, |
92 | .set_brightness = intel_chipset_set_brightness, | ||
83 | }; | 93 | }; |
84 | 94 | ||
85 | /* | 95 | /* |
86 | * Implementation for MacBooks with Nvidia chipset. | 96 | * Implementation for MacBooks with Nvidia chipset. |
87 | */ | 97 | */ |
98 | static void nvidia_chipset_set_brightness(int intensity) | ||
99 | { | ||
100 | outb(0x04 | (intensity << 4), 0x52f); | ||
101 | outb(0xbf, 0x52e); | ||
102 | } | ||
103 | |||
88 | static int nvidia_chipset_send_intensity(struct backlight_device *bd) | 104 | static int nvidia_chipset_send_intensity(struct backlight_device *bd) |
89 | { | 105 | { |
90 | int intensity = bd->props.brightness; | 106 | int intensity = bd->props.brightness; |
91 | 107 | ||
92 | if (debug) | 108 | if (debug) |
93 | printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n", | 109 | printk(KERN_DEBUG DRIVER "setting brightness to %d\n", |
94 | intensity); | 110 | intensity); |
95 | 111 | ||
96 | outb(0x04 | (intensity << 4), 0x52f); | 112 | nvidia_chipset_set_brightness(intensity); |
97 | outb(0xbf, 0x52e); | ||
98 | return 0; | 113 | return 0; |
99 | } | 114 | } |
100 | 115 | ||
@@ -107,295 +122,106 @@ static int nvidia_chipset_get_intensity(struct backlight_device *bd) | |||
107 | intensity = inb(0x52f) >> 4; | 122 | intensity = inb(0x52f) >> 4; |
108 | 123 | ||
109 | if (debug) | 124 | if (debug) |
110 | printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n", | 125 | printk(KERN_DEBUG DRIVER "read brightness of %d\n", |
111 | intensity); | 126 | intensity); |
112 | 127 | ||
113 | return intensity; | 128 | return intensity; |
114 | } | 129 | } |
115 | 130 | ||
116 | static const struct dmi_match_data nvidia_chipset_data = { | 131 | static const struct hw_data nvidia_chipset_data = { |
117 | .iostart = 0x52e, | 132 | .iostart = 0x52e, |
118 | .iolen = 2, | 133 | .iolen = 2, |
119 | .backlight_ops = { | 134 | .backlight_ops = { |
120 | .options = BL_CORE_SUSPENDRESUME, | 135 | .options = BL_CORE_SUSPENDRESUME, |
121 | .get_brightness = nvidia_chipset_get_intensity, | 136 | .get_brightness = nvidia_chipset_get_intensity, |
122 | .update_status = nvidia_chipset_send_intensity | 137 | .update_status = nvidia_chipset_send_intensity |
123 | } | 138 | }, |
139 | .set_brightness = nvidia_chipset_set_brightness, | ||
124 | }; | 140 | }; |
125 | 141 | ||
126 | /* | 142 | static int __devinit mb_bl_add(struct acpi_device *dev) |
127 | * DMI matching. | ||
128 | */ | ||
129 | static /* const */ struct dmi_match_data *driver_data; | ||
130 | |||
131 | static int mbp_dmi_match(const struct dmi_system_id *id) | ||
132 | { | 143 | { |
133 | driver_data = id->driver_data; | 144 | struct backlight_properties props; |
145 | struct pci_dev *host; | ||
134 | 146 | ||
135 | printk(KERN_INFO "mbp_nvidia_bl: %s detected\n", id->ident); | 147 | host = pci_get_bus_and_slot(0, 0); |
136 | return 1; | ||
137 | } | ||
138 | 148 | ||
139 | static const struct dmi_system_id __initdata mbp_device_table[] = { | 149 | if (!host) { |
140 | { | 150 | printk(KERN_ERR DRIVER "unable to find PCI host\n"); |
141 | .callback = mbp_dmi_match, | 151 | return -ENODEV; |
142 | .ident = "MacBook 1,1", | 152 | } |
143 | .matches = { | ||
144 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
145 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
146 | }, | ||
147 | .driver_data = (void *)&intel_chipset_data, | ||
148 | }, | ||
149 | { | ||
150 | .callback = mbp_dmi_match, | ||
151 | .ident = "MacBook 2,1", | ||
152 | .matches = { | ||
153 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
154 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), | ||
155 | }, | ||
156 | .driver_data = (void *)&intel_chipset_data, | ||
157 | }, | ||
158 | { | ||
159 | .callback = mbp_dmi_match, | ||
160 | .ident = "MacBook 3,1", | ||
161 | .matches = { | ||
162 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
163 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook3,1"), | ||
164 | }, | ||
165 | .driver_data = (void *)&intel_chipset_data, | ||
166 | }, | ||
167 | { | ||
168 | .callback = mbp_dmi_match, | ||
169 | .ident = "MacBook 4,1", | ||
170 | .matches = { | ||
171 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
172 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,1"), | ||
173 | }, | ||
174 | .driver_data = (void *)&intel_chipset_data, | ||
175 | }, | ||
176 | { | ||
177 | .callback = mbp_dmi_match, | ||
178 | .ident = "MacBook 4,2", | ||
179 | .matches = { | ||
180 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
181 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,2"), | ||
182 | }, | ||
183 | .driver_data = (void *)&intel_chipset_data, | ||
184 | }, | ||
185 | { | ||
186 | .callback = mbp_dmi_match, | ||
187 | .ident = "MacBookPro 1,1", | ||
188 | .matches = { | ||
189 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
190 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"), | ||
191 | }, | ||
192 | .driver_data = (void *)&intel_chipset_data, | ||
193 | }, | ||
194 | { | ||
195 | .callback = mbp_dmi_match, | ||
196 | .ident = "MacBookPro 1,2", | ||
197 | .matches = { | ||
198 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
199 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,2"), | ||
200 | }, | ||
201 | .driver_data = (void *)&intel_chipset_data, | ||
202 | }, | ||
203 | { | ||
204 | .callback = mbp_dmi_match, | ||
205 | .ident = "MacBookPro 2,1", | ||
206 | .matches = { | ||
207 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
208 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,1"), | ||
209 | }, | ||
210 | .driver_data = (void *)&intel_chipset_data, | ||
211 | }, | ||
212 | { | ||
213 | .callback = mbp_dmi_match, | ||
214 | .ident = "MacBookPro 2,2", | ||
215 | .matches = { | ||
216 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
217 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"), | ||
218 | }, | ||
219 | .driver_data = (void *)&intel_chipset_data, | ||
220 | }, | ||
221 | { | ||
222 | .callback = mbp_dmi_match, | ||
223 | .ident = "MacBookPro 3,1", | ||
224 | .matches = { | ||
225 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
226 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), | ||
227 | }, | ||
228 | .driver_data = (void *)&intel_chipset_data, | ||
229 | }, | ||
230 | { | ||
231 | .callback = mbp_dmi_match, | ||
232 | .ident = "MacBookPro 3,2", | ||
233 | .matches = { | ||
234 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
235 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"), | ||
236 | }, | ||
237 | .driver_data = (void *)&intel_chipset_data, | ||
238 | }, | ||
239 | { | ||
240 | .callback = mbp_dmi_match, | ||
241 | .ident = "MacBookPro 4,1", | ||
242 | .matches = { | ||
243 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
244 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"), | ||
245 | }, | ||
246 | .driver_data = (void *)&intel_chipset_data, | ||
247 | }, | ||
248 | { | ||
249 | .callback = mbp_dmi_match, | ||
250 | .ident = "MacBookAir 1,1", | ||
251 | .matches = { | ||
252 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
253 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir1,1"), | ||
254 | }, | ||
255 | .driver_data = (void *)&intel_chipset_data, | ||
256 | }, | ||
257 | { | ||
258 | .callback = mbp_dmi_match, | ||
259 | .ident = "MacBook 5,1", | ||
260 | .matches = { | ||
261 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
262 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,1"), | ||
263 | }, | ||
264 | .driver_data = (void *)&nvidia_chipset_data, | ||
265 | }, | ||
266 | { | ||
267 | .callback = mbp_dmi_match, | ||
268 | .ident = "MacBook 5,2", | ||
269 | .matches = { | ||
270 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
271 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"), | ||
272 | }, | ||
273 | .driver_data = (void *)&nvidia_chipset_data, | ||
274 | }, | ||
275 | { | ||
276 | .callback = mbp_dmi_match, | ||
277 | .ident = "MacBook 6,1", | ||
278 | .matches = { | ||
279 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
280 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"), | ||
281 | }, | ||
282 | .driver_data = (void *)&nvidia_chipset_data, | ||
283 | }, | ||
284 | { | ||
285 | .callback = mbp_dmi_match, | ||
286 | .ident = "MacBookAir 2,1", | ||
287 | .matches = { | ||
288 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
289 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2,1"), | ||
290 | }, | ||
291 | .driver_data = (void *)&nvidia_chipset_data, | ||
292 | }, | ||
293 | { | ||
294 | .callback = mbp_dmi_match, | ||
295 | .ident = "MacBookPro 5,1", | ||
296 | .matches = { | ||
297 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
298 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"), | ||
299 | }, | ||
300 | .driver_data = (void *)&nvidia_chipset_data, | ||
301 | }, | ||
302 | { | ||
303 | .callback = mbp_dmi_match, | ||
304 | .ident = "MacBookPro 5,2", | ||
305 | .matches = { | ||
306 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
307 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,2"), | ||
308 | }, | ||
309 | .driver_data = (void *)&nvidia_chipset_data, | ||
310 | }, | ||
311 | { | ||
312 | .callback = mbp_dmi_match, | ||
313 | .ident = "MacBookPro 5,3", | ||
314 | .matches = { | ||
315 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
316 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3"), | ||
317 | }, | ||
318 | .driver_data = (void *)&nvidia_chipset_data, | ||
319 | }, | ||
320 | { | ||
321 | .callback = mbp_dmi_match, | ||
322 | .ident = "MacBookPro 5,4", | ||
323 | .matches = { | ||
324 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
325 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4"), | ||
326 | }, | ||
327 | .driver_data = (void *)&nvidia_chipset_data, | ||
328 | }, | ||
329 | { | ||
330 | .callback = mbp_dmi_match, | ||
331 | .ident = "MacBookPro 5,5", | ||
332 | .matches = { | ||
333 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
334 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,5"), | ||
335 | }, | ||
336 | .driver_data = (void *)&nvidia_chipset_data, | ||
337 | }, | ||
338 | { | ||
339 | .callback = mbp_dmi_match, | ||
340 | .ident = "MacBookAir 3,1", | ||
341 | .matches = { | ||
342 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
343 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,1"), | ||
344 | }, | ||
345 | .driver_data = (void *)&nvidia_chipset_data, | ||
346 | }, | ||
347 | { | ||
348 | .callback = mbp_dmi_match, | ||
349 | .ident = "MacBookAir 3,2", | ||
350 | .matches = { | ||
351 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
352 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,2"), | ||
353 | }, | ||
354 | .driver_data = (void *)&nvidia_chipset_data, | ||
355 | }, | ||
356 | { } | ||
357 | }; | ||
358 | 153 | ||
359 | static int __init mbp_init(void) | 154 | if (host->vendor == PCI_VENDOR_ID_INTEL) |
360 | { | 155 | hw_data = &intel_chipset_data; |
361 | struct backlight_properties props; | 156 | else if (host->vendor == PCI_VENDOR_ID_NVIDIA) |
362 | if (!dmi_check_system(mbp_device_table)) | 157 | hw_data = &nvidia_chipset_data; |
158 | |||
159 | pci_dev_put(host); | ||
160 | |||
161 | if (!hw_data) { | ||
162 | printk(KERN_ERR DRIVER "unknown hardware\n"); | ||
363 | return -ENODEV; | 163 | return -ENODEV; |
164 | } | ||
364 | 165 | ||
365 | if (!request_region(driver_data->iostart, driver_data->iolen, | 166 | if (!request_region(hw_data->iostart, hw_data->iolen, |
366 | "Macbook Pro backlight")) | 167 | "Macbook backlight")) |
367 | return -ENXIO; | 168 | return -ENXIO; |
368 | 169 | ||
369 | memset(&props, 0, sizeof(struct backlight_properties)); | 170 | memset(&props, 0, sizeof(struct backlight_properties)); |
370 | props.type = BACKLIGHT_PLATFORM; | 171 | props.type = BACKLIGHT_PLATFORM; |
371 | props.max_brightness = 15; | 172 | props.max_brightness = 15; |
372 | mbp_backlight_device = backlight_device_register("mbp_backlight", NULL, | 173 | mb_backlight_device = backlight_device_register("mb_backlight", NULL, |
373 | NULL, | 174 | NULL, &hw_data->backlight_ops, &props); |
374 | &driver_data->backlight_ops, | 175 | |
375 | &props); | 176 | if (IS_ERR(mb_backlight_device)) { |
376 | if (IS_ERR(mbp_backlight_device)) { | 177 | release_region(hw_data->iostart, hw_data->iolen); |
377 | release_region(driver_data->iostart, driver_data->iolen); | 178 | return PTR_ERR(mb_backlight_device); |
378 | return PTR_ERR(mbp_backlight_device); | ||
379 | } | 179 | } |
380 | 180 | ||
381 | mbp_backlight_device->props.brightness = | 181 | mb_backlight_device->props.brightness = |
382 | driver_data->backlight_ops.get_brightness(mbp_backlight_device); | 182 | hw_data->backlight_ops.get_brightness(mb_backlight_device); |
383 | backlight_update_status(mbp_backlight_device); | 183 | backlight_update_status(mb_backlight_device); |
384 | 184 | ||
385 | return 0; | 185 | return 0; |
386 | } | 186 | } |
387 | 187 | ||
388 | static void __exit mbp_exit(void) | 188 | static int __devexit mb_bl_remove(struct acpi_device *dev, int type) |
389 | { | 189 | { |
390 | backlight_device_unregister(mbp_backlight_device); | 190 | backlight_device_unregister(mb_backlight_device); |
391 | 191 | ||
392 | release_region(driver_data->iostart, driver_data->iolen); | 192 | release_region(hw_data->iostart, hw_data->iolen); |
193 | hw_data = NULL; | ||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static const struct acpi_device_id mb_bl_ids[] = { | ||
198 | {"APP0002", 0}, | ||
199 | {"", 0}, | ||
200 | }; | ||
201 | |||
202 | static struct acpi_driver mb_bl_driver = { | ||
203 | .name = "Macbook backlight", | ||
204 | .ids = mb_bl_ids, | ||
205 | .ops = { | ||
206 | .add = mb_bl_add, | ||
207 | .remove = mb_bl_remove, | ||
208 | }, | ||
209 | }; | ||
210 | |||
211 | static int __init mb_init(void) | ||
212 | { | ||
213 | return acpi_bus_register_driver(&mb_bl_driver); | ||
214 | } | ||
215 | |||
216 | static void __exit mb_exit(void) | ||
217 | { | ||
218 | acpi_bus_unregister_driver(&mb_bl_driver); | ||
393 | } | 219 | } |
394 | 220 | ||
395 | module_init(mbp_init); | 221 | module_init(mb_init); |
396 | module_exit(mbp_exit); | 222 | module_exit(mb_exit); |
397 | 223 | ||
398 | MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); | 224 | MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); |
399 | MODULE_DESCRIPTION("Nvidia-based Macbook Pro Backlight Driver"); | 225 | MODULE_DESCRIPTION("Macbook Backlight Driver"); |
400 | MODULE_LICENSE("GPL"); | 226 | MODULE_LICENSE("GPL"); |
401 | MODULE_DEVICE_TABLE(dmi, mbp_device_table); | 227 | MODULE_DEVICE_TABLE(acpi, mb_bl_ids); |