Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.28-rc3 114 lines 2.8 kB view raw
1/* 2 * Backlight Driver for Nvidia 8600 in Macbook Pro 3 * 4 * Copyright (c) Red Hat <mjg@redhat.com> 5 * Based on code from Pommed: 6 * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch> 7 * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org> 8 * Copyright (C) 2007 Julien BLACHE <jb@jblache.org> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 as 12 * published by the Free Software Foundation. 13 * 14 * This driver triggers SMIs which cause the firmware to change the 15 * backlight brightness. This is icky in many ways, but it's impractical to 16 * get at the firmware code in order to figure out what it's actually doing. 17 */ 18 19#include <linux/module.h> 20#include <linux/kernel.h> 21#include <linux/init.h> 22#include <linux/platform_device.h> 23#include <linux/backlight.h> 24#include <linux/err.h> 25#include <linux/dmi.h> 26#include <linux/io.h> 27 28static struct backlight_device *mbp_backlight_device; 29 30static struct dmi_system_id __initdata mbp_device_table[] = { 31 { 32 .ident = "3,1", 33 .matches = { 34 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), 35 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), 36 }, 37 }, 38 { 39 .ident = "3,2", 40 .matches = { 41 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), 42 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"), 43 }, 44 }, 45 { 46 .ident = "4,1", 47 .matches = { 48 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), 49 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"), 50 }, 51 }, 52 { } 53}; 54 55static int mbp_send_intensity(struct backlight_device *bd) 56{ 57 int intensity = bd->props.brightness; 58 59 outb(0x04 | (intensity << 4), 0xb3); 60 outb(0xbf, 0xb2); 61 62 return 0; 63} 64 65static int mbp_get_intensity(struct backlight_device *bd) 66{ 67 outb(0x03, 0xb3); 68 outb(0xbf, 0xb2); 69 return inb(0xb3) >> 4; 70} 71 72static struct backlight_ops mbp_ops = { 73 .get_brightness = mbp_get_intensity, 74 .update_status = mbp_send_intensity, 75}; 76 77static int __init mbp_init(void) 78{ 79 if (!dmi_check_system(mbp_device_table)) 80 return -ENODEV; 81 82 if (!request_region(0xb2, 2, "Macbook Pro backlight")) 83 return -ENXIO; 84 85 mbp_backlight_device = backlight_device_register("mbp_backlight", 86 NULL, NULL, 87 &mbp_ops); 88 if (IS_ERR(mbp_backlight_device)) { 89 release_region(0xb2, 2); 90 return PTR_ERR(mbp_backlight_device); 91 } 92 93 mbp_backlight_device->props.max_brightness = 15; 94 mbp_backlight_device->props.brightness = 95 mbp_get_intensity(mbp_backlight_device); 96 backlight_update_status(mbp_backlight_device); 97 98 return 0; 99} 100 101static void __exit mbp_exit(void) 102{ 103 backlight_device_unregister(mbp_backlight_device); 104 105 release_region(0xb2, 2); 106} 107 108module_init(mbp_init); 109module_exit(mbp_exit); 110 111MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); 112MODULE_DESCRIPTION("Nvidia-based Macbook Pro Backlight Driver"); 113MODULE_LICENSE("GPL"); 114MODULE_DEVICE_TABLE(dmi, mbp_device_table);