Lines Matching +full:rpm +full:- +full:proc
1 /*-
31 * Driver for extra ACPI-controlled gadgets found on ThinkPad laptops.
32 * Inspired by the ibm-acpi and tpb projects which implement these features
35 * acpi-ibm: <http://ibm-acpi.sourceforge.net/>
157 /* Device-specific register flags */
161 #define ABS(x) (((x) < 0)? -(x) : (x))
274 .description = "Fan level, 0-7 (recommended max), "
275 "8 (unthrottled, full-speed)",
296 * Per-model default list of event mask.
400 if (sc->led_busy) in ibm_led()
403 sc->led_busy = 1; in ibm_led()
404 sc->led_state = onoff; in ibm_led()
415 acpi_ibm_sysctl_set(sc, ACPI_IBM_METHOD_THINKLIGHT, sc->led_state); in ibm_led_task()
418 sc->led_busy = 0; in ibm_led_task()
431 if (sc->mic_led_handle) { in acpi_ibm_mic_led_set()
441 status = AcpiEvaluateObject(sc->handle, "MMTS", &input, NULL); in acpi_ibm_mic_led_set()
443 sc->mic_led_state = arg; in acpi_ibm_mic_led_set()
481 sc->dev = dev; in acpi_ibm_attach()
482 sc->handle = acpi_get_handle(dev); in acpi_ibm_attach()
490 if (!(sc->ec_dev = devclass_get_device(ec_devclass, 0))) { in acpi_ibm_attach()
495 sc->ec_handle = acpi_get_handle(sc->ec_dev); in acpi_ibm_attach()
498 sc->evdev = evdev_alloc(); in acpi_ibm_attach()
499 evdev_set_name(sc->evdev, device_get_desc(dev)); in acpi_ibm_attach()
500 evdev_set_phys(sc->evdev, device_get_nameunit(dev)); in acpi_ibm_attach()
501 evdev_set_id(sc->evdev, BUS_HOST, 0, 0, 1); in acpi_ibm_attach()
502 evdev_support_event(sc->evdev, EV_SYN); in acpi_ibm_attach()
503 evdev_support_event(sc->evdev, EV_KEY); in acpi_ibm_attach()
504 evdev_support_key(sc->evdev, KEY_BRIGHTNESSUP); in acpi_ibm_attach()
505 evdev_support_key(sc->evdev, KEY_BRIGHTNESSDOWN); in acpi_ibm_attach()
507 if (evdev_register(sc->evdev) != 0) in acpi_ibm_attach()
512 sc->sysctl_ctx = device_get_sysctl_ctx(dev); in acpi_ibm_attach()
513 sc->sysctl_tree = device_get_sysctl_tree(dev); in acpi_ibm_attach()
516 sc->events_mask_supported = ACPI_SUCCESS(acpi_GetInteger(sc->handle, in acpi_ibm_attach()
517 IBM_NAME_EVENTS_MASK_GET, &sc->events_initialmask)); in acpi_ibm_attach()
519 if (sc->events_mask_supported) { in acpi_ibm_attach()
520 SYSCTL_ADD_UINT(sc->sysctl_ctx, in acpi_ibm_attach()
521 SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "initialmask", in acpi_ibm_attach()
522 CTLFLAG_RD, &sc->events_initialmask, 0, in acpi_ibm_attach()
525 if (ACPI_SUCCESS (acpi_GetInteger(sc->handle, "MHKV", &hkey))) { in acpi_ibm_attach()
530 if (ACPI_FAILURE(acpi_GetInteger(sc->handle, in acpi_ibm_attach()
531 IBM_NAME_EVENTS_AVAILMASK, &sc->events_availmask))) in acpi_ibm_attach()
532 sc->events_availmask = 0xffffffff; in acpi_ibm_attach()
543 sc->events_availmask = 0xffffffff; in acpi_ibm_attach()
545 if (ACPI_SUCCESS(AcpiEvaluateObject (sc->handle, in acpi_ibm_attach()
547 sc->events_availmask = out_obj.Integer.Value; in acpi_ibm_attach()
554 sc->events_availmask = 0xffffffff; in acpi_ibm_attach()
556 SYSCTL_ADD_UINT(sc->sysctl_ctx, in acpi_ibm_attach()
557 SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, in acpi_ibm_attach()
559 &sc->events_availmask, 0, "Mask of supported events"); in acpi_ibm_attach()
562 /* Hook up proc nodes */ in acpi_ibm_attach()
568 SYSCTL_ADD_PROC(sc->sysctl_ctx, in acpi_ibm_attach()
569 SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, in acpi_ibm_attach()
575 SYSCTL_ADD_PROC(sc->sysctl_ctx, in acpi_ibm_attach()
576 SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, in acpi_ibm_attach()
586 SYSCTL_ADD_PROC(sc->sysctl_ctx, in acpi_ibm_attach()
587 SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "thermal", in acpi_ibm_attach()
594 SYSCTL_ADD_PROC(sc->sysctl_ctx, in acpi_ibm_attach()
595 SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "handlerevents", in acpi_ibm_attach()
602 AcpiInstallNotifyHandler(sc->handle, ACPI_DEVICE_NOTIFY, in acpi_ibm_attach()
606 if (sc->light_set_supported) in acpi_ibm_attach()
607 sc->led_dev = led_create_state(ibm_led, sc, "thinklight", in acpi_ibm_attach()
608 (sc->light_val ? 1 : 0)); in acpi_ibm_attach()
610 /* Enable per-model events. */ in acpi_ibm_attach()
648 acpi_ibm_sysctl_set(sc, ACPI_IBM_METHOD_EVENTMASK, sc->events_initialmask); in acpi_ibm_detach()
651 AcpiRemoveNotifyHandler(sc->handle, ACPI_DEVICE_NOTIFY, acpi_ibm_notify); in acpi_ibm_detach()
653 if (sc->led_dev != NULL) in acpi_ibm_detach()
654 led_destroy(sc->led_dev); in acpi_ibm_detach()
657 evdev_free(sc->evdev); in acpi_ibm_detach()
684 acpi_ibm_mic_led_set(sc, sc->mic_led_state); in acpi_ibm_resume()
707 status = AcpiEvaluateObject(sc->handle, in acpi_ibm_eventmask_set()
728 sc = (struct acpi_ibm_softc *)oidp->oid_arg1; in acpi_ibm_sysctl()
729 function = oidp->oid_arg2; in acpi_ibm_sysctl()
737 if (error != 0 || req->newptr == NULL) in acpi_ibm_sysctl()
759 acpi_GetInteger(sc->handle, IBM_NAME_EVENTS_STATUS_GET, &val); in acpi_ibm_sysctl_get()
763 if (sc->events_mask_supported) in acpi_ibm_sysctl_get()
764 acpi_GetInteger(sc->handle, IBM_NAME_EVENTS_MASK_GET, &val); in acpi_ibm_sysctl_get()
772 * +--+--+-+-+-+-+-+-+-+-+-+-+ in acpi_ibm_sysctl_get()
774 * +--+--+-+-+-+-+-+-+-+-+-+-+ in acpi_ibm_sysctl_get()
776 * | | | | | | | | | | | +- Home Button in acpi_ibm_sysctl_get()
777 * | | | | | | | | | | +--- Search Button in acpi_ibm_sysctl_get()
778 * | | | | | | | | | +----- Mail Button in acpi_ibm_sysctl_get()
779 * | | | | | | | | +------- Thinkpad Button in acpi_ibm_sysctl_get()
780 * | | | | | | | +--------- Zoom (Fn + Space) in acpi_ibm_sysctl_get()
781 * | | | | | | +----------- WLAN Button in acpi_ibm_sysctl_get()
782 * | | | | | +------------- Video Button in acpi_ibm_sysctl_get()
783 * | | | | +--------------- Hibernate Button in acpi_ibm_sysctl_get()
784 * | | | +----------------- Thinklight Button in acpi_ibm_sysctl_get()
785 * | | +------------------- Screen expand (Fn + F8) in acpi_ibm_sysctl_get()
786 * | +--------------------- Brightness in acpi_ibm_sysctl_get()
787 * +------------------------ Volume/Mute in acpi_ibm_sysctl_get()
805 ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, &val_ec, 1); in acpi_ibm_sysctl_get()
810 ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); in acpi_ibm_sysctl_get()
815 ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); in acpi_ibm_sysctl_get()
820 if (sc->light_get_supported) in acpi_ibm_sysctl_get()
821 acpi_GetInteger(sc->ec_handle, IBM_NAME_KEYLIGHT, &val); in acpi_ibm_sysctl_get()
823 val = sc->light_val; in acpi_ibm_sysctl_get()
827 acpi_GetInteger(sc->handle, IBM_NAME_WLAN_BT_GET, &val); in acpi_ibm_sysctl_get()
828 sc->wlan_bt_flags = val; in acpi_ibm_sysctl_get()
833 acpi_GetInteger(sc->handle, IBM_NAME_WLAN_BT_GET, &val); in acpi_ibm_sysctl_get()
834 sc->wlan_bt_flags = val; in acpi_ibm_sysctl_get()
839 if (sc->fan_handle) { in acpi_ibm_sysctl_get()
840 if(ACPI_FAILURE(acpi_GetInteger(sc->fan_handle, NULL, &val))) in acpi_ibm_sysctl_get()
841 val = -1; in acpi_ibm_sysctl_get()
843 ACPI_EC_READ(sc->ec_dev, IBM_EC_FANSPEED, &val_ec, 2); in acpi_ibm_sysctl_get()
851 * Bit 0-5 indicate the level at which the fan operates. Only in acpi_ibm_sysctl_get()
858 if (!sc->fan_handle) { in acpi_ibm_sysctl_get()
859 ACPI_EC_READ(sc->ec_dev, IBM_EC_FANSTATUS, &val_ec, 1); in acpi_ibm_sysctl_get()
868 if (!sc->fan_handle) { in acpi_ibm_sysctl_get()
869 ACPI_EC_READ(sc->ec_dev, IBM_EC_FANSTATUS, &val_ec, 1); in acpi_ibm_sysctl_get()
872 val = -1; in acpi_ibm_sysctl_get()
876 if (sc->mic_led_handle) in acpi_ibm_sysctl_get()
877 return sc->mic_led_state; in acpi_ibm_sysctl_get()
879 val = -1; in acpi_ibm_sysctl_get()
905 status = acpi_SetInteger(sc->handle, IBM_NAME_EVENTS_STATUS_SET, arg); in acpi_ibm_sysctl_set()
908 if (sc->events_mask_supported) in acpi_ibm_sysctl_set()
909 return acpi_ibm_eventmask_set(sc, sc->events_availmask); in acpi_ibm_sysctl_set()
913 if (sc->events_mask_supported) in acpi_ibm_sysctl_set()
949 if (!sc->fan_handle) { in acpi_ibm_sysctl_set()
951 ACPI_EC_READ(sc->ec_dev, IBM_EC_FANSTATUS, &val_ec, 1); in acpi_ibm_sysctl_set()
961 return (ACPI_EC_WRITE(sc->ec_dev, IBM_EC_FANSTATUS, val, in acpi_ibm_sysctl_set()
970 if (!sc->fan_handle) { in acpi_ibm_sysctl_set()
972 ACPI_EC_READ(sc->ec_dev, IBM_EC_FANSTATUS, &val_ec, 1); in acpi_ibm_sysctl_set()
974 return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_FANSTATUS, in acpi_ibm_sysctl_set()
995 return (sc->events_mask_supported); in acpi_ibm_sysctl_init()
1005 if (ACPI_SUCCESS(AcpiGetHandle(sc->handle, "MMTS", &sc->mic_led_handle))) in acpi_ibm_sysctl_init()
1011 sc->mic_led_handle = NULL; in acpi_ibm_sysctl_init()
1015 sc->cmos_handle = NULL; in acpi_ibm_sysctl_init()
1016 sc->light_get_supported = ACPI_SUCCESS(acpi_GetInteger( in acpi_ibm_sysctl_init()
1017 sc->ec_handle, IBM_NAME_KEYLIGHT, &sc->light_val)); in acpi_ibm_sysctl_init()
1019 if ((ACPI_SUCCESS(AcpiGetHandle(sc->handle, "\\UCMS", &sc->light_handle)) || in acpi_ibm_sysctl_init()
1020 ACPI_SUCCESS(AcpiGetHandle(sc->handle, "\\CMOS", &sc->light_handle)) || in acpi_ibm_sysctl_init()
1021 ACPI_SUCCESS(AcpiGetHandle(sc->handle, "\\CMS", &sc->light_handle))) && in acpi_ibm_sysctl_init()
1022 ACPI_SUCCESS(AcpiGetType(sc->light_handle, &cmos_t)) && in acpi_ibm_sysctl_init()
1024 sc->light_cmd_on = 0x0c; in acpi_ibm_sysctl_init()
1025 sc->light_cmd_off = 0x0d; in acpi_ibm_sysctl_init()
1026 sc->cmos_handle = sc->light_handle; in acpi_ibm_sysctl_init()
1028 else if (ACPI_SUCCESS(AcpiGetHandle(sc->handle, "\\LGHT", &sc->light_handle))) { in acpi_ibm_sysctl_init()
1029 sc->light_cmd_on = 1; in acpi_ibm_sysctl_init()
1030 sc->light_cmd_off = 0; in acpi_ibm_sysctl_init()
1032 sc->light_handle = NULL; in acpi_ibm_sysctl_init()
1034 sc->light_set_supported = (sc->light_handle && in acpi_ibm_sysctl_init()
1035 ACPI_FAILURE(AcpiGetHandle(sc->ec_handle, "LEDB", &ledb_handle))); in acpi_ibm_sysctl_init()
1037 if (sc->light_get_supported) in acpi_ibm_sysctl_init()
1040 if (sc->light_set_supported) { in acpi_ibm_sysctl_init()
1041 sc->light_val = 0; in acpi_ibm_sysctl_init()
1049 if (ACPI_SUCCESS(acpi_GetInteger(sc->handle, IBM_NAME_WLAN_BT_GET, &dummy))) in acpi_ibm_sysctl_init()
1055 * Some models report the fan speed in levels from 0-7 in acpi_ibm_sysctl_init()
1058 sc->fan_levels = in acpi_ibm_sysctl_init()
1059 (ACPI_SUCCESS(AcpiGetHandle(sc->handle, "GFAN", &sc->fan_handle)) || in acpi_ibm_sysctl_init()
1060 ACPI_SUCCESS(AcpiGetHandle(sc->handle, "\\FSPD", &sc->fan_handle))); in acpi_ibm_sysctl_init()
1067 * which report fan RPM contiguously, not in levels in acpi_ibm_sysctl_init()
1069 if (sc->fan_levels) in acpi_ibm_sysctl_init()
1074 if (ACPI_SUCCESS(acpi_GetInteger(sc->ec_handle, IBM_NAME_THERMAL_GET, &dummy))) { in acpi_ibm_sysctl_init()
1075 …sc->thermal_updt_supported = ACPI_SUCCESS(acpi_GetInteger(sc->ec_handle, IBM_NAME_THERMAL_UPDT, &d… in acpi_ibm_sysctl_init()
1084 return (acpi_ibm_privacyguard_get(sc) != -1); in acpi_ibm_sysctl_init()
1099 sc = (struct acpi_ibm_softc *)oidp->oid_arg1; in acpi_ibm_thermal_sysctl()
1107 * The TMPx methods seem to return +/- 128 or 0 in acpi_ibm_thermal_sysctl()
1110 if (ACPI_FAILURE(acpi_GetInteger(sc->ec_handle, temp_cmd, in acpi_ibm_thermal_sysctl()
1112 temp[i] = -1; in acpi_ibm_thermal_sysctl()
1113 else if (sc->thermal_updt_supported) in acpi_ibm_thermal_sysctl()
1115 temp[i] = (temp[i] - 2731 + 5) / 10; in acpi_ibm_thermal_sysctl()
1137 sc = (struct acpi_ibm_softc *)oidp->oid_arg1; in acpi_ibm_handlerevents_sysctl()
1145 if (req->newptr == NULL) { in acpi_ibm_handlerevents_sysctl()
1146 for (int i = 0; i < 8 * sizeof(sc->handler_events); i++) in acpi_ibm_handlerevents_sysctl()
1147 if (sc->handler_events & (1 << i)) in acpi_ibm_handlerevents_sysctl()
1161 if (error != 0 || req->newptr == NULL) in acpi_ibm_handlerevents_sysctl()
1178 l = ep - cp; in acpi_ibm_handlerevents_sysctl()
1194 device_printf(sc->dev, "invalid event code: %s\n", cp); in acpi_ibm_handlerevents_sysctl()
1199 handler_events |= 1 << (val - 1); in acpi_ibm_handlerevents_sysctl()
1204 sc->handler_events = handler_events; in acpi_ibm_handlerevents_sysctl()
1226 status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, &val_ec, 1); in acpi_ibm_brightness_set()
1230 if (sc->cmos_handle) { in acpi_ibm_brightness_set()
1239 step = (arg > val) ? 1 : -1; in acpi_ibm_brightness_set()
1241 status = AcpiEvaluateObject(sc->cmos_handle, NULL, in acpi_ibm_brightness_set()
1246 ACPI_EC_WRITE(sc->ec_dev, in acpi_ibm_brightness_set()
1247 IBM_EC_BRIGHTNESS, i - step, 1); in acpi_ibm_brightness_set()
1254 return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_BRIGHTNESS, arg, 1); in acpi_ibm_brightness_set()
1268 val = (arg == 1) ? sc->wlan_bt_flags | IBM_NAME_MASK_BT : in acpi_ibm_bluetooth_set()
1269 sc->wlan_bt_flags & (~IBM_NAME_MASK_BT); in acpi_ibm_bluetooth_set()
1270 return acpi_SetInteger(sc->handle, IBM_NAME_WLAN_BT_SET, val); in acpi_ibm_bluetooth_set()
1286 if (sc->light_set_supported) { in acpi_ibm_thinklight_set()
1290 Arg.Integer.Value = arg ? sc->light_cmd_on : sc->light_cmd_off; in acpi_ibm_thinklight_set()
1292 status = AcpiEvaluateObject(sc->light_handle, NULL, in acpi_ibm_thinklight_set()
1295 sc->light_val = arg; in acpi_ibm_thinklight_set()
1322 status = AcpiEvaluateObject(sc->handle, in acpi_ibm_privacyguard_acpi_call()
1332 * Returns -1 if the device is not present.
1345 return (-1); in acpi_ibm_privacyguard_get()
1373 status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); in acpi_ibm_volume_set()
1377 if (sc->cmos_handle) { in acpi_ibm_volume_set()
1386 step = (arg > val) ? 1 : -1; in acpi_ibm_volume_set()
1388 status = AcpiEvaluateObject(sc->cmos_handle, NULL, in acpi_ibm_volume_set()
1393 val_ec = i - step + in acpi_ibm_volume_set()
1395 ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, in acpi_ibm_volume_set()
1404 return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, val_ec, 1); in acpi_ibm_volume_set()
1421 status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); in acpi_ibm_mute_set()
1425 if (sc->cmos_handle) { in acpi_ibm_mute_set()
1431 status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL); in acpi_ibm_mute_set()
1438 return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, val_ec, 1); in acpi_ibm_mute_set()
1455 acpi_ibm_bluetooth_set(sc, (sc->wlan_bt_flags == 0)); in acpi_ibm_eventhandler()
1461 status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, in acpi_ibm_eventhandler()
1467 val = (arg == IBM_EVENT_BRIGHTNESS_UP) ? val + 1 : val - 1; in acpi_ibm_eventhandler()
1472 acpi_ibm_thinklight_set(sc, (sc->light_val == 0)); in acpi_ibm_eventhandler()
1478 status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); in acpi_ibm_eventhandler()
1483 val = (arg == IBM_EVENT_VOLUME_UP) ? val + 1 : val - 1; in acpi_ibm_eventhandler()
1489 status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); in acpi_ibm_eventhandler()
1524 if (!(sc->events_availmask & (1 << (arg - 1)))) { in acpi_ibm_notify()
1530 if (sc->handler_events & (1 << (arg - 1))) in acpi_ibm_notify()
1539 evdev_push_key(sc->evdev, key, 1); in acpi_ibm_notify()
1540 evdev_sync(sc->evdev); in acpi_ibm_notify()
1541 evdev_push_key(sc->evdev, key, 0); in acpi_ibm_notify()
1542 evdev_sync(sc->evdev); in acpi_ibm_notify()