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;
}
Example #2
0
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);
	}
}