Message ID | 20170620183747.25327-1-cbostic@linux.vnet.ibm.com |
---|---|
State | Accepted, archived |
Headers | show |
On Wed, Jun 21, 2017 at 4:07 AM, Christopher Bostic <cbostic@linux.vnet.ibm.com> wrote: > Check for the optional device tree property 'fault-max-fan'. If > present, configure hardware for 100% PWM fan duty cycle on fault > condition. > > Signed-off-by: Christopher Bostic <cbostic@linux.vnet.ibm.com> > --- > v3 - Change bit field definition to use macro BIT(x) > - Set all 6 fans to same fault response > - Rename fault response register #define to match the spec Applied to dev-4.10. Cheers, Joel > > v2 - Set 4 fans to same fault response > --- > drivers/hwmon/max31785.c | 37 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c > index fc03b7c..4010504 100644 > --- a/drivers/hwmon/max31785.c > +++ b/drivers/hwmon/max31785.c > @@ -38,6 +38,7 @@ > #define MAX31785_REG_MFR_ID 0x99 > #define MAX31785_REG_MFR_MODEL 0x9a > #define MAX31785_REG_MFR_REVISION 0x9b > +#define MAX31785_REG_MFR_FAULT_RESP 0xd9 > #define MAX31785_REG_MFR_FAN_CONFIG 0xf1 > #define MAX31785_REG_READ_FAN_PWM 0xf3 > > @@ -51,6 +52,9 @@ > /* Fan Status register bits */ > #define MAX31785_FAN_STATUS_FAULT_MASK 0x80 > > +/* Fault response register bits */ > +#define MAX31785_FAULT_PIN_MONITOR BIT(0) > + > /* Fan Command constants */ > #define MAX31785_FAN_COMMAND_PWM_RATIO 40 > > @@ -762,6 +766,35 @@ static int max31785_get_capabilities(struct max31785 *data) > return 0; > } > > +static int max31785_init_fault_resp(struct i2c_client *client) > +{ > + struct device_node *np = client->dev.of_node; > + int page; > + int rc; > + > + if (np && of_get_property(np, "fault-max-fan", NULL)) { For reference, you can use of_property_read_bool here. > + for (page = 0; page < NR_CHANNEL; page++) { > + > + /* set max fans on fault */ > + rc = max31785_set_page(client, page); > + if (rc < 0) > + return rc; > + > + rc = i2c_smbus_read_byte_data(client, > + MAX31785_REG_MFR_FAULT_RESP); > + if (rc < 0) > + return rc; > + > + rc |= MAX31785_FAULT_PIN_MONITOR; > + rc = i2c_smbus_write_byte_data(client, > + MAX31785_REG_MFR_FAULT_RESP, rc); > + } > + return rc; > + } > + > + return 0; > +} > + > static int max31785_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > @@ -783,6 +816,10 @@ static int max31785_probe(struct i2c_client *client, > data->client = client; > mutex_init(&data->lock); > > + rc = max31785_init_fault_resp(client); > + if (rc) > + return rc; > + > rc = max31785_init_fans(data); > if (rc) > return rc; > -- > 1.8.2.2 >
diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c index fc03b7c..4010504 100644 --- a/drivers/hwmon/max31785.c +++ b/drivers/hwmon/max31785.c @@ -38,6 +38,7 @@ #define MAX31785_REG_MFR_ID 0x99 #define MAX31785_REG_MFR_MODEL 0x9a #define MAX31785_REG_MFR_REVISION 0x9b +#define MAX31785_REG_MFR_FAULT_RESP 0xd9 #define MAX31785_REG_MFR_FAN_CONFIG 0xf1 #define MAX31785_REG_READ_FAN_PWM 0xf3 @@ -51,6 +52,9 @@ /* Fan Status register bits */ #define MAX31785_FAN_STATUS_FAULT_MASK 0x80 +/* Fault response register bits */ +#define MAX31785_FAULT_PIN_MONITOR BIT(0) + /* Fan Command constants */ #define MAX31785_FAN_COMMAND_PWM_RATIO 40 @@ -762,6 +766,35 @@ static int max31785_get_capabilities(struct max31785 *data) return 0; } +static int max31785_init_fault_resp(struct i2c_client *client) +{ + struct device_node *np = client->dev.of_node; + int page; + int rc; + + if (np && of_get_property(np, "fault-max-fan", NULL)) { + for (page = 0; page < NR_CHANNEL; page++) { + + /* set max fans on fault */ + rc = max31785_set_page(client, page); + if (rc < 0) + return rc; + + rc = i2c_smbus_read_byte_data(client, + MAX31785_REG_MFR_FAULT_RESP); + if (rc < 0) + return rc; + + rc |= MAX31785_FAULT_PIN_MONITOR; + rc = i2c_smbus_write_byte_data(client, + MAX31785_REG_MFR_FAULT_RESP, rc); + } + return rc; + } + + return 0; +} + static int max31785_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -783,6 +816,10 @@ static int max31785_probe(struct i2c_client *client, data->client = client; mutex_init(&data->lock); + rc = max31785_init_fault_resp(client); + if (rc) + return rc; + rc = max31785_init_fans(data); if (rc) return rc;
Check for the optional device tree property 'fault-max-fan'. If present, configure hardware for 100% PWM fan duty cycle on fault condition. Signed-off-by: Christopher Bostic <cbostic@linux.vnet.ibm.com> --- v3 - Change bit field definition to use macro BIT(x) - Set all 6 fans to same fault response - Rename fault response register #define to match the spec v2 - Set 4 fans to same fault response --- drivers/hwmon/max31785.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)