Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | /* * BK Id: SCCS/s.pmac_backlight.c 1.8 09/08/01 15:47:42 paulus */ /* * Miscellaneous procedures for dealing with the PowerMac hardware. * Contains support for the backlight. * * Copyright (C) 2000 Benjamin Herrenschmidt * */ #include <linux/config.h> #include <linux/kernel.h> #include <linux/stddef.h> #include <linux/reboot.h> #include <linux/nvram.h> #include <asm/sections.h> #include <asm/ptrace.h> #include <asm/io.h> #include <asm/pgtable.h> #include <asm/system.h> #include <asm/prom.h> #include <asm/machdep.h> #include <asm/nvram.h> #include <asm/backlight.h> #include <linux/adb.h> #include <linux/pmu.h> static struct backlight_controller *backlighter = NULL; static void* backlighter_data = NULL; static int backlight_autosave = 0; static int backlight_level = BACKLIGHT_MAX; static int backlight_enabled = 1; void __pmac register_backlight_controller(struct backlight_controller *ctrler, void *data, char *type) { struct device_node* bk_node; char *prop; int valid = 0; bk_node = find_devices("backlight"); #ifdef CONFIG_ADB_PMU /* Special case for the old PowerBook since I can't test on it */ backlight_autosave = machine_is_compatible("AAPL,3400/2400") || machine_is_compatible("AAPL,3500"); if ((backlight_autosave || machine_is_compatible("AAPL,PowerBook1998") || machine_is_compatible("PowerBook1,1")) && !strcmp(type, "pmu")) valid = 1; #endif if (bk_node) { prop = get_property(bk_node, "backlight-control", NULL); if (prop && !strncmp(prop, type, strlen(type))) valid = 1; } if (!valid) return; backlighter = ctrler; backlighter_data = data; if (bk_node && !backlight_autosave) prop = get_property(bk_node, "bklt", NULL); else prop = NULL; if (prop) { backlight_level = ((*prop)+1) >> 1; if (backlight_level > BACKLIGHT_MAX) backlight_level = BACKLIGHT_MAX; } #ifdef CONFIG_ADB_PMU if (backlight_autosave) { struct adb_request req; pmu_request(&req, NULL, 2, 0xd9, 0); while (!req.complete) pmu_poll(); backlight_level = req.reply[1] >> 4; } #endif if (!backlighter->set_enable(1, backlight_level, data)) backlight_enabled = 1; printk(KERN_INFO "Registered \"%s\" backlight controller, level: %d/15\n", type, backlight_level); } void __pmac unregister_backlight_controller(struct backlight_controller *ctrler, void *data) { /* We keep the current backlight level (for now) */ if (ctrler == backlighter && data == backlighter_data) backlighter = NULL; } int __pmac set_backlight_enable(int enable) { int rc; if (!backlighter) return -ENODEV; rc = backlighter->set_enable(enable, backlight_level, backlighter_data); if (!rc) backlight_enabled = enable; return rc; } int __pmac get_backlight_enable(void) { if (!backlighter) return -ENODEV; return backlight_enabled; } int __pmac set_backlight_level(int level) { int rc = 0; if (!backlighter) return -ENODEV; if (level < BACKLIGHT_MIN) level = BACKLIGHT_OFF; if (level > BACKLIGHT_MAX) level = BACKLIGHT_MAX; if (backlight_enabled) rc = backlighter->set_level(level, backlighter_data); if (!rc) backlight_level = level; if (!rc && !backlight_autosave) { level <<=1; if (level & 0x10) level |= 0x01; // -- todo: save to property "bklt" } return rc; } int __pmac get_backlight_level(void) { if (!backlighter) return -ENODEV; return backlight_level; } |