mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 09:14:19 +08:00
hwmon: (dell-smm) Detect fan with index=2
Some Dell machines (e.g. Dell Precision M3800) have two fans, first with index=0 and second with index=2. So export also attributes for third fan device with index=2. Reported-by: Tolga Cakir <cevelnet@gmail.com> Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Tested-by: Tolga Cakir <cevelnet@gmail.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
68f86c75ca
commit
747bc8b063
@ -81,6 +81,7 @@ static bool disallow_fan_type_call;
|
||||
#define I8K_HWMON_HAVE_TEMP4 (1 << 3)
|
||||
#define I8K_HWMON_HAVE_FAN1 (1 << 4)
|
||||
#define I8K_HWMON_HAVE_FAN2 (1 << 5)
|
||||
#define I8K_HWMON_HAVE_FAN3 (1 << 6)
|
||||
|
||||
MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)");
|
||||
MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
|
||||
@ -252,7 +253,7 @@ static int _i8k_get_fan_type(int fan)
|
||||
static int i8k_get_fan_type(int fan)
|
||||
{
|
||||
/* I8K_SMM_GET_FAN_TYPE SMM call is expensive, so cache values */
|
||||
static int types[2] = { INT_MIN, INT_MIN };
|
||||
static int types[3] = { INT_MIN, INT_MIN, INT_MIN };
|
||||
|
||||
if (types[fan] == INT_MIN)
|
||||
types[fan] = _i8k_get_fan_type(fan);
|
||||
@ -719,6 +720,12 @@ static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL,
|
||||
1);
|
||||
static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm,
|
||||
i8k_hwmon_set_pwm, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, i8k_hwmon_show_fan, NULL,
|
||||
2);
|
||||
static SENSOR_DEVICE_ATTR(fan3_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL,
|
||||
2);
|
||||
static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm,
|
||||
i8k_hwmon_set_pwm, 2);
|
||||
|
||||
static struct attribute *i8k_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */
|
||||
@ -735,6 +742,9 @@ static struct attribute *i8k_attrs[] = {
|
||||
&sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */
|
||||
&sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */
|
||||
&sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */
|
||||
&sensor_dev_attr_fan3_input.dev_attr.attr, /* 14 */
|
||||
&sensor_dev_attr_fan3_label.dev_attr.attr, /* 15 */
|
||||
&sensor_dev_attr_pwm3.dev_attr.attr, /* 16 */
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -742,7 +752,7 @@ static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||
int index)
|
||||
{
|
||||
if (disallow_fan_type_call &&
|
||||
(index == 9 || index == 12))
|
||||
(index == 9 || index == 12 || index == 15))
|
||||
return 0;
|
||||
if (index >= 0 && index <= 1 &&
|
||||
!(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1))
|
||||
@ -762,6 +772,9 @@ static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||
if (index >= 11 && index <= 13 &&
|
||||
!(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2))
|
||||
return 0;
|
||||
if (index >= 14 && index <= 16 &&
|
||||
!(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN3))
|
||||
return 0;
|
||||
|
||||
return attr->mode;
|
||||
}
|
||||
@ -807,6 +820,13 @@ static int __init i8k_init_hwmon(void)
|
||||
if (err >= 0)
|
||||
i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2;
|
||||
|
||||
/* Third fan attributes, if fan status or type is OK */
|
||||
err = i8k_get_fan_status(2);
|
||||
if (err < 0)
|
||||
err = i8k_get_fan_type(2);
|
||||
if (err >= 0)
|
||||
i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN3;
|
||||
|
||||
i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "dell_smm",
|
||||
NULL, i8k_groups);
|
||||
if (IS_ERR(i8k_hwmon_dev)) {
|
||||
|
Loading…
Reference in New Issue
Block a user