diff options
author | Jean Delvare <khali@linux-fr.org> | 2012-03-23 05:02:17 -0400 |
---|---|---|
committer | Jean Delvare <khali@endymion.delvare> | 2012-03-23 05:02:17 -0400 |
commit | 72fea694c4208d7ee1704a7dbccddd54af352cde (patch) | |
tree | ad5db0b19671d6dac0a4da35f82e469ae4681cba /drivers/hwmon/w83795.c | |
parent | 941a956b0e387b21f385f486c34ef67576775cfc (diff) |
hwmon: (w83795) Unconditionally support manual fan speed control
Manual fan speed control uses a standard interface and has received
sufficient testing and review by now, it can be enabled
unconditionally. This includes attributes pwm[1-8], pwm[1-8]_enable,
pwm[1-8]_mode and pwm[1-8]_freq.
We only let the user switch from automatic mode to manual mode, but
not the other way around, as automatic control settings may not have
been set properly by the BIOS.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers/hwmon/w83795.c')
-rw-r--r-- | drivers/hwmon/w83795.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c index deb12c982800..5478dd136233 100644 --- a/drivers/hwmon/w83795.c +++ b/drivers/hwmon/w83795.c | |||
@@ -929,6 +929,14 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr, | |||
929 | if (val < 1 || val > 2) | 929 | if (val < 1 || val > 2) |
930 | return -EINVAL; | 930 | return -EINVAL; |
931 | 931 | ||
932 | #ifndef CONFIG_SENSORS_W83795_FANCTRL | ||
933 | if (val > 1) { | ||
934 | dev_warn(dev, "Automatic fan speed control support disabled\n"); | ||
935 | dev_warn(dev, "Build with CONFIG_SENSORS_W83795_FANCTRL=y if you want it\n"); | ||
936 | return -EOPNOTSUPP; | ||
937 | } | ||
938 | #endif | ||
939 | |||
932 | mutex_lock(&data->update_lock); | 940 | mutex_lock(&data->update_lock); |
933 | switch (val) { | 941 | switch (val) { |
934 | case 1: | 942 | case 1: |
@@ -1625,18 +1633,18 @@ store_sf_setup(struct device *dev, struct device_attribute *attr, | |||
1625 | #define SENSOR_ATTR_PWM(index) { \ | 1633 | #define SENSOR_ATTR_PWM(index) { \ |
1626 | SENSOR_ATTR_2(pwm##index, S_IWUSR | S_IRUGO, show_pwm, \ | 1634 | SENSOR_ATTR_2(pwm##index, S_IWUSR | S_IRUGO, show_pwm, \ |
1627 | store_pwm, PWM_OUTPUT, index - 1), \ | 1635 | store_pwm, PWM_OUTPUT, index - 1), \ |
1636 | SENSOR_ATTR_2(pwm##index##_enable, S_IWUSR | S_IRUGO, \ | ||
1637 | show_pwm_enable, store_pwm_enable, NOT_USED, index - 1), \ | ||
1638 | SENSOR_ATTR_2(pwm##index##_mode, S_IRUGO, \ | ||
1639 | show_pwm_mode, NULL, NOT_USED, index - 1), \ | ||
1640 | SENSOR_ATTR_2(pwm##index##_freq, S_IWUSR | S_IRUGO, \ | ||
1641 | show_pwm, store_pwm, PWM_FREQ, index - 1), \ | ||
1628 | SENSOR_ATTR_2(pwm##index##_nonstop, S_IWUSR | S_IRUGO, \ | 1642 | SENSOR_ATTR_2(pwm##index##_nonstop, S_IWUSR | S_IRUGO, \ |
1629 | show_pwm, store_pwm, PWM_NONSTOP, index - 1), \ | 1643 | show_pwm, store_pwm, PWM_NONSTOP, index - 1), \ |
1630 | SENSOR_ATTR_2(pwm##index##_start, S_IWUSR | S_IRUGO, \ | 1644 | SENSOR_ATTR_2(pwm##index##_start, S_IWUSR | S_IRUGO, \ |
1631 | show_pwm, store_pwm, PWM_START, index - 1), \ | 1645 | show_pwm, store_pwm, PWM_START, index - 1), \ |
1632 | SENSOR_ATTR_2(pwm##index##_stop_time, S_IWUSR | S_IRUGO, \ | 1646 | SENSOR_ATTR_2(pwm##index##_stop_time, S_IWUSR | S_IRUGO, \ |
1633 | show_pwm, store_pwm, PWM_STOP_TIME, index - 1), \ | 1647 | show_pwm, store_pwm, PWM_STOP_TIME, index - 1), \ |
1634 | SENSOR_ATTR_2(pwm##index##_freq, S_IWUSR | S_IRUGO, \ | ||
1635 | show_pwm, store_pwm, PWM_FREQ, index - 1), \ | ||
1636 | SENSOR_ATTR_2(pwm##index##_enable, S_IWUSR | S_IRUGO, \ | ||
1637 | show_pwm_enable, store_pwm_enable, NOT_USED, index - 1), \ | ||
1638 | SENSOR_ATTR_2(pwm##index##_mode, S_IRUGO, \ | ||
1639 | show_pwm_mode, NULL, NOT_USED, index - 1), \ | ||
1640 | SENSOR_ATTR_2(fan##index##_target, S_IWUSR | S_IRUGO, \ | 1648 | SENSOR_ATTR_2(fan##index##_target, S_IWUSR | S_IRUGO, \ |
1641 | show_fanin, store_fanin, FANIN_TARGET, index - 1) } | 1649 | show_fanin, store_fanin, FANIN_TARGET, index - 1) } |
1642 | 1650 | ||
@@ -1953,6 +1961,14 @@ static int w83795_detect(struct i2c_client *client, | |||
1953 | return 0; | 1961 | return 0; |
1954 | } | 1962 | } |
1955 | 1963 | ||
1964 | #ifdef CONFIG_SENSORS_W83795_FANCTRL | ||
1965 | #define NUM_PWM_ATTRIBUTES ARRAY_SIZE(w83795_pwm[0]) | ||
1966 | #define NUM_TEMP_ATTRIBUTES ARRAY_SIZE(w83795_temp[0]) | ||
1967 | #else | ||
1968 | #define NUM_PWM_ATTRIBUTES 4 | ||
1969 | #define NUM_TEMP_ATTRIBUTES 8 | ||
1970 | #endif | ||
1971 | |||
1956 | static int w83795_handle_files(struct device *dev, int (*fn)(struct device *, | 1972 | static int w83795_handle_files(struct device *dev, int (*fn)(struct device *, |
1957 | const struct device_attribute *)) | 1973 | const struct device_attribute *)) |
1958 | { | 1974 | { |
@@ -2006,24 +2022,18 @@ static int w83795_handle_files(struct device *dev, int (*fn)(struct device *, | |||
2006 | } | 2022 | } |
2007 | } | 2023 | } |
2008 | 2024 | ||
2009 | #ifdef CONFIG_SENSORS_W83795_FANCTRL | ||
2010 | for (i = 0; i < data->has_pwm; i++) { | 2025 | for (i = 0; i < data->has_pwm; i++) { |
2011 | for (j = 0; j < ARRAY_SIZE(w83795_pwm[0]); j++) { | 2026 | for (j = 0; j < NUM_PWM_ATTRIBUTES; j++) { |
2012 | err = fn(dev, &w83795_pwm[i][j].dev_attr); | 2027 | err = fn(dev, &w83795_pwm[i][j].dev_attr); |
2013 | if (err) | 2028 | if (err) |
2014 | return err; | 2029 | return err; |
2015 | } | 2030 | } |
2016 | } | 2031 | } |
2017 | #endif | ||
2018 | 2032 | ||
2019 | for (i = 0; i < ARRAY_SIZE(w83795_temp); i++) { | 2033 | for (i = 0; i < ARRAY_SIZE(w83795_temp); i++) { |
2020 | if (!(data->has_temp & (1 << i))) | 2034 | if (!(data->has_temp & (1 << i))) |
2021 | continue; | 2035 | continue; |
2022 | #ifdef CONFIG_SENSORS_W83795_FANCTRL | 2036 | for (j = 0; j < NUM_TEMP_ATTRIBUTES; j++) { |
2023 | for (j = 0; j < ARRAY_SIZE(w83795_temp[0]); j++) { | ||
2024 | #else | ||
2025 | for (j = 0; j < 8; j++) { | ||
2026 | #endif | ||
2027 | if (j == 7 && !data->enable_beep) | 2037 | if (j == 7 && !data->enable_beep) |
2028 | continue; | 2038 | continue; |
2029 | err = fn(dev, &w83795_temp[i][j].dev_attr); | 2039 | err = fn(dev, &w83795_temp[i][j].dev_attr); |