Lines Matching full:occ

21 #define OCC_ERROR_COUNT_THRESHOLD	2	/* required by OCC spec */
32 /* OCC sensor type and version definitions */
133 static int occ_poll(struct occ *occ) in occ_poll() argument
144 cmd[4] = occ->poll_cmd_data; /* data */ in occ_poll()
149 rc = occ->send_cmd(occ, cmd, sizeof(cmd), &occ->resp, sizeof(occ->resp)); in occ_poll()
151 occ->last_error = rc; in occ_poll()
152 if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD) in occ_poll()
153 occ->error = rc; in occ_poll()
159 occ->error_count = 0; in occ_poll()
160 occ->last_error = 0; in occ_poll()
161 occ->error = 0; in occ_poll()
164 header = (struct occ_poll_response_header *)occ->resp.data; in occ_poll()
166 if (occ->last_safe) { in occ_poll()
168 occ->last_safe + OCC_SAFE_TIMEOUT)) in occ_poll()
169 occ->error = -EHOSTDOWN; in occ_poll()
171 occ->last_safe = jiffies; in occ_poll()
174 occ->last_safe = 0; in occ_poll()
178 occ_sysfs_poll_done(occ); in occ_poll()
182 static int occ_set_user_power_cap(struct occ *occ, u16 user_power_cap) in occ_set_user_power_cap() argument
199 rc = mutex_lock_interruptible(&occ->lock); in occ_set_user_power_cap()
203 rc = occ->send_cmd(occ, cmd, sizeof(cmd), resp, sizeof(resp)); in occ_set_user_power_cap()
205 mutex_unlock(&occ->lock); in occ_set_user_power_cap()
210 int occ_update_response(struct occ *occ) in occ_update_response() argument
212 int rc = mutex_lock_interruptible(&occ->lock); in occ_update_response()
217 /* limit the maximum rate of polling the OCC */ in occ_update_response()
218 if (time_after(jiffies, occ->next_update)) { in occ_update_response()
219 rc = occ_poll(occ); in occ_update_response()
220 occ->next_update = jiffies + OCC_UPDATE_FREQUENCY; in occ_update_response()
222 rc = occ->last_error; in occ_update_response()
225 mutex_unlock(&occ->lock); in occ_update_response()
235 struct occ *occ = dev_get_drvdata(dev); in occ_show_temp_1() local
236 struct occ_sensors *sensors = &occ->sensors; in occ_show_temp_1()
239 rc = occ_update_response(occ); in occ_show_temp_1()
252 * OCC returns 0xFFFF for that sensor. in occ_show_temp_1()
271 struct occ *occ = dev_get_drvdata(dev); in occ_show_temp_2() local
272 struct occ_sensors *sensors = &occ->sensors; in occ_show_temp_2()
275 rc = occ_update_response(occ); in occ_show_temp_2()
322 struct occ *occ = dev_get_drvdata(dev); in occ_show_temp_10() local
323 struct occ_sensors *sensors = &occ->sensors; in occ_show_temp_10()
326 rc = occ_update_response(occ); in occ_show_temp_10()
369 struct occ *occ = dev_get_drvdata(dev); in occ_show_freq_1() local
370 struct occ_sensors *sensors = &occ->sensors; in occ_show_freq_1()
373 rc = occ_update_response(occ); in occ_show_freq_1()
399 struct occ *occ = dev_get_drvdata(dev); in occ_show_freq_2() local
400 struct occ_sensors *sensors = &occ->sensors; in occ_show_freq_2()
403 rc = occ_update_response(occ); in occ_show_freq_2()
429 struct occ *occ = dev_get_drvdata(dev); in occ_show_power_1() local
430 struct occ_sensors *sensors = &occ->sensors; in occ_show_power_1()
433 rc = occ_update_response(occ); in occ_show_power_1()
450 occ->powr_sample_time_us; in occ_show_power_1()
474 struct occ *occ = dev_get_drvdata(dev); in occ_show_power_2() local
475 struct occ_sensors *sensors = &occ->sensors; in occ_show_power_2()
478 rc = occ_update_response(occ); in occ_show_power_2()
495 occ->powr_sample_time_us; in occ_show_power_2()
513 struct occ *occ = dev_get_drvdata(dev); in occ_show_power_a0() local
514 struct occ_sensors *sensors = &occ->sensors; in occ_show_power_a0()
517 rc = occ_update_response(occ); in occ_show_power_a0()
533 occ->powr_sample_time_us; in occ_show_power_a0()
547 occ->powr_sample_time_us; in occ_show_power_a0()
561 occ->powr_sample_time_us; in occ_show_power_a0()
575 occ->powr_sample_time_us; in occ_show_power_a0()
593 struct occ *occ = dev_get_drvdata(dev); in occ_show_caps_1_2() local
594 struct occ_sensors *sensors = &occ->sensors; in occ_show_caps_1_2()
597 rc = occ_update_response(occ); in occ_show_caps_1_2()
625 if (occ->sensors.caps.version == 1) in occ_show_caps_1_2()
643 struct occ *occ = dev_get_drvdata(dev); in occ_show_caps_3() local
644 struct occ_sensors *sensors = &occ->sensors; in occ_show_caps_3()
647 rc = occ_update_response(occ); in occ_show_caps_3()
694 struct occ *occ = dev_get_drvdata(dev); in occ_store_caps_user() local
702 rc = occ_set_user_power_cap(occ, user_power_cap); in occ_store_caps_user()
714 struct occ *occ = dev_get_drvdata(dev); in occ_show_extended() local
715 struct occ_sensors *sensors = &occ->sensors; in occ_show_extended()
718 rc = occ_update_response(occ); in occ_show_extended()
776 static int occ_setup_sensor_attrs(struct occ *occ) in occ_setup_sensor_attrs() argument
779 struct device *dev = occ->bus_dev; in occ_setup_sensor_attrs()
780 struct occ_sensors *sensors = &occ->sensors; in occ_setup_sensor_attrs()
857 occ->attrs = devm_kcalloc(dev, num_attrs, sizeof(*occ->attrs), in occ_setup_sensor_attrs()
859 if (!occ->attrs) in occ_setup_sensor_attrs()
863 occ->group.attrs = devm_kcalloc(dev, num_attrs + 1, in occ_setup_sensor_attrs()
864 sizeof(*occ->group.attrs), in occ_setup_sensor_attrs()
866 if (!occ->group.attrs) in occ_setup_sensor_attrs()
869 attr = occ->attrs; in occ_setup_sensor_attrs()
1041 sysfs_attr_init(&occ->attrs[i].sensor.dev_attr.attr); in occ_setup_sensor_attrs()
1042 occ->group.attrs[i] = &occ->attrs[i].sensor.dev_attr.attr; in occ_setup_sensor_attrs()
1048 /* only need to do this once at startup, as OCC won't change sensors on us */
1049 static void occ_parse_poll_response(struct occ *occ) in occ_parse_poll_response() argument
1053 struct occ_sensors *sensors = &occ->sensors; in occ_parse_poll_response()
1054 struct occ_response *resp = &occ->resp; in occ_parse_poll_response()
1060 dev_info(occ->bus_dev, "OCC found, code level: %.16s\n", in occ_parse_poll_response()
1072 dev_warn(occ->bus_dev, "exceeded response buffer\n"); in occ_parse_poll_response()
1076 dev_dbg(occ->bus_dev, " %04x..%04x: %.4s (%d sensors)\n", in occ_parse_poll_response()
1092 dev_warn(occ->bus_dev, "sensor not supported %.4s\n", in occ_parse_poll_response()
1102 dev_dbg(occ->bus_dev, "Max resp size: %u+%zd=%zd\n", size, in occ_parse_poll_response()
1106 int occ_active(struct occ *occ, bool active) in occ_active() argument
1108 int rc = mutex_lock_interruptible(&occ->lock); in occ_active()
1114 if (occ->active) { in occ_active()
1119 occ->error_count = 0; in occ_active()
1120 occ->last_safe = 0; in occ_active()
1122 rc = occ_poll(occ); in occ_active()
1124 dev_err(occ->bus_dev, in occ_active()
1125 "failed to get OCC poll response=%02x: %d\n", in occ_active()
1126 occ->resp.return_status, rc); in occ_active()
1130 occ->active = true; in occ_active()
1131 occ->next_update = jiffies + OCC_UPDATE_FREQUENCY; in occ_active()
1132 occ_parse_poll_response(occ); in occ_active()
1134 rc = occ_setup_sensor_attrs(occ); in occ_active()
1136 dev_err(occ->bus_dev, in occ_active()
1141 occ->hwmon = hwmon_device_register_with_groups(occ->bus_dev, in occ_active()
1142 "occ", occ, in occ_active()
1143 occ->groups); in occ_active()
1144 if (IS_ERR(occ->hwmon)) { in occ_active()
1145 rc = PTR_ERR(occ->hwmon); in occ_active()
1146 occ->hwmon = NULL; in occ_active()
1147 dev_err(occ->bus_dev, in occ_active()
1152 if (!occ->active) { in occ_active()
1157 if (occ->hwmon) in occ_active()
1158 hwmon_device_unregister(occ->hwmon); in occ_active()
1159 occ->active = false; in occ_active()
1160 occ->hwmon = NULL; in occ_active()
1164 mutex_unlock(&occ->lock); in occ_active()
1168 int occ_setup(struct occ *occ) in occ_setup() argument
1172 mutex_init(&occ->lock); in occ_setup()
1173 occ->groups[0] = &occ->group; in occ_setup()
1175 rc = occ_setup_sysfs(occ); in occ_setup()
1177 dev_err(occ->bus_dev, "failed to setup sysfs: %d\n", rc); in occ_setup()
1181 if (!device_property_read_bool(occ->bus_dev, "ibm,no-poll-on-init")) { in occ_setup()
1182 rc = occ_active(occ, true); in occ_setup()
1184 occ_shutdown_sysfs(occ); in occ_setup()
1191 void occ_shutdown(struct occ *occ) in occ_shutdown() argument
1193 mutex_lock(&occ->lock); in occ_shutdown()
1195 occ_shutdown_sysfs(occ); in occ_shutdown()
1197 if (occ->hwmon) in occ_shutdown()
1198 hwmon_device_unregister(occ->hwmon); in occ_shutdown()
1199 occ->hwmon = NULL; in occ_shutdown()
1201 mutex_unlock(&occ->lock); in occ_shutdown()
1206 MODULE_DESCRIPTION("Common OCC hwmon code");