Lines Matching refs:resource
109 static int update_avg_interval(struct acpi_power_meter_resource *resource)
114 status = acpi_evaluate_integer(resource->acpi_dev->handle, "_GAI",
117 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_GAI",
122 resource->avg_interval = data;
131 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
133 mutex_lock(&resource->lock);
134 update_avg_interval(resource);
135 mutex_unlock(&resource->lock);
137 return sprintf(buf, "%llu\n", resource->avg_interval);
145 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
157 if (temp > resource->caps.max_avg_interval ||
158 temp < resource->caps.min_avg_interval)
162 mutex_lock(&resource->lock);
163 status = acpi_evaluate_integer(resource->acpi_dev->handle, "_PAI",
166 resource->avg_interval = temp;
167 mutex_unlock(&resource->lock);
170 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_PAI",
183 static int update_cap(struct acpi_power_meter_resource *resource)
188 status = acpi_evaluate_integer(resource->acpi_dev->handle, "_GHL",
191 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_GHL",
196 resource->cap = data;
205 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
207 mutex_lock(&resource->lock);
208 update_cap(resource);
209 mutex_unlock(&resource->lock);
211 return sprintf(buf, "%llu\n", resource->cap * 1000);
218 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
231 if (temp > resource->caps.max_cap || temp < resource->caps.min_cap)
235 mutex_lock(&resource->lock);
236 status = acpi_evaluate_integer(resource->acpi_dev->handle, "_SHL",
239 resource->cap = temp;
240 mutex_unlock(&resource->lock);
243 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_SHL",
256 static int set_acpi_trip(struct acpi_power_meter_resource *resource)
267 if (resource->trip[0] < 0 || resource->trip[1] < 0)
271 arg_objs[0].integer.value = resource->trip[1];
272 arg_objs[1].integer.value = resource->trip[0];
274 status = acpi_evaluate_integer(resource->acpi_dev->handle, "_PTP",
277 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_PTP",
294 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
304 mutex_lock(&resource->lock);
305 resource->trip[attr->index - 7] = temp;
306 res = set_acpi_trip(resource);
307 mutex_unlock(&resource->lock);
316 static int update_meter(struct acpi_power_meter_resource *resource)
322 if (time_before(local_jiffies, resource->sensors_last_updated +
323 msecs_to_jiffies(resource->caps.sampling_time)) &&
324 resource->sensors_valid)
327 status = acpi_evaluate_integer(resource->acpi_dev->handle, "_PMM",
330 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_PMM",
335 resource->power = data;
336 resource->sensors_valid = 1;
337 resource->sensors_last_updated = jiffies;
346 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
348 mutex_lock(&resource->lock);
349 update_meter(resource);
350 mutex_unlock(&resource->lock);
352 if (resource->power == UNKNOWN_POWER)
355 return sprintf(buf, "%llu\n", resource->power * 1000);
365 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
369 mutex_lock(&resource->lock);
372 val = resource->model_number;
375 val = resource->serial_number;
378 val = resource->oem_info;
387 mutex_unlock(&resource->lock);
397 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
402 val = resource->caps.min_avg_interval;
405 val = resource->caps.max_avg_interval;
408 val = resource->caps.min_cap * 1000;
411 val = resource->caps.max_cap * 1000;
414 if (resource->caps.hysteresis == UNKNOWN_HYSTERESIS)
417 val = resource->caps.hysteresis * 1000;
420 if (resource->caps.flags & POWER_METER_IS_BATTERY)
426 if (resource->power > resource->cap)
433 if (resource->trip[attr->index - 7] < 0)
436 val = resource->trip[attr->index - 7] * 1000;
452 struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
453 unsigned int acc = resource->caps.accuracy;
528 static void remove_domain_devices(struct acpi_power_meter_resource *resource)
532 if (!resource->num_domain_devices)
535 for (i = 0; i < resource->num_domain_devices; i++) {
536 struct acpi_device *obj = resource->domain_devices[i];
541 sysfs_remove_link(resource->holders_dir,
546 kfree(resource->domain_devices);
547 kobject_put(resource->holders_dir);
548 resource->num_domain_devices = 0;
551 static int read_domain_devices(struct acpi_power_meter_resource *resource)
559 status = acpi_evaluate_object(resource->acpi_dev->handle, "_PMD", NULL,
562 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_PMD",
570 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
579 resource->domain_devices = kcalloc(pss->package.count,
582 if (!resource->domain_devices) {
587 resource->holders_dir = kobject_create_and_add("measures",
588 &resource->acpi_dev->dev.kobj);
589 if (!resource->holders_dir) {
594 resource->num_domain_devices = pss->package.count;
606 resource->domain_devices[i] = obj;
610 res = sysfs_create_link(resource->holders_dir, &obj->dev.kobj,
614 resource->domain_devices[i] = NULL;
622 kfree(resource->domain_devices);
629 static int register_attrs(struct acpi_power_meter_resource *resource,
632 struct device *dev = &resource->acpi_dev->dev;
634 &resource->sensors[resource->num_sensors];
655 resource->num_sensors++;
663 static void remove_attrs(struct acpi_power_meter_resource *resource)
667 for (i = 0; i < resource->num_sensors; i++) {
668 if (!resource->sensors[i].dev_attr.attr.name)
670 device_remove_file(&resource->acpi_dev->dev,
671 &resource->sensors[i].dev_attr);
674 remove_domain_devices(resource);
676 resource->num_sensors = 0;
679 static int setup_attrs(struct acpi_power_meter_resource *resource)
683 res = read_domain_devices(resource);
687 if (resource->caps.flags & POWER_METER_CAN_MEASURE) {
688 res = register_attrs(resource, meter_attrs);
693 if (resource->caps.flags & POWER_METER_CAN_CAP) {
695 dev_warn(&resource->acpi_dev->dev,
700 if (resource->caps.configurable_cap)
701 res = register_attrs(resource, rw_cap_attrs);
703 res = register_attrs(resource, ro_cap_attrs);
708 res = register_attrs(resource, misc_cap_attrs);
714 if (resource->caps.flags & POWER_METER_CAN_TRIP) {
715 res = register_attrs(resource, trip_attrs);
720 res = register_attrs(resource, misc_attrs);
726 remove_attrs(resource);
730 static void free_capabilities(struct acpi_power_meter_resource *resource)
735 str = &resource->model_number;
742 static int read_capabilities(struct acpi_power_meter_resource *resource)
753 status = acpi_evaluate_object(resource->acpi_dev->handle, "_PMC", NULL,
756 acpi_evaluation_failure_warn(resource->acpi_dev->handle, "_PMC",
765 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
773 state.pointer = &resource->caps;
777 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
784 if (resource->caps.units) {
785 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
787 resource->caps.units);
793 str = &resource->model_number;
814 dev_info(&resource->acpi_dev->dev, "Found ACPI power meter.\n");
817 free_capabilities(resource);
826 struct acpi_power_meter_resource *resource;
832 resource = acpi_driver_data(device);
836 mutex_lock(&resource->lock);
837 free_capabilities(resource);
838 res = read_capabilities(resource);
839 mutex_unlock(&resource->lock);
843 remove_attrs(resource);
844 setup_attrs(resource);
871 struct acpi_power_meter_resource *resource;
876 resource = kzalloc(sizeof(*resource), GFP_KERNEL);
877 if (!resource)
880 resource->sensors_valid = 0;
881 resource->acpi_dev = device;
882 mutex_init(&resource->lock);
885 device->driver_data = resource;
887 res = read_capabilities(resource);
891 resource->trip[0] = -1;
892 resource->trip[1] = -1;
894 res = setup_attrs(resource);
898 resource->hwmon_dev = hwmon_device_register(&device->dev);
899 if (IS_ERR(resource->hwmon_dev)) {
900 res = PTR_ERR(resource->hwmon_dev);
908 remove_attrs(resource);
910 free_capabilities(resource);
912 kfree(resource);
919 struct acpi_power_meter_resource *resource;
924 resource = acpi_driver_data(device);
925 hwmon_device_unregister(resource->hwmon_dev);
927 remove_attrs(resource);
928 free_capabilities(resource);
930 kfree(resource);
935 struct acpi_power_meter_resource *resource;
940 resource = acpi_driver_data(to_acpi_device(dev));
941 if (!resource)
944 free_capabilities(resource);
945 read_capabilities(resource);