hwmon: (max6650) Cache alarm_en register
authorGuenter Roeck <linux@roeck-us.net>
Fri, 7 Jun 2019 17:23:20 +0000 (10:23 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 24 Jun 2019 01:33:01 +0000 (18:33 -0700)
The alarm_en register is read each time the is_visible function is called.
Since it is a configuration register, this is completely unnecessary.
Read it once and cache its value.

Cc: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/max6650.c

index 90565318aafb815b53e79780ad36eac935151312..2edee4ca5cae9f97b5dc589289c758469a9edf1b 100644 (file)
@@ -114,6 +114,7 @@ struct max6650_data {
        u8 count;
        u8 dac;
        u8 alarm;
+       u8 alarm_en;
        unsigned long cooling_dev_state;
 };
 
@@ -545,8 +546,6 @@ static umode_t max6650_attrs_visible(struct kobject *kobj, struct attribute *a,
 {
        struct device *dev = container_of(kobj, struct device, kobj);
        struct max6650_data *data = dev_get_drvdata(dev);
-       struct i2c_client *client = data->client;
-       u8 alarm_en = i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM_EN);
        struct device_attribute *devattr;
 
        /*
@@ -559,7 +558,7 @@ static umode_t max6650_attrs_visible(struct kobject *kobj, struct attribute *a,
         || devattr == &sensor_dev_attr_fan1_fault.dev_attr
         || devattr == &sensor_dev_attr_gpio1_alarm.dev_attr
         || devattr == &sensor_dev_attr_gpio2_alarm.dev_attr) {
-               if (!(alarm_en & to_sensor_dev_attr(devattr)->index))
+               if (!(data->alarm_en & to_sensor_dev_attr(devattr)->index))
                        return 0;
        }
 
@@ -682,6 +681,13 @@ static int max6650_init_client(struct max6650_data *data,
        }
        data->count = reg;
 
+       reg = i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM_EN);
+       if (reg < 0) {
+               dev_err(dev, "Failed to read alarm configuration, aborting.\n");
+               return reg;
+       }
+       data->alarm_en = reg;
+
        if (!of_property_read_u32(client->dev.of_node, "maxim,fan-target-rpm",
                                  &target_rpm)) {
                max6650_set_target(data, target_rpm);