2 * Miscellaneous procedures for dealing with the PowerMac hardware.
3 * Contains support for the backlight.
5 * Copyright (C) 2000 Benjamin Herrenschmidt
9 #include <linux/config.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/stddef.h>
13 #include <linux/reboot.h>
14 #include <linux/nvram.h>
15 #include <asm/sections.h>
16 #include <asm/ptrace.h>
18 #include <asm/pgtable.h>
19 #include <asm/system.h>
21 #include <asm/machdep.h>
22 #include <asm/nvram.h>
23 #include <asm/backlight.h>
25 #include <linux/adb.h>
26 #include <linux/pmu.h>
28 static struct backlight_controller *backlighter = NULL;
29 static void* backlighter_data = NULL;
30 static int backlight_autosave = 0;
31 static int backlight_level = BACKLIGHT_MAX;
32 static int backlight_enabled = 1;
35 register_backlight_controller(struct backlight_controller *ctrler, void *data, char *type)
37 struct device_node* bk_node;
41 /* There's already a matching controller, bail out */
42 if (backlighter != NULL)
45 bk_node = find_devices("backlight");
48 /* Special case for the old PowerBook since I can't test on it */
49 backlight_autosave = machine_is_compatible("AAPL,3400/2400")
50 || machine_is_compatible("AAPL,3500");
51 if ((backlight_autosave
52 || machine_is_compatible("AAPL,PowerBook1998")
53 || machine_is_compatible("PowerBook1,1"))
54 && !strcmp(type, "pmu"))
58 prop = get_property(bk_node, "backlight-control", NULL);
59 if (prop && !strncmp(prop, type, strlen(type)))
65 backlighter_data = data;
67 if (bk_node && !backlight_autosave)
68 prop = get_property(bk_node, "bklt", NULL);
72 backlight_level = ((*prop)+1) >> 1;
73 if (backlight_level > BACKLIGHT_MAX)
74 backlight_level = BACKLIGHT_MAX;
78 if (backlight_autosave) {
79 struct adb_request req;
80 pmu_request(&req, NULL, 2, 0xd9, 0);
83 backlight_level = req.reply[0] >> 4;
86 if (!backlighter->set_enable(1, backlight_level, data))
87 backlight_enabled = 1;
89 printk(KERN_INFO "Registered \"%s\" backlight controller, level: %d/15\n",
90 type, backlight_level);
92 EXPORT_SYMBOL(register_backlight_controller);
95 unregister_backlight_controller(struct backlight_controller *ctrler, void *data)
97 /* We keep the current backlight level (for now) */
98 if (ctrler == backlighter && data == backlighter_data)
101 EXPORT_SYMBOL(unregister_backlight_controller);
104 set_backlight_enable(int enable)
110 rc = backlighter->set_enable(enable, backlight_level, backlighter_data);
112 backlight_enabled = enable;
115 EXPORT_SYMBOL(set_backlight_enable);
118 get_backlight_enable(void)
122 return backlight_enabled;
124 EXPORT_SYMBOL(get_backlight_enable);
127 set_backlight_level(int level)
133 if (level < BACKLIGHT_MIN)
134 level = BACKLIGHT_OFF;
135 if (level > BACKLIGHT_MAX)
136 level = BACKLIGHT_MAX;
137 if (backlight_enabled)
138 rc = backlighter->set_level(level, backlighter_data);
140 backlight_level = level;
141 if (!rc && !backlight_autosave) {
145 // -- todo: save to property "bklt"
149 EXPORT_SYMBOL(set_backlight_level);
152 get_backlight_level(void)
156 return backlight_level;
158 EXPORT_SYMBOL(get_backlight_level);