@@ -66,6 +66,8 @@ enum chips { amc6821 };
66
66
#define AMC6821_REG_TACH_LLIMITH 0x11
67
67
#define AMC6821_REG_TACH_HLIMITL 0x12
68
68
#define AMC6821_REG_TACH_HLIMITH 0x13
69
+ #define AMC6821_REG_TACH_SETTINGL 0x1e
70
+ #define AMC6821_REG_TACH_SETTINGH 0x1f
69
71
70
72
#define AMC6821_CONF1_START 0x01
71
73
#define AMC6821_CONF1_FAN_INT_EN 0x02
@@ -122,17 +124,18 @@ static const u8 temp_reg[] = {AMC6821_REG_LTEMP_HI,
122
124
AMC6821_REG_RTEMP_LIMIT_MAX ,
123
125
AMC6821_REG_RTEMP_CRIT , };
124
126
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 ,
126
128
FAN1_IDX_LEN , };
127
129
128
130
static const u8 fan_reg_low [] = {AMC6821_REG_TDATA_LOW ,
129
131
AMC6821_REG_TACH_LLIMITL ,
130
- AMC6821_REG_TACH_HLIMITL , };
131
-
132
+ AMC6821_REG_TACH_HLIMITL ,
133
+ AMC6821_REG_TACH_SETTINGL , };
132
134
133
135
static const u8 fan_reg_hi [] = {AMC6821_REG_TDATA_HI ,
134
136
AMC6821_REG_TACH_LLIMITH ,
135
- AMC6821_REG_TACH_HLIMITH , };
137
+ AMC6821_REG_TACH_HLIMITH ,
138
+ AMC6821_REG_TACH_SETTINGH , };
136
139
137
140
/*
138
141
* Client data (each client gets its own)
@@ -250,10 +253,10 @@ static struct amc6821_data *amc6821_update_device(struct device *dev)
250
253
break ;
251
254
case 1 : /*
252
255
* semi-open loop: software sets rpm, chip controls
253
- * pwm1, currently not implemented
256
+ * pwm1
254
257
*/
255
258
data -> pwm1_auto_channels_temp = 0 ;
256
- data -> pwm1_enable = 0 ;
259
+ data -> pwm1_enable = 4 ;
257
260
break ;
258
261
}
259
262
@@ -407,6 +410,10 @@ static ssize_t pwm1_enable_store(struct device *dev,
407
410
config |= AMC6821_CONF1_FDRC0 ;
408
411
config |= AMC6821_CONF1_FDRC1 ;
409
412
break ;
413
+ case 4 :
414
+ config |= AMC6821_CONF1_FDRC0 ;
415
+ config &= ~AMC6821_CONF1_FDRC1 ;
416
+ break ;
410
417
default :
411
418
count = - EINVAL ;
412
419
goto unlock ;
@@ -622,8 +629,8 @@ static ssize_t fan_store(struct device *dev, struct device_attribute *attr,
622
629
if (ret )
623
630
return ret ;
624
631
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 )
627
634
return - EINVAL ;
628
635
629
636
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);
713
720
static SENSOR_DEVICE_ATTR_RO (fan1_input , fan , IDX_FAN1_INPUT ) ;
714
721
static SENSOR_DEVICE_ATTR_RW (fan1_min , fan , IDX_FAN1_MIN ) ;
715
722
static SENSOR_DEVICE_ATTR_RW (fan1_max , fan , IDX_FAN1_MAX ) ;
723
+ static SENSOR_DEVICE_ATTR_RW (fan1_target , fan , IDX_FAN1_TARGET ) ;
716
724
static SENSOR_DEVICE_ATTR_RO (fan1_fault , fan1_fault , 0 ) ;
717
725
static SENSOR_DEVICE_ATTR_RW (fan1_pulses , fan1_pulses , 0 ) ;
718
726
@@ -756,6 +764,7 @@ static struct attribute *amc6821_attrs[] = {
756
764
& sensor_dev_attr_fan1_input .dev_attr .attr ,
757
765
& sensor_dev_attr_fan1_min .dev_attr .attr ,
758
766
& sensor_dev_attr_fan1_max .dev_attr .attr ,
767
+ & sensor_dev_attr_fan1_target .dev_attr .attr ,
759
768
& sensor_dev_attr_fan1_fault .dev_attr .attr ,
760
769
& sensor_dev_attr_fan1_pulses .dev_attr .attr ,
761
770
& sensor_dev_attr_pwm1 .dev_attr .attr ,
0 commit comments