int acpi_i2c_install_space_handler(struct i2c_adapter *adapter) { acpi_handle handle = ACPI_HANDLE(adapter->dev.parent); struct acpi_i2c_handler_data *data; acpi_status status; if (!handle) return -ENODEV; data = kzalloc(sizeof(struct acpi_i2c_handler_data), GFP_KERNEL); if (!data) return -ENOMEM; data->adapter = adapter; status = acpi_bus_attach_private_data(handle, (void *)data); if (ACPI_FAILURE(status)) { kfree(data); return -ENOMEM; } status = acpi_install_address_space_handler(handle, ACPI_ADR_SPACE_GSBUS, &acpi_i2c_space_handler, NULL, data); if (ACPI_FAILURE(status)) { dev_err(&adapter->dev, "Error installing i2c space handler\n"); acpi_bus_detach_private_data(handle); kfree(data); return -ENOMEM; } return 0; }
static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz) { sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone"); sysfs_remove_link(&tz->thermal_zone->device.kobj, "device"); thermal_zone_device_unregister(tz->thermal_zone); tz->thermal_zone = NULL; acpi_bus_detach_private_data(tz->device->handle); }
void acpi_i2c_remove_space_handler(struct i2c_adapter *adapter) { acpi_handle handle = ACPI_HANDLE(adapter->dev.parent); struct acpi_i2c_handler_data *data; acpi_status status; if (!handle) return; acpi_remove_address_space_handler(handle, ACPI_ADR_SPACE_GSBUS, &acpi_i2c_space_handler); status = acpi_bus_get_private_data(handle, (void **)&data); if (ACPI_SUCCESS(status)) kfree(data); acpi_bus_detach_private_data(handle); }