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

📄 it87.c

📁 ite_8075 io source code temperature and fan speed control for linux
💻 C
📖 第 1 页 / 共 4 页
字号:
	return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);}static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 8);static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 9);static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 10);static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 11);static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 12);static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 13);static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 14);static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 15);static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 0);static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 1);static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 2);static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 3);static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 6);static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 16);static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 17);static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 18);static ssize_tshow_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf){	struct it87_data *data = dev_get_drvdata(dev);	return sprintf(buf, "%u\n", data->vrm);}static ssize_tstore_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct it87_data *data = dev_get_drvdata(dev);	u32 val;	val = simple_strtoul(buf, NULL, 10);	data->vrm = val;	return count;}static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);static ssize_tshow_vid_reg(struct device *dev, struct device_attribute *attr, char *buf){	struct it87_data *data = it87_update_device(dev);	return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));}static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);static ssize_t show_name(struct device *dev, struct device_attribute			 *devattr, char *buf){	struct it87_data *data = dev_get_drvdata(dev);	return sprintf(buf, "%s\n", data->name);}static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);static struct attribute *it87_attributes[] = {	&sensor_dev_attr_in0_input.dev_attr.attr,	&sensor_dev_attr_in1_input.dev_attr.attr,	&sensor_dev_attr_in2_input.dev_attr.attr,	&sensor_dev_attr_in3_input.dev_attr.attr,	&sensor_dev_attr_in4_input.dev_attr.attr,	&sensor_dev_attr_in5_input.dev_attr.attr,	&sensor_dev_attr_in6_input.dev_attr.attr,	&sensor_dev_attr_in7_input.dev_attr.attr,	&sensor_dev_attr_in8_input.dev_attr.attr,	&sensor_dev_attr_in0_min.dev_attr.attr,	&sensor_dev_attr_in1_min.dev_attr.attr,	&sensor_dev_attr_in2_min.dev_attr.attr,	&sensor_dev_attr_in3_min.dev_attr.attr,	&sensor_dev_attr_in4_min.dev_attr.attr,	&sensor_dev_attr_in5_min.dev_attr.attr,	&sensor_dev_attr_in6_min.dev_attr.attr,	&sensor_dev_attr_in7_min.dev_attr.attr,	&sensor_dev_attr_in0_max.dev_attr.attr,	&sensor_dev_attr_in1_max.dev_attr.attr,	&sensor_dev_attr_in2_max.dev_attr.attr,	&sensor_dev_attr_in3_max.dev_attr.attr,	&sensor_dev_attr_in4_max.dev_attr.attr,	&sensor_dev_attr_in5_max.dev_attr.attr,	&sensor_dev_attr_in6_max.dev_attr.attr,	&sensor_dev_attr_in7_max.dev_attr.attr,	&sensor_dev_attr_in0_alarm.dev_attr.attr,	&sensor_dev_attr_in1_alarm.dev_attr.attr,	&sensor_dev_attr_in2_alarm.dev_attr.attr,	&sensor_dev_attr_in3_alarm.dev_attr.attr,	&sensor_dev_attr_in4_alarm.dev_attr.attr,	&sensor_dev_attr_in5_alarm.dev_attr.attr,	&sensor_dev_attr_in6_alarm.dev_attr.attr,	&sensor_dev_attr_in7_alarm.dev_attr.attr,	&sensor_dev_attr_temp1_input.dev_attr.attr,	&sensor_dev_attr_temp2_input.dev_attr.attr,	&sensor_dev_attr_temp3_input.dev_attr.attr,	&sensor_dev_attr_temp1_max.dev_attr.attr,	&sensor_dev_attr_temp2_max.dev_attr.attr,	&sensor_dev_attr_temp3_max.dev_attr.attr,	&sensor_dev_attr_temp1_min.dev_attr.attr,	&sensor_dev_attr_temp2_min.dev_attr.attr,	&sensor_dev_attr_temp3_min.dev_attr.attr,	&sensor_dev_attr_temp1_type.dev_attr.attr,	&sensor_dev_attr_temp2_type.dev_attr.attr,	&sensor_dev_attr_temp3_type.dev_attr.attr,	&sensor_dev_attr_temp1_alarm.dev_attr.attr,	&sensor_dev_attr_temp2_alarm.dev_attr.attr,	&sensor_dev_attr_temp3_alarm.dev_attr.attr,	&dev_attr_alarms.attr,	&dev_attr_name.attr,	NULL};static const struct attribute_group it87_group = {	.attrs = it87_attributes,};static struct attribute *it87_attributes_opt[] = {	&sensor_dev_attr_fan1_input16.dev_attr.attr,	&sensor_dev_attr_fan1_min16.dev_attr.attr,	&sensor_dev_attr_fan2_input16.dev_attr.attr,	&sensor_dev_attr_fan2_min16.dev_attr.attr,	&sensor_dev_attr_fan3_input16.dev_attr.attr,	&sensor_dev_attr_fan3_min16.dev_attr.attr,	&sensor_dev_attr_fan4_input16.dev_attr.attr,	&sensor_dev_attr_fan4_min16.dev_attr.attr,	&sensor_dev_attr_fan5_input16.dev_attr.attr,	&sensor_dev_attr_fan5_min16.dev_attr.attr,	&sensor_dev_attr_fan1_input.dev_attr.attr,	&sensor_dev_attr_fan1_min.dev_attr.attr,	&sensor_dev_attr_fan1_div.dev_attr.attr,	&sensor_dev_attr_fan2_input.dev_attr.attr,	&sensor_dev_attr_fan2_min.dev_attr.attr,	&sensor_dev_attr_fan2_div.dev_attr.attr,	&sensor_dev_attr_fan3_input.dev_attr.attr,	&sensor_dev_attr_fan3_min.dev_attr.attr,	&sensor_dev_attr_fan3_div.dev_attr.attr,	&sensor_dev_attr_fan1_alarm.dev_attr.attr,	&sensor_dev_attr_fan2_alarm.dev_attr.attr,	&sensor_dev_attr_fan3_alarm.dev_attr.attr,	&sensor_dev_attr_fan4_alarm.dev_attr.attr,	&sensor_dev_attr_fan5_alarm.dev_attr.attr,	&sensor_dev_attr_pwm1_enable.dev_attr.attr,	&sensor_dev_attr_pwm2_enable.dev_attr.attr,	&sensor_dev_attr_pwm3_enable.dev_attr.attr,	&sensor_dev_attr_pwm1.dev_attr.attr,	&sensor_dev_attr_pwm2.dev_attr.attr,	&sensor_dev_attr_pwm3.dev_attr.attr,	&dev_attr_pwm1_freq.attr,	&dev_attr_pwm2_freq.attr,	&dev_attr_pwm3_freq.attr,	&dev_attr_vrm.attr,	&dev_attr_cpu0_vid.attr,	NULL};static const struct attribute_group it87_group_opt = {	.attrs = it87_attributes_opt,};/* SuperIO detection - will change isa_address if a chip is found */static int __init it87_find(unsigned short *address,	struct it87_sio_data *sio_data){	int err = -ENODEV;	u16 chip_type;	superio_enter();	chip_type = force_id ? force_id : superio_inw(DEVID);	switch (chip_type) {	case IT8705F_DEVID:		sio_data->type = it87;		break;	case IT8712F_DEVID:		sio_data->type = it8712;		break;	case IT8716F_DEVID:	case IT8726F_DEVID:		sio_data->type = it8716;		break;	case IT8718F_DEVID:		sio_data->type = it8718;		break;	case IT8720F_DEVID:		sio_data->type = it8720;		break;	case IT8781F_DEVID:		sio_data->type = it8781;		break;	case IT8782F_DEVID:		sio_data->type = it8782;		break;	case 0xffff:	/* No device at all */		goto exit;	default:		pr_debug(DRVNAME ": Unsupported chip (DEVID=0x%x)\n",			 chip_type);		goto exit;	}	superio_select(PME);	if (!(superio_inb(IT87_ACT_REG) & 0x01)) {		pr_info("it87: Device not activated, skipping\n");		goto exit;	}	*address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1);	if (*address == 0) {		pr_info("it87: Base address not set, skipping\n");		goto exit;	}	err = 0;	pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n",		chip_type, *address, superio_inb(DEVREV) & 0x0f);	/* Read GPIO config and VID value from LDN 7 (GPIO) */	if (chip_type != IT8705F_DEVID) {		int reg;		superio_select(GPIO);		if (chip_type == it8718)			sio_data->vid_value = superio_inb(IT87_SIO_VID_REG);		reg = superio_inb(IT87_SIO_PINX2_REG);		if (reg & (1 << 0))			pr_info("it87: in3 is VCC (+5V)\n");		if (reg & (1 << 1))			pr_info("it87: in7 is VCCH (+5V Stand-By)\n");	}exit:	superio_exit();	return err;}static int __devinit it87_probe(struct platform_device *pdev){	struct it87_data *data;	struct resource *res;	struct device *dev = &pdev->dev;	struct it87_sio_data *sio_data = dev->platform_data;	int err = 0;	int enable_pwm_interface;	static const char *names[] = {		"it87",		"it8712",		"it8716",		"it8718",	};	res = platform_get_resource(pdev, IORESOURCE_IO, 0);	if (!request_region(res->start, IT87_EC_EXTENT, DRVNAME)) {		dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",			(unsigned long)res->start,			(unsigned long)(res->start + IT87_EC_EXTENT - 1));		err = -EBUSY;		goto ERROR0;	}	if (!(data = kzalloc(sizeof(struct it87_data), GFP_KERNEL))) {		err = -ENOMEM;		goto ERROR1;	}	data->addr = res->start;	data->type = sio_data->type;	data->name = names[sio_data->type];	/* Now, we do the remaining detection. */	if ((it87_read_value(data, IT87_REG_CONFIG) & 0x80)	 || it87_read_value(data, IT87_REG_CHIPID) != 0x90) {		err = -ENODEV;		goto ERROR2;	}	platform_set_drvdata(pdev, data);	mutex_init(&data->update_lock);	/* Check PWM configuration */	enable_pwm_interface = it87_check_pwm(dev);	/* Initialize the IT87 chip */	it87_init_device(pdev);	/* Register sysfs hooks */	if ((err = sysfs_create_group(&dev->kobj, &it87_group)))		goto ERROR2;	/* Do not create fan files for disabled fans */	if (data->type == it8716 || data->type == it8718) {		/* 16-bit tachometers */		if (data->has_fan & (1 << 0)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan1_input16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan1_min16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan1_alarm.dev_attr)))				goto ERROR4;		}		if (data->has_fan & (1 << 1)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan2_input16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan2_min16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan2_alarm.dev_attr)))				goto ERROR4;		}		if (data->has_fan & (1 << 2)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan3_input16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan3_min16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan3_alarm.dev_attr)))				goto ERROR4;		}		if (data->has_fan & (1 << 3)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan4_input16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan4_min16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan4_alarm.dev_attr)))				goto ERROR4;		}		if (data->has_fan & (1 << 4)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan5_input16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan5_min16.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan5_alarm.dev_attr)))				goto ERROR4;		}	} else {		/* 8-bit tachometers with clock divider */		if (data->has_fan & (1 << 0)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan1_input.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan1_min.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan1_div.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan1_alarm.dev_attr)))				goto ERROR4;		}		if (data->has_fan & (1 << 1)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan2_input.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan2_min.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan2_div.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan2_alarm.dev_attr)))				goto ERROR4;		}		if (data->has_fan & (1 << 2)) {			if ((err = device_create_file(dev,			     &sensor_dev_attr_fan3_input.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan3_min.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan3_div.dev_attr))			 || (err = device_create_file(dev,			     &sensor_dev_attr_fan3_alarm.dev_attr)))				goto ERROR4;		}	}	if (enable_pwm_interface) {		if ((err = device_create_file(dev,		     &sensor_dev_attr_pwm1_enable.dev_attr))		 || (err = device_create_file(dev,		     &sensor_dev_attr_pwm2_enable.dev_attr))		 || (err = device_create_file(dev,		     &sensor_dev_attr_pwm3_enable.dev_attr))		 || (err = device_create_file(dev,		     &sensor_dev_attr_pwm1.dev_attr))		 || (err = device_create_file(dev,		     &sensor_dev_attr_pwm2.dev_attr))		 || (err = device_create_file(dev,		     &sensor_dev_attr_pwm3.dev_attr))		 || (err = device_create_file(dev,		     &dev_attr_pwm1_freq))		 || (err = device_create_file(dev,

⌨️ 快捷键说明

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