drivers/hwmon: MAX31785 Provide config of fault pin bevavior
PATCH 1/1 drivers/hwmon: MAX31785 Provide config of fault pin bevavior
Provide interface to set behavior when FAULT pin is asserted. When enabled force fan to 100% PWM duty cycle.
--- drivers/hwmon/max31785.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+)
drivers/hwmon/max31785.c +70 -0
@@ -37,6 +37,7 @@#define MAX31785_REG_FAN_SPEED_1 0x90#define MAX31785_REG_MFR_ID 0x99#define MAX31785_REG_MFR_MODEL 0x9a +#define MAX31785_REG_MFR_FAULT_RESP 0xd9#define MAX31785_REG_MFR_FAN_CONFIG 0xf1#define MAX31785_REG_READ_FAN_PWM 0xf3
@@ -50,6 +51,9 @@/* Fan Status register bits */ #define MAX31785_FAN_STATUS_FAULT_MASK 0x80 +/* Fault response register bits */ +#define MAX31785_FAULT_RESP_PIN_MONITOR 0x01 +/* Fan Command constants */ #define MAX31785_FAN_COMMAND_PWM_RATIO 40
@@ -657,6 +661,68 @@ static int max31785_detect(struct i2c_client *client,return 0 ; } +static ssize_t fault_resp_store (struct device *dev, +struct device_attribute *attr,const char *buf, +size_t count) +{ +struct i2c_client *client =to_i2c_client (dev); +int rv; + + rv =max31785_set_page (client,0 ); +if (rv <0 ) +return rv; + + rv =i2c_smbus_read_byte_data (client,MAX31785_REG_MFR_FAULT_RESP ); +if (rv <0 ) +return rv; + +if (!strncmp (buf,"on" ,strlen ("on" ))) { +if (!(rv &MAX31785_FAULT_RESP_PIN_MONITOR )) { + rv |=MAX31785_FAULT_RESP_PIN_MONITOR ; + rv =i2c_smbus_write_byte_data (client, +MAX31785_REG_MFR_FAULT_RESP , rv); +if (rv <0 ) +return rv; + } + }else if (!strncmp (buf,"off" ,strlen ("off" ))) { +if (rv &MAX31785_FAULT_RESP_PIN_MONITOR ) { + rv &= ~MAX31785_FAULT_RESP_PIN_MONITOR ; + rv =i2c_smbus_write_byte_data (client, +MAX31785_REG_MFR_FAULT_RESP , rv); +if (rv <0 ) +return rv; + } + }else { +dev_warn (dev,"Unknown fault response type: [%s]\n" , buf); +return -EINVAL ; + } +return count; +} + +static ssize_t fault_resp_show (struct device *dev, +struct device_attribute *attr,char *buf) +{ +struct i2c_client *client =to_i2c_client (dev); +int rv; + + rv =max31785_set_page (client,0 ); +if (rv <0 ) +return rv; + + rv =i2c_smbus_read_byte_data (client,MAX31785_REG_MFR_FAULT_RESP ); +if (rv <0 ) +return rv; + +if (rv &MAX31785_FAULT_RESP_PIN_MONITOR ) + rv =sprintf (buf,"on\n" ); +else + rv =sprintf (buf,"off\n" ); + +return rv; +} + +static DEVICE_ATTR(fault_resp, 0644, fault_resp_show, fault_resp_store); +static int max31785_probe (struct i2c_client *client,const struct i2c_device_id *id) {
@@ -684,6 +750,10 @@ static int max31785_probe(struct i2c_client *client,if (err)return err; + err =device_create_file (dev, &dev_attr_fault_resp); +if (err) +return err; + hwmon_dev =devm_hwmon_device_register_with_groups (dev, client->name, data, max31785_groups);
Signature · 1 line
1.8.2.2
Quoted 3 lines · Christopher Bostic
Provide interface to set behavior when FAULT pin is asserted. When enabled force fan to 100% PWM duty cycle.
I'll apply this on top of my rework of the driver and send both later today.
Cheers,
Andrew
Quoted 107 lines
Signed-off-by Christopher Bostic <[email protected]>---
drivers/hwmon/max31785.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++1 file changed, 70 insertions(+)drivers/hwmon/max31785.c +0
-0@@ -37,6 +37,7 @@Quoted 6 lines
#define
MAX31785_REG_FAN_SPEED_10x90
#defineMAX31785_REG_MFR_ID0x99
#defineMAX31785_REG_MFR_MODEL0x9a
+#defineMAX31785_REG_MFR_FAULT_RESP0xd9
#defineMAX31785_REG_MFR_FAN_CONFIG0xf1
#defineMAX31785_REG_READ_FAN_PWM0xf3drivers/hwmon/max31785.c +0
-0@@ -50,6 +51,9 @@ /* Fan Status register bits */Quoted 1 line
#define
MAX31785_FAN_STATUS_FAULT_MASK0x80
+/* Fault response register bits */Quoted 1 line
+#define
MAX31785_FAULT_RESP_PIN_MONITOR0x01+
/* Fan Command constants */Quoted 1 line
#define
MAX31785_FAN_COMMAND_PWM_RATIO40drivers/hwmon/max31785.c +0
-0@@ -657,6 +661,68 @@ static int max31785_detect(struct i2c_client *client, > return 0; }
+staticssize_tfault_resp_store(struct device *dev,drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 666
Quoted 2 lines
drivers/hwmon/max31785.c +2
-0+ struct device_attribute *attr, const char *buf, + size_t count)+{
Review
Quoted 2 lines
(quoted diff) +2
-0+ struct i2c_client *client = to_i2c_client(dev); + int rv;+
drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 673
Quoted 3 lines
drivers/hwmon/max31785.c +3
-0+ rv =max31785_set_page (client,0 ); +if (rv <0 ) +return rv;+
drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 677
Quoted 3 lines
drivers/hwmon/max31785.c +3
-0+ rv =i2c_smbus_read_byte_data (client,MAX31785_REG_MFR_FAULT_RESP ); +if (rv <0 ) +return rv;+
Quoted 21 lines
drivers/hwmon/max31785.c +21
-0+if (!strncmp (buf,"on" ,strlen ("on" ))) { +if (!(rv &MAX31785_FAULT_RESP_PIN_MONITOR )) { + rv |=MAX31785_FAULT_RESP_PIN_MONITOR ; + rv =i2c_smbus_write_byte_data (client, +MAX31785_REG_MFR_FAULT_RESP , rv); +if (rv <0 ) +return rv; + } + }else if (!strncmp (buf,"off" ,strlen ("off" ))) { +if (rv &MAX31785_FAULT_RESP_PIN_MONITOR ) { + rv &= ~MAX31785_FAULT_RESP_PIN_MONITOR ; + rv =i2c_smbus_write_byte_data (client, +MAX31785_REG_MFR_FAULT_RESP , rv); +if (rv <0 ) +return rv; + } + }else { +dev_warn (dev,"Unknown fault response type: [%s]\n" , buf); +return -EINVAL ; + } +return count;drivers/hwmon/max31785.c +3
-0+} + +static ssize_t fault_resp_show(struct device *dev,drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 703
Quoted 1 line
drivers/hwmon/max31785.c +1
-0+ struct device_attribute *attr, char *buf)+{
Review
Quoted 2 lines
(quoted diff) +2
-0+ struct i2c_client *client = to_i2c_client(dev); + int rv;+
drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 673
Quoted 3 lines
drivers/hwmon/max31785.c +3
-0+ rv =max31785_set_page (client,0 ); +if (rv <0 ) +return rv;+
drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 677
Quoted 3 lines
drivers/hwmon/max31785.c +3
-0+ rv =i2c_smbus_read_byte_data (client,MAX31785_REG_MFR_FAULT_RESP ); +if (rv <0 ) +return rv;+
drivers/hwmon/max31785.c static int max31785_detect(struct i2c_client *client, · line 719
Quoted 4 lines
drivers/hwmon/max31785.c +4
-0+if (rv &MAX31785_FAULT_RESP_PIN_MONITOR ) + rv =sprintf (buf,"on\n" ); +else + rv =sprintf (buf,"off\n" );+
Quoted 1 line
(quoted diff) +1
-0+ return rv;drivers/hwmon/max31785.c +4
-0+} + +static DEVICE_ATTR(fault_resp, 0644, fault_resp_show, fault_resp_store); +static int max31785_probe(struct
i2c_client*client,Quoted 1 line
const struct
i2c_device_id*id){
drivers/hwmon/max31785.c +0
-0@@ -684,6 +750,10 @@ static int max31785_probe(struct i2c_client *client, > if (err) > return err;drivers/hwmon/max31785.c static int max31785_probe(struct i2c_client *client, · line 755
Quoted 3 lines
drivers/hwmon/max31785.c +3
-0+ err =device_create_file (dev, &dev_attr_fault_resp); +if (err) +return err;+
Quoted 2 lines
hwmon_dev=devm_hwmon_device_register_with_groups(dev, client->name, data, max31785_groups);