[PATCH linux dev-4.10 v2 3/3] drivers/hwmon: max31785 Set fan fault response based on dev tree
Joel Stanley
joel at jms.id.au
Fri Jun 16 16:18:46 AEST 2017
On Fri, Jun 16, 2017 at 5:30 AM, Christopher Bostic
<cbostic at 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 at linux.vnet.ibm.com>
> ---
> drivers/hwmon/max31785.c | 38 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
> diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c
> index fc03b7c..a67d5e5 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
It's a bit, so use BIT(0).
The bit is called "FAULT_PIN_MONITOR". Please use that naming in your code.
> +
> /* Fan Command constants */
> #define MAX31785_FAN_COMMAND_PWM_RATIO 40
>
> @@ -762,6 +766,36 @@ 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)) {
> + /* TODO: number of fans/pages is platform dependent */
> + for (page = 0; page < 4; page++) {
The datasheet says "this bit is only valid for pages 0 to 5. Other
pages return 0".
Is there a reason you only apply it to the first four pages, and not
the fifth (index 4) and sixth (index 5)?
If you intended to apply this for all 6 supported pages, you could set
page 255, and have the condition applied for all of the valid pages.
If you only set it for the first four pages on purpose then please add
a comment to say that. However, I think we should fix the binding so
the pages can be selected. I will review the bindings separately.
Cheers,
Joel
> +
> + /* 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_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 +817,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
>
More information about the openbmc
mailing list