diff options
| -rw-r--r-- | drivers/char/i8k.c | 149 | ||||
| -rw-r--r-- | drivers/char/misc.c | 4 |
2 files changed, 47 insertions, 106 deletions
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c index 1599456bdb65..584e9a4a6f18 100644 --- a/drivers/char/i8k.c +++ b/drivers/char/i8k.c | |||
| @@ -87,14 +87,14 @@ static struct file_operations i8k_fops = { | |||
| 87 | .ioctl = i8k_ioctl, | 87 | .ioctl = i8k_ioctl, |
| 88 | }; | 88 | }; |
| 89 | 89 | ||
| 90 | typedef struct { | 90 | struct smm_regs { |
| 91 | unsigned int eax; | 91 | unsigned int eax; |
| 92 | unsigned int ebx __attribute__ ((packed)); | 92 | unsigned int ebx __attribute__ ((packed)); |
| 93 | unsigned int ecx __attribute__ ((packed)); | 93 | unsigned int ecx __attribute__ ((packed)); |
| 94 | unsigned int edx __attribute__ ((packed)); | 94 | unsigned int edx __attribute__ ((packed)); |
| 95 | unsigned int esi __attribute__ ((packed)); | 95 | unsigned int esi __attribute__ ((packed)); |
| 96 | unsigned int edi __attribute__ ((packed)); | 96 | unsigned int edi __attribute__ ((packed)); |
| 97 | } SMMRegisters; | 97 | }; |
| 98 | 98 | ||
| 99 | static inline char *i8k_get_dmi_data(int field) | 99 | static inline char *i8k_get_dmi_data(int field) |
| 100 | { | 100 | { |
| @@ -104,7 +104,7 @@ static inline char *i8k_get_dmi_data(int field) | |||
| 104 | /* | 104 | /* |
| 105 | * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. | 105 | * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. |
| 106 | */ | 106 | */ |
| 107 | static int i8k_smm(SMMRegisters * regs) | 107 | static int i8k_smm(struct smm_regs *regs) |
| 108 | { | 108 | { |
| 109 | int rc; | 109 | int rc; |
| 110 | int eax = regs->eax; | 110 | int eax = regs->eax; |
| @@ -134,9 +134,8 @@ static int i8k_smm(SMMRegisters * regs) | |||
| 134 | : "a"(regs) | 134 | : "a"(regs) |
| 135 | : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); | 135 | : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); |
| 136 | 136 | ||
| 137 | if ((rc != 0) || ((regs->eax & 0xffff) == 0xffff) || (regs->eax == eax)) { | 137 | if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) |
| 138 | return -EINVAL; | 138 | return -EINVAL; |
| 139 | } | ||
| 140 | 139 | ||
| 141 | return 0; | 140 | return 0; |
| 142 | } | 141 | } |
| @@ -147,15 +146,9 @@ static int i8k_smm(SMMRegisters * regs) | |||
| 147 | */ | 146 | */ |
| 148 | static int i8k_get_bios_version(void) | 147 | static int i8k_get_bios_version(void) |
| 149 | { | 148 | { |
| 150 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 149 | struct smm_regs regs = { .eax = I8K_SMM_BIOS_VERSION, }; |
| 151 | int rc; | ||
| 152 | |||
| 153 | regs.eax = I8K_SMM_BIOS_VERSION; | ||
| 154 | if ((rc = i8k_smm(®s)) < 0) { | ||
| 155 | return rc; | ||
| 156 | } | ||
| 157 | 150 | ||
| 158 | return regs.eax; | 151 | return i8k_smm(®s) ? : regs.eax; |
| 159 | } | 152 | } |
| 160 | 153 | ||
| 161 | /* | 154 | /* |
| @@ -163,13 +156,11 @@ static int i8k_get_bios_version(void) | |||
| 163 | */ | 156 | */ |
| 164 | static int i8k_get_fn_status(void) | 157 | static int i8k_get_fn_status(void) |
| 165 | { | 158 | { |
| 166 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 159 | struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; |
| 167 | int rc; | 160 | int rc; |
| 168 | 161 | ||
| 169 | regs.eax = I8K_SMM_FN_STATUS; | 162 | if ((rc = i8k_smm(®s)) < 0) |
| 170 | if ((rc = i8k_smm(®s)) < 0) { | ||
| 171 | return rc; | 163 | return rc; |
| 172 | } | ||
| 173 | 164 | ||
| 174 | switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { | 165 | switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { |
| 175 | case I8K_FN_UP: | 166 | case I8K_FN_UP: |
| @@ -188,20 +179,13 @@ static int i8k_get_fn_status(void) | |||
| 188 | */ | 179 | */ |
| 189 | static int i8k_get_power_status(void) | 180 | static int i8k_get_power_status(void) |
| 190 | { | 181 | { |
| 191 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 182 | struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; |
| 192 | int rc; | 183 | int rc; |
| 193 | 184 | ||
| 194 | regs.eax = I8K_SMM_POWER_STATUS; | 185 | if ((rc = i8k_smm(®s)) < 0) |
| 195 | if ((rc = i8k_smm(®s)) < 0) { | ||
| 196 | return rc; | 186 | return rc; |
| 197 | } | ||
| 198 | 187 | ||
| 199 | switch (regs.eax & 0xff) { | 188 | return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; |
| 200 | case I8K_POWER_AC: | ||
| 201 | return I8K_AC; | ||
| 202 | default: | ||
| 203 | return I8K_BATTERY; | ||
| 204 | } | ||
| 205 | } | 189 | } |
| 206 | 190 | ||
| 207 | /* | 191 | /* |
| @@ -209,16 +193,10 @@ static int i8k_get_power_status(void) | |||
| 209 | */ | 193 | */ |
| 210 | static int i8k_get_fan_status(int fan) | 194 | static int i8k_get_fan_status(int fan) |
| 211 | { | 195 | { |
| 212 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 196 | struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; |
| 213 | int rc; | ||
| 214 | 197 | ||
| 215 | regs.eax = I8K_SMM_GET_FAN; | ||
| 216 | regs.ebx = fan & 0xff; | 198 | regs.ebx = fan & 0xff; |
| 217 | if ((rc = i8k_smm(®s)) < 0) { | 199 | return i8k_smm(®s) ? : regs.eax & 0xff; |
| 218 | return rc; | ||
| 219 | } | ||
| 220 | |||
| 221 | return (regs.eax & 0xff); | ||
| 222 | } | 200 | } |
| 223 | 201 | ||
| 224 | /* | 202 | /* |
| @@ -226,16 +204,10 @@ static int i8k_get_fan_status(int fan) | |||
| 226 | */ | 204 | */ |
| 227 | static int i8k_get_fan_speed(int fan) | 205 | static int i8k_get_fan_speed(int fan) |
| 228 | { | 206 | { |
| 229 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 207 | struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; |
| 230 | int rc; | ||
| 231 | 208 | ||
| 232 | regs.eax = I8K_SMM_GET_SPEED; | ||
| 233 | regs.ebx = fan & 0xff; | 209 | regs.ebx = fan & 0xff; |
| 234 | if ((rc = i8k_smm(®s)) < 0) { | 210 | return i8k_smm(®s) ? : (regs.eax & 0xffff) * I8K_FAN_MULT; |
| 235 | return rc; | ||
| 236 | } | ||
| 237 | |||
| 238 | return (regs.eax & 0xffff) * I8K_FAN_MULT; | ||
| 239 | } | 211 | } |
| 240 | 212 | ||
| 241 | /* | 213 | /* |
| @@ -243,18 +215,12 @@ static int i8k_get_fan_speed(int fan) | |||
| 243 | */ | 215 | */ |
| 244 | static int i8k_set_fan(int fan, int speed) | 216 | static int i8k_set_fan(int fan, int speed) |
| 245 | { | 217 | { |
| 246 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 218 | struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; |
| 247 | int rc; | ||
| 248 | 219 | ||
| 249 | speed = (speed < 0) ? 0 : ((speed > I8K_FAN_MAX) ? I8K_FAN_MAX : speed); | 220 | speed = (speed < 0) ? 0 : ((speed > I8K_FAN_MAX) ? I8K_FAN_MAX : speed); |
| 250 | |||
| 251 | regs.eax = I8K_SMM_SET_FAN; | ||
| 252 | regs.ebx = (fan & 0xff) | (speed << 8); | 221 | regs.ebx = (fan & 0xff) | (speed << 8); |
| 253 | if ((rc = i8k_smm(®s)) < 0) { | ||
| 254 | return rc; | ||
| 255 | } | ||
| 256 | 222 | ||
| 257 | return (i8k_get_fan_status(fan)); | 223 | return i8k_smm(®s) ? : i8k_get_fan_status(fan); |
| 258 | } | 224 | } |
| 259 | 225 | ||
| 260 | /* | 226 | /* |
| @@ -262,18 +228,17 @@ static int i8k_set_fan(int fan, int speed) | |||
| 262 | */ | 228 | */ |
| 263 | static int i8k_get_cpu_temp(void) | 229 | static int i8k_get_cpu_temp(void) |
| 264 | { | 230 | { |
| 265 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 231 | struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP, }; |
| 266 | int rc; | 232 | int rc; |
| 267 | int temp; | 233 | int temp; |
| 268 | 234 | ||
| 269 | #ifdef I8K_TEMPERATURE_BUG | 235 | #ifdef I8K_TEMPERATURE_BUG |
| 270 | static int prev = 0; | 236 | static int prev; |
| 271 | #endif | 237 | #endif |
| 272 | 238 | ||
| 273 | regs.eax = I8K_SMM_GET_TEMP; | 239 | if ((rc = i8k_smm(®s)) < 0) |
| 274 | if ((rc = i8k_smm(®s)) < 0) { | ||
| 275 | return rc; | 240 | return rc; |
| 276 | } | 241 | |
| 277 | temp = regs.eax & 0xff; | 242 | temp = regs.eax & 0xff; |
| 278 | 243 | ||
| 279 | #ifdef I8K_TEMPERATURE_BUG | 244 | #ifdef I8K_TEMPERATURE_BUG |
| @@ -297,19 +262,13 @@ static int i8k_get_cpu_temp(void) | |||
| 297 | 262 | ||
| 298 | static int i8k_get_dell_signature(void) | 263 | static int i8k_get_dell_signature(void) |
| 299 | { | 264 | { |
| 300 | SMMRegisters regs = { 0, 0, 0, 0, 0, 0 }; | 265 | struct smm_regs regs = { .eax = I8K_SMM_GET_DELL_SIG, }; |
| 301 | int rc; | 266 | int rc; |
| 302 | 267 | ||
| 303 | regs.eax = I8K_SMM_GET_DELL_SIG; | 268 | if ((rc = i8k_smm(®s)) < 0) |
| 304 | if ((rc = i8k_smm(®s)) < 0) { | ||
| 305 | return rc; | 269 | return rc; |
| 306 | } | ||
| 307 | 270 | ||
| 308 | if ((regs.eax == 1145651527) && (regs.edx == 1145392204)) { | 271 | return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; |
| 309 | return 0; | ||
| 310 | } else { | ||
| 311 | return -1; | ||
| 312 | } | ||
| 313 | } | 272 | } |
| 314 | 273 | ||
| 315 | static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, | 274 | static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, |
| @@ -346,29 +305,29 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, | |||
| 346 | break; | 305 | break; |
| 347 | 306 | ||
| 348 | case I8K_GET_SPEED: | 307 | case I8K_GET_SPEED: |
| 349 | if (copy_from_user(&val, argp, sizeof(int))) { | 308 | if (copy_from_user(&val, argp, sizeof(int))) |
| 350 | return -EFAULT; | 309 | return -EFAULT; |
| 351 | } | 310 | |
| 352 | val = i8k_get_fan_speed(val); | 311 | val = i8k_get_fan_speed(val); |
| 353 | break; | 312 | break; |
| 354 | 313 | ||
| 355 | case I8K_GET_FAN: | 314 | case I8K_GET_FAN: |
| 356 | if (copy_from_user(&val, argp, sizeof(int))) { | 315 | if (copy_from_user(&val, argp, sizeof(int))) |
| 357 | return -EFAULT; | 316 | return -EFAULT; |
| 358 | } | 317 | |
| 359 | val = i8k_get_fan_status(val); | 318 | val = i8k_get_fan_status(val); |
| 360 | break; | 319 | break; |
| 361 | 320 | ||
| 362 | case I8K_SET_FAN: | 321 | case I8K_SET_FAN: |
| 363 | if (restricted && !capable(CAP_SYS_ADMIN)) { | 322 | if (restricted && !capable(CAP_SYS_ADMIN)) |
| 364 | return -EPERM; | 323 | return -EPERM; |
| 365 | } | 324 | |
| 366 | if (copy_from_user(&val, argp, sizeof(int))) { | 325 | if (copy_from_user(&val, argp, sizeof(int))) |
| 367 | return -EFAULT; | 326 | return -EFAULT; |
| 368 | } | 327 | |
| 369 | if (copy_from_user(&speed, argp + 1, sizeof(int))) { | 328 | if (copy_from_user(&speed, argp + 1, sizeof(int))) |
| 370 | return -EFAULT; | 329 | return -EFAULT; |
| 371 | } | 330 | |
| 372 | val = i8k_set_fan(val, speed); | 331 | val = i8k_set_fan(val, speed); |
| 373 | break; | 332 | break; |
| 374 | 333 | ||
| @@ -376,25 +335,24 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, | |||
| 376 | return -EINVAL; | 335 | return -EINVAL; |
| 377 | } | 336 | } |
| 378 | 337 | ||
| 379 | if (val < 0) { | 338 | if (val < 0) |
| 380 | return val; | 339 | return val; |
| 381 | } | ||
| 382 | 340 | ||
| 383 | switch (cmd) { | 341 | switch (cmd) { |
| 384 | case I8K_BIOS_VERSION: | 342 | case I8K_BIOS_VERSION: |
| 385 | if (copy_to_user(argp, &val, 4)) { | 343 | if (copy_to_user(argp, &val, 4)) |
| 386 | return -EFAULT; | 344 | return -EFAULT; |
| 387 | } | 345 | |
| 388 | break; | 346 | break; |
| 389 | case I8K_MACHINE_ID: | 347 | case I8K_MACHINE_ID: |
| 390 | if (copy_to_user(argp, buff, 16)) { | 348 | if (copy_to_user(argp, buff, 16)) |
| 391 | return -EFAULT; | 349 | return -EFAULT; |
| 392 | } | 350 | |
| 393 | break; | 351 | break; |
| 394 | default: | 352 | default: |
| 395 | if (copy_to_user(argp, &val, sizeof(int))) { | 353 | if (copy_to_user(argp, &val, sizeof(int))) |
| 396 | return -EFAULT; | 354 | return -EFAULT; |
| 397 | } | 355 | |
| 398 | break; | 356 | break; |
| 399 | } | 357 | } |
| 400 | 358 | ||
| @@ -415,11 +373,10 @@ static int i8k_proc_show(struct seq_file *seq, void *offset) | |||
| 415 | left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ | 373 | left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ |
| 416 | right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ | 374 | right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ |
| 417 | fn_key = i8k_get_fn_status(); /* 750 µs */ | 375 | fn_key = i8k_get_fn_status(); /* 750 µs */ |
| 418 | if (power_status) { | 376 | if (power_status) |
| 419 | ac_power = i8k_get_power_status(); /* 14700 µs */ | 377 | ac_power = i8k_get_power_status(); /* 14700 µs */ |
| 420 | } else { | 378 | else |
| 421 | ac_power = -1; | 379 | ac_power = -1; |
| 422 | } | ||
| 423 | 380 | ||
| 424 | /* | 381 | /* |
| 425 | * Info: | 382 | * Info: |
| @@ -528,10 +485,7 @@ static int __init i8k_probe(void) | |||
| 528 | return 0; | 485 | return 0; |
| 529 | } | 486 | } |
| 530 | 487 | ||
| 531 | #ifdef MODULE | 488 | static int __init i8k_init(void) |
| 532 | static | ||
| 533 | #endif | ||
| 534 | int __init i8k_init(void) | ||
| 535 | { | 489 | { |
| 536 | struct proc_dir_entry *proc_i8k; | 490 | struct proc_dir_entry *proc_i8k; |
| 537 | 491 | ||
| @@ -554,19 +508,10 @@ int __init i8k_init(void) | |||
| 554 | return 0; | 508 | return 0; |
| 555 | } | 509 | } |
| 556 | 510 | ||
| 557 | #ifdef MODULE | 511 | static void __exit i8k_exit(void) |
| 558 | int init_module(void) | ||
| 559 | { | 512 | { |
| 560 | return i8k_init(); | ||
| 561 | } | ||
| 562 | |||
| 563 | void cleanup_module(void) | ||
| 564 | { | ||
| 565 | /* Remove the proc entry */ | ||
| 566 | remove_proc_entry("i8k", NULL); | 513 | remove_proc_entry("i8k", NULL); |
| 567 | |||
| 568 | printk(KERN_INFO "i8k: module unloaded\n"); | ||
| 569 | } | 514 | } |
| 570 | #endif | ||
| 571 | 515 | ||
| 572 | /* end of file */ | 516 | module_init(i8k_init); |
| 517 | module_exit(i8k_exit); | ||
diff --git a/drivers/char/misc.c b/drivers/char/misc.c index f7e838eae19c..31cf84d69026 100644 --- a/drivers/char/misc.c +++ b/drivers/char/misc.c | |||
| @@ -66,7 +66,6 @@ static unsigned char misc_minors[DYNAMIC_MINORS / 8]; | |||
| 66 | extern int rtc_DP8570A_init(void); | 66 | extern int rtc_DP8570A_init(void); |
| 67 | extern int rtc_MK48T08_init(void); | 67 | extern int rtc_MK48T08_init(void); |
| 68 | extern int pmu_device_init(void); | 68 | extern int pmu_device_init(void); |
| 69 | extern int i8k_init(void); | ||
| 70 | 69 | ||
| 71 | #ifdef CONFIG_PROC_FS | 70 | #ifdef CONFIG_PROC_FS |
| 72 | static void *misc_seq_start(struct seq_file *seq, loff_t *pos) | 71 | static void *misc_seq_start(struct seq_file *seq, loff_t *pos) |
| @@ -313,9 +312,6 @@ static int __init misc_init(void) | |||
| 313 | #ifdef CONFIG_PMAC_PBOOK | 312 | #ifdef CONFIG_PMAC_PBOOK |
| 314 | pmu_device_init(); | 313 | pmu_device_init(); |
| 315 | #endif | 314 | #endif |
| 316 | #ifdef CONFIG_I8K | ||
| 317 | i8k_init(); | ||
| 318 | #endif | ||
| 319 | if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) { | 315 | if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) { |
| 320 | printk("unable to get major %d for misc devices\n", | 316 | printk("unable to get major %d for misc devices\n", |
| 321 | MISC_MAJOR); | 317 | MISC_MAJOR); |
