⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 it87.c

📁 ite_8075 io source code temperature and fan speed control for linux
💻 C
📖 第 1 页 / 共 4 页
字号:
}static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr]));}static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_low[nr]));}static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	mutex_lock(&data->update_lock);	data->temp_high[nr] = TEMP_TO_REG(val);	it87_write_value(data, IT87_REG_TEMP_HIGH(nr), data->temp_high[nr]);	mutex_unlock(&data->update_lock);	return count;}static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	mutex_lock(&data->update_lock);	data->temp_low[nr] = TEMP_TO_REG(val);	it87_write_value(data, IT87_REG_TEMP_LOW(nr), data->temp_low[nr]);	mutex_unlock(&data->update_lock);	return count;}#define show_temp_offset(offset)					\static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO,		\		show_temp, NULL, offset - 1);				\static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR,	\		show_temp_max, set_temp_max, offset - 1);		\static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR,	\		show_temp_min, set_temp_min, offset - 1);show_temp_offset(1);show_temp_offset(2);show_temp_offset(3);static ssize_t show_sensor(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	u8 reg = data->sensor; /* In case the value is updated while we use it */		if (reg & (1 << nr))		return sprintf(buf, "3\n");  /* thermal diode */	if (reg & (8 << nr))		return sprintf(buf, "2\n");  /* thermistor */	return sprintf(buf, "0\n");      /* disabled */}static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	mutex_lock(&data->update_lock);	data->sensor &= ~(1 << nr);	data->sensor &= ~(8 << nr);	/* 3 = thermal diode; 2 = thermistor; 0 = disabled */	if (val == 3)	    data->sensor |= 1 << nr;	else if (val == 2)	    data->sensor |= 8 << nr;	else if (val != 0) {		mutex_unlock(&data->update_lock);		return -EINVAL;	}	it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor);	mutex_unlock(&data->update_lock);	return count;}#define show_sensor_offset(offset)					\static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR,	\		show_sensor, set_sensor, offset - 1);show_sensor_offset(1);show_sensor_offset(2);show_sensor_offset(3);/* 3 Fans */static ssize_t show_fan(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr], 				DIV_FROM_REG(data->fan_div[nr])));}static ssize_t show_fan_min(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf,"%d\n",		FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr])));}static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));}static ssize_t show_pwm_enable(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf,"%d\n", (data->fan_main_ctrl & (1 << nr)) ? 1 : 0);}static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf,"%d\n", data->manual_pwm_ctl[nr]);}static ssize_t show_pwm_freq(struct device *dev, struct device_attribute *attr,		char *buf){	struct it87_data *data = it87_update_device(dev);	int index = (data->fan_ctl >> 4) & 0x07;	return sprintf(buf, "%u\n", pwm_freq[index]);}static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	u8 reg;	mutex_lock(&data->update_lock);	reg = it87_read_value(data, IT87_REG_FAN_DIV);	switch (nr) {	case 0: data->fan_div[nr] = reg & 0x07; break;	case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;	case 2: data->fan_div[nr] = (reg & 0x40) ? 3 : 1; break;	}	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));	it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan_min[nr]);	mutex_unlock(&data->update_lock);	return count;}static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	unsigned long val = simple_strtoul(buf, NULL, 10);	int min;	u8 old;	mutex_lock(&data->update_lock);	old = it87_read_value(data, IT87_REG_FAN_DIV);	/* Save fan min limit */	min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));	switch (nr) {	case 0:	case 1:		data->fan_div[nr] = DIV_TO_REG(val);		break;	case 2:		if (val < 8)			data->fan_div[nr] = 1;		else			data->fan_div[nr] = 3;	}	val = old & 0x80;	val |= (data->fan_div[0] & 0x07);	val |= (data->fan_div[1] & 0x07) << 3;	if (data->fan_div[2] == 3)		val |= 0x1 << 6;	it87_write_value(data, IT87_REG_FAN_DIV, val);	/* Restore fan min limit */	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));	it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan_min[nr]);	mutex_unlock(&data->update_lock);	return count;}static ssize_t set_pwm_enable(struct device *dev,		struct device_attribute *attr, const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	mutex_lock(&data->update_lock);	if (val == 0) {		int tmp;		/* make sure the fan is on when in on/off mode */		tmp = it87_read_value(data, IT87_REG_FAN_CTL);		it87_write_value(data, IT87_REG_FAN_CTL, tmp | (1 << nr));		/* set on/off mode */		data->fan_main_ctrl &= ~(1 << nr);		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, data->fan_main_ctrl);	} else if (val == 1) {		/* set SmartGuardian mode */		data->fan_main_ctrl |= (1 << nr);		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, data->fan_main_ctrl);		/* set saved pwm value, clear FAN_CTLX PWM mode bit */		it87_write_value(data, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr]));	} else {		mutex_unlock(&data->update_lock);		return -EINVAL;	}	mutex_unlock(&data->update_lock);	return count;}static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	if (val < 0 || val > 255)		return -EINVAL;	mutex_lock(&data->update_lock);	data->manual_pwm_ctl[nr] = val;	if (data->fan_main_ctrl & (1 << nr))		it87_write_value(data, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr]));	mutex_unlock(&data->update_lock);	return count;}static ssize_t set_pwm_freq(struct device *dev,		struct device_attribute *attr, const char *buf, size_t count){	struct it87_data *data = dev_get_drvdata(dev);	unsigned long val = simple_strtoul(buf, NULL, 10);	int i;	/* Search for the nearest available frequency */	for (i = 0; i < 7; i++) {		if (val > (pwm_freq[i] + pwm_freq[i+1]) / 2)			break;	}	mutex_lock(&data->update_lock);	data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL) & 0x8f;	data->fan_ctl |= i << 4;	it87_write_value(data, IT87_REG_FAN_CTL, data->fan_ctl);	mutex_unlock(&data->update_lock);	return count;}#define show_fan_offset(offset)					\static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,		\		show_fan, NULL, offset - 1);			\static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \		show_fan_min, set_fan_min, offset - 1);		\static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \		show_fan_div, set_fan_div, offset - 1);show_fan_offset(1);show_fan_offset(2);show_fan_offset(3);#define show_pwm_offset(offset)						\static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR,	\		show_pwm_enable, set_pwm_enable, offset - 1);		\static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR,		\		show_pwm, set_pwm, offset - 1);				\static DEVICE_ATTR(pwm##offset##_freq,					\		(offset == 1 ? S_IRUGO | S_IWUSR : S_IRUGO),		\		show_pwm_freq, (offset == 1 ? set_pwm_freq : NULL));show_pwm_offset(1);show_pwm_offset(2);show_pwm_offset(3);/* A different set of callbacks for 16-bit fans */static ssize_t show_fan16(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%d\n", FAN16_FROM_REG(data->fan[nr]));}static ssize_t show_fan16_min(struct device *dev, struct device_attribute *attr,		char *buf){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%d\n", FAN16_FROM_REG(data->fan_min[nr]));}static ssize_t set_fan16_min(struct device *dev, struct device_attribute *attr,		const char *buf, size_t count){	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);	int nr = sensor_attr->index;	struct it87_data *data = dev_get_drvdata(dev);	int val = simple_strtol(buf, NULL, 10);	mutex_lock(&data->update_lock);	data->fan_min[nr] = FAN16_TO_REG(val);	it87_write_value(data, IT87_REG_FAN_MIN[nr],			 data->fan_min[nr] & 0xff);	it87_write_value(data, IT87_REG_FANX_MIN[nr],			 data->fan_min[nr] >> 8);	mutex_unlock(&data->update_lock);	return count;}/* We want to use the same sysfs file names as 8-bit fans, but we need   different variable names, so we have to use SENSOR_ATTR instead of   SENSOR_DEVICE_ATTR. */#define show_fan16_offset(offset) \static struct sensor_device_attribute sensor_dev_attr_fan##offset##_input16 \	= SENSOR_ATTR(fan##offset##_input, S_IRUGO,		\		show_fan16, NULL, offset - 1);			\static struct sensor_device_attribute sensor_dev_attr_fan##offset##_min16 \	= SENSOR_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,	\		show_fan16_min, set_fan16_min, offset - 1)show_fan16_offset(1);show_fan16_offset(2);show_fan16_offset(3);show_fan16_offset(4);show_fan16_offset(5);/* Alarms */static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf){	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%u\n", data->alarms);}static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,		char *buf){	int bitnr = to_sensor_dev_attr(attr)->index;	struct it87_data *data = it87_update_device(dev);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -