drm/nouveau/therm: don't try pwm/toggle control if GPIO_FAN is input
My GTX660 has the GPIO_FAN function, but it's configured in input-mode; presumably to monitor the frequency set by an I2C fan controller? Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
e8c3cc0803
commit
708ff04b13
|
@ -10,6 +10,13 @@ enum dcb_gpio_func_name {
|
|||
DCB_GPIO_UNUSED = 0xff
|
||||
};
|
||||
|
||||
#define DCB_GPIO_LOG_DIR 0x02
|
||||
#define DCB_GPIO_LOG_DIR_OUT 0x00
|
||||
#define DCB_GPIO_LOG_DIR_IN 0x02
|
||||
#define DCB_GPIO_LOG_VAL 0x01
|
||||
#define DCB_GPIO_LOG_VAL_LO 0x00
|
||||
#define DCB_GPIO_LOG_VAL_HI 0x01
|
||||
|
||||
struct dcb_gpio_func {
|
||||
u8 func;
|
||||
u8 line;
|
||||
|
|
|
@ -214,14 +214,23 @@ nouveau_therm_fan_ctor(struct nouveau_therm *therm)
|
|||
|
||||
/* attempt to locate a drivable fan, and determine control method */
|
||||
ret = gpio->find(gpio, 0, DCB_GPIO_FAN, 0xff, &func);
|
||||
if (ret == 0)
|
||||
ret = nouveau_fanpwm_create(therm, &func);
|
||||
if (ret != 0)
|
||||
ret = nouveau_fantog_create(therm, &func);
|
||||
if (ret != 0)
|
||||
if (ret == 0) {
|
||||
if (func.log[0] & DCB_GPIO_LOG_DIR_IN) {
|
||||
nv_debug(therm, "GPIO_FAN is in input mode\n");
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
ret = nouveau_fanpwm_create(therm, &func);
|
||||
if (ret != 0)
|
||||
ret = nouveau_fantog_create(therm, &func);
|
||||
}
|
||||
}
|
||||
|
||||
/* no controllable fan found, create a dummy fan module */
|
||||
if (ret != 0) {
|
||||
ret = nouveau_fannil_create(therm);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
nv_info(therm, "FAN control: %s\n", priv->fan->type);
|
||||
|
||||
|
|
Loading…
Reference in New Issue