| 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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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); |