Message ID | 20170601200644.56311-1-cbostic@linux.vnet.ibm.com |
---|---|
State | Superseded, archived |
Headers | show |
On Thu, 2017-06-01 at 15:06 -0500, Christopher Bostic wrote: > 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 > Signed-off-by: Christopher Bostic <cbostic@linux.vnet.ibm.com> > --- > drivers/hwmon/max31785.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 70 insertions(+) > > diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c > index fb7b3f0..9b42ce5 100644 > --- a/drivers/hwmon/max31785.c > +++ b/drivers/hwmon/max31785.c > @@ -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); >
diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c index fb7b3f0..9b42ce5 100644 --- a/drivers/hwmon/max31785.c +++ b/drivers/hwmon/max31785.c @@ -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);
Provide interface to set behavior when FAULT pin is asserted. When enabled force fan to 100% PWM duty cycle. Signed-off-by: Christopher Bostic <cbostic@linux.vnet.ibm.com> --- drivers/hwmon/max31785.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+)