diff options
author | Matthew Garrett <mjg@redhat.com> | 2010-12-16 15:37:54 -0500 |
---|---|---|
committer | Matthew Garrett <mjg@redhat.com> | 2010-12-16 15:37:54 -0500 |
commit | 0988eed04e7237fdab524413e9c69bbf54cdf400 (patch) | |
tree | e1569adddcfa427a763349941643e770d67f6341 /apple_backlight.patch | |
parent | c6781123e5747130611e984918856076200f6395 (diff) | |
download | kernel-0988eed04e7237fdab524413e9c69bbf54cdf400.tar.gz kernel-0988eed04e7237fdab524413e9c69bbf54cdf400.tar.xz kernel-0988eed04e7237fdab524413e9c69bbf54cdf400.zip |
- applesmc_update.patch: Make the driver more generic. Should help Apples.
- apple_backlight.patch: Make sure that this loads on all hardware.
- efifb_update.patch: Fixes for the 11 inch Macbook Air
- acpi_reboot.patch: Should make reboot work better on most hardware
- efi_default_physical.patch: Some machines dislike EFI virtual mode
Diffstat (limited to 'apple_backlight.patch')
-rw-r--r-- | apple_backlight.patch | 688 |
1 files changed, 688 insertions, 0 deletions
diff --git a/apple_backlight.patch b/apple_backlight.patch new file mode 100644 index 000000000..c7d5a8191 --- /dev/null +++ b/apple_backlight.patch @@ -0,0 +1,688 @@ +Various fixes to the Apple backlight driver. Upstream in .38? + +diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig +index e54a337..fb5df46 100644 +--- a/drivers/video/backlight/Kconfig ++++ b/drivers/video/backlight/Kconfig +@@ -236,12 +236,12 @@ config BACKLIGHT_MAX8925 + If you have a LCD backlight connected to the WLED output of MAX8925 + WLED output, say Y here to enable this driver. + +-config BACKLIGHT_MBP_NVIDIA +- tristate "MacBook Pro Nvidia Backlight Driver" ++config BACKLIGHT_APPLE ++ tristate "Apple Backlight Driver" + depends on X86 + help +- If you have an Apple Macbook Pro with Nvidia graphics hardware say Y +- to enable a driver for its backlight ++ If you have an Intel-based Apple say Y to enable a driver for its ++ backlight + + config BACKLIGHT_TOSA + tristate "Sharp SL-6000 Backlight Driver" +diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile +index 44c0f81..ebaecc0 100644 +--- a/drivers/video/backlight/Makefile ++++ b/drivers/video/backlight/Makefile +@@ -26,7 +26,7 @@ obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o + obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o + obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o + obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o +-obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o ++obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o + obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o + obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o + obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o +diff --git a/drivers/video/backlight/apple_bl.c b/drivers/video/backlight/apple_bl.c +new file mode 100644 +index 0000000..8f808c7 +--- /dev/null ++++ b/drivers/video/backlight/apple_bl.c +@@ -0,0 +1,240 @@ ++/* ++ * Backlight Driver for Intel-based Apples ++ * ++ * Copyright (c) Red Hat <mjg@redhat.com> ++ * Based on code from Pommed: ++ * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch> ++ * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org> ++ * Copyright (C) 2007 Julien BLACHE <jb@jblache.org> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * This driver triggers SMIs which cause the firmware to change the ++ * backlight brightness. This is icky in many ways, but it's impractical to ++ * get at the firmware code in order to figure out what it's actually doing. ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/backlight.h> ++#include <linux/err.h> ++#include <linux/io.h> ++#include <linux/pci.h> ++#include <linux/acpi.h> ++ ++static struct backlight_device *apple_backlight_device; ++ ++struct hw_data { ++ /* I/O resource to allocate. */ ++ unsigned long iostart; ++ unsigned long iolen; ++ /* Backlight operations structure. */ ++ const struct backlight_ops backlight_ops; ++ void (*set_brightness)(int); ++}; ++ ++static const struct hw_data *hw_data; ++ ++#define DRIVER "apple_backlight: " ++ ++/* Module parameters. */ ++static int debug; ++module_param_named(debug, debug, int, 0644); ++MODULE_PARM_DESC(debug, "Set to one to enable debugging messages."); ++ ++/* ++ * Implementation for machines with Intel chipset. ++ */ ++static void intel_chipset_set_brightness(int intensity) ++{ ++ outb(0x04 | (intensity << 4), 0xb3); ++ outb(0xbf, 0xb2); ++} ++ ++static int intel_chipset_send_intensity(struct backlight_device *bd) ++{ ++ int intensity = bd->props.brightness; ++ ++ if (debug) ++ printk(KERN_DEBUG DRIVER "setting brightness to %d\n", ++ intensity); ++ ++ intel_chipset_set_brightness(intensity); ++ return 0; ++} ++ ++static int intel_chipset_get_intensity(struct backlight_device *bd) ++{ ++ int intensity; ++ ++ outb(0x03, 0xb3); ++ outb(0xbf, 0xb2); ++ intensity = inb(0xb3) >> 4; ++ ++ if (debug) ++ printk(KERN_DEBUG DRIVER "read brightness of %d\n", ++ intensity); ++ ++ return intensity; ++} ++ ++static const struct hw_data intel_chipset_data = { ++ .iostart = 0xb2, ++ .iolen = 2, ++ .backlight_ops = { ++ .options = BL_CORE_SUSPENDRESUME, ++ .get_brightness = intel_chipset_get_intensity, ++ .update_status = intel_chipset_send_intensity, ++ }, ++ .set_brightness = intel_chipset_set_brightness, ++}; ++ ++/* ++ * Implementation for machines with Nvidia chipset. ++ */ ++static void nvidia_chipset_set_brightness(int intensity) ++{ ++ outb(0x04 | (intensity << 4), 0x52f); ++ outb(0xbf, 0x52e); ++} ++ ++static int nvidia_chipset_send_intensity(struct backlight_device *bd) ++{ ++ int intensity = bd->props.brightness; ++ ++ if (debug) ++ printk(KERN_DEBUG DRIVER "setting brightness to %d\n", ++ intensity); ++ ++ nvidia_chipset_set_brightness(intensity); ++ return 0; ++} ++ ++static int nvidia_chipset_get_intensity(struct backlight_device *bd) ++{ ++ int intensity; ++ ++ outb(0x03, 0x52f); ++ outb(0xbf, 0x52e); ++ intensity = inb(0x52f) >> 4; ++ ++ if (debug) ++ printk(KERN_DEBUG DRIVER "read brightness of %d\n", ++ intensity); ++ ++ return intensity; ++} ++ ++static const struct hw_data nvidia_chipset_data = { ++ .iostart = 0x52e, ++ .iolen = 2, ++ .backlight_ops = { ++ .options = BL_CORE_SUSPENDRESUME, ++ .get_brightness = nvidia_chipset_get_intensity, ++ .update_status = nvidia_chipset_send_intensity ++ }, ++ .set_brightness = nvidia_chipset_set_brightness, ++}; ++ ++static int __devinit apple_bl_add(struct acpi_device *dev) ++{ ++ struct backlight_properties props; ++ struct pci_dev *host; ++ int intensity; ++ ++ host = pci_get_bus_and_slot(0, 0); ++ ++ if (!host) { ++ printk(KERN_ERR DRIVER "unable to find PCI host\n"); ++ return -ENODEV; ++ } ++ ++ if (host->vendor == PCI_VENDOR_ID_INTEL) ++ hw_data = &intel_chipset_data; ++ else if (host->vendor == PCI_VENDOR_ID_NVIDIA) ++ hw_data = &nvidia_chipset_data; ++ ++ pci_dev_put(host); ++ ++ if (!hw_data) { ++ printk(KERN_ERR DRIVER "unknown hardware\n"); ++ return -ENODEV; ++ } ++ ++ /* Check that the hardware responds - this may not work under EFI */ ++ ++ intensity = hw_data->backlight_ops.get_brightness(NULL); ++ ++ if (!intensity) { ++ hw_data->set_brightness(1); ++ if (!hw_data->backlight_ops.get_brightness(NULL)) ++ return -ENODEV; ++ ++ hw_data->set_brightness(0); ++ } ++ ++ if (!request_region(hw_data->iostart, hw_data->iolen, ++ "Apple backlight")) ++ return -ENXIO; ++ ++ memset(&props, 0, sizeof(struct backlight_properties)); ++ props.max_brightness = 15; ++ apple_backlight_device = backlight_device_register("apple_backlight", ++ NULL, NULL, &hw_data->backlight_ops, &props); ++ ++ if (IS_ERR(apple_backlight_device)) { ++ release_region(hw_data->iostart, hw_data->iolen); ++ return PTR_ERR(apple_backlight_device); ++ } ++ ++ apple_backlight_device->props.brightness = ++ hw_data->backlight_ops.get_brightness(apple_backlight_device); ++ backlight_update_status(apple_backlight_device); ++ ++ return 0; ++} ++ ++static int __devexit apple_bl_remove(struct acpi_device *dev, int type) ++{ ++ backlight_device_unregister(apple_backlight_device); ++ ++ release_region(hw_data->iostart, hw_data->iolen); ++ hw_data = NULL; ++ return 0; ++} ++ ++static const struct acpi_device_id apple_bl_ids[] = { ++ {"APP0002", 0}, ++ {"", 0}, ++}; ++ ++static struct acpi_driver apple_bl_driver = { ++ .name = "Apple backlight", ++ .ids = apple_bl_ids, ++ .ops = { ++ .add = apple_bl_add, ++ .remove = apple_bl_remove, ++ }, ++}; ++ ++static int __init apple_bl_init(void) ++{ ++ return acpi_bus_register_driver(&apple_bl_driver); ++} ++ ++static void __exit apple_bl_exit(void) ++{ ++ acpi_bus_unregister_driver(&apple_bl_driver); ++} ++ ++module_init(apple_bl_init); ++module_exit(apple_bl_exit); ++ ++MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); ++MODULE_DESCRIPTION("Apple Backlight Driver"); ++MODULE_LICENSE("GPL"); ++MODULE_DEVICE_TABLE(acpi, apple_bl_ids); ++MODULE_ALIAS("mbp_nvidia_bl"); +diff --git a/drivers/video/backlight/mbp_nvidia_bl.c b/drivers/video/backlight/mbp_nvidia_bl.c +deleted file mode 100644 +index 1485f73..0000000 +--- a/drivers/video/backlight/mbp_nvidia_bl.c ++++ /dev/null +@@ -1,400 +0,0 @@ +-/* +- * Backlight Driver for Nvidia 8600 in Macbook Pro +- * +- * Copyright (c) Red Hat <mjg@redhat.com> +- * Based on code from Pommed: +- * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch> +- * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org> +- * Copyright (C) 2007 Julien BLACHE <jb@jblache.org> +- * +- * This program is free software; you can redistribute it and/or modify +- * it under the terms of the GNU General Public License version 2 as +- * published by the Free Software Foundation. +- * +- * This driver triggers SMIs which cause the firmware to change the +- * backlight brightness. This is icky in many ways, but it's impractical to +- * get at the firmware code in order to figure out what it's actually doing. +- */ +- +-#include <linux/module.h> +-#include <linux/kernel.h> +-#include <linux/init.h> +-#include <linux/platform_device.h> +-#include <linux/backlight.h> +-#include <linux/err.h> +-#include <linux/dmi.h> +-#include <linux/io.h> +- +-static struct backlight_device *mbp_backlight_device; +- +-/* Structure to be passed to the DMI_MATCH function. */ +-struct dmi_match_data { +- /* I/O resource to allocate. */ +- unsigned long iostart; +- unsigned long iolen; +- /* Backlight operations structure. */ +- const struct backlight_ops backlight_ops; +-}; +- +-/* Module parameters. */ +-static int debug; +-module_param_named(debug, debug, int, 0644); +-MODULE_PARM_DESC(debug, "Set to one to enable debugging messages."); +- +-/* +- * Implementation for MacBooks with Intel chipset. +- */ +-static int intel_chipset_send_intensity(struct backlight_device *bd) +-{ +- int intensity = bd->props.brightness; +- +- if (debug) +- printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n", +- intensity); +- +- outb(0x04 | (intensity << 4), 0xb3); +- outb(0xbf, 0xb2); +- return 0; +-} +- +-static int intel_chipset_get_intensity(struct backlight_device *bd) +-{ +- int intensity; +- +- outb(0x03, 0xb3); +- outb(0xbf, 0xb2); +- intensity = inb(0xb3) >> 4; +- +- if (debug) +- printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n", +- intensity); +- +- return intensity; +-} +- +-static const struct dmi_match_data intel_chipset_data = { +- .iostart = 0xb2, +- .iolen = 2, +- .backlight_ops = { +- .options = BL_CORE_SUSPENDRESUME, +- .get_brightness = intel_chipset_get_intensity, +- .update_status = intel_chipset_send_intensity, +- } +-}; +- +-/* +- * Implementation for MacBooks with Nvidia chipset. +- */ +-static int nvidia_chipset_send_intensity(struct backlight_device *bd) +-{ +- int intensity = bd->props.brightness; +- +- if (debug) +- printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n", +- intensity); +- +- outb(0x04 | (intensity << 4), 0x52f); +- outb(0xbf, 0x52e); +- return 0; +-} +- +-static int nvidia_chipset_get_intensity(struct backlight_device *bd) +-{ +- int intensity; +- +- outb(0x03, 0x52f); +- outb(0xbf, 0x52e); +- intensity = inb(0x52f) >> 4; +- +- if (debug) +- printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n", +- intensity); +- +- return intensity; +-} +- +-static const struct dmi_match_data nvidia_chipset_data = { +- .iostart = 0x52e, +- .iolen = 2, +- .backlight_ops = { +- .options = BL_CORE_SUSPENDRESUME, +- .get_brightness = nvidia_chipset_get_intensity, +- .update_status = nvidia_chipset_send_intensity +- } +-}; +- +-/* +- * DMI matching. +- */ +-static /* const */ struct dmi_match_data *driver_data; +- +-static int mbp_dmi_match(const struct dmi_system_id *id) +-{ +- driver_data = id->driver_data; +- +- printk(KERN_INFO "mbp_nvidia_bl: %s detected\n", id->ident); +- return 1; +-} +- +-static const struct dmi_system_id __initdata mbp_device_table[] = { +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 1,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 2,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 3,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook3,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 4,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 4,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,2"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 1,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 1,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,2"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 2,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 2,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 3,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 3,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 4,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookAir 1,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir1,1"), +- }, +- .driver_data = (void *)&intel_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 5,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,1"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 5,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBook 6,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookAir 2,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2,1"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 5,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 5,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,2"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 5,3", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 5,4", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookPro 5,5", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,5"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookAir 3,1", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,1"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { +- .callback = mbp_dmi_match, +- .ident = "MacBookAir 3,2", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,2"), +- }, +- .driver_data = (void *)&nvidia_chipset_data, +- }, +- { } +-}; +- +-static int __init mbp_init(void) +-{ +- struct backlight_properties props; +- if (!dmi_check_system(mbp_device_table)) +- return -ENODEV; +- +- if (!request_region(driver_data->iostart, driver_data->iolen, +- "Macbook Pro backlight")) +- return -ENXIO; +- +- memset(&props, 0, sizeof(struct backlight_properties)); +- props.max_brightness = 15; +- mbp_backlight_device = backlight_device_register("mbp_backlight", NULL, +- NULL, +- &driver_data->backlight_ops, +- &props); +- if (IS_ERR(mbp_backlight_device)) { +- release_region(driver_data->iostart, driver_data->iolen); +- return PTR_ERR(mbp_backlight_device); +- } +- +- mbp_backlight_device->props.brightness = +- driver_data->backlight_ops.get_brightness(mbp_backlight_device); +- backlight_update_status(mbp_backlight_device); +- +- return 0; +-} +- +-static void __exit mbp_exit(void) +-{ +- backlight_device_unregister(mbp_backlight_device); +- +- release_region(driver_data->iostart, driver_data->iolen); +-} +- +-module_init(mbp_init); +-module_exit(mbp_exit); +- +-MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); +-MODULE_DESCRIPTION("Nvidia-based Macbook Pro Backlight Driver"); +-MODULE_LICENSE("GPL"); +-MODULE_DEVICE_TABLE(dmi, mbp_device_table); |