static int intel_hid_probe(struct platform_device *device) { acpi_handle handle = ACPI_HANDLE(&device->dev); unsigned long long event_cap, mode; struct intel_hid_priv *priv; acpi_status status; int err; status = acpi_evaluate_integer(handle, "HDMM", NULL, &mode); if (ACPI_FAILURE(status)) { dev_warn(&device->dev, "failed to read mode\n"); return -ENODEV; } if (mode != 0) { /* * This driver only implements "simple" mode. There appear * to be no other modes, but we should be paranoid and check * for compatibility. */ dev_info(&device->dev, "platform is not in simple mode\n"); return -ENODEV; } priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; dev_set_drvdata(&device->dev, priv); err = intel_hid_input_setup(device); if (err) { pr_err("Failed to setup Intel HID hotkeys\n"); return err; } /* Setup 5 button array */ status = acpi_evaluate_integer(handle, "HEBC", NULL, &event_cap); if (ACPI_SUCCESS(status) && (event_cap & 0x20000)) { dev_info(&device->dev, "platform supports 5 button array\n"); err = intel_button_array_input_setup(device); if (err) pr_err("Failed to setup Intel 5 button array hotkeys\n"); } status = acpi_install_notify_handler(handle, ACPI_DEVICE_NOTIFY, notify_handler, device); if (ACPI_FAILURE(status)) return -EBUSY; err = intel_hid_set_enable(&device->dev, true); if (err) goto err_remove_notify; if (priv->array) { intel_button_array_enable(&device->dev, true); /* Call button load method to enable HID power button */ status = acpi_evaluate_object(handle, "BTNL", NULL, NULL); if (ACPI_FAILURE(status)) dev_warn(&device->dev, "failed to enable HID power button\n"); } return 0; err_remove_notify: acpi_remove_notify_handler(handle, ACPI_DEVICE_NOTIFY, notify_handler); return err; }
static int intel_hid_probe(struct platform_device *device) { acpi_handle handle = ACPI_HANDLE(&device->dev); unsigned long long mode; struct intel_hid_priv *priv; acpi_status status; int err; intel_hid_init_dsm(handle); if (!intel_hid_evaluate_method(handle, INTEL_HID_DSM_HDMM_FN, &mode)) { dev_warn(&device->dev, "failed to read mode\n"); return -ENODEV; } if (mode != 0) { /* * This driver only implements "simple" mode. There appear * to be no other modes, but we should be paranoid and check * for compatibility. */ dev_info(&device->dev, "platform is not in simple mode\n"); return -ENODEV; } priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; dev_set_drvdata(&device->dev, priv); err = intel_hid_input_setup(device); if (err) { pr_err("Failed to setup Intel HID hotkeys\n"); return err; } /* Setup 5 button array */ if (button_array_present(device)) { dev_info(&device->dev, "platform supports 5 button array\n"); err = intel_button_array_input_setup(device); if (err) pr_err("Failed to setup Intel 5 button array hotkeys\n"); } status = acpi_install_notify_handler(handle, ACPI_DEVICE_NOTIFY, notify_handler, device); if (ACPI_FAILURE(status)) return -EBUSY; err = intel_hid_set_enable(&device->dev, true); if (err) goto err_remove_notify; if (priv->array) { unsigned long long dummy; intel_button_array_enable(&device->dev, true); /* Call button load method to enable HID power button */ if (!intel_hid_evaluate_method(handle, INTEL_HID_DSM_BTNL_FN, &dummy)) { dev_warn(&device->dev, "failed to enable HID power button\n"); } } device_init_wakeup(&device->dev, true); return 0; err_remove_notify: acpi_remove_notify_handler(handle, ACPI_DEVICE_NOTIFY, notify_handler); return err; }