Lines Matching +full:sensor +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2007-2009 Luca Tettamanti <[email protected]>
36 /* Old interface reads the same sensor for fan0 and fan1 */
134 u32 id; member
161 u64 id; member
173 * [0-3] "value" is valid flag
174 * [4-7] value
175 * [8- ] unknown stuff on newer mobos
185 u32 id; member
193 static int atk_read_value(struct atk_sensor_data *sensor, u64 *value);
228 if (s->type == HWMON_TYPE_TEMP) in atk_input_show()
240 return sprintf(buf, "%s\n", s->acpi_name); in atk_label_show()
247 u64 value = s->limit1; in atk_limit1_show()
249 if (s->type == HWMON_TYPE_TEMP) in atk_limit1_show()
259 u64 value = s->limit2; in atk_limit2_show()
261 if (s->type == HWMON_TYPE_TEMP) in atk_limit2_show()
270 sysfs_attr_init(&attr->attr); in atk_init_attribute()
271 attr->attr.name = name; in atk_init_attribute()
272 attr->attr.mode = 0444; in atk_init_attribute()
273 attr->show = show; in atk_init_attribute()
274 attr->store = NULL; in atk_init_attribute()
282 bool old_if = data->old_interface; in atk_get_pack_member()
308 return &pack->package.elements[offset]; in atk_get_pack_member()
314 * - flag (int)
315 * class - used for de-muxing the request to the correct GITn
317 * sensor id |
318 * sensor id - used for de-muxing the request _inside_ the GITn
319 * - name (str)
320 * - unknown (int)
321 * - unknown (int)
322 * - limit1 (int)
323 * - limit2 (int)
324 * - enable (int)
330 struct device *dev = &data->acpi_dev->dev; in validate_hwmon_pack()
332 bool old_if = data->old_interface; in validate_hwmon_pack()
336 if (obj->type != ACPI_TYPE_PACKAGE) { in validate_hwmon_pack()
337 dev_warn(dev, "Invalid type: %d\n", obj->type); in validate_hwmon_pack()
338 return -EINVAL; in validate_hwmon_pack()
341 if (obj->package.count != expected_size) { in validate_hwmon_pack()
343 obj->package.count, expected_size); in validate_hwmon_pack()
344 return -EINVAL; in validate_hwmon_pack()
348 if (tmp->type != ACPI_TYPE_INTEGER) { in validate_hwmon_pack()
349 dev_warn(dev, "Invalid type (flag): %d\n", tmp->type); in validate_hwmon_pack()
350 return -EINVAL; in validate_hwmon_pack()
354 if (tmp->type != ACPI_TYPE_STRING) { in validate_hwmon_pack()
355 dev_warn(dev, "Invalid type (name): %d\n", tmp->type); in validate_hwmon_pack()
356 return -EINVAL; in validate_hwmon_pack()
361 tmp = &obj->package.elements[HWMON_PACK_UNK1]; in validate_hwmon_pack()
362 if (tmp->type != ACPI_TYPE_INTEGER) { in validate_hwmon_pack()
363 dev_warn(dev, "Invalid type (unk1): %d\n", tmp->type); in validate_hwmon_pack()
364 return -EINVAL; in validate_hwmon_pack()
367 tmp = &obj->package.elements[HWMON_PACK_UNK2]; in validate_hwmon_pack()
368 if (tmp->type != ACPI_TYPE_INTEGER) { in validate_hwmon_pack()
369 dev_warn(dev, "Invalid type (unk2): %d\n", tmp->type); in validate_hwmon_pack()
370 return -EINVAL; in validate_hwmon_pack()
375 if (tmp->type != ACPI_TYPE_INTEGER) { in validate_hwmon_pack()
376 dev_warn(dev, "Invalid type (limit1): %d\n", tmp->type); in validate_hwmon_pack()
377 return -EINVAL; in validate_hwmon_pack()
381 if (tmp->type != ACPI_TYPE_INTEGER) { in validate_hwmon_pack()
382 dev_warn(dev, "Invalid type (limit2): %d\n", tmp->type); in validate_hwmon_pack()
383 return -EINVAL; in validate_hwmon_pack()
387 if (tmp->type != ACPI_TYPE_INTEGER) { in validate_hwmon_pack()
388 dev_warn(dev, "Invalid type (enable): %d\n", tmp->type); in validate_hwmon_pack()
389 return -EINVAL; in validate_hwmon_pack()
400 u64 type = flags->integer.value & ATK_TYPE_MASK; in atk_sensor_type()
425 struct device *dev = &data->acpi_dev->dev; in atk_print_sensor()
441 dev_dbg(dev, "%s: %#llx %s [%llu-%llu] %s\n", what, in atk_print_sensor()
442 flags->integer.value, in atk_print_sensor()
443 name->string.pointer, in atk_print_sensor()
444 limit1->integer.value, limit2->integer.value, in atk_print_sensor()
445 str_enabled_disabled(enable->integer.value)); in atk_print_sensor()
449 static int atk_read_value_old(struct atk_sensor_data *sensor, u64 *value) in atk_read_value_old() argument
451 struct atk_data *data = sensor->data; in atk_read_value_old()
452 struct device *dev = &data->acpi_dev->dev; in atk_read_value_old()
454 union acpi_object id; in atk_read_value_old() local
458 switch (sensor->type) { in atk_read_value_old()
460 method = data->rvlt_handle; in atk_read_value_old()
463 method = data->rtmp_handle; in atk_read_value_old()
466 method = data->rfan_handle; in atk_read_value_old()
469 return -EINVAL; in atk_read_value_old()
472 id.type = ACPI_TYPE_INTEGER; in atk_read_value_old()
473 id.integer.value = sensor->id; in atk_read_value_old()
476 params.pointer = &id; in atk_read_value_old()
482 return -EIO; in atk_read_value_old()
490 struct device *dev = &data->acpi_dev->dev; in atk_ggrp()
494 union acpi_object id; in atk_ggrp() local
497 id.type = ACPI_TYPE_INTEGER; in atk_ggrp()
498 id.integer.value = mux; in atk_ggrp()
500 params.pointer = &id; in atk_ggrp()
503 ret = acpi_evaluate_object(data->enumerate_handle, NULL, ¶ms, &buf); in atk_ggrp()
507 return ERR_PTR(-EIO); in atk_ggrp()
510 if (pack->type != ACPI_TYPE_PACKAGE) { in atk_ggrp()
511 /* Execution was successful, but the id was not found */ in atk_ggrp()
513 return ERR_PTR(-ENOENT); in atk_ggrp()
516 if (pack->package.count < 1) { in atk_ggrp()
519 return ERR_PTR(-EIO); in atk_ggrp()
524 static union acpi_object *atk_gitm(struct atk_data *data, u64 id) in atk_gitm() argument
526 struct device *dev = &data->acpi_dev->dev; in atk_gitm()
534 buf.id = id; in atk_gitm()
546 status = acpi_evaluate_object_typed(data->read_handle, NULL, ¶ms, in atk_gitm()
549 dev_warn(dev, "GITM[%#llx] ACPI exception: %s\n", id, in atk_gitm()
551 return ERR_PTR(-EIO); in atk_gitm()
556 if (obj->buffer.length < 8) { in atk_gitm()
558 obj->buffer.length); in atk_gitm()
560 return ERR_PTR(-EIO); in atk_gitm()
568 struct device *dev = &data->acpi_dev->dev; in atk_sitm()
583 status = acpi_evaluate_object_typed(data->write_handle, NULL, ¶ms, in atk_sitm()
586 dev_warn(dev, "SITM[%#x] ACPI exception: %s\n", buf->id, in atk_sitm()
588 return ERR_PTR(-EIO); in atk_sitm()
593 if (obj->buffer.length < 8) { in atk_sitm()
595 obj->buffer.length); in atk_sitm()
597 return ERR_PTR(-EIO); in atk_sitm()
602 static int atk_read_value_new(struct atk_sensor_data *sensor, u64 *value) in atk_read_value_new() argument
604 struct atk_data *data = sensor->data; in atk_read_value_new()
605 struct device *dev = &data->acpi_dev->dev; in atk_read_value_new()
610 obj = atk_gitm(data, sensor->id); in atk_read_value_new()
614 buf = (struct atk_acpi_ret_buffer *)obj->buffer.pointer; in atk_read_value_new()
615 if (buf->flags == 0) { in atk_read_value_new()
618 * - sensor failure in atk_read_value_new()
619 * - enumeration was FUBAR (and we didn't notice) in atk_read_value_new()
621 dev_warn(dev, "Read failed, sensor = %#llx\n", sensor->id); in atk_read_value_new()
622 err = -EIO; in atk_read_value_new()
626 *value = buf->value; in atk_read_value_new()
632 static int atk_read_value(struct atk_sensor_data *sensor, u64 *value) in atk_read_value() argument
636 if (!sensor->is_valid || in atk_read_value()
637 time_after(jiffies, sensor->last_updated + CACHE_TIME)) { in atk_read_value()
638 if (sensor->data->old_interface) in atk_read_value()
639 err = atk_read_value_old(sensor, value); in atk_read_value()
641 err = atk_read_value_new(sensor, value); in atk_read_value()
646 sensor->is_valid = true; in atk_read_value()
647 sensor->last_updated = jiffies; in atk_read_value()
648 sensor->cached_value = *value; in atk_read_value()
650 *value = sensor->cached_value; in atk_read_value()
665 if (!data->read_handle) in atk_debugfs_gitm_get()
666 return -ENODEV; in atk_debugfs_gitm_get()
668 if (!data->debugfs.id) in atk_debugfs_gitm_get()
669 return -EINVAL; in atk_debugfs_gitm_get()
671 ret = atk_gitm(data, data->debugfs.id); in atk_debugfs_gitm_get()
675 buf = (struct atk_acpi_ret_buffer *)ret->buffer.pointer; in atk_debugfs_gitm_get()
676 if (buf->flags) in atk_debugfs_gitm_get()
677 *val = buf->value; in atk_debugfs_gitm_get()
679 err = -EIO; in atk_debugfs_gitm_get()
692 switch (obj->type) { in atk_acpi_print()
694 ret = snprintf(buf, sz, "0x%08llx\n", obj->integer.value); in atk_acpi_print()
697 ret = snprintf(buf, sz, "%s\n", obj->string.pointer); in atk_acpi_print()
709 for (i = 0; i < pack->package.count; i++) { in atk_pack_print()
710 union acpi_object *obj = &pack->package.elements[i]; in atk_pack_print()
716 sz -= ret; in atk_pack_print()
722 struct atk_data *data = inode->i_private; in atk_debugfs_ggrp_open()
728 if (!data->enumerate_handle) in atk_debugfs_ggrp_open()
729 return -ENODEV; in atk_debugfs_ggrp_open()
730 if (!data->debugfs.id) in atk_debugfs_ggrp_open()
731 return -EINVAL; in atk_debugfs_ggrp_open()
733 cls = (data->debugfs.id & 0xff000000) >> 24; in atk_debugfs_ggrp_open()
738 for (i = 0; i < ret->package.count; i++) { in atk_debugfs_ggrp_open()
739 union acpi_object *pack = &ret->package.elements[i]; in atk_debugfs_ggrp_open()
740 union acpi_object *id; in atk_debugfs_ggrp_open() local
742 if (pack->type != ACPI_TYPE_PACKAGE) in atk_debugfs_ggrp_open()
744 if (!pack->package.count) in atk_debugfs_ggrp_open()
746 id = &pack->package.elements[0]; in atk_debugfs_ggrp_open()
747 if (id->integer.value == data->debugfs.id) { in atk_debugfs_ggrp_open()
752 return -ENOMEM; in atk_debugfs_ggrp_open()
761 return -EINVAL; in atk_debugfs_ggrp_open()
763 file->private_data = buf; in atk_debugfs_ggrp_open()
771 char *str = file->private_data; in atk_debugfs_ggrp_read()
779 kfree(file->private_data); in atk_debugfs_ggrp_release()
793 data->debugfs.id = 0; in atk_debugfs_init()
797 debugfs_create_x32("id", 0600, d, &data->debugfs.id); in atk_debugfs_init()
801 data->debugfs.root = d; in atk_debugfs_init()
806 debugfs_remove_recursive(data->debugfs.root); in atk_debugfs_cleanup()
822 struct device *dev = &data->acpi_dev->dev; in atk_add_sensor()
828 struct atk_sensor_data *sensor; in atk_add_sensor() local
837 if (obj->type != ACPI_TYPE_PACKAGE) { in atk_add_sensor()
840 obj->type); in atk_add_sensor()
841 return -EINVAL; in atk_add_sensor()
849 type = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS)->integer.value in atk_add_sensor()
857 num = &data->voltage_count; in atk_add_sensor()
864 num = &data->temperature_count; in atk_add_sensor()
871 num = &data->fan_count; in atk_add_sensor()
875 dev_warn(dev, "Unknown sensor type: %#llx\n", type); in atk_add_sensor()
876 return -EINVAL; in atk_add_sensor()
880 if (!enable->integer.value) in atk_add_sensor()
881 /* sensor is disabled */ in atk_add_sensor()
889 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in atk_add_sensor()
890 if (!sensor) in atk_add_sensor()
891 return -ENOMEM; in atk_add_sensor()
893 sensor->acpi_name = devm_kstrdup(dev, name->string.pointer, GFP_KERNEL); in atk_add_sensor()
894 if (!sensor->acpi_name) in atk_add_sensor()
895 return -ENOMEM; in atk_add_sensor()
897 INIT_LIST_HEAD(&sensor->list); in atk_add_sensor()
898 sensor->type = type; in atk_add_sensor()
899 sensor->data = data; in atk_add_sensor()
900 sensor->id = flags->integer.value; in atk_add_sensor()
901 sensor->limit1 = limit1->integer.value; in atk_add_sensor()
902 if (data->old_interface) in atk_add_sensor()
903 sensor->limit2 = limit2->integer.value; in atk_add_sensor()
906 sensor->limit2 = sensor->limit1 + limit2->integer.value; in atk_add_sensor()
908 snprintf(sensor->input_attr_name, ATTR_NAME_SIZE, in atk_add_sensor()
910 atk_init_attribute(&sensor->input_attr, in atk_add_sensor()
911 sensor->input_attr_name, in atk_add_sensor()
914 snprintf(sensor->label_attr_name, ATTR_NAME_SIZE, in atk_add_sensor()
916 atk_init_attribute(&sensor->label_attr, in atk_add_sensor()
917 sensor->label_attr_name, in atk_add_sensor()
920 snprintf(sensor->limit1_attr_name, ATTR_NAME_SIZE, in atk_add_sensor()
922 atk_init_attribute(&sensor->limit1_attr, in atk_add_sensor()
923 sensor->limit1_attr_name, in atk_add_sensor()
926 snprintf(sensor->limit2_attr_name, ATTR_NAME_SIZE, in atk_add_sensor()
928 atk_init_attribute(&sensor->limit2_attr, in atk_add_sensor()
929 sensor->limit2_attr_name, in atk_add_sensor()
932 list_add(&sensor->list, &data->sensor_list); in atk_add_sensor()
940 struct device *dev = &data->acpi_dev->dev; in atk_enumerate_old_hwmon()
949 status = acpi_evaluate_object_typed(data->atk_handle, in atk_enumerate_old_hwmon()
955 return -ENODEV; in atk_enumerate_old_hwmon()
959 for (i = 1; i < pack->package.count; i++) { in atk_enumerate_old_hwmon()
960 union acpi_object *obj = &pack->package.elements[i]; in atk_enumerate_old_hwmon()
970 status = acpi_evaluate_object_typed(data->atk_handle, in atk_enumerate_old_hwmon()
976 return -ENODEV; in atk_enumerate_old_hwmon()
980 for (i = 1; i < pack->package.count; i++) { in atk_enumerate_old_hwmon()
981 union acpi_object *obj = &pack->package.elements[i]; in atk_enumerate_old_hwmon()
991 status = acpi_evaluate_object_typed(data->atk_handle, in atk_enumerate_old_hwmon()
997 return -ENODEV; in atk_enumerate_old_hwmon()
1001 for (i = 1; i < pack->package.count; i++) { in atk_enumerate_old_hwmon()
1002 union acpi_object *obj = &pack->package.elements[i]; in atk_enumerate_old_hwmon()
1015 struct device *dev = &data->acpi_dev->dev; in atk_ec_present()
1023 if (PTR_ERR(pack) == -ENOENT) { in atk_ec_present()
1024 /* The MGMT class does not exists - that's ok */ in atk_ec_present()
1033 for (i = 0; i < pack->package.count; i++) { in atk_ec_present()
1034 union acpi_object *obj = &pack->package.elements[i]; in atk_ec_present()
1035 union acpi_object *id; in atk_ec_present() local
1037 if (obj->type != ACPI_TYPE_PACKAGE) in atk_ec_present()
1040 id = &obj->package.elements[0]; in atk_ec_present()
1041 if (id->type != ACPI_TYPE_INTEGER) in atk_ec_present()
1044 if (id->integer.value == ATK_EC_ID) { in atk_ec_present()
1061 struct device *dev = &data->acpi_dev->dev; in atk_ec_enabled()
1071 buf = (struct atk_acpi_ret_buffer *)obj->buffer.pointer; in atk_ec_enabled()
1073 if (buf->flags == 0) { in atk_ec_enabled()
1075 err = -EIO; in atk_ec_enabled()
1077 err = (buf->value != 0); in atk_ec_enabled()
1087 struct device *dev = &data->acpi_dev->dev; in atk_ec_ctl()
1093 sitm.id = ATK_EC_ID; in atk_ec_ctl()
1102 ec_ret = (struct atk_acpi_ret_buffer *)obj->buffer.pointer; in atk_ec_ctl()
1103 if (ec_ret->flags == 0) { in atk_ec_ctl()
1105 err = -EIO; in atk_ec_ctl()
1116 struct device *dev = &data->acpi_dev->dev; in atk_enumerate_new_hwmon()
1129 data->disable_ec = err; in atk_enumerate_new_hwmon()
1133 data->disable_ec = false; in atk_enumerate_new_hwmon()
1144 for (i = 0; i < pack->package.count; i++) { in atk_enumerate_new_hwmon()
1145 union acpi_object *obj = &pack->package.elements[i]; in atk_enumerate_new_hwmon()
1150 err = data->voltage_count + data->temperature_count + data->fan_count; in atk_enumerate_new_hwmon()
1158 struct device *dev = &data->acpi_dev->dev; in atk_init_attribute_groups()
1162 int len = (data->voltage_count + data->temperature_count in atk_init_attribute_groups()
1163 + data->fan_count) * 4 + 1; in atk_init_attribute_groups()
1167 return -ENOMEM; in atk_init_attribute_groups()
1169 list_for_each_entry(s, &data->sensor_list, list) { in atk_init_attribute_groups()
1170 attrs[i++] = &s->input_attr.attr; in atk_init_attribute_groups()
1171 attrs[i++] = &s->label_attr.attr; in atk_init_attribute_groups()
1172 attrs[i++] = &s->limit1_attr.attr; in atk_init_attribute_groups()
1173 attrs[i++] = &s->limit2_attr.attr; in atk_init_attribute_groups()
1176 data->attr_group.attrs = attrs; in atk_init_attribute_groups()
1177 data->attr_groups[0] = &data->attr_group; in atk_init_attribute_groups()
1184 struct device *dev = &data->acpi_dev->dev; in atk_register_hwmon()
1187 data->hwmon_dev = hwmon_device_register_with_groups(dev, "atk0110", in atk_register_hwmon()
1189 data->attr_groups); in atk_register_hwmon()
1191 return PTR_ERR_OR_ZERO(data->hwmon_dev); in atk_register_hwmon()
1196 struct device *dev = &data->acpi_dev->dev; in atk_probe_if()
1202 status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_TMP, &ret); in atk_probe_if()
1204 data->rtmp_handle = ret; in atk_probe_if()
1210 status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_VLT, &ret); in atk_probe_if()
1212 data->rvlt_handle = ret; in atk_probe_if()
1218 status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_FAN, &ret); in atk_probe_if()
1220 data->rfan_handle = ret; in atk_probe_if()
1226 status = acpi_get_handle(data->atk_handle, METHOD_ENUMERATE, &ret); in atk_probe_if()
1228 data->enumerate_handle = ret; in atk_probe_if()
1233 /* De-multiplexer (read) */ in atk_probe_if()
1234 status = acpi_get_handle(data->atk_handle, METHOD_READ, &ret); in atk_probe_if()
1236 data->read_handle = ret; in atk_probe_if()
1241 /* De-multiplexer (write) */ in atk_probe_if()
1242 status = acpi_get_handle(data->atk_handle, METHOD_WRITE, &ret); in atk_probe_if()
1244 data->write_handle = ret; in atk_probe_if()
1257 if (data->rtmp_handle && in atk_probe_if()
1258 data->rvlt_handle && data->rfan_handle && !new_if) in atk_probe_if()
1259 data->old_interface = true; in atk_probe_if()
1260 else if (data->enumerate_handle && data->read_handle && in atk_probe_if()
1261 data->write_handle) in atk_probe_if()
1262 data->old_interface = false; in atk_probe_if()
1264 err = -ENODEV; in atk_probe_if()
1277 dev_dbg(&device->dev, "adding...\n"); in atk_add()
1279 data = devm_kzalloc(&device->dev, sizeof(*data), GFP_KERNEL); in atk_add()
1281 return -ENOMEM; in atk_add()
1283 data->acpi_dev = device; in atk_add()
1284 data->atk_handle = device->handle; in atk_add()
1285 INIT_LIST_HEAD(&data->sensor_list); in atk_add()
1286 data->disable_ec = false; in atk_add()
1289 ret = acpi_evaluate_object_typed(data->atk_handle, BOARD_ID, NULL, in atk_add()
1292 dev_dbg(&device->dev, "atk: method MBIF not found\n"); in atk_add()
1295 if (obj->package.count >= 2) { in atk_add()
1296 union acpi_object *id = &obj->package.elements[1]; in atk_add() local
1297 if (id->type == ACPI_TYPE_STRING) in atk_add()
1298 dev_dbg(&device->dev, "board ID = %s\n", in atk_add()
1299 id->string.pointer); in atk_add()
1306 dev_err(&device->dev, "No usable hwmon interface detected\n"); in atk_add()
1310 if (data->old_interface) { in atk_add()
1311 dev_dbg(&device->dev, "Using old hwmon interface\n"); in atk_add()
1314 dev_dbg(&device->dev, "Using new hwmon interface\n"); in atk_add()
1320 dev_info(&device->dev, in atk_add()
1321 "No usable sensor detected, bailing out\n"); in atk_add()
1322 err = -ENODEV; in atk_add()
1335 device->driver_data = data; in atk_add()
1338 if (data->disable_ec) in atk_add()
1345 struct atk_data *data = device->driver_data; in atk_remove()
1346 dev_dbg(&device->dev, "removing...\n"); in atk_remove()
1348 device->driver_data = NULL; in atk_remove()
1352 hwmon_device_unregister(data->hwmon_dev); in atk_remove()
1354 if (data->disable_ec) { in atk_remove()
1356 dev_err(&device->dev, "Failed to disable EC\n"); in atk_remove()
1367 return -EBUSY; in atk0110_init()