📄 adm1026.c
字号:
static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ show_temp_##offset##_min, set_temp_##offset##_min); \static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ show_temp_##offset##_max, set_temp_##offset##_max);temp_reg(1);temp_reg(2);temp_reg(3);static ssize_t show_temp_offset(struct device *dev, char *buf, int nr){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_offset[nr]));}static ssize_t set_temp_offset(struct device *dev, const char *buf, size_t count, int nr){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->temp_offset[nr] = TEMP_TO_REG(val); adm1026_write_value(client, ADM1026_REG_TEMP_OFFSET[nr], data->temp_offset[nr]); up(&data->update_lock); return count;}#define temp_offset_reg(offset) \static ssize_t show_temp_##offset##_offset (struct device *dev, char *buf) \{ \ return show_temp_offset(dev, buf, offset - 1); \} \static ssize_t set_temp_##offset##_offset (struct device *dev, \ const char *buf, size_t count) \{ \ return set_temp_offset(dev, buf, count, offset - 1); \} \static DEVICE_ATTR(temp##offset##_offset, S_IRUGO | S_IWUSR, \ show_temp_##offset##_offset, set_temp_##offset##_offset);temp_offset_reg(1);temp_offset_reg(2);temp_offset_reg(3);static ssize_t show_temp_auto_point1_temp_hyst(struct device *dev, char *buf, int nr){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", TEMP_FROM_REG( ADM1026_FAN_ACTIVATION_TEMP_HYST + data->temp_tmin[nr]));}static ssize_t show_temp_auto_point2_temp(struct device *dev, char *buf, int nr){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_tmin[nr] + ADM1026_FAN_CONTROL_TEMP_RANGE));}static ssize_t show_temp_auto_point1_temp(struct device *dev, char *buf, int nr){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_tmin[nr]));}static ssize_t set_temp_auto_point1_temp(struct device *dev, const char *buf, size_t count, int nr){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->temp_tmin[nr] = TEMP_TO_REG(val); adm1026_write_value(client, ADM1026_REG_TEMP_TMIN[nr], data->temp_tmin[nr]); up(&data->update_lock); return count;}#define temp_auto_point(offset) \static ssize_t show_temp##offset##_auto_point1_temp (struct device *dev, \ char *buf) \{ \ return show_temp_auto_point1_temp(dev, buf, offset - 1); \} \static ssize_t set_temp##offset##_auto_point1_temp (struct device *dev, \ const char *buf, size_t count) \{ \ return set_temp_auto_point1_temp(dev, buf, count, offset - 1); \} \static ssize_t show_temp##offset##_auto_point1_temp_hyst (struct device \ *dev, char *buf) \{ \ return show_temp_auto_point1_temp_hyst(dev, buf, offset - 1); \} \static ssize_t show_temp##offset##_auto_point2_temp (struct device *dev, \ char *buf) \{ \ return show_temp_auto_point2_temp(dev, buf, offset - 1); \} \static DEVICE_ATTR(temp##offset##_auto_point1_temp, S_IRUGO | S_IWUSR, \ show_temp##offset##_auto_point1_temp, \ set_temp##offset##_auto_point1_temp); \static DEVICE_ATTR(temp##offset##_auto_point1_temp_hyst, S_IRUGO, \ show_temp##offset##_auto_point1_temp_hyst, NULL); \static DEVICE_ATTR(temp##offset##_auto_point2_temp, S_IRUGO, \ show_temp##offset##_auto_point2_temp, NULL);temp_auto_point(1);temp_auto_point(2);temp_auto_point(3);static ssize_t show_temp_crit_enable(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", (data->config1 & CFG1_THERM_HOT) >> 4);}static ssize_t set_temp_crit_enable(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; val = simple_strtol(buf, NULL, 10); if ((val == 1) || (val==0)) { down(&data->update_lock); data->config1 = (data->config1 & ~CFG1_THERM_HOT) | (val << 4); adm1026_write_value(client, ADM1026_REG_CONFIG1, data->config1); up(&data->update_lock); } return count;}static DEVICE_ATTR(temp1_crit_enable, S_IRUGO | S_IWUSR, show_temp_crit_enable, set_temp_crit_enable);static DEVICE_ATTR(temp2_crit_enable, S_IRUGO | S_IWUSR, show_temp_crit_enable, set_temp_crit_enable);static DEVICE_ATTR(temp3_crit_enable, S_IRUGO | S_IWUSR, show_temp_crit_enable, set_temp_crit_enable);static ssize_t show_temp_crit(struct device *dev, char *buf, int nr){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_crit[nr]));}static ssize_t set_temp_crit(struct device *dev, const char *buf, size_t count, int nr){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->temp_crit[nr] = TEMP_TO_REG(val); adm1026_write_value(client, ADM1026_REG_TEMP_THERM[nr], data->temp_crit[nr]); up(&data->update_lock); return count;}#define temp_crit_reg(offset) \static ssize_t show_temp_##offset##_crit (struct device *dev, char *buf) \{ \ return show_temp_crit(dev, buf, offset - 1); \} \static ssize_t set_temp_##offset##_crit (struct device *dev, \ const char *buf, size_t count) \{ \ return set_temp_crit(dev, buf, count, offset - 1); \} \static DEVICE_ATTR(temp##offset##_crit, S_IRUGO | S_IWUSR, \ show_temp_##offset##_crit, set_temp_##offset##_crit);temp_crit_reg(1);temp_crit_reg(2);temp_crit_reg(3);static ssize_t show_analog_out_reg(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", DAC_FROM_REG(data->analog_out));}static ssize_t set_analog_out_reg(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->analog_out = DAC_TO_REG(val); adm1026_write_value(client, ADM1026_REG_DAC, data->analog_out); up(&data->update_lock); return count;}static DEVICE_ATTR(analog_out, S_IRUGO | S_IWUSR, show_analog_out_reg, set_analog_out_reg);static ssize_t show_vid_reg(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", vid_from_reg(data->vid & 0x3f, data->vrm));}static DEVICE_ATTR(vid, S_IRUGO, show_vid_reg, NULL);static ssize_t show_vrm_reg(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", data->vrm);}static ssize_t store_vrm_reg(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); data->vrm = simple_strtol(buf, NULL, 10); return count;}static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);static ssize_t show_alarms_reg(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf, "%ld\n", (long) (data->alarms));}static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);static ssize_t show_alarm_mask(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%ld\n", data->alarm_mask);}static ssize_t set_alarm_mask(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; unsigned long mask; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->alarm_mask = val & 0x7fffffff; mask = data->alarm_mask | (data->gpio_mask & 0x10000 ? 0x80000000 : 0); adm1026_write_value(client, ADM1026_REG_MASK1, mask & 0xff); mask >>= 8; adm1026_write_value(client, ADM1026_REG_MASK2, mask & 0xff); mask >>= 8; adm1026_write_value(client, ADM1026_REG_MASK3, mask & 0xff); mask >>= 8; adm1026_write_value(client, ADM1026_REG_MASK4, mask & 0xff); up(&data->update_lock); return count;}static DEVICE_ATTR(alarm_mask, S_IRUGO | S_IWUSR, show_alarm_mask, set_alarm_mask);static ssize_t show_gpio(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%ld\n", data->gpio);}static ssize_t set_gpio(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; long gpio; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->gpio = val & 0x1ffff; gpio = data->gpio; adm1026_write_value(client, ADM1026_REG_GPIO_STATUS_0_7,gpio & 0xff); gpio >>= 8; adm1026_write_value(client, ADM1026_REG_GPIO_STATUS_8_15,gpio & 0xff); gpio = ((gpio >> 1) & 0x80) | (data->alarms >> 24 & 0x7f); adm1026_write_value(client, ADM1026_REG_STATUS4,gpio & 0xff); up(&data->update_lock); return count;}static DEVICE_ATTR(gpio, S_IRUGO | S_IWUSR, show_gpio, set_gpio);static ssize_t show_gpio_mask(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%ld\n", data->gpio_mask);}static ssize_t set_gpio_mask(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; long mask; down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->gpio_mask = val & 0x1ffff; mask = data->gpio_mask; adm1026_write_value(client, ADM1026_REG_GPIO_MASK_0_7,mask & 0xff); mask >>= 8; adm1026_write_value(client, ADM1026_REG_GPIO_MASK_8_15,mask & 0xff); mask = ((mask >> 1) & 0x80) | (data->alarm_mask >> 24 & 0x7f); adm1026_write_value(client, ADM1026_REG_MASK1,mask & 0xff); up(&data->update_lock); return count;}static DEVICE_ATTR(gpio_mask, S_IRUGO | S_IWUSR, show_gpio_mask, set_gpio_mask);static ssize_t show_pwm_reg(struct device *dev, char *buf){ struct adm1026_data *data = adm1026_update_device(dev); return sprintf(buf,"%d\n", PWM_FROM_REG(data->pwm1.pwm));}static ssize_t set_pwm_reg(struct device *dev, const char *buf, size_t count){ struct i2c_client *client = to_i2c_client(dev); struct adm1026_data *data = i2c_get_clientdata(client); int val; if (data->pwm1.enable == 1) { down(&data->update_lock); val = simple_strtol(buf, NULL, 10); data->pwm1.pwm = PWM_TO_REG(val); adm1026_write_value(client, ADM1026_REG_PWM, data->pwm1.pwm); up(&data->update_lock); } return count;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -