static int acpi_power_meter_add(struct acpi_device *device) { int res; struct acpi_power_meter_resource *resource; if (!device) return -EINVAL; resource = kzalloc(sizeof(struct acpi_power_meter_resource), GFP_KERNEL); if (!resource) return -ENOMEM; resource->sensors_valid = 0; resource->acpi_dev = device; mutex_init(&resource->lock); strcpy(acpi_device_name(device), ACPI_POWER_METER_DEVICE_NAME); strcpy(acpi_device_class(device), ACPI_POWER_METER_CLASS); device->driver_data = resource; free_capabilities(resource); res = read_capabilities(resource); if (res) goto exit_free; resource->trip[0] = resource->trip[1] = -1; res = setup_attrs(resource); if (res) goto exit_free; resource->hwmon_dev = hwmon_device_register(&device->dev); if (IS_ERR(resource->hwmon_dev)) { res = PTR_ERR(resource->hwmon_dev); goto exit_remove; } res = 0; goto exit; exit_remove: remove_attrs(resource); exit_free: kfree(resource); exit: return res; }
/* Handle ACPI event notifications */ static void acpi_power_meter_notify(struct acpi_device *device, u32 event) { struct acpi_power_meter_resource *resource; int res; if (!device || !acpi_driver_data(device)) return; resource = acpi_driver_data(device); mutex_lock(&resource->lock); switch (event) { case METER_NOTIFY_CONFIG: free_capabilities(resource); res = read_capabilities(resource); if (res) break; remove_attrs(resource); setup_attrs(resource); break; case METER_NOTIFY_TRIP: sysfs_notify(&device->dev.kobj, NULL, POWER_AVERAGE_NAME); update_meter(resource); break; case METER_NOTIFY_CAP: sysfs_notify(&device->dev.kobj, NULL, POWER_CAP_NAME); update_cap(resource); break; case METER_NOTIFY_INTERVAL: sysfs_notify(&device->dev.kobj, NULL, POWER_AVG_INTERVAL_NAME); update_avg_interval(resource); break; case METER_NOTIFY_CAPPING: sysfs_notify(&device->dev.kobj, NULL, POWER_ALARM_NAME); dev_info(&device->dev, "Capping in progress.\n"); break; default: WARN(1, "Unexpected event %d\n", event); break; } mutex_unlock(&resource->lock); acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS, dev_name(&device->dev), event, 0); }
/* * Process REGISTER request and save it's contacts */ static inline int save_real(struct sip_msg* _m, udomain_t* _t, char* aor_filt, int doreply) { contact_t* c; int st; str uid, ua, aor_filter; rerrno = R_FINE; if (parse_message(_m) < 0) { goto error; } if (check_contacts(_m, &st) > 0) { goto error; } if (aor_filt) { if (get_str_fparam(&aor_filter, _m, (fparam_t*)aor_filt) != 0) { ERR("registrar:save: Unable to get the AOR value\n"); return -1; } } else { aor_filter.s = 0; aor_filter.len = 0; } get_act_time(); c = get_first_contact(_m); if (get_to_uid(&uid, _m) < 0) goto error; ua.len = 0; if (parse_headers(_m, HDR_USERAGENT_F, 0) != -1 && _m->user_agent && _m->user_agent->body.len > 0) { ua.len = _m->user_agent->body.len; ua.s = _m->user_agent->body.s; } if (ua.len == 0) { ua.len = UA_DUMMY_LEN; ua.s = UA_DUMMY_STR; } if (c == 0) { if (st) { if (star(_t, &uid, &aor_filter) < 0) goto error; } else { if (no_contacts(_t, &uid, &aor_filter) < 0) goto error; } } else { if (contacts(_m, c, _t, &uid, &ua, &aor_filter) < 0) goto error; } if (doreply) { if (send_reply(_m) < 0) return -1; } else { /* No reply sent, create attributes with values * of reply code, reason text, and contacts */ if (setup_attrs(_m) < 0) return -1; } return 1; error: if (doreply) { send_reply(_m); return 0; } return -2; }