Lines Matching +full:1 +full:- +full:based

1 // SPDX-License-Identifier: GPL-2.0-only
9 * Based on documentation in the libsmbios package:
10 * Copyright (C) 2005-2014 Dell Inc.
31 #include "dell-rbtn.h"
32 #include "dell-smbios.h"
34 #include "dell-wmi-privacy.h"
45 * The list must end with -1
58 quirks = dmi->driver_data; in dmi_matched()
59 return 1; in dmi_matched()
68 .kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 },
85 .name = "dell-laptop",
346 buffer->input[0] = arg0; in dell_fill_request()
347 buffer->input[1] = arg1; in dell_fill_request()
348 buffer->input[2] = arg2; in dell_fill_request()
349 buffer->input[3] = arg3; in dell_fill_request()
357 buffer->cmd_class = class; in dell_send_request()
358 buffer->cmd_select = select; in dell_send_request()
362 return dell_smbios_error(buffer->output[0]); in dell_send_request()
366 * Derived from information in smbios-wireless-ctl:
373 * cbRes1 Standard return codes (0, -1, -2)
376 * 0 Hardware switch supported (1)
377 * 1 WiFi locator supported (1)
378 * 2 WLAN supported (1)
379 * 3 Bluetooth (BT) supported (1)
380 * 4 WWAN supported (1)
381 * 5 Wireless KBD supported (1)
382 * 6 Uw b supported (1)
383 * 7 WiGig supported (1)
384 * 8 WLAN installed (1)
385 * 9 BT installed (1)
386 * 10 WWAN installed (1)
387 * 11 Uw b installed (1)
388 * 12 WiGig installed (1)
389 * 13-15 Reserved (0)
390 * 16 Hardware (HW) switch is On (1)
391 * 17 WLAN disabled (1)
392 * 18 BT disabled (1)
393 * 19 WWAN disabled (1)
394 * 20 Uw b disabled (1)
395 * 21 WiGig disabled (1)
396 * 20-31 Reserved (0)
407 * 1 WLAN ID
413 * 0 QuickSet disables radio (1)
414 * 1-7 Reserved (0)
416 * cbRes1 Standard return codes (0, -1, -2)
419 * 1 QS disables BT
423 * 5-31 Reserved (0)
431 * 1 Set config
434 * Switch settings (if byte 1==1):
435 * 0 WLAN sw itch control (1)
436 * 1 BT sw itch control (1)
437 * 2 WWAN sw itch control (1)
438 * 3 UWB sw itch control (1)
439 * 4 WiGig sw itch control (1)
440 * 5-7 Reserved (0)
441 * cbArg1, byte2 Enable bits (if byte 1==2):
442 * 0 Enable WiFi locator (1)
444 * cbRes1 Standard return codes (0, -1, -2)
446 * 0 WLAN controlled by sw itch (1)
447 * 1 BT controlled by sw itch (1)
448 * 2 WWAN controlled by sw itch (1)
449 * 3 UWB controlled by sw itch (1)
450 * 4 WiGig controlled by sw itch (1)
451 * 5-6 Reserved (0)
452 * 7 Wireless sw itch config locked (1)
453 * 8 WiFi locator enabled (1)
454 * 9-14 Reserved (0)
455 * 15 WiFi locator setting locked (1)
456 * 16-31 Reserved (0)
462 * cbRes1 Standard return codes (0, -1, -2)
474 * cbRes1 Standard return codes (0, -1, -2)
478 * cbRes1 Standard return codes (0, -1, -2)
482 * cbRes1 Standard return codes (0, -1, -2)
487 int disable = blocked ? 1 : 0; in dell_rfkill_set()
489 int hwswitch_bit = (unsigned long)data - 1; in dell_rfkill_set()
499 status = buffer.output[1]; in dell_rfkill_set()
505 hwswitch = buffer.output[1]; in dell_rfkill_set()
511 disable = 1; in dell_rfkill_set()
513 dell_fill_request(&buffer, 1 | (radio<<8) | (disable << 16), 0, 0, 0); in dell_rfkill_set()
522 /* Has hw-switch, sync sw_state to BIOS */ in dell_rfkill_update_sw_state()
526 1 | (radio << 8) | (block << 16), 0, 0, 0); in dell_rfkill_update_sw_state()
529 /* No hw-switch, sync BIOS state to sw_state */ in dell_rfkill_update_sw_state()
537 if (hwswitch & (BIT(radio - 1))) in dell_rfkill_update_hw_state()
551 status = buffer.output[1]; in dell_rfkill_query()
559 hwswitch = buffer.output[1]; in dell_rfkill_query()
586 status = buffer.output[1]; in dell_debugfs_show()
592 hwswitch_state = buffer.output[1]; in dell_debugfs_show()
598 seq_printf(s, "Bit 1 : Wifi locator supported: %lu\n", in dell_debugfs_show()
599 (status & BIT(1)) >> 1); in dell_debugfs_show()
640 seq_printf(s, "Bit 1 : Bluetooth controlled by switch: %lu\n", in dell_debugfs_show()
641 (hwswitch_state & BIT(1)) >> 1); in dell_debugfs_show()
668 status = buffer.output[1]; in dell_update_rfkill()
677 hwswitch = buffer.output[1]; in dell_update_rfkill()
680 dell_rfkill_update_hw_state(wifi_rfkill, 1, status, hwswitch); in dell_update_rfkill()
681 dell_rfkill_update_sw_state(wifi_rfkill, 1, status); in dell_update_rfkill()
747 whitelisted = 1; in dell_setup_rfkill()
753 status = buffer.output[1]; in dell_setup_rfkill()
763 if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) { in dell_setup_rfkill()
764 wifi_rfkill = rfkill_alloc("dell-wifi", &platform_device->dev, in dell_setup_rfkill()
766 &dell_rfkill_ops, (void *) 1); in dell_setup_rfkill()
768 ret = -ENOMEM; in dell_setup_rfkill()
776 if ((status & (1<<3|1<<9)) == (1<<3|1<<9)) { in dell_setup_rfkill()
777 bluetooth_rfkill = rfkill_alloc("dell-bluetooth", in dell_setup_rfkill()
778 &platform_device->dev, in dell_setup_rfkill()
782 ret = -ENOMEM; in dell_setup_rfkill()
790 if ((status & (1<<4|1<<10)) == (1<<4|1<<10)) { in dell_setup_rfkill()
791 wwan_rfkill = rfkill_alloc("dell-wwan", in dell_setup_rfkill()
792 &platform_device->dev, in dell_setup_rfkill()
796 ret = -ENOMEM; in dell_setup_rfkill()
805 * Dell Airplane Mode Switch driver (dell-rbtn) supports ACPI devices in dell_setup_rfkill()
819 * dell-rbtn driver will automatically remove its own rfkill devices in dell_setup_rfkill()
844 pr_info("Symbols from dell-rbtn acpi driver are not available\n"); in dell_setup_rfkill()
845 ret = -ENODEV; in dell_setup_rfkill()
849 pr_info("Using dell-rbtn acpi driver for receiving events\n"); in dell_setup_rfkill()
850 } else if (ret != -ENODEV) { in dell_setup_rfkill()
912 return -ENODEV; in dell_send_intensity()
915 token->location, bd->props.brightness, 0, 0); in dell_send_intensity()
934 return -ENODEV; in dell_get_intensity()
936 dell_fill_request(&buffer, token->location, 0, 0, 0); in dell_get_intensity()
945 ret = buffer.output[1]; in dell_get_intensity()
958 char data = 1; in touchpad_led_on()
959 i8042_command(&data, command | 1 << 12); in touchpad_led_on()
966 i8042_command(&data, command | 1 << 12); in touchpad_led_off()
979 .name = "dell-laptop::touchpad",
995 * Derived from information in smbios-keyboard-ctl:
1003 * cbRES1 Standard return codes (0, -1, -2)
1004 * cbRES2, word0 Bitmap of user-selectable modes
1006 * bit 1 Always on (Travis ATG, Siberia)
1007 * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG)
1008 * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off
1009 * bit 4 Auto: Input-activity-based On; input-activity based Off
1010 * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off
1011 * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off
1012 * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off
1013 * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off
1014 * bits 9-15 Reserved for future use
1018 * 1 Tasklight
1020 * 3-255 Reserved for future use
1023 * bit 1 Touchpad activity
1026 * bits 4-7 Reserved for future use
1029 * bit 1 Minutes
1032 * bits 4-7 Reserved for future use
1040 * cbRES1 Standard return codes (0, -1, -2)
1043 * bit 1 Always on (Travis ATG, Siberia)
1044 * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG)
1045 * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off
1046 * bit 4 Auto: Input-activity-based On; input-activity based Off
1047 * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off
1048 * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off
1049 * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off
1050 * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off
1051 * bits 9-15 Reserved for future use
1055 * bit 1 Touchpad activity
1058 * bits 4-7 Reserved for future use
1065 * bits 5:0 Timeout value (0-63) in sec/min/hr/day
1077 * Bits 5:0 Timeout value (0-63) in sec/min/hr/day
1082 * cbRES1 Standard return codes (0, -1, -2)
1085 * bit 1 Always on (Travis ATG, Siberia)
1086 * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG)
1087 * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off
1088 * bit 4 Auto: Input-activity-based On; input-activity based Off
1089 * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off
1090 * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off
1091 * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off
1092 * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off
1093 * bits 9-15 Reserved for future use
1098 * bit 1 Touchpad activity
1101 * bits 4-7 Reserved for future use
1108 * bits 5:0 Timeout value (0-63) in sec/min/hr/day
1117 * bits 5:0 Timeout value (0-63) in sec/min/hr/day
1221 info->modes = buffer.output[1] & 0xFFFF; in kbd_get_info()
1222 info->type = (buffer.output[1] >> 24) & 0xFF; in kbd_get_info()
1223 info->triggers = buffer.output[2] & 0xFF; in kbd_get_info()
1225 info->levels = (buffer.output[2] >> 16) & 0xFF; in kbd_get_info()
1227 if (quirks && quirks->kbd_led_levels_off_1 && info->levels) in kbd_get_info()
1228 info->levels--; in kbd_get_info()
1231 info->seconds = (buffer.output[3] >> 0) & 0xFF; in kbd_get_info()
1232 if (units & BIT(1)) in kbd_get_info()
1233 info->minutes = (buffer.output[3] >> 8) & 0xFF; in kbd_get_info()
1235 info->hours = (buffer.output[3] >> 16) & 0xFF; in kbd_get_info()
1237 info->days = (buffer.output[3] >> 24) & 0xFF; in kbd_get_info()
1247 return kbd_mode_levels_count - 1; in kbd_get_max_level()
1256 return state->level; in kbd_get_level()
1260 if (kbd_mode_levels[i] == state->mode_bit) in kbd_get_level()
1265 return -EINVAL; in kbd_get_level()
1273 if (state->level == level) in kbd_set_level()
1275 state->level = level; in kbd_set_level()
1276 if (level != 0 && state->mode_bit == KBD_MODE_BIT_OFF) in kbd_set_level()
1277 state->mode_bit = kbd_previous_mode_bit; in kbd_set_level()
1278 else if (level == 0 && state->mode_bit != KBD_MODE_BIT_OFF) { in kbd_set_level()
1279 kbd_previous_mode_bit = state->mode_bit; in kbd_set_level()
1280 state->mode_bit = KBD_MODE_BIT_OFF; in kbd_set_level()
1288 state->mode_bit = kbd_mode_levels[level]; in kbd_set_level()
1292 return -EINVAL; in kbd_set_level()
1306 state->mode_bit = ffs(buffer.output[1] & 0xFFFF); in kbd_get_state()
1307 if (state->mode_bit != 0) in kbd_get_state()
1308 state->mode_bit--; in kbd_get_state()
1310 state->triggers = (buffer.output[1] >> 16) & 0xFF; in kbd_get_state()
1311 state->timeout_value = (buffer.output[1] >> 24) & 0x3F; in kbd_get_state()
1312 state->timeout_unit = (buffer.output[1] >> 30) & 0x3; in kbd_get_state()
1313 state->als_setting = buffer.output[2] & 0xFF; in kbd_get_state()
1314 state->als_value = (buffer.output[2] >> 8) & 0xFF; in kbd_get_state()
1315 state->level = (buffer.output[2] >> 16) & 0xFF; in kbd_get_state()
1316 state->timeout_value_ac = (buffer.output[2] >> 24) & 0x3F; in kbd_get_state()
1317 state->timeout_unit_ac = (buffer.output[2] >> 30) & 0x3; in kbd_get_state()
1329 input1 = BIT(state->mode_bit) & 0xFFFF; in kbd_set_state()
1330 input1 |= (state->triggers & 0xFF) << 16; in kbd_set_state()
1331 input1 |= (state->timeout_value & 0x3F) << 24; in kbd_set_state()
1332 input1 |= (state->timeout_unit & 0x3) << 30; in kbd_set_state()
1333 input2 = state->als_setting & 0xFF; in kbd_set_state()
1334 input2 |= (state->level & 0xFF) << 16; in kbd_set_state()
1335 input2 |= (state->timeout_value_ac & 0x3F) << 24; in kbd_set_state()
1336 input2 |= (state->timeout_unit_ac & 0x3) << 30; in kbd_set_state()
1371 return -EINVAL; in kbd_set_token_bit()
1375 return -EINVAL; in kbd_set_token_bit()
1377 dell_fill_request(&buffer, token->location, token->value, 0, 0); in kbd_set_token_bit()
1391 return -EINVAL; in kbd_get_token_bit()
1395 return -EINVAL; in kbd_get_token_bit()
1397 dell_fill_request(&buffer, token->location, 0, 0, 0); in kbd_get_token_bit()
1399 val = buffer.output[1]; in kbd_get_token_bit()
1404 return (val == token->value); in kbd_get_token_bit()
1414 if (ret == 1) in kbd_get_first_active_token_bit()
1440 if ((quirks && quirks->kbd_missing_ac_tag) || in kbd_init_info()
1465 kbd_previous_level = 1; in kbd_init_info()
1471 kbd_previous_mode_bit--; in kbd_init_info()
1488 kbd_mode_levels[1 + kbd_mode_levels_count++] = i; in kbd_init_info()
1522 if (quirks && quirks->kbd_led_not_present) in kbd_init()
1550 if (ret < 1) in kbd_led_timeout_store()
1551 return -EINVAL; in kbd_led_timeout_store()
1552 else if (ret == 1) in kbd_led_timeout_store()
1556 return -EINVAL; in kbd_led_timeout_store()
1582 return -EINVAL; in kbd_led_timeout_store()
1585 if (quirks && quirks->needs_kbd_timeouts) in kbd_led_timeout_store()
1602 if (quirks && quirks->needs_kbd_timeouts) { in kbd_led_timeout_store()
1603 for (i = 0; quirks->kbd_timeouts[i] != -1; i++) { in kbd_led_timeout_store()
1604 if (value <= quirks->kbd_timeouts[i]) { in kbd_led_timeout_store()
1605 value = quirks->kbd_timeouts[i]; in kbd_led_timeout_store()
1623 return -EINVAL; in kbd_led_timeout_store()
1686 return -EINVAL; in kbd_led_timeout_show()
1709 int trigger_bit = -1; in kbd_led_triggers_store()
1714 if (ret != 1) in kbd_led_triggers_store()
1715 return -EINVAL; in kbd_led_triggers_store()
1717 if (trigger[0] != '+' && trigger[0] != '-') in kbd_led_triggers_store()
1718 return -EINVAL; in kbd_led_triggers_store()
1735 if (strcmp(trigger+1, kbd_led_triggers[i]) != 0) in kbd_led_triggers_store()
1742 if (trigger[0] == '-' && in kbd_led_triggers_store()
1752 if (trigger_bit == -1) { in kbd_led_triggers_store()
1753 ret = -EINVAL; in kbd_led_triggers_store()
1764 * disabling touchpad bit (1), otherwise touchpad in kbd_led_triggers_store()
1765 * bit (1) will not be disabled in kbd_led_triggers_store()
1767 if (trigger_bit == 1) in kbd_led_triggers_store()
1772 ret = -EINVAL; in kbd_led_triggers_store()
1782 ret = -EINVAL; in kbd_led_triggers_store()
1822 buf[len++] = '-'; in kbd_led_triggers_show()
1828 buf[len - 1] = '\n'; in kbd_led_triggers_show()
1880 ret = -EINVAL; in kbd_led_als_enabled_store()
1908 return sprintf(buf, "%d\n", enabled ? 1 : 0); in kbd_led_als_enabled_show()
2009 for (num = kbd_token_bits; num != 0 && ret > 0; --ret) in kbd_led_level_get()
2010 num &= num - 1; /* clear the first bit set */ in kbd_led_level_get()
2013 return ffs(num) - 1; in kbd_led_level_get()
2041 for (num = kbd_token_bits; num != 0 && value > 0; --value) in kbd_led_level_set()
2042 num &= num - 1; /* clear the first bit set */ in kbd_led_level_set()
2046 ret = kbd_set_token_bit(ffs(num) - 1); in kbd_led_level_set()
2049 ret = -ENXIO; in kbd_led_level_set()
2074 return -ENODEV; in kbd_led_init()
2076 kbd_led_groups[1] = NULL; in kbd_led_init()
2081 kbd_led.max_brightness--; in kbd_led_init()
2152 return -ENODEV; in micmute_led_set()
2154 dell_fill_request(&buffer, token->location, token->value, 0, 0); in micmute_led_set()
2162 .max_brightness = 1,
2164 .default_trigger = "audio-micmute",
2174 return -ENODEV; in dell_init()
2183 platform_device = platform_device_alloc("dell-laptop", -1); in dell_init()
2185 ret = -ENOMEM; in dell_init()
2199 if (quirks && quirks->touchpad_led) in dell_init()
2200 touchpad_led_init(&platform_device->dev); in dell_init()
2202 kbd_led_init(&platform_device->dev); in dell_init()
2214 ret = led_classdev_register(&platform_device->dev, &micmute_led_cdev); in dell_init()
2227 dell_fill_request(&buffer, token->location, 0, 0, 0); in dell_init()
2240 &platform_device->dev, in dell_init()
2251 dell_backlight_device->props.brightness = in dell_init()
2253 if (dell_backlight_device->props.brightness < 0) { in dell_init()
2254 ret = dell_backlight_device->props.brightness; in dell_init()
2283 if (quirks && quirks->touchpad_led) in dell_exit()
2296 /* dell-rbtn.c driver export functions which will not work correctly (and could
2297 * cause kernel crash) if they are called before dell-rbtn.c init code. This is
2298 * not problem when dell-rbtn.c is compiled as external module. When both files
2299 * (dell-rbtn.c and dell-laptop.c) are compiled statically into kernel, then we
2300 * need to ensure that dell_init() will be called after initializing dell-rbtn.