hwmon: (max31790) add fanN_enable
[linux-2.6-microblaze.git] / drivers / hwmon / max31790.c
index 7e9362f..20bf5ff 100644 (file)
@@ -202,6 +202,9 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
                }
                mutex_unlock(&data->update_lock);
                return 0;
+       case hwmon_fan_enable:
+               *val = !!(data->fan_config[channel] & MAX31790_FAN_CFG_TACH_INPUT_EN);
+               return 0;
        default:
                return -EOPNOTSUPP;
        }
@@ -214,7 +217,7 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
        struct i2c_client *client = data->client;
        int target_count;
        int err = 0;
-       u8 bits;
+       u8 bits, fan_config;
        int sr;
 
        mutex_lock(&data->update_lock);
@@ -243,6 +246,23 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
                                        MAX31790_REG_TARGET_COUNT(channel),
                                        data->target_count[channel]);
                break;
+       case hwmon_fan_enable:
+               fan_config = data->fan_config[channel];
+               if (val == 0) {
+                       fan_config &= ~MAX31790_FAN_CFG_TACH_INPUT_EN;
+               } else if (val == 1) {
+                       fan_config |= MAX31790_FAN_CFG_TACH_INPUT_EN;
+               } else {
+                       err = -EINVAL;
+                       break;
+               }
+               if (fan_config != data->fan_config[channel]) {
+                       err = i2c_smbus_write_byte_data(client, MAX31790_REG_FAN_CONFIG(channel),
+                                                       fan_config);
+                       if (!err)
+                               data->fan_config[channel] = fan_config;
+               }
+               break;
        default:
                err = -EOPNOTSUPP;
                break;
@@ -270,6 +290,10 @@ static umode_t max31790_fan_is_visible(const void *_data, u32 attr, int channel)
                    !(fan_config & MAX31790_FAN_CFG_TACH_INPUT))
                        return 0644;
                return 0;
+       case hwmon_fan_enable:
+               if (channel < NR_CHANNEL)
+                       return 0644;
+               return 0;
        default:
                return 0;
        }
@@ -423,12 +447,12 @@ static umode_t max31790_is_visible(const void *data,
 
 static const struct hwmon_channel_info *max31790_info[] = {
        HWMON_CHANNEL_INFO(fan,
-                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
-                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
-                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
-                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
-                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
-                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
+                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT | HWMON_F_ENABLE,
+                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT | HWMON_F_ENABLE,
+                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT | HWMON_F_ENABLE,
+                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT | HWMON_F_ENABLE,
+                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT | HWMON_F_ENABLE,
+                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT | HWMON_F_ENABLE,
                           HWMON_F_INPUT | HWMON_F_FAULT,
                           HWMON_F_INPUT | HWMON_F_FAULT,
                           HWMON_F_INPUT | HWMON_F_FAULT,