static int xo15_sci_remove(struct acpi_device *device, int type) { acpi_disable_gpe(NULL, xo15_sci_gpe); acpi_remove_gpe_handler(NULL, xo15_sci_gpe, xo15_sci_gpe_handler); cancel_work_sync(&sci_work); sysfs_remove_file(&device->dev.kobj, &lid_wake_on_close_attr.attr); return 0; }
acpi_status ec_remove_gpe_handler ( EC_CONTEXT *ec) { acpi_status status = AE_OK; FUNCTION_TRACE("ec_remove_gpe_handler"); if (!ec) { return_ACPI_STATUS(AE_BAD_PARAMETER); } status = acpi_remove_gpe_handler(ec->gpe_bit, &ec_gpe_handler); return_ACPI_STATUS(status); }
static int xo15_sci_add(struct acpi_device *device) { unsigned long long tmp; acpi_status status; int r; if (!device) return -EINVAL; strcpy(acpi_device_name(device), XO15_SCI_DEVICE_NAME); strcpy(acpi_device_class(device), XO15_SCI_CLASS); /* Get GPE bit assignment (EC events). */ status = acpi_evaluate_integer(device->handle, "_GPE", NULL, &tmp); if (ACPI_FAILURE(status)) return -EINVAL; xo15_sci_gpe = tmp; status = acpi_install_gpe_handler(NULL, xo15_sci_gpe, ACPI_GPE_EDGE_TRIGGERED, xo15_sci_gpe_handler, device); if (ACPI_FAILURE(status)) return -ENODEV; dev_info(&device->dev, "Initialized, GPE = 0x%lx\n", xo15_sci_gpe); r = sysfs_create_file(&device->dev.kobj, &lid_wake_on_close_attr.attr); if (r) goto err_sysfs; /* Flush queue, and enable all SCI events */ process_sci_queue(); olpc_ec_mask_write(EC_SCI_SRC_ALL); acpi_enable_gpe(NULL, xo15_sci_gpe); /* Enable wake-on-EC */ if (device->wakeup.flags.valid) device_init_wakeup(&device->dev, true); return 0; err_sysfs: acpi_remove_gpe_handler(NULL, xo15_sci_gpe, xo15_sci_gpe_handler); cancel_work_sync(&sci_work); return r; }