/* * pommed - Apple laptops hotkeys handler daemon * * MacBook Backlight Control (Intel GMA950 & GMA965) * * Copyright (C) 2006-2007 Ryan Lortie * Copyright (C) 2006-2007 Julien BLACHE * + Adapted for pommed * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * * The GMA950 has a backlight control register at offset 0x00061254 in its * PCI memory space (512K region): * - bits 0-15 represent the backlight value * - bits 16 indicates legacy mode is in use when set * - bits 17-31 hold the max backlight value << 1 * * Bit 16 indicates whether the backlight control should be used in legacy * mode or not. This bit is 0 on MacBooks, indicating native mode should be * used. This is the only method supported here. * * * The GMA965 is slightly different; the backlight control register is at * offset 0x00061250 in its PCI memory space (first 512K in the 1M region): * - bits 0-15 represent the backlight value * - bits 16-31 hold the max backlight value * - bit 30 indicates legacy mode is in use when set * * * For BOTH cards, the register for the backlight value is at offset 0x00061254. * * * For both cards, in the code below, max value and current value are expressed * on 15 bits; the values are shifted as appropriate when appropriate. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "../pommed.h" #include "../conffile.h" #include "../lcd_backlight.h" #include "../dbus.h" static unsigned int GMA950_BACKLIGHT_MAX; static int fd = -1; static char *memory = NULL; static char sysfs_resource[64]; static long length = 0; #define REGISTER_OFFSET 0x00061254 #define GMA950_LEGACY_MODE (1 << 16) #define GMA950_CONTROL_REGISTER 0x00061254 #define GMA965_LEGACY_MODE (1 << 30) #define GMA965_CONTROL_REGISTER 0x00061250 static inline unsigned int readl(const volatile void *addr) { return *(volatile unsigned int*) addr; } static inline void writel(unsigned int b, volatile void *addr) { *(volatile unsigned int*) addr = b; } #define INREG(addr) readl(memory+addr) #define OUTREG(addr,val) writel(val, memory+addr) static unsigned int gma950_backlight_get(void) { return (INREG(REGISTER_OFFSET) >> 1) & 0x7fff; } static unsigned int gma950_backlight_get_max(void) { return (INREG(REGISTER_OFFSET) >> 17); } static void gma950_backlight_set(unsigned int value) { OUTREG(REGISTER_OFFSET, (GMA950_BACKLIGHT_MAX << 17) | (value << 1)); } static int gma950_backlight_map(void) { return 0; } static void gma950_backlight_unmap(void) { } void gma950_backlight_step(int dir) { } void gma950_backlight_toggle(int lvl) { } /* * We are hardware-dependent for GMA950_BACKLIGHT_MAX, * so here _fix_config() is static and called at probe time. */ static void gma950_backlight_fix_config(void) { } #define PCI_ID_VENDOR_INTEL 0x8086 #define PCI_ID_PRODUCT_GMA950 0x27A2 #define PCI_ID_PRODUCT_GMA965 0x2A02 /* Look for an Intel GMA950 or GMA965 */ int gma950_backlight_probe(void) { return 0; }