drivers/hwmon: max31785 Set fan fault response based on dev tree
PATCH 1/1 drivers/hwmon: max31785 Set fan fault response based on dev tree
Check for the optional device tree property 'fault-max-fan'. If present, configure hardware for 100% PWM fan duty cycle on fault condition.
---
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(+)
drivers/hwmon/max31785.c +37 -0
@@ -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;
Signature · 1 line
1.8.2.2
Joel Stanley
AppliedQuoted 9 lines · Christopher Bostic
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 <[email protected]>---
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
Quoted 29 lines
v2 - Set 4 fans to same fault response
--- drivers/hwmon/max31785.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)drivers/hwmon/max31785.c +4
-0@@ -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
drivers/hwmon/max31785.c static int max31785_get_capabilities(struct max31785 *data) · line 775
Quoted 10 lines
drivers/hwmon/max31785.c +7
-0@@ -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.
Quoted 39 lines
drivers/hwmon/max31785.c +26
-1+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