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/stddef.h>
12 #include <linux/reboot.h>
13 #include <linux/nvram.h>
15 #include <asm/ptrace.h>
17 #include <asm/pgtable.h>
18 #include <asm/system.h>
20 #include <asm/machdep.h>
21 #include <asm/nvram.h>
22 #include <asm/backlight.h>
24 #include <linux/adb.h>
25 #include <linux/pmu.h>
27 static struct backlight_controller
*backlighter
= NULL
;
28 static void* backlighter_data
= NULL
;
29 static int backlight_autosave
= 0;
30 static int backlight_level
= BACKLIGHT_MAX
;
31 static int backlight_enabled
= 1;
34 register_backlight_controller(struct backlight_controller
*ctrler
, void *data
, char *type
)
36 struct device_node
* bk_node
;
40 bk_node
= find_devices("backlight");
43 /* Special case for the old PowerBook since I can't test on it */
44 backlight_autosave
= machine_is_compatible("AAPL,3400/2400")
45 || machine_is_compatible("AAPL,3500");
46 if ((backlight_autosave
47 || machine_is_compatible("AAPL,PowerBook1998")
48 || machine_is_compatible("PowerBook1,1"))
49 && !strcmp(type
, "pmu"))
53 prop
= get_property(bk_node
, "backlight-control", NULL
);
54 if (prop
&& !strncmp(prop
, type
, strlen(type
)))
60 backlighter_data
= data
;
62 if (bk_node
&& !backlight_autosave
)
63 prop
= get_property(bk_node
, "bklt", NULL
);
67 backlight_level
= ((*prop
)+1) >> 1;
68 if (backlight_level
> BACKLIGHT_MAX
)
69 backlight_level
= BACKLIGHT_MAX
;
73 if (backlight_autosave
) {
74 struct adb_request req
;
75 pmu_request(&req
, NULL
, 2, 0xd9, 0);
78 backlight_level
= req
.reply
[1] >> 4;
81 if (!backlighter
->set_enable(1, backlight_level
, data
))
82 backlight_enabled
= 1;
84 printk(KERN_INFO
"Registered \"%s\" backlight controller, level: %d/15\n",
85 type
, backlight_level
);
89 unregister_backlight_controller(struct backlight_controller
*ctrler
, void *data
)
91 /* We keep the current backlight level (for now) */
92 if (ctrler
== backlighter
&& data
== backlighter_data
)
97 set_backlight_enable(int enable
)
103 rc
= backlighter
->set_enable(enable
, backlight_level
, backlighter_data
);
105 backlight_enabled
= enable
;
110 get_backlight_enable(void)
114 return backlight_enabled
;
118 set_backlight_level(int level
)
124 if (level
< BACKLIGHT_MIN
)
125 level
= BACKLIGHT_OFF
;
126 if (level
> BACKLIGHT_MAX
)
127 level
= BACKLIGHT_MAX
;
128 if (backlight_enabled
)
129 rc
= backlighter
->set_level(level
, backlighter_data
);
131 backlight_level
= level
;
132 if (!rc
&& !backlight_autosave
) {
136 // -- todo: save to property "bklt"
142 get_backlight_level(void)
146 return backlight_level
;