@@ -66,6 +66,8 @@ enum chips { amc6821 };
6666#define AMC6821_REG_TACH_LLIMITH 0x11
6767#define AMC6821_REG_TACH_HLIMITL 0x12
6868#define AMC6821_REG_TACH_HLIMITH 0x13
69+ #define AMC6821_REG_TACH_SETTINGL 0x1e
70+ #define AMC6821_REG_TACH_SETTINGH 0x1f
6971
7072#define AMC6821_CONF1_START 0x01
7173#define AMC6821_CONF1_FAN_INT_EN 0x02
@@ -122,17 +124,18 @@ static const u8 temp_reg[] = {AMC6821_REG_LTEMP_HI,
122124 AMC6821_REG_RTEMP_LIMIT_MAX ,
123125 AMC6821_REG_RTEMP_CRIT , };
124126
125- enum {IDX_FAN1_INPUT = 0 , IDX_FAN1_MIN , IDX_FAN1_MAX ,
127+ enum {IDX_FAN1_INPUT = 0 , IDX_FAN1_MIN , IDX_FAN1_MAX , IDX_FAN1_TARGET ,
126128 FAN1_IDX_LEN , };
127129
128130static const u8 fan_reg_low [] = {AMC6821_REG_TDATA_LOW ,
129131 AMC6821_REG_TACH_LLIMITL ,
130- AMC6821_REG_TACH_HLIMITL , };
131-
132+ AMC6821_REG_TACH_HLIMITL ,
133+ AMC6821_REG_TACH_SETTINGL , };
132134
133135static const u8 fan_reg_hi [] = {AMC6821_REG_TDATA_HI ,
134136 AMC6821_REG_TACH_LLIMITH ,
135- AMC6821_REG_TACH_HLIMITH , };
137+ AMC6821_REG_TACH_HLIMITH ,
138+ AMC6821_REG_TACH_SETTINGH , };
136139
137140/*
138141 * Client data (each client gets its own)
@@ -250,10 +253,10 @@ static struct amc6821_data *amc6821_update_device(struct device *dev)
250253 break ;
251254 case 1 : /*
252255 * semi-open loop: software sets rpm, chip controls
253- * pwm1, currently not implemented
256+ * pwm1
254257 */
255258 data -> pwm1_auto_channels_temp = 0 ;
256- data -> pwm1_enable = 0 ;
259+ data -> pwm1_enable = 4 ;
257260 break ;
258261 }
259262
@@ -407,6 +410,10 @@ static ssize_t pwm1_enable_store(struct device *dev,
407410 config |= AMC6821_CONF1_FDRC0 ;
408411 config |= AMC6821_CONF1_FDRC1 ;
409412 break ;
413+ case 4 :
414+ config |= AMC6821_CONF1_FDRC0 ;
415+ config &= ~AMC6821_CONF1_FDRC1 ;
416+ break ;
410417 default :
411418 count = - EINVAL ;
412419 goto unlock ;
@@ -622,8 +629,8 @@ static ssize_t fan_store(struct device *dev, struct device_attribute *attr,
622629 if (ret )
623630 return ret ;
624631
625- /* The minimum fan speed must not be unlimited (0) */
626- if (ix == IDX_FAN1_MIN && !val )
632+ /* Minimum and target fan speed must not be unlimited (0) */
633+ if (( ix == IDX_FAN1_MIN || ix == IDX_FAN1_TARGET ) && !val )
627634 return - EINVAL ;
628635
629636 val = val > 0 ? 6000000 / clamp_val (val , 1 , 6000000 ) : 0 ;
@@ -713,6 +720,7 @@ static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, temp_alarm, IDX_TEMP2_CRIT);
713720static SENSOR_DEVICE_ATTR_RO (fan1_input , fan , IDX_FAN1_INPUT ) ;
714721static SENSOR_DEVICE_ATTR_RW (fan1_min , fan , IDX_FAN1_MIN ) ;
715722static SENSOR_DEVICE_ATTR_RW (fan1_max , fan , IDX_FAN1_MAX ) ;
723+ static SENSOR_DEVICE_ATTR_RW (fan1_target , fan , IDX_FAN1_TARGET ) ;
716724static SENSOR_DEVICE_ATTR_RO (fan1_fault , fan1_fault , 0 ) ;
717725static SENSOR_DEVICE_ATTR_RW (fan1_pulses , fan1_pulses , 0 ) ;
718726
@@ -756,6 +764,7 @@ static struct attribute *amc6821_attrs[] = {
756764 & sensor_dev_attr_fan1_input .dev_attr .attr ,
757765 & sensor_dev_attr_fan1_min .dev_attr .attr ,
758766 & sensor_dev_attr_fan1_max .dev_attr .attr ,
767+ & sensor_dev_attr_fan1_target .dev_attr .attr ,
759768 & sensor_dev_attr_fan1_fault .dev_attr .attr ,
760769 & sensor_dev_attr_fan1_pulses .dev_attr .attr ,
761770 & sensor_dev_attr_pwm1 .dev_attr .attr ,
0 commit comments