📄 adt7470.c
字号:
struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10) / 1000; mutex_lock(&data->lock); data->temp_max[attr->index] = temp; i2c_smbus_write_byte_data(client, ADT7470_TEMP_MAX_REG(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]);}static ssize_t show_alarms(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); if (attr->index) return sprintf(buf, "%x\n", data->alarms); else return sprintf(buf, "%x\n", data->alarms_mask);}static ssize_t show_fan_max(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); if (FAN_DATA_VALID(data->fan_max[attr->index])) return sprintf(buf, "%d\n", FAN_PERIOD_TO_RPM(data->fan_max[attr->index])); else return sprintf(buf, "0\n");}static ssize_t set_fan_max(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); if (!temp) return -EINVAL; temp = FAN_RPM_TO_PERIOD(temp); mutex_lock(&data->lock); data->fan_max[attr->index] = temp; adt7470_write_word_data(client, ADT7470_REG_FAN_MAX(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_fan_min(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); if (FAN_DATA_VALID(data->fan_min[attr->index])) return sprintf(buf, "%d\n", FAN_PERIOD_TO_RPM(data->fan_min[attr->index])); else return sprintf(buf, "0\n");}static ssize_t set_fan_min(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); if (!temp) return -EINVAL; temp = FAN_RPM_TO_PERIOD(temp); mutex_lock(&data->lock); data->fan_min[attr->index] = temp; adt7470_write_word_data(client, ADT7470_REG_FAN_MIN(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); if (FAN_DATA_VALID(data->fan[attr->index])) return sprintf(buf, "%d\n", FAN_PERIOD_TO_RPM(data->fan[attr->index])); else return sprintf(buf, "0\n");}static ssize_t show_force_pwm_max(struct device *dev, struct device_attribute *devattr, char *buf){ struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", data->force_pwm_max);}static ssize_t set_force_pwm_max(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); u8 reg; mutex_lock(&data->lock); data->force_pwm_max = temp; reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); if (temp) reg |= ADT7470_FSPD_MASK; else reg &= ~ADT7470_FSPD_MASK; i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg); mutex_unlock(&data->lock); return count;}static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", data->pwm[attr->index]);}static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); mutex_lock(&data->lock); data->pwm[attr->index] = temp; i2c_smbus_write_byte_data(client, ADT7470_REG_PWM(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_pwm_max(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", data->pwm_max[attr->index]);}static ssize_t set_pwm_max(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); mutex_lock(&data->lock); data->pwm_max[attr->index] = temp; i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MAX(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_pwm_min(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", data->pwm_min[attr->index]);}static ssize_t set_pwm_min(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); mutex_lock(&data->lock); data->pwm_min[attr->index] = temp; i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MIN(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_pwm_tmax(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); /* the datasheet says that tmax = tmin + 20C */ return sprintf(buf, "%d\n", 1000 * (20 + data->pwm_tmin[attr->index]));}static ssize_t show_pwm_tmin(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", 1000 * data->pwm_tmin[attr->index]);}static ssize_t set_pwm_tmin(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10) / 1000; mutex_lock(&data->lock); data->pwm_tmin[attr->index] = temp; i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_TMIN(attr->index), temp); mutex_unlock(&data->lock); return count;}static ssize_t show_pwm_auto(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); return sprintf(buf, "%d\n", 1 + data->pwm_automatic[attr->index]);}static ssize_t set_pwm_auto(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = simple_strtol(buf, NULL, 10); int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); int pwm_auto_reg_mask; u8 reg; if (attr->index % 2) pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; else pwm_auto_reg_mask = ADT7470_PWM1_AUTO_MASK; if (temp != 2 && temp != 1) return -EINVAL; temp--; mutex_lock(&data->lock); data->pwm_automatic[attr->index] = temp; reg = i2c_smbus_read_byte_data(client, pwm_auto_reg); if (temp) reg |= pwm_auto_reg_mask; else reg &= ~pwm_auto_reg_mask; i2c_smbus_write_byte_data(client, pwm_auto_reg, reg); mutex_unlock(&data->lock); return count;}static ssize_t show_pwm_auto_temp(struct device *dev, struct device_attribute *devattr, char *buf){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct adt7470_data *data = adt7470_update_device(dev); u8 ctrl = data->pwm_auto_temp[attr->index]; if (ctrl) return sprintf(buf, "%d\n", 1 << (ctrl - 1)); else return sprintf(buf, "%d\n", ADT7470_PWM_ALL_TEMPS);}static int cvt_auto_temp(int input){ if (input == ADT7470_PWM_ALL_TEMPS) return 0; if (input < 1 || !power_of_2(input)) return -EINVAL; return ilog2(input) + 1;}static ssize_t set_pwm_auto_temp(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count){ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct i2c_client *client = to_i2c_client(dev); struct adt7470_data *data = i2c_get_clientdata(client); int temp = cvt_auto_temp(simple_strtol(buf, NULL, 10)); int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); u8 reg; if (temp < 0) return temp; mutex_lock(&data->lock); data->pwm_automatic[attr->index] = temp; reg = i2c_smbus_read_byte_data(client, pwm_auto_reg);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -