Lines Matching +full:hall +full:- +full:switch +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2007-2009 Carlos Corbacho <carlos@strangeworlds.co.uk>
8 * Copyright (C) 2005-2007 E.M. Smith
9 * Copyright (C) 2007-2008 Carlos Corbacho <cathectic@gmail.com>
30 #include <linux/input/sparse-keymap.h>
39 * Meaning is unknown - this number is required for writing to ACPI for AMW0
71 #define AMW0_GUID1 "67C3371D-95A3-4C37-BB61-DD47B491DAAB"
72 #define AMW0_GUID2 "431F16ED-0C2B-444C-B267-27DEB140CF9C"
73 #define WMID_GUID1 "6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3"
74 #define WMID_GUID2 "95764E09-FB56-4E83-B31A-37761F60994A"
75 #define WMID_GUID3 "61EF69EA-865C-4BC3-A502-A0DEBA0CB531"
76 #define WMID_GUID4 "7A4DDFE7-5B5D-40B4-8595-4408E0CC7F56"
81 #define ACERWMID_EVENT_GUID "676AA15E-6A47-4D9F-A2CC-1E6D18D14026"
83 MODULE_ALIAS("wmi:67C3371D-95A3-4C37-BB61-DD47B491DAAB");
84 MODULE_ALIAS("wmi:6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3");
85 MODULE_ALIAS("wmi:676AA15E-6A47-4D9F-A2CC-1E6D18D14026");
118 {KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */
166 * Bit[7]: Hall Sensor Application Status
246 static int mailled = -1;
247 static int brightness = -1;
248 static int threeg = -1;
250 static int force_caps = -1;
285 /* Each low-level interface must define at least some of the following */
323 if (quirks->mailled) in set_quirks()
324 interface->capability |= ACER_CAP_MAILLED; in set_quirks()
326 if (quirks->brightness) in set_quirks()
327 interface->capability |= ACER_CAP_BRIGHTNESS; in set_quirks()
329 if (quirks->turbo) in set_quirks()
330 interface->capability |= ACER_CAP_TURBO_OC | ACER_CAP_TURBO_LED in set_quirks()
336 quirks = dmi->driver_data; in dmi_matched()
342 if (force_caps == -1) { in set_force_caps()
343 force_caps = (uintptr_t)dmi->driver_data; in set_force_caps()
344 pr_info("Found %s, set force_caps to 0x%x\n", dmi->ident, force_caps); in set_force_caps()
353 .brightness = -1,
379 /* The Aspire One has a dummy ACPI-WMI interface - disable it */
422 * that those machines are supported by acer-wmi driver.
535 .ident = "Acer Predator PH315-53",
538 DMI_MATCH(DMI_PRODUCT_NAME, "Predator PH315-53"),
544 .ident = "Acer Aspire Switch 10E SW3-016",
547 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW3-016"),
553 .ident = "Acer Aspire Switch 10 SW5-012",
556 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
573 * This quirk list is for those non-acer machines that have AMW0_GUID1
574 * but supported by acer-wmi in past days. Keeping this quirk list here
576 * here anymore. Those non-acer machines should be supported by
627 .ident = "Lenovo Ideapad S205-10382JG",
636 .ident = "Lenovo Ideapad S205-1038DPG",
649 interface->capability &= ~ACER_CAP_BRIGHTNESS; in video_set_backlight_video_vendor()
729 return interface->capability & cap; in has_cap()
768 switch (cap) { in AMW0_get_u32()
770 switch (quirks->mailled) { in AMW0_get_u32()
780 switch (quirks->wireless) { in AMW0_get_u32()
808 switch (quirks->bluetooth) { in AMW0_get_u32()
818 switch (quirks->brightness) { in AMW0_get_u32()
841 switch (cap) { in AMW0_set_u32()
860 switch (quirks->brightness) { in AMW0_set_u32()
888 if (obj && obj->type == ACPI_TYPE_BUFFER && in AMW0_find_mailled()
889 obj->buffer.length == sizeof(struct wmab_ret)) { in AMW0_find_mailled()
890 ret = *((struct wmab_ret *) obj->buffer.pointer); in AMW0_find_mailled()
897 interface->capability |= ACER_CAP_MAILLED; in AMW0_find_mailled()
908 { "SNY5001", 0}, /* sony-laptop in charge */
917 for (id = norfkill_ids; id->id[0]; id++) in AMW0_set_cap_acpi_check_device()
918 if (acpi_dev_found(id->id)) in AMW0_set_cap_acpi_check_device()
939 interface->capability |= ACER_CAP_WIRELESS; in AMW0_set_capabilities()
954 if (obj && obj->type == ACPI_TYPE_BUFFER && in AMW0_set_capabilities()
955 obj->buffer.length == sizeof(struct wmab_ret)) { in AMW0_set_capabilities()
956 ret = *((struct wmab_ret *) obj->buffer.pointer); in AMW0_set_capabilities()
963 interface->capability |= ACER_CAP_WIRELESS; in AMW0_set_capabilities()
977 if (obj && obj->type == ACPI_TYPE_BUFFER in AMW0_set_capabilities()
978 && obj->buffer.length == sizeof(struct wmab_ret)) { in AMW0_set_capabilities()
979 ret = *((struct wmab_ret *) obj->buffer.pointer); in AMW0_set_capabilities()
986 interface->capability |= ACER_CAP_BLUETOOTH; in AMW0_set_capabilities()
993 if (quirks->brightness >= 0) in AMW0_set_capabilities()
994 interface->capability |= ACER_CAP_BRIGHTNESS; in AMW0_set_capabilities()
1029 if (obj->type == ACPI_TYPE_BUFFER && in WMI_execute_u32()
1030 (obj->buffer.length == sizeof(u32) || in WMI_execute_u32()
1031 obj->buffer.length == sizeof(u64))) { in WMI_execute_u32()
1032 tmp = *((u32 *) obj->buffer.pointer); in WMI_execute_u32()
1033 } else if (obj->type == ACPI_TYPE_INTEGER) { in WMI_execute_u32()
1034 tmp = (u32) obj->integer.value; in WMI_execute_u32()
1052 switch (cap) { in WMID_get_u32()
1066 if (quirks->mailled == 1) { in WMID_get_u32()
1088 switch (cap) { in WMID_set_u32()
1112 if (quirks->mailled == 1) { in WMID_set_u32()
1150 else if (obj->type != ACPI_TYPE_BUFFER) { in wmid3_get_device_status()
1154 if (obj->buffer.length != 8) { in wmid3_get_device_status()
1155 pr_warn("Unknown buffer length %d\n", obj->buffer.length); in wmid3_get_device_status()
1160 return_value = *((struct wmid3_gds_return_value *)obj->buffer.pointer); in wmid3_get_device_status()
1164 pr_warn("Get 0x%x Device Status failed: 0x%x - 0x%x\n", in wmid3_get_device_status()
1178 switch (cap) { in wmid_v2_get_u32()
1229 else if (obj->type != ACPI_TYPE_BUFFER) { in wmid3_set_device_status()
1233 if (obj->buffer.length != 8) { in wmid3_set_device_status()
1234 pr_warn("Unknown buffer length %d\n", obj->buffer.length); in wmid3_set_device_status()
1239 return_value = *((struct wmid3_gds_return_value *)obj->buffer.pointer); in wmid3_set_device_status()
1243 pr_warn("Get Current Device Status failed: 0x%x - 0x%x\n", in wmid3_set_device_status()
1260 else if (obj->type != ACPI_TYPE_BUFFER) { in wmid3_set_device_status()
1264 if (obj->buffer.length != 4) { in wmid3_set_device_status()
1265 pr_warn("Unknown buffer length %d\n", obj->buffer.length); in wmid3_set_device_status()
1270 return_value = *((struct wmid3_gds_return_value *)obj->buffer.pointer); in wmid3_set_device_status()
1274 pr_warn("Set Device Status failed: 0x%x - 0x%x\n", in wmid3_set_device_status()
1285 switch (cap) { in wmid_v2_set_u32()
1305 /* We are looking for OEM-specific Type AAh */ in type_aa_dmi_decode()
1306 if (header->type != 0xAA) in type_aa_dmi_decode()
1313 type_aa->commun_func_bitmap); in type_aa_dmi_decode()
1314 commun_func_bitmap = type_aa->commun_func_bitmap; in type_aa_dmi_decode()
1316 if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_WIRELESS) in type_aa_dmi_decode()
1317 interface->capability |= ACER_CAP_WIRELESS; in type_aa_dmi_decode()
1318 if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_THREEG) in type_aa_dmi_decode()
1319 interface->capability |= ACER_CAP_THREEG; in type_aa_dmi_decode()
1320 if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_BLUETOOTH) in type_aa_dmi_decode()
1321 interface->capability |= ACER_CAP_BLUETOOTH; in type_aa_dmi_decode()
1322 if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_RFBTN) in type_aa_dmi_decode()
1325 commun_fn_key_number = type_aa->commun_fn_key_number; in type_aa_dmi_decode()
1341 if (obj->type == ACPI_TYPE_BUFFER && in WMID_set_capabilities()
1342 (obj->buffer.length == sizeof(u32) || in WMID_set_capabilities()
1343 obj->buffer.length == sizeof(u64))) { in WMID_set_capabilities()
1344 devices = *((u32 *) obj->buffer.pointer); in WMID_set_capabilities()
1345 } else if (obj->type == ACPI_TYPE_INTEGER) { in WMID_set_capabilities()
1346 devices = (u32) obj->integer.value; in WMID_set_capabilities()
1358 interface->capability |= ACER_CAP_WIRELESS; in WMID_set_capabilities()
1360 interface->capability |= ACER_CAP_THREEG; in WMID_set_capabilities()
1362 interface->capability |= ACER_CAP_BLUETOOTH; in WMID_set_capabilities()
1399 if (obj->type == ACPI_TYPE_BUFFER) { in WMI_gaming_execute_u64()
1400 if (obj->buffer.length == sizeof(u32)) in WMI_gaming_execute_u64()
1401 tmp = *((u32 *) obj->buffer.pointer); in WMI_gaming_execute_u64()
1402 else if (obj->buffer.length == sizeof(u64)) in WMI_gaming_execute_u64()
1403 tmp = *((u64 *) obj->buffer.pointer); in WMI_gaming_execute_u64()
1404 } else if (obj->type == ACPI_TYPE_INTEGER) { in WMI_gaming_execute_u64()
1405 tmp = (u64) obj->integer.value; in WMI_gaming_execute_u64()
1421 if (!(interface->capability & cap)) in WMID_gaming_set_u64()
1424 switch (cap) { in WMID_gaming_set_u64()
1448 if (!(interface->capability & cap)) in WMID_gaming_get_u64()
1451 switch (cap) { in WMID_gaming_get_u64()
1472 if (quirks->cpu_fans > 0) in WMID_gaming_set_fan_mode()
1474 for (i = 0; i < (quirks->cpu_fans + quirks->gpu_fans); ++i) in WMID_gaming_set_fan_mode()
1476 for (i = 0; i < quirks->gpu_fans; ++i) in WMID_gaming_set_fan_mode()
1478 if (quirks->cpu_fans > 0) in WMID_gaming_set_fan_mode()
1480 for (i = 0; i < (quirks->cpu_fans + quirks->gpu_fans); ++i) in WMID_gaming_set_fan_mode()
1482 for (i = 0; i < quirks->gpu_fans; ++i) in WMID_gaming_set_fan_mode()
1488 * Generic Device (interface-independent)
1495 switch (interface->type) { in get_u32()
1525 if (interface->capability & cap) { in set_u32()
1526 switch (interface->type) { in set_u32()
1589 .name = "acer-wmi::mail",
1618 int intensity = bd->props.brightness; in update_bl_status()
1620 if (bd->props.power != FB_BLANK_UNBLANK) in update_bl_status()
1622 if (bd->props.fb_blank != FB_BLANK_UNBLANK) in update_bl_status()
1643 bd = backlight_device_register("acer-wmi", dev, NULL, &acer_bl_ops, in acer_backlight_init()
1653 bd->props.power = FB_BLANK_UNBLANK; in acer_backlight_init()
1654 bd->props.brightness = read_brightness(bd); in acer_backlight_init()
1679 return -1; in acer_gsensor_init()
1696 return -1; in acer_gsensor_event()
1703 return -1; in acer_gsensor_event()
1705 if (out_obj->package.count != 4) in acer_gsensor_event()
1706 return -1; in acer_gsensor_event()
1709 (s16)out_obj->package.elements[0].integer.value); in acer_gsensor_event()
1711 (s16)out_obj->package.elements[1].integer.value); in acer_gsensor_event()
1713 (s16)out_obj->package.elements[2].integer.value); in acer_gsensor_event()
1727 return -1; in acer_toggle_turbo()
1754 * Switch series keyboard dock status
1758 switch (kbd_dock_state) { in acer_kbd_dock_state_to_sw_tablet_mode()
1761 case 0x04: /* Stand-alone tablet */ in acer_kbd_dock_state_to_sw_tablet_mode()
1782 pr_err("Error getting keyboard-dock initial status: %s\n", in acer_kbd_dock_get_initial_state()
1788 if (!obj || obj->type != ACPI_TYPE_BUFFER || obj->buffer.length != 8) { in acer_kbd_dock_get_initial_state()
1789 pr_err("Unexpected output format getting keyboard-dock initial status\n"); in acer_kbd_dock_get_initial_state()
1793 output = obj->buffer.pointer; in acer_kbd_dock_get_initial_state()
1795 pr_err("Unexpected output [0]=0x%02x [3]=0x%02x getting keyboard-dock initial status\n", in acer_kbd_dock_get_initial_state()
1814 sw_tablet_mode = acer_kbd_dock_state_to_sw_tablet_mode(event->kbd_dock_state); in acer_kbd_dock_event()
1832 if (quirks->wireless == 3) in acer_rfkill_update()
1862 return -ENODEV; in acer_rfkill_set()
1885 return ERR_PTR(-ENOMEM); in acer_rfkill_register()
1907 "acer-wireless", ACER_CAP_WIRELESS); in acer_rfkill_init()
1916 RFKILL_TYPE_BLUETOOTH, "acer-bluetooth", in acer_rfkill_init()
1926 RFKILL_TYPE_WWAN, "acer-threeg", in acer_rfkill_init()
2000 if (obj->type != ACPI_TYPE_BUFFER) { in acer_wmi_notify()
2001 pr_warn("Unknown response received %d\n", obj->type); in acer_wmi_notify()
2005 if (obj->buffer.length != 8) { in acer_wmi_notify()
2006 pr_warn("Unknown buffer length %d\n", obj->buffer.length); in acer_wmi_notify()
2011 return_value = *((struct event_return_value *)obj->buffer.pointer); in acer_wmi_notify()
2014 switch (return_value.function) { in acer_wmi_notify()
2022 pr_warn("Unknown key number - 0x%x\n", in acer_wmi_notify()
2026 switch (key->keycode) { in acer_wmi_notify()
2055 pr_warn("Unknown function number - %d - %d\n", in acer_wmi_notify()
2079 else if (obj->type != ACPI_TYPE_BUFFER) { in wmid3_set_function_mode()
2083 if (obj->buffer.length != 4) { in wmid3_set_function_mode()
2084 pr_warn("Unknown buffer length %d\n", obj->buffer.length); in wmid3_set_function_mode()
2089 *return_value = *((struct func_return_value *)obj->buffer.pointer); in wmid3_set_function_mode()
2110 pr_warn("Enabling EC raw mode failed: 0x%x - 0x%x\n", in acer_wmi_enable_ec_raw()
2134 pr_warn("Enabling Launch Manager failed: 0x%x - 0x%x\n", in acer_wmi_enable_lm()
2156 pr_warn("Enabling RF Button failed: 0x%x - 0x%x\n", in acer_wmi_enable_rf_button()
2168 adev = acpi_dev_get_first_match_dev("BST0001", NULL, -1); in acer_wmi_accel_setup()
2170 return -ENODEV; in acer_wmi_accel_setup()
2177 return -ENOMEM; in acer_wmi_accel_setup()
2179 acer_wmi_accel_dev->open = acer_gsensor_open; in acer_wmi_accel_setup()
2181 acer_wmi_accel_dev->name = "Acer BMA150 accelerometer"; in acer_wmi_accel_setup()
2182 acer_wmi_accel_dev->phys = "wmi/input1"; in acer_wmi_accel_setup()
2183 acer_wmi_accel_dev->id.bustype = BUS_HOST; in acer_wmi_accel_setup()
2184 acer_wmi_accel_dev->evbit[0] = BIT_MASK(EV_ABS); in acer_wmi_accel_setup()
2185 input_set_abs_params(acer_wmi_accel_dev, ABS_X, -16384, 16384, 0, 0); in acer_wmi_accel_setup()
2186 input_set_abs_params(acer_wmi_accel_dev, ABS_Y, -16384, 16384, 0, 0); in acer_wmi_accel_setup()
2187 input_set_abs_params(acer_wmi_accel_dev, ABS_Z, -16384, 16384, 0, 0); in acer_wmi_accel_setup()
2207 return -ENOMEM; in acer_wmi_input_setup()
2209 acer_wmi_input_dev->name = "Acer WMI hotkeys"; in acer_wmi_input_setup()
2210 acer_wmi_input_dev->phys = "wmi/input0"; in acer_wmi_input_setup()
2211 acer_wmi_input_dev->id.bustype = BUS_HOST; in acer_wmi_input_setup()
2223 err = -EIO; in acer_wmi_input_setup()
2265 if (obj->type == ACPI_TYPE_BUFFER && in get_wmid_devices()
2266 (obj->buffer.length == sizeof(u32) || in get_wmid_devices()
2267 obj->buffer.length == sizeof(u64))) { in get_wmid_devices()
2268 devices = *((u32 *) obj->buffer.pointer); in get_wmid_devices()
2269 } else if (obj->type == ACPI_TYPE_INTEGER) { in get_wmid_devices()
2270 devices = (u32) obj->integer.value; in get_wmid_devices()
2286 err = acer_led_init(&device->dev); in acer_platform_probe()
2292 err = acer_backlight_init(&device->dev); in acer_platform_probe()
2297 err = acer_rfkill_init(&device->dev); in acer_platform_probe()
2328 struct acer_data *data = &interface->data; in acer_suspend()
2331 return -ENOMEM; in acer_suspend()
2336 data->mailled = value; in acer_suspend()
2341 data->brightness = value; in acer_suspend()
2349 struct acer_data *data = &interface->data; in acer_resume()
2352 return -ENOMEM; in acer_resume()
2355 set_u32(data->mailled, ACER_CAP_MAILLED); in acer_resume()
2358 set_u32(data->brightness, ACER_CAP_BRIGHTNESS); in acer_resume()
2374 struct acer_data *data = &interface->data; in acer_platform_shutdown()
2385 .name = "acer-wmi",
2397 debugfs_remove_recursive(interface->debug.root); in remove_debugfs()
2402 interface->debug.root = debugfs_create_dir("acer-wmi", NULL); in create_debugfs()
2404 debugfs_create_u32("devices", S_IRUGO, interface->debug.root, in create_debugfs()
2405 &interface->debug.wmid_devices); in create_debugfs()
2412 pr_info("Acer Laptop ACPI-WMI Extras\n"); in acer_wmi_init()
2415 pr_info("Blacklisted hardware detected - not loading\n"); in acer_wmi_init()
2416 return -ENODEV; in acer_wmi_init()
2424 * acer-wmi driver handled those non-Acer machines by quirks list. in acer_wmi_init()
2425 * But actually acer-wmi driver was loaded on any machines that have in acer_wmi_init()
2427 * be supported by appropriate wmi drivers. e.g. fujitsu-laptop, in acer_wmi_init()
2428 * ideapad-laptop. So, here checks the machine that has AMW0_GUID1 in acer_wmi_init()
2436 return -ENODEV; in acer_wmi_init()
2440 * Detect which ACPI-WMI interface we're using. in acer_wmi_init()
2457 return -ENODEV; in acer_wmi_init()
2460 interface->capability |= ACER_CAP_BRIGHTNESS; in acer_wmi_init()
2461 } else if (!wmi_has_guid(WMID_GUID2) && interface && !has_type_aa && force_caps == -1) { in acer_wmi_init()
2463 return -ENODEV; in acer_wmi_init()
2471 return -ENODEV; in acer_wmi_init()
2480 return -ENODEV; in acer_wmi_init()
2489 interface->capability &= ~ACER_CAP_BRIGHTNESS; in acer_wmi_init()
2492 interface->capability |= ACER_CAP_SET_FUNCTION_MODE; in acer_wmi_init()
2494 if (force_caps != -1) in acer_wmi_init()
2495 interface->capability = force_caps; in acer_wmi_init()
2498 (interface->capability & ACER_CAP_SET_FUNCTION_MODE)) { in acer_wmi_init()
2505 return -ENODEV; in acer_wmi_init()
2509 return -ENODEV; in acer_wmi_init()
2520 if (err && err != -ENODEV) in acer_wmi_init()
2530 acer_platform_device = platform_device_alloc("acer-wmi", -1); in acer_wmi_init()
2532 err = -ENOMEM; in acer_wmi_init()
2541 interface->debug.wmid_devices = get_wmid_devices(); in acer_wmi_init()