[linux,dev-4.10,3/3] drivers/hwmon: max31785 Set fan fault response based on dev tree
diff mbox

Message ID 20170614205115.47342-4-cbostic@linux.vnet.ibm.com
State Superseded
Headers show

Commit Message

Christopher Bostic June 14, 2017, 8:51 p.m. UTC
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>
---
 drivers/hwmon/max31785.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Patch
diff mbox

diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c
index fc03b7c..5d7bdd3 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_RESP_PIN_MONITOR		0x01
+
 /* Fan Command constants */
 #define MAX31785_FAN_COMMAND_PWM_RATIO		40
 
@@ -762,6 +766,32 @@  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 rc;
+
+	if (np && of_get_property(np, "fault-max-fan", NULL)) {
+
+		/* set max fans on fault */
+		rc = max31785_set_page(client, 0);
+		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_RESP_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 +813,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;