aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/asus_acpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/asus_acpi.c')
-rw-r--r--drivers/acpi/asus_acpi.c690
1 files changed, 344 insertions, 346 deletions
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
index a560b1e2da77..fec895af6ae6 100644
--- a/drivers/acpi/asus_acpi.c
+++ b/drivers/acpi/asus_acpi.c
@@ -61,7 +61,7 @@
61/* 61/*
62 * Some events we use, same for all Asus 62 * Some events we use, same for all Asus
63 */ 63 */
64#define BR_UP 0x10 64#define BR_UP 0x10
65#define BR_DOWN 0x20 65#define BR_DOWN 0x20
66 66
67/* 67/*
@@ -75,7 +75,6 @@ MODULE_AUTHOR("Julien Lerouge, Karol Kozimor");
75MODULE_DESCRIPTION(ACPI_HOTK_NAME); 75MODULE_DESCRIPTION(ACPI_HOTK_NAME);
76MODULE_LICENSE("GPL"); 76MODULE_LICENSE("GPL");
77 77
78
79static uid_t asus_uid; 78static uid_t asus_uid;
80static gid_t asus_gid; 79static gid_t asus_gid;
81module_param(asus_uid, uint, 0); 80module_param(asus_uid, uint, 0);
@@ -83,26 +82,25 @@ MODULE_PARM_DESC(uid, "UID for entries in /proc/acpi/asus.\n");
83module_param(asus_gid, uint, 0); 82module_param(asus_gid, uint, 0);
84MODULE_PARM_DESC(gid, "GID for entries in /proc/acpi/asus.\n"); 83MODULE_PARM_DESC(gid, "GID for entries in /proc/acpi/asus.\n");
85 84
86
87/* For each model, all features implemented, 85/* For each model, all features implemented,
88 * those marked with R are relative to HOTK, A for absolute */ 86 * those marked with R are relative to HOTK, A for absolute */
89struct model_data { 87struct model_data {
90 char *name; //name of the laptop________________A 88 char *name; //name of the laptop________________A
91 char *mt_mled; //method to handle mled_____________R 89 char *mt_mled; //method to handle mled_____________R
92 char *mled_status; //node to handle mled reading_______A 90 char *mled_status; //node to handle mled reading_______A
93 char *mt_wled; //method to handle wled_____________R 91 char *mt_wled; //method to handle wled_____________R
94 char *wled_status; //node to handle wled reading_______A 92 char *wled_status; //node to handle wled reading_______A
95 char *mt_tled; //method to handle tled_____________R 93 char *mt_tled; //method to handle tled_____________R
96 char *tled_status; //node to handle tled reading_______A 94 char *tled_status; //node to handle tled reading_______A
97 char *mt_lcd_switch; //method to turn LCD ON/OFF_________A 95 char *mt_lcd_switch; //method to turn LCD ON/OFF_________A
98 char *lcd_status; //node to read LCD panel state______A 96 char *lcd_status; //node to read LCD panel state______A
99 char *brightness_up; //method to set brightness up_______A 97 char *brightness_up; //method to set brightness up_______A
100 char *brightness_down; //guess what ?______________________A 98 char *brightness_down; //guess what ?______________________A
101 char *brightness_set; //method to set absolute brightness_R 99 char *brightness_set; //method to set absolute brightness_R
102 char *brightness_get; //method to get absolute brightness_R 100 char *brightness_get; //method to get absolute brightness_R
103 char *brightness_status; //node to get brightness____________A 101 char *brightness_status; //node to get brightness____________A
104 char *display_set; //method to set video output________R 102 char *display_set; //method to set video output________R
105 char *display_get; //method to get video output________R 103 char *display_get; //method to get video output________R
106}; 104};
107 105
108/* 106/*
@@ -110,34 +108,34 @@ struct model_data {
110 * about the hotk device 108 * about the hotk device
111 */ 109 */
112struct asus_hotk { 110struct asus_hotk {
113 struct acpi_device *device; //the device we are in 111 struct acpi_device *device; //the device we are in
114 acpi_handle handle; //the handle of the hotk device 112 acpi_handle handle; //the handle of the hotk device
115 char status; //status of the hotk, for LEDs, ... 113 char status; //status of the hotk, for LEDs, ...
116 struct model_data *methods; //methods available on the laptop 114 struct model_data *methods; //methods available on the laptop
117 u8 brightness; //brightness level 115 u8 brightness; //brightness level
118 enum { 116 enum {
119 A1x = 0, //A1340D, A1300F 117 A1x = 0, //A1340D, A1300F
120 A2x, //A2500H 118 A2x, //A2500H
121 D1x, //D1 119 D1x, //D1
122 L2D, //L2000D 120 L2D, //L2000D
123 L3C, //L3800C 121 L3C, //L3800C
124 L3D, //L3400D 122 L3D, //L3400D
125 L3H, //L3H, but also L2000E 123 L3H, //L3H, but also L2000E
126 L4R, //L4500R 124 L4R, //L4500R
127 L5x, //L5800C 125 L5x, //L5800C
128 L8L, //L8400L 126 L8L, //L8400L
129 M1A, //M1300A 127 M1A, //M1300A
130 M2E, //M2400E, L4400L 128 M2E, //M2400E, L4400L
131 M6N, //M6800N 129 M6N, //M6800N
132 M6R, //M6700R 130 M6R, //M6700R
133 P30, //Samsung P30 131 P30, //Samsung P30
134 S1x, //S1300A, but also L1400B and M2400A (L84F) 132 S1x, //S1300A, but also L1400B and M2400A (L84F)
135 S2x, //S200 (J1 reported), Victor MP-XP7210 133 S2x, //S200 (J1 reported), Victor MP-XP7210
136 xxN, //M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON 134 xxN, //M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON
137 //(Centrino) 135 //(Centrino)
138 END_MODEL 136 END_MODEL
139 } model; //Models currently supported 137 } model; //Models currently supported
140 u16 event_count[128]; //count for each event TODO make this better 138 u16 event_count[128]; //count for each event TODO make this better
141}; 139};
142 140
143/* Here we go */ 141/* Here we go */
@@ -150,7 +148,7 @@ struct asus_hotk {
150#define xxN_PREFIX "\\_SB.PCI0.SBRG.EC0." 148#define xxN_PREFIX "\\_SB.PCI0.SBRG.EC0."
151 149
152static struct model_data model_conf[END_MODEL] = { 150static struct model_data model_conf[END_MODEL] = {
153 /* 151 /*
154 * Those pathnames are relative to the HOTK / ATKD device : 152 * Those pathnames are relative to the HOTK / ATKD device :
155 * - mt_mled 153 * - mt_mled
156 * - mt_wled 154 * - mt_wled
@@ -165,215 +163,197 @@ static struct model_data model_conf[END_MODEL] = {
165 */ 163 */
166 164
167 { 165 {
168 .name = "A1x", 166 .name = "A1x",
169 .mt_mled = "MLED", 167 .mt_mled = "MLED",
170 .mled_status = "\\MAIL", 168 .mled_status = "\\MAIL",
171 .mt_lcd_switch = A1x_PREFIX "_Q10", 169 .mt_lcd_switch = A1x_PREFIX "_Q10",
172 .lcd_status = "\\BKLI", 170 .lcd_status = "\\BKLI",
173 .brightness_up = A1x_PREFIX "_Q0E", 171 .brightness_up = A1x_PREFIX "_Q0E",
174 .brightness_down = A1x_PREFIX "_Q0F" 172 .brightness_down = A1x_PREFIX "_Q0F"},
175 },
176 173
177 { 174 {
178 .name = "A2x", 175 .name = "A2x",
179 .mt_mled = "MLED", 176 .mt_mled = "MLED",
180 .mt_wled = "WLED", 177 .mt_wled = "WLED",
181 .wled_status = "\\SG66", 178 .wled_status = "\\SG66",
182 .mt_lcd_switch = "\\Q10", 179 .mt_lcd_switch = "\\Q10",
183 .lcd_status = "\\BAOF", 180 .lcd_status = "\\BAOF",
184 .brightness_set = "SPLV", 181 .brightness_set = "SPLV",
185 .brightness_get = "GPLV", 182 .brightness_get = "GPLV",
186 .display_set = "SDSP", 183 .display_set = "SDSP",
187 .display_get = "\\INFB" 184 .display_get = "\\INFB"},
188 },
189 185
190 { 186 {
191 .name = "D1x", 187 .name = "D1x",
192 .mt_mled = "MLED", 188 .mt_mled = "MLED",
193 .mt_lcd_switch = "\\Q0D", 189 .mt_lcd_switch = "\\Q0D",
194 .lcd_status = "\\GP11", 190 .lcd_status = "\\GP11",
195 .brightness_up = "\\Q0C", 191 .brightness_up = "\\Q0C",
196 .brightness_down = "\\Q0B", 192 .brightness_down = "\\Q0B",
197 .brightness_status = "\\BLVL", 193 .brightness_status = "\\BLVL",
198 .display_set = "SDSP", 194 .display_set = "SDSP",
199 .display_get = "\\INFB" 195 .display_get = "\\INFB"},
200 },
201 196
202 { 197 {
203 .name = "L2D", 198 .name = "L2D",
204 .mt_mled = "MLED", 199 .mt_mled = "MLED",
205 .mled_status = "\\SGP6", 200 .mled_status = "\\SGP6",
206 .mt_wled = "WLED", 201 .mt_wled = "WLED",
207 .wled_status = "\\RCP3", 202 .wled_status = "\\RCP3",
208 .mt_lcd_switch = "\\Q10", 203 .mt_lcd_switch = "\\Q10",
209 .lcd_status = "\\SGP0", 204 .lcd_status = "\\SGP0",
210 .brightness_up = "\\Q0E", 205 .brightness_up = "\\Q0E",
211 .brightness_down = "\\Q0F", 206 .brightness_down = "\\Q0F",
212 .display_set = "SDSP", 207 .display_set = "SDSP",
213 .display_get = "\\INFB" 208 .display_get = "\\INFB"},
214 },
215 209
216 { 210 {
217 .name = "L3C", 211 .name = "L3C",
218 .mt_mled = "MLED", 212 .mt_mled = "MLED",
219 .mt_wled = "WLED", 213 .mt_wled = "WLED",
220 .mt_lcd_switch = L3C_PREFIX "_Q10", 214 .mt_lcd_switch = L3C_PREFIX "_Q10",
221 .lcd_status = "\\GL32", 215 .lcd_status = "\\GL32",
222 .brightness_set = "SPLV", 216 .brightness_set = "SPLV",
223 .brightness_get = "GPLV", 217 .brightness_get = "GPLV",
224 .display_set = "SDSP", 218 .display_set = "SDSP",
225 .display_get = "\\_SB.PCI0.PCI1.VGAC.NMAP" 219 .display_get = "\\_SB.PCI0.PCI1.VGAC.NMAP"},
226 },
227 220
228 { 221 {
229 .name = "L3D", 222 .name = "L3D",
230 .mt_mled = "MLED", 223 .mt_mled = "MLED",
231 .mled_status = "\\MALD", 224 .mled_status = "\\MALD",
232 .mt_wled = "WLED", 225 .mt_wled = "WLED",
233 .mt_lcd_switch = "\\Q10", 226 .mt_lcd_switch = "\\Q10",
234 .lcd_status = "\\BKLG", 227 .lcd_status = "\\BKLG",
235 .brightness_set = "SPLV", 228 .brightness_set = "SPLV",
236 .brightness_get = "GPLV", 229 .brightness_get = "GPLV",
237 .display_set = "SDSP", 230 .display_set = "SDSP",
238 .display_get = "\\INFB" 231 .display_get = "\\INFB"},
239 },
240 232
241 { 233 {
242 .name = "L3H", 234 .name = "L3H",
243 .mt_mled = "MLED", 235 .mt_mled = "MLED",
244 .mt_wled = "WLED", 236 .mt_wled = "WLED",
245 .mt_lcd_switch = "EHK", 237 .mt_lcd_switch = "EHK",
246 .lcd_status = "\\_SB.PCI0.PM.PBC", 238 .lcd_status = "\\_SB.PCI0.PM.PBC",
247 .brightness_set = "SPLV", 239 .brightness_set = "SPLV",
248 .brightness_get = "GPLV", 240 .brightness_get = "GPLV",
249 .display_set = "SDSP", 241 .display_set = "SDSP",
250 .display_get = "\\INFB" 242 .display_get = "\\INFB"},
251 },
252 243
253 { 244 {
254 .name = "L4R", 245 .name = "L4R",
255 .mt_mled = "MLED", 246 .mt_mled = "MLED",
256 .mt_wled = "WLED", 247 .mt_wled = "WLED",
257 .wled_status = "\\_SB.PCI0.SBRG.SG13", 248 .wled_status = "\\_SB.PCI0.SBRG.SG13",
258 .mt_lcd_switch = xxN_PREFIX "_Q10", 249 .mt_lcd_switch = xxN_PREFIX "_Q10",
259 .lcd_status = "\\_SB.PCI0.SBSM.SEO4", 250 .lcd_status = "\\_SB.PCI0.SBSM.SEO4",
260 .brightness_set = "SPLV", 251 .brightness_set = "SPLV",
261 .brightness_get = "GPLV", 252 .brightness_get = "GPLV",
262 .display_set = "SDSP", 253 .display_set = "SDSP",
263 .display_get = "\\_SB.PCI0.P0P1.VGA.GETD" 254 .display_get = "\\_SB.PCI0.P0P1.VGA.GETD"},
264 },
265 255
266 { 256 {
267 .name = "L5x", 257 .name = "L5x",
268 .mt_mled = "MLED", 258 .mt_mled = "MLED",
269/* WLED present, but not controlled by ACPI */ 259/* WLED present, but not controlled by ACPI */
270 .mt_tled = "TLED", 260 .mt_tled = "TLED",
271 .mt_lcd_switch = "\\Q0D", 261 .mt_lcd_switch = "\\Q0D",
272 .lcd_status = "\\BAOF", 262 .lcd_status = "\\BAOF",
273 .brightness_set = "SPLV", 263 .brightness_set = "SPLV",
274 .brightness_get = "GPLV", 264 .brightness_get = "GPLV",
275 .display_set = "SDSP", 265 .display_set = "SDSP",
276 .display_get = "\\INFB" 266 .display_get = "\\INFB"},
277 },
278 267
279 { 268 {
280 .name = "L8L" 269 .name = "L8L"
281/* No features, but at least support the hotkeys */ 270/* No features, but at least support the hotkeys */
282 }, 271 },
283 272
284 { 273 {
285 .name = "M1A", 274 .name = "M1A",
286 .mt_mled = "MLED", 275 .mt_mled = "MLED",
287 .mt_lcd_switch = M1A_PREFIX "Q10", 276 .mt_lcd_switch = M1A_PREFIX "Q10",
288 .lcd_status = "\\PNOF", 277 .lcd_status = "\\PNOF",
289 .brightness_up = M1A_PREFIX "Q0E", 278 .brightness_up = M1A_PREFIX "Q0E",
290 .brightness_down = M1A_PREFIX "Q0F", 279 .brightness_down = M1A_PREFIX "Q0F",
291 .brightness_status = "\\BRIT", 280 .brightness_status = "\\BRIT",
292 .display_set = "SDSP", 281 .display_set = "SDSP",
293 .display_get = "\\INFB" 282 .display_get = "\\INFB"},
294 },
295 283
296 { 284 {
297 .name = "M2E", 285 .name = "M2E",
298 .mt_mled = "MLED", 286 .mt_mled = "MLED",
299 .mt_wled = "WLED", 287 .mt_wled = "WLED",
300 .mt_lcd_switch = "\\Q10", 288 .mt_lcd_switch = "\\Q10",
301 .lcd_status = "\\GP06", 289 .lcd_status = "\\GP06",
302 .brightness_set = "SPLV", 290 .brightness_set = "SPLV",
303 .brightness_get = "GPLV", 291 .brightness_get = "GPLV",
304 .display_set = "SDSP", 292 .display_set = "SDSP",
305 .display_get = "\\INFB" 293 .display_get = "\\INFB"},
306 },
307 294
308 { 295 {
309 .name = "M6N", 296 .name = "M6N",
310 .mt_mled = "MLED", 297 .mt_mled = "MLED",
311 .mt_wled = "WLED", 298 .mt_wled = "WLED",
312 .wled_status = "\\_SB.PCI0.SBRG.SG13", 299 .wled_status = "\\_SB.PCI0.SBRG.SG13",
313 .mt_lcd_switch = xxN_PREFIX "_Q10", 300 .mt_lcd_switch = xxN_PREFIX "_Q10",
314 .lcd_status = "\\_SB.BKLT", 301 .lcd_status = "\\_SB.BKLT",
315 .brightness_set = "SPLV", 302 .brightness_set = "SPLV",
316 .brightness_get = "GPLV", 303 .brightness_get = "GPLV",
317 .display_set = "SDSP", 304 .display_set = "SDSP",
318 .display_get = "\\SSTE" 305 .display_get = "\\SSTE"},
319 },
320 { 306 {
321 .name = "M6R", 307 .name = "M6R",
322 .mt_mled = "MLED", 308 .mt_mled = "MLED",
323 .mt_wled = "WLED", 309 .mt_wled = "WLED",
324 .mt_lcd_switch = xxN_PREFIX "_Q10", 310 .mt_lcd_switch = xxN_PREFIX "_Q10",
325 .lcd_status = "\\_SB.PCI0.SBSM.SEO4", 311 .lcd_status = "\\_SB.PCI0.SBSM.SEO4",
326 .brightness_set = "SPLV", 312 .brightness_set = "SPLV",
327 .brightness_get = "GPLV", 313 .brightness_get = "GPLV",
328 .display_set = "SDSP", 314 .display_set = "SDSP",
329 .display_get = "\\SSTE" 315 .display_get = "\\SSTE"},
330 },
331
332 316
333 { 317 {
334 .name = "P30", 318 .name = "P30",
335 .mt_wled = "WLED", 319 .mt_wled = "WLED",
336 .mt_lcd_switch = P30_PREFIX "_Q0E", 320 .mt_lcd_switch = P30_PREFIX "_Q0E",
337 .lcd_status = "\\BKLT", 321 .lcd_status = "\\BKLT",
338 .brightness_up = P30_PREFIX "_Q68", 322 .brightness_up = P30_PREFIX "_Q68",
339 .brightness_down = P30_PREFIX "_Q69", 323 .brightness_down = P30_PREFIX "_Q69",
340 .brightness_get = "GPLV", 324 .brightness_get = "GPLV",
341 .display_set = "SDSP", 325 .display_set = "SDSP",
342 .display_get = "\\DNXT" 326 .display_get = "\\DNXT"},
343 },
344 327
345 { 328 {
346 .name = "S1x", 329 .name = "S1x",
347 .mt_mled = "MLED", 330 .mt_mled = "MLED",
348 .mled_status = "\\EMLE", 331 .mled_status = "\\EMLE",
349 .mt_wled = "WLED", 332 .mt_wled = "WLED",
350 .mt_lcd_switch = S1x_PREFIX "Q10" , 333 .mt_lcd_switch = S1x_PREFIX "Q10",
351 .lcd_status = "\\PNOF", 334 .lcd_status = "\\PNOF",
352 .brightness_set = "SPLV", 335 .brightness_set = "SPLV",
353 .brightness_get = "GPLV" 336 .brightness_get = "GPLV"},
354 },
355 337
356 { 338 {
357 .name = "S2x", 339 .name = "S2x",
358 .mt_mled = "MLED", 340 .mt_mled = "MLED",
359 .mled_status = "\\MAIL", 341 .mled_status = "\\MAIL",
360 .mt_lcd_switch = S2x_PREFIX "_Q10", 342 .mt_lcd_switch = S2x_PREFIX "_Q10",
361 .lcd_status = "\\BKLI", 343 .lcd_status = "\\BKLI",
362 .brightness_up = S2x_PREFIX "_Q0B", 344 .brightness_up = S2x_PREFIX "_Q0B",
363 .brightness_down = S2x_PREFIX "_Q0A" 345 .brightness_down = S2x_PREFIX "_Q0A"},
364 },
365 346
366 { 347 {
367 .name = "xxN", 348 .name = "xxN",
368 .mt_mled = "MLED", 349 .mt_mled = "MLED",
369/* WLED present, but not controlled by ACPI */ 350/* WLED present, but not controlled by ACPI */
370 .mt_lcd_switch = xxN_PREFIX "_Q10", 351 .mt_lcd_switch = xxN_PREFIX "_Q10",
371 .lcd_status = "\\BKLT", 352 .lcd_status = "\\BKLT",
372 .brightness_set = "SPLV", 353 .brightness_set = "SPLV",
373 .brightness_get = "GPLV", 354 .brightness_get = "GPLV",
374 .display_set = "SDSP", 355 .display_set = "SDSP",
375 .display_get = "\\ADVG" 356 .display_get = "\\ADVG"}
376 }
377}; 357};
378 358
379/* procdir we use */ 359/* procdir we use */
@@ -395,13 +375,13 @@ static struct asus_hotk *hotk;
395static int asus_hotk_add(struct acpi_device *device); 375static int asus_hotk_add(struct acpi_device *device);
396static int asus_hotk_remove(struct acpi_device *device, int type); 376static int asus_hotk_remove(struct acpi_device *device, int type);
397static struct acpi_driver asus_hotk_driver = { 377static struct acpi_driver asus_hotk_driver = {
398 .name = ACPI_HOTK_NAME, 378 .name = ACPI_HOTK_NAME,
399 .class = ACPI_HOTK_CLASS, 379 .class = ACPI_HOTK_CLASS,
400 .ids = ACPI_HOTK_HID, 380 .ids = ACPI_HOTK_HID,
401 .ops = { 381 .ops = {
402 .add = asus_hotk_add, 382 .add = asus_hotk_add,
403 .remove = asus_hotk_remove, 383 .remove = asus_hotk_remove,
404 }, 384 },
405}; 385};
406 386
407/* 387/*
@@ -423,11 +403,10 @@ static int write_acpi_int(acpi_handle handle, const char *method, int val,
423 in_obj.type = ACPI_TYPE_INTEGER; 403 in_obj.type = ACPI_TYPE_INTEGER;
424 in_obj.integer.value = val; 404 in_obj.integer.value = val;
425 405
426 status = acpi_evaluate_object(handle, (char *) method, &params, output); 406 status = acpi_evaluate_object(handle, (char *)method, &params, output);
427 return (status == AE_OK); 407 return (status == AE_OK);
428} 408}
429 409
430
431static int read_acpi_int(acpi_handle handle, const char *method, int *val) 410static int read_acpi_int(acpi_handle handle, const char *method, int *val)
432{ 411{
433 struct acpi_buffer output; 412 struct acpi_buffer output;
@@ -437,7 +416,7 @@ static int read_acpi_int(acpi_handle handle, const char *method, int *val)
437 output.length = sizeof(out_obj); 416 output.length = sizeof(out_obj);
438 output.pointer = &out_obj; 417 output.pointer = &out_obj;
439 418
440 status = acpi_evaluate_object(handle, (char *) method, NULL, &output); 419 status = acpi_evaluate_object(handle, (char *)method, NULL, &output);
441 *val = out_obj.integer.value; 420 *val = out_obj.integer.value;
442 return (status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER); 421 return (status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER);
443} 422}
@@ -449,7 +428,7 @@ static int read_acpi_int(acpi_handle handle, const char *method, int *val)
449 */ 428 */
450static int 429static int
451proc_read_info(char *page, char **start, off_t off, int count, int *eof, 430proc_read_info(char *page, char **start, off_t off, int count, int *eof,
452 void *data) 431 void *data)
453{ 432{
454 int len = 0; 433 int len = 0;
455 int temp; 434 int temp;
@@ -460,7 +439,7 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
460 */ 439 */
461 440
462 len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n"); 441 len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n");
463 len += sprintf(page + len, "Model reference : %s\n", 442 len += sprintf(page + len, "Model reference : %s\n",
464 hotk->methods->name); 443 hotk->methods->name);
465 /* 444 /*
466 * The SFUN method probably allows the original driver to get the list 445 * The SFUN method probably allows the original driver to get the list
@@ -469,7 +448,8 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
469 * The significance of others is yet to be found. 448 * The significance of others is yet to be found.
470 */ 449 */
471 if (read_acpi_int(hotk->handle, "SFUN", &temp)) 450 if (read_acpi_int(hotk->handle, "SFUN", &temp))
472 len += sprintf(page + len, "SFUN value : 0x%04x\n", temp); 451 len +=
452 sprintf(page + len, "SFUN value : 0x%04x\n", temp);
473 /* 453 /*
474 * Another value for userspace: the ASYM method returns 0x02 for 454 * Another value for userspace: the ASYM method returns 0x02 for
475 * battery low and 0x04 for battery critical, its readings tend to be 455 * battery low and 0x04 for battery critical, its readings tend to be
@@ -478,7 +458,8 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
478 * silently ignored. 458 * silently ignored.
479 */ 459 */
480 if (read_acpi_int(hotk->handle, "ASYM", &temp)) 460 if (read_acpi_int(hotk->handle, "ASYM", &temp))
481 len += sprintf(page + len, "ASYM value : 0x%04x\n", temp); 461 len +=
462 sprintf(page + len, "ASYM value : 0x%04x\n", temp);
482 if (asus_info) { 463 if (asus_info) {
483 snprintf(buf, 16, "%d", asus_info->length); 464 snprintf(buf, 16, "%d", asus_info->length);
484 len += sprintf(page + len, "DSDT length : %s\n", buf); 465 len += sprintf(page + len, "DSDT length : %s\n", buf);
@@ -501,7 +482,6 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
501 return len; 482 return len;
502} 483}
503 484
504
505/* 485/*
506 * /proc handlers 486 * /proc handlers
507 * We write our info in page, we begin at offset off and cannot write more 487 * We write our info in page, we begin at offset off and cannot write more
@@ -510,8 +490,7 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
510 */ 490 */
511 491
512/* Generic LED functions */ 492/* Generic LED functions */
513static int 493static int read_led(const char *ledname, int ledmask)
514read_led(const char *ledname, int ledmask)
515{ 494{
516 if (ledname) { 495 if (ledname) {
517 int led_status; 496 int led_status;
@@ -525,7 +504,7 @@ read_led(const char *ledname, int ledmask)
525 return (hotk->status & ledmask) ? 1 : 0; 504 return (hotk->status & ledmask) ? 1 : 0;
526} 505}
527 506
528static int parse_arg(const char __user *buf, unsigned long count, int *val) 507static int parse_arg(const char __user * buf, unsigned long count, int *val)
529{ 508{
530 char s[32]; 509 char s[32];
531 if (!count) 510 if (!count)
@@ -542,8 +521,8 @@ static int parse_arg(const char __user *buf, unsigned long count, int *val)
542 521
543/* FIXME: kill extraneous args so it can be called independently */ 522/* FIXME: kill extraneous args so it can be called independently */
544static int 523static int
545write_led(const char __user *buffer, unsigned long count, 524write_led(const char __user * buffer, unsigned long count,
546 char *ledname, int ledmask, int invert) 525 char *ledname, int ledmask, int invert)
547{ 526{
548 int value; 527 int value;
549 int led_out = 0; 528 int led_out = 0;
@@ -555,16 +534,16 @@ write_led(const char __user *buffer, unsigned long count,
555 hotk->status = 534 hotk->status =
556 (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask); 535 (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask);
557 536
558 if (invert) /* invert target value */ 537 if (invert) /* invert target value */
559 led_out = !led_out & 0x1; 538 led_out = !led_out & 0x1;
560 539
561 if (!write_acpi_int(hotk->handle, ledname, led_out, NULL)) 540 if (!write_acpi_int(hotk->handle, ledname, led_out, NULL))
562 printk(KERN_WARNING "Asus ACPI: LED (%s) write failed\n", ledname); 541 printk(KERN_WARNING "Asus ACPI: LED (%s) write failed\n",
542 ledname);
563 543
564 return count; 544 return count;
565} 545}
566 546
567
568/* 547/*
569 * Proc handlers for MLED 548 * Proc handlers for MLED
570 */ 549 */
@@ -572,12 +551,12 @@ static int
572proc_read_mled(char *page, char **start, off_t off, int count, int *eof, 551proc_read_mled(char *page, char **start, off_t off, int count, int *eof,
573 void *data) 552 void *data)
574{ 553{
575 return sprintf(page, "%d\n", read_led(hotk->methods->mled_status, MLED_ON)); 554 return sprintf(page, "%d\n",
555 read_led(hotk->methods->mled_status, MLED_ON));
576} 556}
577 557
578
579static int 558static int
580proc_write_mled(struct file *file, const char __user *buffer, 559proc_write_mled(struct file *file, const char __user * buffer,
581 unsigned long count, void *data) 560 unsigned long count, void *data)
582{ 561{
583 return write_led(buffer, count, hotk->methods->mt_mled, MLED_ON, 1); 562 return write_led(buffer, count, hotk->methods->mt_mled, MLED_ON, 1);
@@ -590,11 +569,12 @@ static int
590proc_read_wled(char *page, char **start, off_t off, int count, int *eof, 569proc_read_wled(char *page, char **start, off_t off, int count, int *eof,
591 void *data) 570 void *data)
592{ 571{
593 return sprintf(page, "%d\n", read_led(hotk->methods->wled_status, WLED_ON)); 572 return sprintf(page, "%d\n",
573 read_led(hotk->methods->wled_status, WLED_ON));
594} 574}
595 575
596static int 576static int
597proc_write_wled(struct file *file, const char __user *buffer, 577proc_write_wled(struct file *file, const char __user * buffer,
598 unsigned long count, void *data) 578 unsigned long count, void *data)
599{ 579{
600 return write_led(buffer, count, hotk->methods->mt_wled, WLED_ON, 0); 580 return write_led(buffer, count, hotk->methods->mt_wled, WLED_ON, 0);
@@ -607,35 +587,36 @@ static int
607proc_read_tled(char *page, char **start, off_t off, int count, int *eof, 587proc_read_tled(char *page, char **start, off_t off, int count, int *eof,
608 void *data) 588 void *data)
609{ 589{
610 return sprintf(page, "%d\n", read_led(hotk->methods->tled_status, TLED_ON)); 590 return sprintf(page, "%d\n",
591 read_led(hotk->methods->tled_status, TLED_ON));
611} 592}
612 593
613static int 594static int
614proc_write_tled(struct file *file, const char __user *buffer, 595proc_write_tled(struct file *file, const char __user * buffer,
615 unsigned long count, void *data) 596 unsigned long count, void *data)
616{ 597{
617 return write_led(buffer, count, hotk->methods->mt_tled, TLED_ON, 0); 598 return write_led(buffer, count, hotk->methods->mt_tled, TLED_ON, 0);
618} 599}
619 600
620
621static int get_lcd_state(void) 601static int get_lcd_state(void)
622{ 602{
623 int lcd = 0; 603 int lcd = 0;
624 604
625 if (hotk->model != L3H) { 605 if (hotk->model != L3H) {
626 /* We don't have to check anything if we are here */ 606 /* We don't have to check anything if we are here */
627 if (!read_acpi_int(NULL, hotk->methods->lcd_status, &lcd)) 607 if (!read_acpi_int(NULL, hotk->methods->lcd_status, &lcd))
628 printk(KERN_WARNING "Asus ACPI: Error reading LCD status\n"); 608 printk(KERN_WARNING
629 609 "Asus ACPI: Error reading LCD status\n");
610
630 if (hotk->model == L2D) 611 if (hotk->model == L2D)
631 lcd = ~lcd; 612 lcd = ~lcd;
632 } else { /* L3H and the like have to be handled differently */ 613 } else { /* L3H and the like have to be handled differently */
633 acpi_status status = 0; 614 acpi_status status = 0;
634 struct acpi_object_list input; 615 struct acpi_object_list input;
635 union acpi_object mt_params[2]; 616 union acpi_object mt_params[2];
636 struct acpi_buffer output; 617 struct acpi_buffer output;
637 union acpi_object out_obj; 618 union acpi_object out_obj;
638 619
639 input.count = 2; 620 input.count = 2;
640 input.pointer = mt_params; 621 input.pointer = mt_params;
641 /* Note: the following values are partly guessed up, but 622 /* Note: the following values are partly guessed up, but
@@ -647,15 +628,17 @@ static int get_lcd_state(void)
647 628
648 output.length = sizeof(out_obj); 629 output.length = sizeof(out_obj);
649 output.pointer = &out_obj; 630 output.pointer = &out_obj;
650 631
651 status = acpi_evaluate_object(NULL, hotk->methods->lcd_status, &input, &output); 632 status =
633 acpi_evaluate_object(NULL, hotk->methods->lcd_status,
634 &input, &output);
652 if (status != AE_OK) 635 if (status != AE_OK)
653 return -1; 636 return -1;
654 if (out_obj.type == ACPI_TYPE_INTEGER) 637 if (out_obj.type == ACPI_TYPE_INTEGER)
655 /* That's what the AML code does */ 638 /* That's what the AML code does */
656 lcd = out_obj.integer.value >> 8; 639 lcd = out_obj.integer.value >> 8;
657 } 640 }
658 641
659 return (lcd & 1); 642 return (lcd & 1);
660} 643}
661 644
@@ -669,10 +652,13 @@ static int set_lcd_state(int value)
669 /* switch */ 652 /* switch */
670 if (hotk->model != L3H) { 653 if (hotk->model != L3H) {
671 status = 654 status =
672 acpi_evaluate_object(NULL, hotk->methods->mt_lcd_switch, 655 acpi_evaluate_object(NULL,
656 hotk->methods->mt_lcd_switch,
673 NULL, NULL); 657 NULL, NULL);
674 } else { /* L3H and the like have to be handled differently */ 658 } else { /* L3H and the like have to be handled differently */
675 if (!write_acpi_int(hotk->handle, hotk->methods->mt_lcd_switch, 0x07, NULL)) 659 if (!write_acpi_int
660 (hotk->handle, hotk->methods->mt_lcd_switch, 0x07,
661 NULL))
676 status = AE_ERROR; 662 status = AE_ERROR;
677 /* L3H's AML executes EHK (0x07) upon Fn+F7 keypress, 663 /* L3H's AML executes EHK (0x07) upon Fn+F7 keypress,
678 the exact behaviour is simulated here */ 664 the exact behaviour is simulated here */
@@ -691,33 +677,33 @@ proc_read_lcd(char *page, char **start, off_t off, int count, int *eof,
691 return sprintf(page, "%d\n", get_lcd_state()); 677 return sprintf(page, "%d\n", get_lcd_state());
692} 678}
693 679
694
695static int 680static int
696proc_write_lcd(struct file *file, const char __user *buffer, 681proc_write_lcd(struct file *file, const char __user * buffer,
697 unsigned long count, void *data) 682 unsigned long count, void *data)
698{ 683{
699 int value; 684 int value;
700 685
701 count = parse_arg(buffer, count, &value); 686 count = parse_arg(buffer, count, &value);
702 if (count > 0) 687 if (count > 0)
703 set_lcd_state(value); 688 set_lcd_state(value);
704 return count; 689 return count;
705} 690}
706 691
707
708static int read_brightness(void) 692static int read_brightness(void)
709{ 693{
710 int value; 694 int value;
711 695
712 if(hotk->methods->brightness_get) { /* SPLV/GPLV laptop */ 696 if (hotk->methods->brightness_get) { /* SPLV/GPLV laptop */
713 if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get, 697 if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get,
714 &value)) 698 &value))
715 printk(KERN_WARNING "Asus ACPI: Error reading brightness\n"); 699 printk(KERN_WARNING
716 } else if (hotk->methods->brightness_status) { /* For D1 for example */ 700 "Asus ACPI: Error reading brightness\n");
717 if (!read_acpi_int(NULL, hotk->methods->brightness_status, 701 } else if (hotk->methods->brightness_status) { /* For D1 for example */
702 if (!read_acpi_int(NULL, hotk->methods->brightness_status,
718 &value)) 703 &value))
719 printk(KERN_WARNING "Asus ACPI: Error reading brightness\n"); 704 printk(KERN_WARNING
720 } else /* No GPLV method */ 705 "Asus ACPI: Error reading brightness\n");
706 } else /* No GPLV method */
721 value = hotk->brightness; 707 value = hotk->brightness;
722 return value; 708 return value;
723} 709}
@@ -730,23 +716,25 @@ static void set_brightness(int value)
730 acpi_status status = 0; 716 acpi_status status = 0;
731 717
732 /* SPLV laptop */ 718 /* SPLV laptop */
733 if(hotk->methods->brightness_set) { 719 if (hotk->methods->brightness_set) {
734 if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set, 720 if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set,
735 value, NULL)) 721 value, NULL))
736 printk(KERN_WARNING "Asus ACPI: Error changing brightness\n"); 722 printk(KERN_WARNING
723 "Asus ACPI: Error changing brightness\n");
737 return; 724 return;
738 } 725 }
739 726
740 /* No SPLV method if we are here, act as appropriate */ 727 /* No SPLV method if we are here, act as appropriate */
741 value -= read_brightness(); 728 value -= read_brightness();
742 while (value != 0) { 729 while (value != 0) {
743 status = acpi_evaluate_object(NULL, (value > 0) ? 730 status = acpi_evaluate_object(NULL, (value > 0) ?
744 hotk->methods->brightness_up : 731 hotk->methods->brightness_up :
745 hotk->methods->brightness_down, 732 hotk->methods->brightness_down,
746 NULL, NULL); 733 NULL, NULL);
747 (value > 0) ? value-- : value++; 734 (value > 0) ? value-- : value++;
748 if (ACPI_FAILURE(status)) 735 if (ACPI_FAILURE(status))
749 printk(KERN_WARNING "Asus ACPI: Error changing brightness\n"); 736 printk(KERN_WARNING
737 "Asus ACPI: Error changing brightness\n");
750 } 738 }
751 return; 739 return;
752} 740}
@@ -759,7 +747,7 @@ proc_read_brn(char *page, char **start, off_t off, int count, int *eof,
759} 747}
760 748
761static int 749static int
762proc_write_brn(struct file *file, const char __user *buffer, 750proc_write_brn(struct file *file, const char __user * buffer,
763 unsigned long count, void *data) 751 unsigned long count, void *data)
764{ 752{
765 int value; 753 int value;
@@ -767,7 +755,7 @@ proc_write_brn(struct file *file, const char __user *buffer,
767 count = parse_arg(buffer, count, &value); 755 count = parse_arg(buffer, count, &value);
768 if (count > 0) { 756 if (count > 0) {
769 value = (0 < value) ? ((15 < value) ? 15 : value) : 0; 757 value = (0 < value) ? ((15 < value) ? 15 : value) : 0;
770 /* 0 <= value <= 15 */ 758 /* 0 <= value <= 15 */
771 set_brightness(value); 759 set_brightness(value);
772 } else if (count < 0) { 760 } else if (count < 0) {
773 printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); 761 printk(KERN_WARNING "Asus ACPI: Error reading user input\n");
@@ -779,7 +767,7 @@ proc_write_brn(struct file *file, const char __user *buffer,
779static void set_display(int value) 767static void set_display(int value)
780{ 768{
781 /* no sanity check needed for now */ 769 /* no sanity check needed for now */
782 if (!write_acpi_int(hotk->handle, hotk->methods->display_set, 770 if (!write_acpi_int(hotk->handle, hotk->methods->display_set,
783 value, NULL)) 771 value, NULL))
784 printk(KERN_WARNING "Asus ACPI: Error setting display\n"); 772 printk(KERN_WARNING "Asus ACPI: Error setting display\n");
785 return; 773 return;
@@ -791,13 +779,14 @@ static void set_display(int value)
791 */ 779 */
792static int 780static int
793proc_read_disp(char *page, char **start, off_t off, int count, int *eof, 781proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
794 void *data) 782 void *data)
795{ 783{
796 int value = 0; 784 int value = 0;
797 785
798 if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value)) 786 if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value))
799 printk(KERN_WARNING "Asus ACPI: Error reading display status\n"); 787 printk(KERN_WARNING
800 value &= 0x07; /* needed for some models, shouldn't hurt others */ 788 "Asus ACPI: Error reading display status\n");
789 value &= 0x07; /* needed for some models, shouldn't hurt others */
801 return sprintf(page, "%d\n", value); 790 return sprintf(page, "%d\n", value);
802} 791}
803 792
@@ -808,8 +797,8 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
808 * simultaneously, so be warned. See the acpi4asus README for more info. 797 * simultaneously, so be warned. See the acpi4asus README for more info.
809 */ 798 */
810static int 799static int
811proc_write_disp(struct file *file, const char __user *buffer, 800proc_write_disp(struct file *file, const char __user * buffer,
812 unsigned long count, void *data) 801 unsigned long count, void *data)
813{ 802{
814 int value; 803 int value;
815 804
@@ -822,19 +811,19 @@ proc_write_disp(struct file *file, const char __user *buffer,
822 return count; 811 return count;
823} 812}
824 813
825 814typedef int (proc_readfunc) (char *page, char **start, off_t off, int count,
826typedef int (proc_readfunc)(char *page, char **start, off_t off, int count, 815 int *eof, void *data);
827 int *eof, void *data); 816typedef int (proc_writefunc) (struct file * file, const char __user * buffer,
828typedef int (proc_writefunc)(struct file *file, const char __user *buffer, 817 unsigned long count, void *data);
829 unsigned long count, void *data);
830 818
831static int 819static int
832__init asus_proc_add(char *name, proc_writefunc *writefunc, 820__init asus_proc_add(char *name, proc_writefunc * writefunc,
833 proc_readfunc *readfunc, mode_t mode, 821 proc_readfunc * readfunc, mode_t mode,
834 struct acpi_device *device) 822 struct acpi_device *device)
835{ 823{
836 struct proc_dir_entry *proc = create_proc_entry(name, mode, acpi_device_dir(device)); 824 struct proc_dir_entry *proc =
837 if(!proc) { 825 create_proc_entry(name, mode, acpi_device_dir(device));
826 if (!proc) {
838 printk(KERN_WARNING " Unable to create %s fs entry\n", name); 827 printk(KERN_WARNING " Unable to create %s fs entry\n", name);
839 return -1; 828 return -1;
840 } 829 }
@@ -851,14 +840,14 @@ static int __init asus_hotk_add_fs(struct acpi_device *device)
851{ 840{
852 struct proc_dir_entry *proc; 841 struct proc_dir_entry *proc;
853 mode_t mode; 842 mode_t mode;
854 843
855 /* 844 /*
856 * If parameter uid or gid is not changed, keep the default setting for 845 * If parameter uid or gid is not changed, keep the default setting for
857 * our proc entries (-rw-rw-rw-) else, it means we care about security, 846 * our proc entries (-rw-rw-rw-) else, it means we care about security,
858 * and then set to -rw-rw---- 847 * and then set to -rw-rw----
859 */ 848 */
860 849
861 if ((asus_uid == 0) && (asus_gid == 0)){ 850 if ((asus_uid == 0) && (asus_gid == 0)) {
862 mode = S_IFREG | S_IRUGO | S_IWUGO; 851 mode = S_IFREG | S_IRUGO | S_IWUGO;
863 } else { 852 } else {
864 mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; 853 mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP;
@@ -881,15 +870,18 @@ static int __init asus_hotk_add_fs(struct acpi_device *device)
881 } 870 }
882 871
883 if (hotk->methods->mt_wled) { 872 if (hotk->methods->mt_wled) {
884 asus_proc_add(PROC_WLED, &proc_write_wled, &proc_read_wled, mode, device); 873 asus_proc_add(PROC_WLED, &proc_write_wled, &proc_read_wled,
874 mode, device);
885 } 875 }
886 876
887 if (hotk->methods->mt_mled) { 877 if (hotk->methods->mt_mled) {
888 asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled, mode, device); 878 asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled,
879 mode, device);
889 } 880 }
890 881
891 if (hotk->methods->mt_tled) { 882 if (hotk->methods->mt_tled) {
892 asus_proc_add(PROC_TLED, &proc_write_tled, &proc_read_tled, mode, device); 883 asus_proc_add(PROC_TLED, &proc_write_tled, &proc_read_tled,
884 mode, device);
893 } 885 }
894 886
895 /* 887 /*
@@ -897,35 +889,40 @@ static int __init asus_hotk_add_fs(struct acpi_device *device)
897 * from keyboard 889 * from keyboard
898 */ 890 */
899 if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) { 891 if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) {
900 asus_proc_add(PROC_LCD, &proc_write_lcd, &proc_read_lcd, mode, device); 892 asus_proc_add(PROC_LCD, &proc_write_lcd, &proc_read_lcd, mode,
893 device);
901 } 894 }
902 895
903 if ((hotk->methods->brightness_up && hotk->methods->brightness_down) || 896 if ((hotk->methods->brightness_up && hotk->methods->brightness_down) ||
904 (hotk->methods->brightness_get && hotk->methods->brightness_set)) { 897 (hotk->methods->brightness_get && hotk->methods->brightness_set)) {
905 asus_proc_add(PROC_BRN, &proc_write_brn, &proc_read_brn, mode, device); 898 asus_proc_add(PROC_BRN, &proc_write_brn, &proc_read_brn, mode,
899 device);
906 } 900 }
907 901
908 if (hotk->methods->display_set) { 902 if (hotk->methods->display_set) {
909 asus_proc_add(PROC_DISP, &proc_write_disp, &proc_read_disp, mode, device); 903 asus_proc_add(PROC_DISP, &proc_write_disp, &proc_read_disp,
904 mode, device);
910 } 905 }
911 906
912 return 0; 907 return 0;
913} 908}
914 909
915static int asus_hotk_remove_fs(struct acpi_device* device) 910static int asus_hotk_remove_fs(struct acpi_device *device)
916{ 911{
917 if(acpi_device_dir(device)) { 912 if (acpi_device_dir(device)) {
918 remove_proc_entry(PROC_INFO,acpi_device_dir(device)); 913 remove_proc_entry(PROC_INFO, acpi_device_dir(device));
919 if (hotk->methods->mt_wled) 914 if (hotk->methods->mt_wled)
920 remove_proc_entry(PROC_WLED,acpi_device_dir(device)); 915 remove_proc_entry(PROC_WLED, acpi_device_dir(device));
921 if (hotk->methods->mt_mled) 916 if (hotk->methods->mt_mled)
922 remove_proc_entry(PROC_MLED,acpi_device_dir(device)); 917 remove_proc_entry(PROC_MLED, acpi_device_dir(device));
923 if (hotk->methods->mt_tled) 918 if (hotk->methods->mt_tled)
924 remove_proc_entry(PROC_TLED,acpi_device_dir(device)); 919 remove_proc_entry(PROC_TLED, acpi_device_dir(device));
925 if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) 920 if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status)
926 remove_proc_entry(PROC_LCD, acpi_device_dir(device)); 921 remove_proc_entry(PROC_LCD, acpi_device_dir(device));
927 if ((hotk->methods->brightness_up && hotk->methods->brightness_down) || 922 if ((hotk->methods->brightness_up
928 (hotk->methods->brightness_get && hotk->methods->brightness_set)) 923 && hotk->methods->brightness_down)
924 || (hotk->methods->brightness_get
925 && hotk->methods->brightness_set))
929 remove_proc_entry(PROC_BRN, acpi_device_dir(device)); 926 remove_proc_entry(PROC_BRN, acpi_device_dir(device));
930 if (hotk->methods->display_set) 927 if (hotk->methods->display_set)
931 remove_proc_entry(PROC_DISP, acpi_device_dir(device)); 928 remove_proc_entry(PROC_DISP, acpi_device_dir(device));
@@ -933,16 +930,15 @@ static int asus_hotk_remove_fs(struct acpi_device* device)
933 return 0; 930 return 0;
934} 931}
935 932
936
937static void asus_hotk_notify(acpi_handle handle, u32 event, void *data) 933static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
938{ 934{
939 /* TODO Find a better way to handle events count.*/ 935 /* TODO Find a better way to handle events count. */
940 if (!hotk) 936 if (!hotk)
941 return; 937 return;
942 938
943 if ((event & ~((u32) BR_UP)) < 16) { 939 if ((event & ~((u32) BR_UP)) < 16) {
944 hotk->brightness = (event & ~((u32) BR_UP)); 940 hotk->brightness = (event & ~((u32) BR_UP));
945 } else if ((event & ~((u32) BR_DOWN)) < 16 ) { 941 } else if ((event & ~((u32) BR_DOWN)) < 16) {
946 hotk->brightness = (event & ~((u32) BR_DOWN)); 942 hotk->brightness = (event & ~((u32) BR_DOWN));
947 } 943 }
948 944
@@ -976,7 +972,7 @@ static int __init asus_hotk_get_info(void)
976 if (ACPI_FAILURE(status)) 972 if (ACPI_FAILURE(status))
977 printk(KERN_WARNING " Couldn't get the DSDT table header\n"); 973 printk(KERN_WARNING " Couldn't get the DSDT table header\n");
978 else 974 else
979 asus_info = (struct acpi_table_header *) dsdt.pointer; 975 asus_info = (struct acpi_table_header *)dsdt.pointer;
980 976
981 /* We have to write 0 on init this far for all ASUS models */ 977 /* We have to write 0 on init this far for all ASUS models */
982 if (!write_acpi_int(hotk->handle, "INIT", 0, &buffer)) { 978 if (!write_acpi_int(hotk->handle, "INIT", 0, &buffer)) {
@@ -988,15 +984,17 @@ static int __init asus_hotk_get_info(void)
988 if (!read_acpi_int(hotk->handle, "BSTS", &bsts_result)) 984 if (!read_acpi_int(hotk->handle, "BSTS", &bsts_result))
989 printk(KERN_WARNING " Error calling BSTS\n"); 985 printk(KERN_WARNING " Error calling BSTS\n");
990 else if (bsts_result) 986 else if (bsts_result)
991 printk(KERN_NOTICE " BSTS called, 0x%02x returned\n", bsts_result); 987 printk(KERN_NOTICE " BSTS called, 0x%02x returned\n",
988 bsts_result);
992 989
993 /* Samsung P30 has a device with a valid _HID whose INIT does not 990 /* Samsung P30 has a device with a valid _HID whose INIT does not
994 * return anything. Catch this one and any similar here */ 991 * return anything. Catch this one and any similar here */
995 if (buffer.pointer == NULL) { 992 if (buffer.pointer == NULL) {
996 if (asus_info && /* Samsung P30 */ 993 if (asus_info && /* Samsung P30 */
997 strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) { 994 strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
998 hotk->model = P30; 995 hotk->model = P30;
999 printk(KERN_NOTICE " Samsung P30 detected, supported\n"); 996 printk(KERN_NOTICE
997 " Samsung P30 detected, supported\n");
1000 } else { 998 } else {
1001 hotk->model = M2E; 999 hotk->model = M2E;
1002 printk(KERN_WARNING " no string returned by INIT\n"); 1000 printk(KERN_WARNING " no string returned by INIT\n");
@@ -1006,10 +1004,11 @@ static int __init asus_hotk_get_info(void)
1006 hotk->methods = &model_conf[hotk->model]; 1004 hotk->methods = &model_conf[hotk->model];
1007 return AE_OK; 1005 return AE_OK;
1008 } 1006 }
1009 1007
1010 model = (union acpi_object *) buffer.pointer; 1008 model = (union acpi_object *)buffer.pointer;
1011 if (model->type == ACPI_TYPE_STRING) { 1009 if (model->type == ACPI_TYPE_STRING) {
1012 printk(KERN_NOTICE " %s model detected, ", model->string.pointer); 1010 printk(KERN_NOTICE " %s model detected, ",
1011 model->string.pointer);
1013 } 1012 }
1014 1013
1015 hotk->model = END_MODEL; 1014 hotk->model = END_MODEL;
@@ -1035,7 +1034,7 @@ static int __init asus_hotk_get_info(void)
1035 strncmp(model->string.pointer, "M6N", 3) == 0 || 1034 strncmp(model->string.pointer, "M6N", 3) == 0 ||
1036 strncmp(model->string.pointer, "S1N", 3) == 0 || 1035 strncmp(model->string.pointer, "S1N", 3) == 0 ||
1037 strncmp(model->string.pointer, "S5N", 3) == 0 || 1036 strncmp(model->string.pointer, "S5N", 3) == 0 ||
1038 strncmp(model->string.pointer, "W1N", 3) == 0) 1037 strncmp(model->string.pointer, "W1N", 3) == 0)
1039 hotk->model = xxN; 1038 hotk->model = xxN;
1040 else if (strncmp(model->string.pointer, "M1", 2) == 0) 1039 else if (strncmp(model->string.pointer, "M1", 2) == 0)
1041 hotk->model = M1A; 1040 hotk->model = M1A;
@@ -1069,21 +1068,21 @@ static int __init asus_hotk_get_info(void)
1069 1068
1070 /* Sort of per-model blacklist */ 1069 /* Sort of per-model blacklist */
1071 if (strncmp(model->string.pointer, "L2B", 3) == 0) 1070 if (strncmp(model->string.pointer, "L2B", 3) == 0)
1072 hotk->methods->lcd_status = NULL; 1071 hotk->methods->lcd_status = NULL;
1073 /* L2B is similar enough to L3C to use its settings, with this only 1072 /* L2B is similar enough to L3C to use its settings, with this only
1074 exception */ 1073 exception */
1075 else if (strncmp(model->string.pointer, "S5N", 3) == 0 || 1074 else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
1076 strncmp(model->string.pointer, "M5N", 3) == 0) 1075 strncmp(model->string.pointer, "M5N", 3) == 0)
1077 hotk->methods->mt_mled = NULL; 1076 hotk->methods->mt_mled = NULL;
1078 /* S5N and M5N have no MLED */ 1077 /* S5N and M5N have no MLED */
1079 else if (strncmp(model->string.pointer, "M2N", 3) == 0 || 1078 else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
1080 strncmp(model->string.pointer, "W1N", 3) == 0) 1079 strncmp(model->string.pointer, "W1N", 3) == 0)
1081 hotk->methods->mt_wled = "WLED"; 1080 hotk->methods->mt_wled = "WLED";
1082 /* M2N and W1N have a usable WLED */ 1081 /* M2N and W1N have a usable WLED */
1083 else if (asus_info) { 1082 else if (asus_info) {
1084 if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) 1083 if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
1085 hotk->methods->mled_status = NULL; 1084 hotk->methods->mled_status = NULL;
1086 /* S1300A reports L84F, but L1400B too, account for that */ 1085 /* S1300A reports L84F, but L1400B too, account for that */
1087 } 1086 }
1088 1087
1089 acpi_os_free(model); 1088 acpi_os_free(model);
@@ -1091,7 +1090,6 @@ static int __init asus_hotk_get_info(void)
1091 return AE_OK; 1090 return AE_OK;
1092} 1091}
1093 1092
1094
1095static int __init asus_hotk_check(void) 1093static int __init asus_hotk_check(void)
1096{ 1094{
1097 int result = 0; 1095 int result = 0;
@@ -1110,7 +1108,6 @@ static int __init asus_hotk_check(void)
1110 return result; 1108 return result;
1111} 1109}
1112 1110
1113
1114static int __init asus_hotk_add(struct acpi_device *device) 1111static int __init asus_hotk_add(struct acpi_device *device)
1115{ 1112{
1116 acpi_status status = AE_OK; 1113 acpi_status status = AE_OK;
@@ -1123,7 +1120,7 @@ static int __init asus_hotk_add(struct acpi_device *device)
1123 ASUS_ACPI_VERSION); 1120 ASUS_ACPI_VERSION);
1124 1121
1125 hotk = 1122 hotk =
1126 (struct asus_hotk *) kmalloc(sizeof(struct asus_hotk), GFP_KERNEL); 1123 (struct asus_hotk *)kmalloc(sizeof(struct asus_hotk), GFP_KERNEL);
1127 if (!hotk) 1124 if (!hotk)
1128 return -ENOMEM; 1125 return -ENOMEM;
1129 memset(hotk, 0, sizeof(struct asus_hotk)); 1126 memset(hotk, 0, sizeof(struct asus_hotk));
@@ -1134,7 +1131,6 @@ static int __init asus_hotk_add(struct acpi_device *device)
1134 acpi_driver_data(device) = hotk; 1131 acpi_driver_data(device) = hotk;
1135 hotk->device = device; 1132 hotk->device = device;
1136 1133
1137
1138 result = asus_hotk_check(); 1134 result = asus_hotk_check();
1139 if (result) 1135 if (result)
1140 goto end; 1136 goto end;
@@ -1153,17 +1149,22 @@ static int __init asus_hotk_add(struct acpi_device *device)
1153 printk(KERN_ERR " Error installing notify handler\n"); 1149 printk(KERN_ERR " Error installing notify handler\n");
1154 1150
1155 /* For laptops without GPLV: init the hotk->brightness value */ 1151 /* For laptops without GPLV: init the hotk->brightness value */
1156 if ((!hotk->methods->brightness_get) && (!hotk->methods->brightness_status) && 1152 if ((!hotk->methods->brightness_get)
1157 (hotk->methods->brightness_up && hotk->methods->brightness_down)) { 1153 && (!hotk->methods->brightness_status)
1158 status = acpi_evaluate_object(NULL, hotk->methods->brightness_down, 1154 && (hotk->methods->brightness_up
1159 NULL, NULL); 1155 && hotk->methods->brightness_down)) {
1156 status =
1157 acpi_evaluate_object(NULL, hotk->methods->brightness_down,
1158 NULL, NULL);
1160 if (ACPI_FAILURE(status)) 1159 if (ACPI_FAILURE(status))
1161 printk(KERN_WARNING " Error changing brightness\n"); 1160 printk(KERN_WARNING " Error changing brightness\n");
1162 else { 1161 else {
1163 status = acpi_evaluate_object(NULL, hotk->methods->brightness_up, 1162 status =
1164 NULL, NULL); 1163 acpi_evaluate_object(NULL,
1164 hotk->methods->brightness_up,
1165 NULL, NULL);
1165 if (ACPI_FAILURE(status)) 1166 if (ACPI_FAILURE(status))
1166 printk(KERN_WARNING " Strange, error changing" 1167 printk(KERN_WARNING " Strange, error changing"
1167 " brightness\n"); 1168 " brightness\n");
1168 } 1169 }
1169 } 1170 }
@@ -1176,7 +1177,6 @@ static int __init asus_hotk_add(struct acpi_device *device)
1176 return result; 1177 return result;
1177} 1178}
1178 1179
1179
1180static int asus_hotk_remove(struct acpi_device *device, int type) 1180static int asus_hotk_remove(struct acpi_device *device, int type)
1181{ 1181{
1182 acpi_status status = 0; 1182 acpi_status status = 0;
@@ -1196,7 +1196,6 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
1196 return 0; 1196 return 0;
1197} 1197}
1198 1198
1199
1200static int __init asus_acpi_init(void) 1199static int __init asus_acpi_init(void)
1201{ 1200{
1202 int result; 1201 int result;
@@ -1204,9 +1203,9 @@ static int __init asus_acpi_init(void)
1204 if (acpi_disabled) 1203 if (acpi_disabled)
1205 return -ENODEV; 1204 return -ENODEV;
1206 1205
1207 if (!acpi_specific_hotkey_enabled){ 1206 if (!acpi_specific_hotkey_enabled) {
1208 printk(KERN_ERR "Using generic hotkey driver\n"); 1207 printk(KERN_ERR "Using generic hotkey driver\n");
1209 return -ENODEV; 1208 return -ENODEV;
1210 } 1209 }
1211 asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir); 1210 asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir);
1212 if (!asus_proc_dir) { 1211 if (!asus_proc_dir) {
@@ -1225,7 +1224,6 @@ static int __init asus_acpi_init(void)
1225 return 0; 1224 return 0;
1226} 1225}
1227 1226
1228
1229static void __exit asus_acpi_exit(void) 1227static void __exit asus_acpi_exit(void)
1230{ 1228{
1231 acpi_bus_unregister_driver(&asus_hotk_driver); 1229 acpi_bus_unregister_driver(&asus_hotk_driver);