[PATCH linux dev-4.10] hwmon: max31785: Enable dual rotor if functionality is detected
Joel Stanley
joel at jms.id.au
Wed Jun 21 14:54:54 AEST 2017
On Tue, Jun 20, 2017 at 12:09 PM, Andrew Jeffery <andrew at aj.id.au> wrote:
> The MFR_FAN_CONFIG command contains a bit (12) to enable or disable the
> second rotor measurement. Ensure we set it if we detect the 0x3040
> MFR_REVISION_ID.
>
> Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
Applied to dev-4.10.
Cheers,
Joel
> ---
> drivers/hwmon/max31785.c | 22 +++++++++++++++++-----
> 1 file changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c
> index ecece346be28..73680954f664 100644
> --- a/drivers/hwmon/max31785.c
> +++ b/drivers/hwmon/max31785.c
> @@ -39,6 +39,7 @@
> #define MAX31785_REG_MFR_MODEL 0x9a
> #define MAX31785_REG_MFR_REVISION 0x9b
> #define MAX31785_REG_MFR_FAN_CONFIG 0xf1
> +#define MAX31785_REG_MFR_FAN_CONFIG_DUAL_TACH BIT(12)
> #define MAX31785_REG_READ_FAN_PWM 0xf3
>
> /* Fan Config register bits */
> @@ -81,13 +82,13 @@ struct max31785 {
> /* Registers */
> u8 fan_config[NR_CHANNEL];
> u16 fan_command[NR_CHANNEL];
> - u8 mfr_fan_config[NR_CHANNEL];
> + u16 mfr_fan_config[NR_CHANNEL];
> u8 fault_status[NR_CHANNEL];
> u16 pwm[NR_CHANNEL];
> u16 tach_rpm[NR_CHANNEL * 2];
> };
>
> -static inline bool max31785_has_fast_rotor(struct max31785 *data)
> +static inline bool max31785_has_dual_rotor(struct max31785 *data)
> {
> return !!(data->capabilities & MAX31785_CAP_FAST_ROTOR);
> }
> @@ -188,7 +189,7 @@ static int max31785_update_fan_speed(struct max31785 *data, u8 fan)
> if (rc)
> return rc;
>
> - if (max31785_has_fast_rotor(data)) {
> + if (max31785_has_dual_rotor(data)) {
> rc = max31785_smbus_read_long_data(data->client,
> MAX31785_REG_FAN_SPEED_1);
> if (rc < 0)
> @@ -429,12 +430,23 @@ static int max31785_init_fans(struct max31785 *data)
> return rv;
> data->fan_command[i] = rv;
>
> - rv = max31785_read_fan_byte(client, i,
> + rv = max31785_read_fan_word(client, i,
> MAX31785_REG_MFR_FAN_CONFIG);
> if (rv < 0)
> return rv;
> data->mfr_fan_config[i] = rv;
>
> + if (max31785_has_dual_rotor(data)) {
> + rv |= MAX31785_REG_MFR_FAN_CONFIG_DUAL_TACH;
> + data->mfr_fan_config[i] = rv;
> +
> + rv = max31785_write_fan_word(client, i,
> + MAX31785_REG_MFR_FAN_CONFIG,
> + data->mfr_fan_config[i]);
> + if (rv < 0)
> + return rv;
> + }
> +
> if (!((data->fan_config[i]
> & MAX31785_FAN_CFG_CONTROL_MODE_RPM)
> || is_automatic_control_mode(data, i))) {
> @@ -799,7 +811,7 @@ static int max31785_probe(struct i2c_client *client,
> if (rc < 0)
> return rc;
>
> - if (max31785_has_fast_rotor(data))
> + if (max31785_has_dual_rotor(data))
> chip = &max31785_chip_info_0x3040;
> else
> chip = &max31785_chip_info_0x3030;
> --
> 2.11.0
>
More information about the openbmc
mailing list