• Home
  • Raw
  • Download

Lines Matching +full:power +full:- +full:sensor

1 // SPDX-License-Identifier: GPL-2.0+
7 #include <linux/hwmon-sysfs.h>
31 /* OCC sensor type and version definitions */
127 u16 checksum = occ->poll_cmd_data + occ->seq_no + 1; in occ_poll()
132 cmd[0] = occ->seq_no++; /* sequence number */ in occ_poll()
136 cmd[4] = occ->poll_cmd_data; /* data */ in occ_poll()
142 rc = occ->send_cmd(occ, cmd); in occ_poll()
144 occ->last_error = rc; in occ_poll()
145 if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD) in occ_poll()
146 occ->error = rc; in occ_poll()
152 occ->error_count = 0; in occ_poll()
153 occ->last_error = 0; in occ_poll()
154 occ->error = 0; in occ_poll()
157 header = (struct occ_poll_response_header *)occ->resp.data; in occ_poll()
158 if (header->occ_state == OCC_STATE_SAFE) { in occ_poll()
159 if (occ->last_safe) { in occ_poll()
161 occ->last_safe + OCC_SAFE_TIMEOUT)) in occ_poll()
162 occ->error = -EHOSTDOWN; in occ_poll()
164 occ->last_safe = jiffies; in occ_poll()
167 occ->last_safe = 0; in occ_poll()
193 rc = mutex_lock_interruptible(&occ->lock); in occ_set_user_power_cap()
197 rc = occ->send_cmd(occ, cmd); in occ_set_user_power_cap()
199 mutex_unlock(&occ->lock); in occ_set_user_power_cap()
206 int rc = mutex_lock_interruptible(&occ->lock); in occ_update_response()
212 if (time_after(jiffies, occ->next_update)) { in occ_update_response()
214 occ->next_update = jiffies + OCC_UPDATE_FREQUENCY; in occ_update_response()
216 rc = occ->last_error; in occ_update_response()
219 mutex_unlock(&occ->lock); in occ_update_response()
230 struct occ_sensors *sensors = &occ->sensors; in occ_show_temp_1()
237 temp = ((struct temp_sensor_1 *)sensors->temp.data) + sattr->index; in occ_show_temp_1()
239 switch (sattr->nr) { in occ_show_temp_1()
241 val = get_unaligned_be16(&temp->sensor_id); in occ_show_temp_1()
245 * If a sensor reading has expired and couldn't be refreshed, in occ_show_temp_1()
246 * OCC returns 0xFFFF for that sensor. in occ_show_temp_1()
248 if (temp->value == 0xFFFF) in occ_show_temp_1()
249 return -EREMOTEIO; in occ_show_temp_1()
250 val = get_unaligned_be16(&temp->value) * 1000; in occ_show_temp_1()
253 return -EINVAL; in occ_show_temp_1()
256 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); in occ_show_temp_1()
266 struct occ_sensors *sensors = &occ->sensors; in occ_show_temp_2()
273 temp = ((struct temp_sensor_2 *)sensors->temp.data) + sattr->index; in occ_show_temp_2()
275 switch (sattr->nr) { in occ_show_temp_2()
277 val = get_unaligned_be32(&temp->sensor_id); in occ_show_temp_2()
280 val = temp->value; in occ_show_temp_2()
282 return -EREMOTEIO; in occ_show_temp_2()
289 if (temp->fru_type != OCC_FRU_TYPE_VRM) { in occ_show_temp_2()
290 /* sensor not ready */ in occ_show_temp_2()
292 return -EAGAIN; in occ_show_temp_2()
298 val = temp->fru_type; in occ_show_temp_2()
301 val = temp->value == OCC_TEMP_SENSOR_FAULT; in occ_show_temp_2()
304 return -EINVAL; in occ_show_temp_2()
307 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); in occ_show_temp_2()
317 struct occ_sensors *sensors = &occ->sensors; in occ_show_freq_1()
324 freq = ((struct freq_sensor_1 *)sensors->freq.data) + sattr->index; in occ_show_freq_1()
326 switch (sattr->nr) { in occ_show_freq_1()
328 val = get_unaligned_be16(&freq->sensor_id); in occ_show_freq_1()
331 val = get_unaligned_be16(&freq->value); in occ_show_freq_1()
334 return -EINVAL; in occ_show_freq_1()
337 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); in occ_show_freq_1()
347 struct occ_sensors *sensors = &occ->sensors; in occ_show_freq_2()
354 freq = ((struct freq_sensor_2 *)sensors->freq.data) + sattr->index; in occ_show_freq_2()
356 switch (sattr->nr) { in occ_show_freq_2()
358 val = get_unaligned_be32(&freq->sensor_id); in occ_show_freq_2()
361 val = get_unaligned_be16(&freq->value); in occ_show_freq_2()
364 return -EINVAL; in occ_show_freq_2()
367 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); in occ_show_freq_2()
375 struct power_sensor_1 *power; in occ_show_power_1() local
377 struct occ_sensors *sensors = &occ->sensors; in occ_show_power_1()
384 power = ((struct power_sensor_1 *)sensors->power.data) + sattr->index; in occ_show_power_1()
386 switch (sattr->nr) { in occ_show_power_1()
388 val = get_unaligned_be16(&power->sensor_id); in occ_show_power_1()
391 val = get_unaligned_be32(&power->accumulator) / in occ_show_power_1()
392 get_unaligned_be32(&power->update_tag); in occ_show_power_1()
396 val = (u64)get_unaligned_be32(&power->update_tag) * in occ_show_power_1()
397 occ->powr_sample_time_us; in occ_show_power_1()
400 val = get_unaligned_be16(&power->value) * 1000000ULL; in occ_show_power_1()
403 return -EINVAL; in occ_show_power_1()
406 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); in occ_show_power_1()
422 struct power_sensor_2 *power; in occ_show_power_2() local
424 struct occ_sensors *sensors = &occ->sensors; in occ_show_power_2()
431 power = ((struct power_sensor_2 *)sensors->power.data) + sattr->index; in occ_show_power_2()
433 switch (sattr->nr) { in occ_show_power_2()
435 return snprintf(buf, PAGE_SIZE - 1, "%u_%u_%u\n", in occ_show_power_2()
436 get_unaligned_be32(&power->sensor_id), in occ_show_power_2()
437 power->function_id, power->apss_channel); in occ_show_power_2()
439 val = occ_get_powr_avg(&power->accumulator, in occ_show_power_2()
440 &power->update_tag); in occ_show_power_2()
443 val = (u64)get_unaligned_be32(&power->update_tag) * in occ_show_power_2()
444 occ->powr_sample_time_us; in occ_show_power_2()
447 val = get_unaligned_be16(&power->value) * 1000000ULL; in occ_show_power_2()
450 return -EINVAL; in occ_show_power_2()
453 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); in occ_show_power_2()
461 struct power_sensor_a0 *power; in occ_show_power_a0() local
463 struct occ_sensors *sensors = &occ->sensors; in occ_show_power_a0()
470 power = ((struct power_sensor_a0 *)sensors->power.data) + sattr->index; in occ_show_power_a0()
472 switch (sattr->nr) { in occ_show_power_a0()
474 return snprintf(buf, PAGE_SIZE - 1, "%u_system\n", in occ_show_power_a0()
475 get_unaligned_be32(&power->sensor_id)); in occ_show_power_a0()
477 val = occ_get_powr_avg(&power->system.accumulator, in occ_show_power_a0()
478 &power->system.update_tag); in occ_show_power_a0()
481 val = (u64)get_unaligned_be32(&power->system.update_tag) * in occ_show_power_a0()
482 occ->powr_sample_time_us; in occ_show_power_a0()
485 val = get_unaligned_be16(&power->system.value) * 1000000ULL; in occ_show_power_a0()
488 return snprintf(buf, PAGE_SIZE - 1, "%u_proc\n", in occ_show_power_a0()
489 get_unaligned_be32(&power->sensor_id)); in occ_show_power_a0()
491 val = occ_get_powr_avg(&power->proc.accumulator, in occ_show_power_a0()
492 &power->proc.update_tag); in occ_show_power_a0()
495 val = (u64)get_unaligned_be32(&power->proc.update_tag) * in occ_show_power_a0()
496 occ->powr_sample_time_us; in occ_show_power_a0()
499 val = get_unaligned_be16(&power->proc.value) * 1000000ULL; in occ_show_power_a0()
502 return snprintf(buf, PAGE_SIZE - 1, "%u_vdd\n", in occ_show_power_a0()
503 get_unaligned_be32(&power->sensor_id)); in occ_show_power_a0()
505 val = occ_get_powr_avg(&power->vdd.accumulator, in occ_show_power_a0()
506 &power->vdd.update_tag); in occ_show_power_a0()
509 val = (u64)get_unaligned_be32(&power->vdd.update_tag) * in occ_show_power_a0()
510 occ->powr_sample_time_us; in occ_show_power_a0()
513 val = get_unaligned_be16(&power->vdd.value) * 1000000ULL; in occ_show_power_a0()
516 return snprintf(buf, PAGE_SIZE - 1, "%u_vdn\n", in occ_show_power_a0()
517 get_unaligned_be32(&power->sensor_id)); in occ_show_power_a0()
519 val = occ_get_powr_avg(&power->vdn.accumulator, in occ_show_power_a0()
520 &power->vdn.update_tag); in occ_show_power_a0()
523 val = (u64)get_unaligned_be32(&power->vdn.update_tag) * in occ_show_power_a0()
524 occ->powr_sample_time_us; in occ_show_power_a0()
527 val = get_unaligned_be16(&power->vdn.value) * 1000000ULL; in occ_show_power_a0()
530 return -EINVAL; in occ_show_power_a0()
533 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); in occ_show_power_a0()
543 struct occ_sensors *sensors = &occ->sensors; in occ_show_caps_1_2()
550 caps = ((struct caps_sensor_2 *)sensors->caps.data) + sattr->index; in occ_show_caps_1_2()
552 switch (sattr->nr) { in occ_show_caps_1_2()
554 return snprintf(buf, PAGE_SIZE - 1, "system\n"); in occ_show_caps_1_2()
556 val = get_unaligned_be16(&caps->cap) * 1000000ULL; in occ_show_caps_1_2()
559 val = get_unaligned_be16(&caps->system_power) * 1000000ULL; in occ_show_caps_1_2()
562 val = get_unaligned_be16(&caps->n_cap) * 1000000ULL; in occ_show_caps_1_2()
565 val = get_unaligned_be16(&caps->max) * 1000000ULL; in occ_show_caps_1_2()
568 val = get_unaligned_be16(&caps->min) * 1000000ULL; in occ_show_caps_1_2()
571 val = get_unaligned_be16(&caps->user) * 1000000ULL; in occ_show_caps_1_2()
574 if (occ->sensors.caps.version == 1) in occ_show_caps_1_2()
575 return -EINVAL; in occ_show_caps_1_2()
577 val = caps->user_source; in occ_show_caps_1_2()
580 return -EINVAL; in occ_show_caps_1_2()
583 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); in occ_show_caps_1_2()
593 struct occ_sensors *sensors = &occ->sensors; in occ_show_caps_3()
600 caps = ((struct caps_sensor_3 *)sensors->caps.data) + sattr->index; in occ_show_caps_3()
602 switch (sattr->nr) { in occ_show_caps_3()
604 return snprintf(buf, PAGE_SIZE - 1, "system\n"); in occ_show_caps_3()
606 val = get_unaligned_be16(&caps->cap) * 1000000ULL; in occ_show_caps_3()
609 val = get_unaligned_be16(&caps->system_power) * 1000000ULL; in occ_show_caps_3()
612 val = get_unaligned_be16(&caps->n_cap) * 1000000ULL; in occ_show_caps_3()
615 val = get_unaligned_be16(&caps->max) * 1000000ULL; in occ_show_caps_3()
618 val = get_unaligned_be16(&caps->hard_min) * 1000000ULL; in occ_show_caps_3()
621 val = get_unaligned_be16(&caps->user) * 1000000ULL; in occ_show_caps_3()
624 val = caps->user_source; in occ_show_caps_3()
627 return -EINVAL; in occ_show_caps_3()
630 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); in occ_show_caps_3()
661 struct occ_sensors *sensors = &occ->sensors; in occ_show_extended()
668 extn = ((struct extended_sensor *)sensors->extended.data) + in occ_show_extended()
669 sattr->index; in occ_show_extended()
671 switch (sattr->nr) { in occ_show_extended()
673 if (extn->flags & EXTN_FLAG_SENSOR_ID) in occ_show_extended()
674 rc = snprintf(buf, PAGE_SIZE - 1, "%u", in occ_show_extended()
675 get_unaligned_be32(&extn->sensor_id)); in occ_show_extended()
677 rc = snprintf(buf, PAGE_SIZE - 1, "%02x%02x%02x%02x\n", in occ_show_extended()
678 extn->name[0], extn->name[1], in occ_show_extended()
679 extn->name[2], extn->name[3]); in occ_show_extended()
682 rc = snprintf(buf, PAGE_SIZE - 1, "%02x\n", extn->flags); in occ_show_extended()
685 rc = snprintf(buf, PAGE_SIZE - 1, "%02x%02x%02x%02x%02x%02x\n", in occ_show_extended()
686 extn->data[0], extn->data[1], extn->data[2], in occ_show_extended()
687 extn->data[3], extn->data[4], extn->data[5]); in occ_show_extended()
690 return -EINVAL; in occ_show_extended()
722 * use our own instead of the built-in hwmon attribute types.
727 struct device *dev = occ->bus_dev; in occ_setup_sensor_attrs()
728 struct occ_sensors *sensors = &occ->sensors; in occ_setup_sensor_attrs()
740 switch (sensors->temp.version) { in occ_setup_sensor_attrs()
742 num_attrs += (sensors->temp.num_sensors * 2); in occ_setup_sensor_attrs()
745 num_attrs += (sensors->temp.num_sensors * 4); in occ_setup_sensor_attrs()
749 sensors->temp.num_sensors = 0; in occ_setup_sensor_attrs()
752 switch (sensors->freq.version) { in occ_setup_sensor_attrs()
757 num_attrs += (sensors->freq.num_sensors * 2); in occ_setup_sensor_attrs()
760 sensors->freq.num_sensors = 0; in occ_setup_sensor_attrs()
763 switch (sensors->power.version) { in occ_setup_sensor_attrs()
768 num_attrs += (sensors->power.num_sensors * 4); in occ_setup_sensor_attrs()
771 num_attrs += (sensors->power.num_sensors * 16); in occ_setup_sensor_attrs()
775 sensors->power.num_sensors = 0; in occ_setup_sensor_attrs()
778 switch (sensors->caps.version) { in occ_setup_sensor_attrs()
780 num_attrs += (sensors->caps.num_sensors * 7); in occ_setup_sensor_attrs()
786 num_attrs += (sensors->caps.num_sensors * 8); in occ_setup_sensor_attrs()
789 sensors->caps.num_sensors = 0; in occ_setup_sensor_attrs()
792 switch (sensors->extended.version) { in occ_setup_sensor_attrs()
794 num_attrs += (sensors->extended.num_sensors * 3); in occ_setup_sensor_attrs()
797 sensors->extended.num_sensors = 0; in occ_setup_sensor_attrs()
800 occ->attrs = devm_kzalloc(dev, sizeof(*occ->attrs) * num_attrs, in occ_setup_sensor_attrs()
802 if (!occ->attrs) in occ_setup_sensor_attrs()
803 return -ENOMEM; in occ_setup_sensor_attrs()
805 /* null-terminated list */ in occ_setup_sensor_attrs()
806 occ->group.attrs = devm_kzalloc(dev, sizeof(*occ->group.attrs) * in occ_setup_sensor_attrs()
808 if (!occ->group.attrs) in occ_setup_sensor_attrs()
809 return -ENOMEM; in occ_setup_sensor_attrs()
811 attr = occ->attrs; in occ_setup_sensor_attrs()
813 for (i = 0; i < sensors->temp.num_sensors; ++i) { in occ_setup_sensor_attrs()
815 temp = ((struct temp_sensor_2 *)sensors->temp.data) + i; in occ_setup_sensor_attrs()
817 snprintf(attr->name, sizeof(attr->name), "temp%d_label", s); in occ_setup_sensor_attrs()
818 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, in occ_setup_sensor_attrs()
822 if (sensors->temp.version > 1 && in occ_setup_sensor_attrs()
823 temp->fru_type == OCC_FRU_TYPE_VRM) { in occ_setup_sensor_attrs()
824 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
827 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
831 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, in occ_setup_sensor_attrs()
835 if (sensors->temp.version > 1) { in occ_setup_sensor_attrs()
836 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
838 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
842 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
844 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
850 for (i = 0; i < sensors->freq.num_sensors; ++i) { in occ_setup_sensor_attrs()
853 snprintf(attr->name, sizeof(attr->name), "freq%d_label", s); in occ_setup_sensor_attrs()
854 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, in occ_setup_sensor_attrs()
858 snprintf(attr->name, sizeof(attr->name), "freq%d_input", s); in occ_setup_sensor_attrs()
859 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, in occ_setup_sensor_attrs()
864 if (sensors->power.version == 0xA0) { in occ_setup_sensor_attrs()
866 * Special case for many-attribute power sensor. Split it into in occ_setup_sensor_attrs()
867 * a sensor number per power type, emulating several sensors. in occ_setup_sensor_attrs()
869 for (i = 0; i < sensors->power.num_sensors; ++i) { in occ_setup_sensor_attrs()
876 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
877 "power%d_label", s); in occ_setup_sensor_attrs()
878 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
883 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
884 "power%d_average", s); in occ_setup_sensor_attrs()
885 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
890 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
891 "power%d_average_interval", s); in occ_setup_sensor_attrs()
892 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
897 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
898 "power%d_input", s); in occ_setup_sensor_attrs()
899 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
908 s = (sensors->power.num_sensors * 4) + 1; in occ_setup_sensor_attrs()
910 for (i = 0; i < sensors->power.num_sensors; ++i) { in occ_setup_sensor_attrs()
913 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
914 "power%d_label", s); in occ_setup_sensor_attrs()
915 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
919 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
920 "power%d_average", s); in occ_setup_sensor_attrs()
921 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
925 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
926 "power%d_average_interval", s); in occ_setup_sensor_attrs()
927 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
931 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
932 "power%d_input", s); in occ_setup_sensor_attrs()
933 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
938 s = sensors->power.num_sensors + 1; in occ_setup_sensor_attrs()
941 if (sensors->caps.num_sensors >= 1) { in occ_setup_sensor_attrs()
942 snprintf(attr->name, sizeof(attr->name), "power%d_label", s); in occ_setup_sensor_attrs()
943 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, in occ_setup_sensor_attrs()
947 snprintf(attr->name, sizeof(attr->name), "power%d_cap", s); in occ_setup_sensor_attrs()
948 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, in occ_setup_sensor_attrs()
952 snprintf(attr->name, sizeof(attr->name), "power%d_input", s); in occ_setup_sensor_attrs()
953 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, in occ_setup_sensor_attrs()
957 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
958 "power%d_cap_not_redundant", s); in occ_setup_sensor_attrs()
959 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, in occ_setup_sensor_attrs()
963 snprintf(attr->name, sizeof(attr->name), "power%d_cap_max", s); in occ_setup_sensor_attrs()
964 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, in occ_setup_sensor_attrs()
968 snprintf(attr->name, sizeof(attr->name), "power%d_cap_min", s); in occ_setup_sensor_attrs()
969 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, in occ_setup_sensor_attrs()
973 snprintf(attr->name, sizeof(attr->name), "power%d_cap_user", in occ_setup_sensor_attrs()
975 attr->sensor = OCC_INIT_ATTR(attr->name, 0644, show_caps, in occ_setup_sensor_attrs()
979 if (sensors->caps.version > 1) { in occ_setup_sensor_attrs()
980 snprintf(attr->name, sizeof(attr->name), in occ_setup_sensor_attrs()
981 "power%d_cap_user_source", s); in occ_setup_sensor_attrs()
982 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
988 for (i = 0; i < sensors->extended.num_sensors; ++i) { in occ_setup_sensor_attrs()
991 snprintf(attr->name, sizeof(attr->name), "extn%d_label", s); in occ_setup_sensor_attrs()
992 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
996 snprintf(attr->name, sizeof(attr->name), "extn%d_flags", s); in occ_setup_sensor_attrs()
997 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
1001 snprintf(attr->name, sizeof(attr->name), "extn%d_input", s); in occ_setup_sensor_attrs()
1002 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, in occ_setup_sensor_attrs()
1009 sysfs_attr_init(&occ->attrs[i].sensor.dev_attr.attr); in occ_setup_sensor_attrs()
1010 occ->group.attrs[i] = &occ->attrs[i].sensor.dev_attr.attr; in occ_setup_sensor_attrs()
1020 struct occ_sensor *sensor; in occ_parse_poll_response() local
1021 struct occ_sensors *sensors = &occ->sensors; in occ_parse_poll_response()
1022 struct occ_response *resp = &occ->resp; in occ_parse_poll_response()
1024 (struct occ_poll_response *)&resp->data[0]; in occ_parse_poll_response()
1025 struct occ_poll_response_header *header = &poll->header; in occ_parse_poll_response()
1026 struct occ_sensor_data_block *block = &poll->block; in occ_parse_poll_response()
1028 dev_info(occ->bus_dev, "OCC found, code level: %.16s\n", in occ_parse_poll_response()
1029 header->occ_code_level); in occ_parse_poll_response()
1031 for (i = 0; i < header->num_sensor_data_blocks; ++i) { in occ_parse_poll_response()
1034 offset = (block->header.num_sensors * in occ_parse_poll_response()
1035 block->header.sensor_length) + sizeof(block->header); in occ_parse_poll_response()
1040 dev_warn(occ->bus_dev, "exceeded response buffer\n"); in occ_parse_poll_response()
1044 dev_dbg(occ->bus_dev, " %04x..%04x: %.4s (%d sensors)\n", in occ_parse_poll_response()
1045 old_offset, offset - 1, block->header.eye_catcher, in occ_parse_poll_response()
1046 block->header.num_sensors); in occ_parse_poll_response()
1048 /* match sensor block type */ in occ_parse_poll_response()
1049 if (strncmp(block->header.eye_catcher, "TEMP", 4) == 0) in occ_parse_poll_response()
1050 sensor = &sensors->temp; in occ_parse_poll_response()
1051 else if (strncmp(block->header.eye_catcher, "FREQ", 4) == 0) in occ_parse_poll_response()
1052 sensor = &sensors->freq; in occ_parse_poll_response()
1053 else if (strncmp(block->header.eye_catcher, "POWR", 4) == 0) in occ_parse_poll_response()
1054 sensor = &sensors->power; in occ_parse_poll_response()
1055 else if (strncmp(block->header.eye_catcher, "CAPS", 4) == 0) in occ_parse_poll_response()
1056 sensor = &sensors->caps; in occ_parse_poll_response()
1057 else if (strncmp(block->header.eye_catcher, "EXTN", 4) == 0) in occ_parse_poll_response()
1058 sensor = &sensors->extended; in occ_parse_poll_response()
1060 dev_warn(occ->bus_dev, "sensor not supported %.4s\n", in occ_parse_poll_response()
1061 block->header.eye_catcher); in occ_parse_poll_response()
1065 sensor->num_sensors = block->header.num_sensors; in occ_parse_poll_response()
1066 sensor->version = block->header.sensor_format; in occ_parse_poll_response()
1067 sensor->data = &block->data; in occ_parse_poll_response()
1070 dev_dbg(occ->bus_dev, "Max resp size: %u+%zd=%zd\n", size, in occ_parse_poll_response()
1078 mutex_init(&occ->lock); in occ_setup()
1079 occ->groups[0] = &occ->group; in occ_setup()
1083 if (rc == -ESHUTDOWN) { in occ_setup()
1084 dev_info(occ->bus_dev, "host is not ready\n"); in occ_setup()
1087 dev_err(occ->bus_dev, "failed to get OCC poll response: %d\n", in occ_setup()
1092 occ->next_update = jiffies + OCC_UPDATE_FREQUENCY; in occ_setup()
1097 dev_err(occ->bus_dev, "failed to setup sensor attrs: %d\n", in occ_setup()
1102 occ->hwmon = devm_hwmon_device_register_with_groups(occ->bus_dev, name, in occ_setup()
1103 occ, occ->groups); in occ_setup()
1104 if (IS_ERR(occ->hwmon)) { in occ_setup()
1105 rc = PTR_ERR(occ->hwmon); in occ_setup()
1106 dev_err(occ->bus_dev, "failed to register hwmon device: %d\n", in occ_setup()
1113 dev_err(occ->bus_dev, "failed to setup sysfs: %d\n", rc); in occ_setup()