summaryrefslogtreecommitdiffstats
path: root/apple_backlight.patch
diff options
context:
space:
mode:
authorMatthew Garrett <mjg@redhat.com>2010-12-16 15:37:54 -0500
committerMatthew Garrett <mjg@redhat.com>2010-12-16 15:37:54 -0500
commit0988eed04e7237fdab524413e9c69bbf54cdf400 (patch)
treee1569adddcfa427a763349941643e770d67f6341 /apple_backlight.patch
parentc6781123e5747130611e984918856076200f6395 (diff)
downloadkernel-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.patch688
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);