static s32 set_current_threshold(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct i2c_client *client = to_i2c_client(dev); struct ina230_data *data = i2c_get_clientdata(client); s32 retval; mutex_lock(&data->mutex); if (strict_strtol(buf, 10, (long *)&(data->pdata->current_threshold))) { retval = -EINVAL; goto out; } if (data->pdata->current_threshold) { if (data->running) { /* force restart */ retval = __locked_start_current_mon(client); } else { __locked_evaluate_state(client); retval = 0; } } else { retval = __locked_power_down_ina230(client); } out: mutex_unlock(&data->mutex); if (retval >= 0) return count; return retval; }
s32 ina230_set_current_threshold(s32 current_threshold, int min_cpu) { struct i2c_client *client; struct ina230_data *data; int retval; if (!p_ina230_data) return -1; client = p_ina230_data->client; data = p_ina230_data; mutex_lock(&data->mutex); data->pdata->current_threshold = current_threshold; data->pdata->min_cores_online = min_cpu; if (data->pdata->current_threshold) { if (data->running) { /* force restart */ retval = __locked_start_current_mon(client); } else { __locked_evaluate_state(client); retval = 0; } } else { retval = __locked_power_down_ina230(client); } out: mutex_unlock(&data->mutex); return retval; }
static s32 power_down_ina230(struct i2c_client *client) { s32 retval; struct ina230_data *data = i2c_get_clientdata(client); mutex_lock(&data->mutex); retval = __locked_power_down_ina230(client); mutex_unlock(&data->mutex); return retval; }
static void __locked_evaluate_state(struct i2c_client *client) { struct ina230_data *data = i2c_get_clientdata(client); int cpus = num_online_cpus(); if (data->running) { if (cpus < data->pdata->min_cores_online || !data->pdata->current_threshold) __locked_power_down_ina230(client); } else { if (cpus >= data->pdata->min_cores_online && data->pdata->current_threshold) __locked_start_current_mon(client); } }