Skip to content

Commit

Permalink
drm/nouveau/therm: don't try pwm/toggle control if GPIO_FAN is input
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ben Skeggs committed Feb 20, 2013
1 parent e8c3cc0 commit 708ff04
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 7 deletions.
7 changes: 7 additions & 0 deletions drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
23 changes: 16 additions & 7 deletions drivers/gpu/drm/nouveau/core/subdev/therm/fan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 708ff04

Please sign in to comment.