Lines 77-82
ACPI_MODULE_NAME("IBM")
Link Here
|
77 |
#define ACPI_IBM_METHOD_HANDLEREVENTS 14 |
77 |
#define ACPI_IBM_METHOD_HANDLEREVENTS 14 |
78 |
#define ACPI_IBM_METHOD_MIC_LED 15 |
78 |
#define ACPI_IBM_METHOD_MIC_LED 15 |
79 |
#define ACPI_IBM_METHOD_PRIVACYGUARD 16 |
79 |
#define ACPI_IBM_METHOD_PRIVACYGUARD 16 |
|
|
80 |
#define ACPI_IBM_METHOD_BAT0_CHRG_START 17 |
81 |
#define ACPI_IBM_METHOD_BAT0_CHRG_STOP 18 |
80 |
|
82 |
|
81 |
/* Hotkeys/Buttons */ |
83 |
/* Hotkeys/Buttons */ |
82 |
#define IBM_RTC_HOTKEY1 0x64 |
84 |
#define IBM_RTC_HOTKEY1 0x64 |
Lines 154-159
ACPI_MODULE_NAME("IBM")
Link Here
|
154 |
#define IBM_FLAG_PRIVACYGUARD_DEVICE_PRESENT 0x10000 |
156 |
#define IBM_FLAG_PRIVACYGUARD_DEVICE_PRESENT 0x10000 |
155 |
#define IBM_FLAG_PRIVACYGUARD_ON 0x1 |
157 |
#define IBM_FLAG_PRIVACYGUARD_ON 0x1 |
156 |
|
158 |
|
|
|
159 |
/* Batteries */ |
160 |
#define IBM_BAT_PRIMARY 1 |
161 |
|
157 |
#define ABS(x) (((x) < 0)? -(x) : (x)) |
162 |
#define ABS(x) (((x) < 0)? -(x) : (x)) |
158 |
|
163 |
|
159 |
struct acpi_ibm_softc { |
164 |
struct acpi_ibm_softc { |
Lines 282-287
static struct {
Link Here
|
282 |
.method = ACPI_IBM_METHOD_PRIVACYGUARD, |
287 |
.method = ACPI_IBM_METHOD_PRIVACYGUARD, |
283 |
.description = "PrivacyGuard enable", |
288 |
.description = "PrivacyGuard enable", |
284 |
}, |
289 |
}, |
|
|
290 |
{ |
291 |
.name = "bat0_charge_start", |
292 |
.method = ACPI_IBM_METHOD_BAT0_CHRG_START, |
293 |
.description = "Primary battery charge threshold", |
294 |
}, |
295 |
{ |
296 |
.name = "bat0_charge_stop", |
297 |
.method = ACPI_IBM_METHOD_BAT0_CHRG_STOP, |
298 |
.description = "Primary battery charge stop threshold", |
299 |
}, |
285 |
{ NULL, 0, NULL, 0 } |
300 |
{ NULL, 0, NULL, 0 } |
286 |
}; |
301 |
}; |
287 |
|
302 |
|
Lines 365-372
static driver_t acpi_ibm_driver = {
Link Here
|
365 |
|
380 |
|
366 |
static devclass_t acpi_ibm_devclass; |
381 |
static devclass_t acpi_ibm_devclass; |
367 |
|
382 |
|
368 |
DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass, |
383 |
DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass, 0, 0); |
369 |
0, 0); |
|
|
370 |
MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1); |
384 |
MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1); |
371 |
static char *ibm_ids[] = {"IBM0068", "LEN0068", "LEN0268", NULL}; |
385 |
static char *ibm_ids[] = {"IBM0068", "LEN0068", "LEN0268", NULL}; |
372 |
|
386 |
|
Lines 440-445
acpi_ibm_mic_led_set (struct acpi_ibm_softc *sc, int arg)
Link Here
|
440 |
return (0); |
454 |
return (0); |
441 |
} |
455 |
} |
442 |
|
456 |
|
|
|
457 |
/* |
458 |
* Evaluate an object with one integer parameter that returns one integer. |
459 |
* If result is NULL, the return value is discarded. |
460 |
*/ |
461 |
static ACPI_STATUS |
462 |
acpi_EvalIntToInt(ACPI_HANDLE handle, char *path, UINT32 param, UINT32 *result) |
463 |
{ |
464 |
ACPI_STATUS status; |
465 |
ACPI_OBJECT_LIST params; |
466 |
ACPI_OBJECT pbuf[1]; |
467 |
ACPI_BUFFER results; |
468 |
ACPI_OBJECT rbuf[1]; |
469 |
|
470 |
params.Count = 1; |
471 |
params.Pointer = pbuf; |
472 |
pbuf[0].Type = ACPI_TYPE_INTEGER; |
473 |
pbuf[0].Integer.Value = param; |
474 |
|
475 |
if (result != NULL) { |
476 |
results.Length = sizeof(rbuf); |
477 |
results.Pointer = rbuf; |
478 |
status = AcpiEvaluateObject(handle, path, ¶ms, &results); |
479 |
if (ACPI_SUCCESS(status)) { |
480 |
if (rbuf[0].Type == ACPI_TYPE_INTEGER) |
481 |
*result = rbuf[0].Integer.Value; |
482 |
else |
483 |
status = AE_TYPE; |
484 |
} |
485 |
} else |
486 |
status = AcpiEvaluateObject(handle, path, ¶ms, NULL); |
487 |
return (status); |
488 |
} |
489 |
|
490 |
/* |
491 |
* Get battery charge start (BCTG) and stop (BCSG) thresholds. |
492 |
*/ |
493 |
static int |
494 |
acpi_ibm_bat_get(ACPI_HANDLE handle, char *path, int bat) |
495 |
{ |
496 |
int val; |
497 |
if (ACPI_FAILURE(acpi_EvalIntToInt(handle, path, bat & 0x3, &val))) |
498 |
return -2; /* failed to eval object */ |
499 |
if (val & (1 << 31)) |
500 |
return -3; /* got error flag */ |
501 |
if (!(val & (1 << 8))) |
502 |
return -4; /* not supported */ |
503 |
return val & 0xff; |
504 |
} |
505 |
|
506 |
/* |
507 |
* Set battery charge start (BCCS) and stop (BCSS) thresholds. |
508 |
*/ |
509 |
static int |
510 |
acpi_ibm_bat_set(ACPI_HANDLE handle, char *path, int bat, int arg) |
511 |
{ |
512 |
ACPI_STATUS status; |
513 |
int val; |
514 |
if (arg < 0 || arg > 99) |
515 |
return (EINVAL); |
516 |
status = acpi_EvalIntToInt(handle, path, (bat & 0x3) << 8 | (arg & 0xff), &val); |
517 |
if (ACPI_FAILURE(status) || val & 0x8000) |
518 |
return (-1); |
519 |
return (0); |
520 |
} |
521 |
|
443 |
static int |
522 |
static int |
444 |
acpi_ibm_probe(device_t dev) |
523 |
acpi_ibm_probe(device_t dev) |
445 |
{ |
524 |
{ |
Lines 858-863
acpi_ibm_sysctl_get(struct acpi_ibm_softc *sc, int method)
Link Here
|
858 |
val = acpi_ibm_privacyguard_get(sc); |
937 |
val = acpi_ibm_privacyguard_get(sc); |
859 |
break; |
938 |
break; |
860 |
|
939 |
|
|
|
940 |
case ACPI_IBM_METHOD_BAT0_CHRG_START: |
941 |
return acpi_ibm_bat_get(sc->handle, "BCTG", IBM_BAT_PRIMARY); |
942 |
|
943 |
case ACPI_IBM_METHOD_BAT0_CHRG_STOP: |
944 |
return acpi_ibm_bat_get(sc->handle, "BCSG", IBM_BAT_PRIMARY); |
861 |
} |
945 |
} |
862 |
|
946 |
|
863 |
return (val); |
947 |
return (val); |
Lines 951-956
acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg)
Link Here
|
951 |
(arg == 1) ? (val_ec | IBM_EC_MASK_FANSTATUS) : (val_ec & (~IBM_EC_MASK_FANSTATUS)), 1); |
1035 |
(arg == 1) ? (val_ec | IBM_EC_MASK_FANSTATUS) : (val_ec & (~IBM_EC_MASK_FANSTATUS)), 1); |
952 |
} |
1036 |
} |
953 |
break; |
1037 |
break; |
|
|
1038 |
|
1039 |
case ACPI_IBM_METHOD_BAT0_CHRG_START: |
1040 |
return acpi_ibm_bat_set(sc->handle, "BCCS", IBM_BAT_PRIMARY, arg); |
1041 |
|
1042 |
case ACPI_IBM_METHOD_BAT0_CHRG_STOP: |
1043 |
return acpi_ibm_bat_set(sc->handle, "BCSS", IBM_BAT_PRIMARY, arg); |
954 |
} |
1044 |
} |
955 |
|
1045 |
|
956 |
return (0); |
1046 |
return (0); |
Lines 1061-1066
acpi_ibm_sysctl_init(struct acpi_ibm_softc *sc, int method)
Link Here
|
1061 |
case ACPI_IBM_METHOD_PRIVACYGUARD: |
1151 |
case ACPI_IBM_METHOD_PRIVACYGUARD: |
1062 |
return (acpi_ibm_privacyguard_get(sc) != -1); |
1152 |
return (acpi_ibm_privacyguard_get(sc) != -1); |
1063 |
|
1153 |
|
|
|
1154 |
case ACPI_IBM_METHOD_BAT0_CHRG_START: |
1155 |
if (acpi_ibm_bat_get(sc->handle, "BCTG", IBM_BAT_PRIMARY) >= 0) |
1156 |
return (TRUE); |
1157 |
|
1158 |
case ACPI_IBM_METHOD_BAT0_CHRG_STOP: |
1159 |
if (acpi_ibm_bat_get(sc->handle, "BCSG", IBM_BAT_PRIMARY) >= 0) |
1160 |
return (TRUE); |
1064 |
} |
1161 |
} |
1065 |
return (FALSE); |
1162 |
return (FALSE); |
1066 |
} |
1163 |
} |