Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/acpi_support/acpi_ibm.c
Show First 20 Lines • Show All 123 Lines • ▼ Show 20 Lines | |||||
#define IBM_NAME_THERMAL_UPDT "UPDT" | #define IBM_NAME_THERMAL_UPDT "UPDT" | ||||
#define IBM_NAME_EVENTS_STATUS_GET "DHKC" | #define IBM_NAME_EVENTS_STATUS_GET "DHKC" | ||||
#define IBM_NAME_EVENTS_MASK_GET "DHKN" | #define IBM_NAME_EVENTS_MASK_GET "DHKN" | ||||
#define IBM_NAME_EVENTS_STATUS_SET "MHKC" | #define IBM_NAME_EVENTS_STATUS_SET "MHKC" | ||||
#define IBM_NAME_EVENTS_MASK_SET "MHKM" | #define IBM_NAME_EVENTS_MASK_SET "MHKM" | ||||
#define IBM_NAME_EVENTS_GET "MHKP" | #define IBM_NAME_EVENTS_GET "MHKP" | ||||
#define IBM_NAME_EVENTS_AVAILMASK "MHKA" | #define IBM_NAME_EVENTS_AVAILMASK "MHKA" | ||||
#define IBM_NAME_EVENTS_VERSION "MHKV" | |||||
/* Event Code */ | /* Event Code */ | ||||
#define IBM_EVENT_LCD_BACKLIGHT 0x03 | #define IBM_EVENT_LCD_BACKLIGHT 0x03 | ||||
#define IBM_EVENT_SUSPEND_TO_RAM 0x04 | #define IBM_EVENT_SUSPEND_TO_RAM 0x04 | ||||
#define IBM_EVENT_BLUETOOTH 0x05 | #define IBM_EVENT_BLUETOOTH 0x05 | ||||
#define IBM_EVENT_SCREEN_EXPAND 0x07 | #define IBM_EVENT_SCREEN_EXPAND 0x07 | ||||
#define IBM_EVENT_SUSPEND_TO_DISK 0x0c | #define IBM_EVENT_SUSPEND_TO_DISK 0x0c | ||||
#define IBM_EVENT_BRIGHTNESS_UP 0x10 | #define IBM_EVENT_BRIGHTNESS_UP 0x10 | ||||
▲ Show 20 Lines • Show All 195 Lines • ▼ Show 20 Lines | static driver_t acpi_ibm_driver = { | ||||
sizeof(struct acpi_ibm_softc), | sizeof(struct acpi_ibm_softc), | ||||
}; | }; | ||||
static devclass_t acpi_ibm_devclass; | static devclass_t acpi_ibm_devclass; | ||||
DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass, | DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass, | ||||
0, 0); | 0, 0); | ||||
MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1); | MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1); | ||||
static char *ibm_ids[] = {"IBM0068", "LEN0068", NULL}; | static char *ibm_ids[] = {"IBM0068", "LEN0068", "LEN0268", NULL}; | ||||
static void | static void | ||||
ibm_led(void *softc, int onoff) | ibm_led(void *softc, int onoff) | ||||
{ | { | ||||
struct acpi_ibm_softc* sc = (struct acpi_ibm_softc*) softc; | struct acpi_ibm_softc* sc = (struct acpi_ibm_softc*) softc; | ||||
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); | ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); | ||||
Show All 29 Lines | acpi_ibm_probe(device_t dev) | ||||
device_set_desc(dev, "IBM ThinkPad ACPI Extras"); | device_set_desc(dev, "IBM ThinkPad ACPI Extras"); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
acpi_ibm_attach(device_t dev) | acpi_ibm_attach(device_t dev) | ||||
{ | { | ||||
int i; | ACPI_OBJECT p, *bufp; | ||||
ACPI_OBJECT_LIST args; | |||||
ACPI_BUFFER buf; | |||||
int hkey_version; | |||||
struct acpi_ibm_softc *sc; | struct acpi_ibm_softc *sc; | ||||
char *maker, *product; | char *maker, *product; | ||||
devclass_t ec_devclass; | devclass_t ec_devclass; | ||||
ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); | ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); | ||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
sc->dev = dev; | sc->dev = dev; | ||||
Show All 21 Lines | sc->events_mask_supported = ACPI_SUCCESS(acpi_GetInteger(sc->handle, | ||||
IBM_NAME_EVENTS_MASK_GET, &sc->events_initialmask)); | IBM_NAME_EVENTS_MASK_GET, &sc->events_initialmask)); | ||||
if (sc->events_mask_supported) { | if (sc->events_mask_supported) { | ||||
SYSCTL_ADD_UINT(sc->sysctl_ctx, | SYSCTL_ADD_UINT(sc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, | ||||
"initialmask", CTLFLAG_RD, | "initialmask", CTLFLAG_RD, | ||||
&sc->events_initialmask, 0, "Initial eventmask"); | &sc->events_initialmask, 0, "Initial eventmask"); | ||||
/* The availmask is the bitmask of supported events */ | /* | ||||
* The availmask is the bitmask of supported events, it's determined | |||||
* by calling MHKA. Old pre-0x100 versions of the hkey interface (MKHV) | |||||
emaste: s/MKHV/MHKV/ | |||||
* take no parameter to determine the hotkey mask. Newer models | |||||
* (post-2015, like T460, T470s, Carbon X1) take one integer parameter: | |||||
* 1: Retrieve availmask like before | |||||
* 2: Retrieve adaptive keyboard mask (currently not supported | |||||
* by this driver), only supported on models featuring | |||||
* the adaptive keyboard, otherwise returns 0 | |||||
*/ | |||||
if (ACPI_FAILURE(acpi_GetInteger(sc->handle, | if (ACPI_FAILURE(acpi_GetInteger(sc->handle, | ||||
IBM_NAME_EVENTS_VERSION, &hkey_version))) | |||||
hkey_version = 0x100; /* default to version 1 of the hkey interface */ | |||||
if ((hkey_version >> 8) < 2) { | |||||
if (ACPI_FAILURE(acpi_GetInteger(sc->handle, | |||||
IBM_NAME_EVENTS_AVAILMASK, &sc->events_availmask))) | IBM_NAME_EVENTS_AVAILMASK, &sc->events_availmask))) | ||||
sc->events_availmask = 0xffffffff; | sc->events_availmask = 0xffffffff; | ||||
} else { | |||||
p.Type = ACPI_TYPE_INTEGER; | |||||
p.Integer.Value = 1; | |||||
args.Count = 1; | |||||
args.Pointer = &p; | |||||
buf.Length = ACPI_ALLOCATE_BUFFER; | |||||
if (ACPI_FAILURE(AcpiEvaluateObjectTyped(sc->handle, | |||||
IBM_NAME_EVENTS_AVAILMASK, &args, &buf, | |||||
ACPI_TYPE_INTEGER))) | |||||
sc->events_availmask = 0xffffffff; | |||||
else { | |||||
bufp = buf.Pointer; | |||||
sc->events_availmask= bufp->Integer.Value; | |||||
AcpiOsFree(buf.Pointer); | |||||
} | |||||
} | |||||
SYSCTL_ADD_UINT(sc->sysctl_ctx, | SYSCTL_ADD_UINT(sc->sysctl_ctx, | ||||
SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, | ||||
"availmask", CTLFLAG_RD, | "availmask", CTLFLAG_RD, | ||||
&sc->events_availmask, 0, "Mask of supported events"); | &sc->events_availmask, 0, "Mask of supported events"); | ||||
} | } | ||||
/* Hook up proc nodes */ | /* Hook up proc nodes */ | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | sc->led_dev = led_create_state(ibm_led, sc, "thinklight", | ||||
(sc->light_val ? 1 : 0)); | (sc->light_val ? 1 : 0)); | ||||
/* Enable per-model events. */ | /* Enable per-model events. */ | ||||
maker = kern_getenv("smbios.system.maker"); | maker = kern_getenv("smbios.system.maker"); | ||||
product = kern_getenv("smbios.system.product"); | product = kern_getenv("smbios.system.product"); | ||||
if (maker == NULL || product == NULL) | if (maker == NULL || product == NULL) | ||||
goto nosmbios; | goto nosmbios; | ||||
for (i = 0; i < nitems(acpi_ibm_models); i++) { | for (int i = 0; i < nitems(acpi_ibm_models); i++) { | ||||
if (strcmp(maker, acpi_ibm_models[i].maker) == 0 && | if (strcmp(maker, acpi_ibm_models[i].maker) == 0 && | ||||
strcmp(product, acpi_ibm_models[i].product) == 0) { | strcmp(product, acpi_ibm_models[i].product) == 0) { | ||||
ACPI_SERIAL_BEGIN(ibm); | ACPI_SERIAL_BEGIN(ibm); | ||||
acpi_ibm_sysctl_set(sc, ACPI_IBM_METHOD_EVENTMASK, | acpi_ibm_sysctl_set(sc, ACPI_IBM_METHOD_EVENTMASK, | ||||
acpi_ibm_models[i].eventmask); | acpi_ibm_models[i].eventmask); | ||||
ACPI_SERIAL_END(ibm); | ACPI_SERIAL_END(ibm); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 319 Lines • ▼ Show 20 Lines | acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg) | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
acpi_ibm_sysctl_init(struct acpi_ibm_softc *sc, int method) | acpi_ibm_sysctl_init(struct acpi_ibm_softc *sc, int method) | ||||
{ | { | ||||
int dummy; | int dummy; | ||||
Done Inline Actionsextra whitespace here emaste: extra whitespace here | |||||
ACPI_OBJECT_TYPE cmos_t; | ACPI_OBJECT_TYPE cmos_t; | ||||
ACPI_HANDLE ledb_handle; | ACPI_HANDLE ledb_handle; | ||||
switch (method) { | switch (method) { | ||||
case ACPI_IBM_METHOD_EVENTS: | case ACPI_IBM_METHOD_EVENTS: | ||||
return (TRUE); | return (TRUE); | ||||
Done Inline Actionsand here emaste: and here | |||||
case ACPI_IBM_METHOD_EVENTMASK: | case ACPI_IBM_METHOD_EVENTMASK: | ||||
return (sc->events_mask_supported); | return (sc->events_mask_supported); | ||||
case ACPI_IBM_METHOD_HOTKEY: | case ACPI_IBM_METHOD_HOTKEY: | ||||
case ACPI_IBM_METHOD_BRIGHTNESS: | case ACPI_IBM_METHOD_BRIGHTNESS: | ||||
case ACPI_IBM_METHOD_VOLUME: | case ACPI_IBM_METHOD_VOLUME: | ||||
case ACPI_IBM_METHOD_MUTE: | case ACPI_IBM_METHOD_MUTE: | ||||
/* EC is required here, which was already checked before */ | /* EC is required here, which was already checked before */ | ||||
▲ Show 20 Lines • Show All 473 Lines • Show Last 20 Lines |
s/MKHV/MHKV/