summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-12-07 11:37:28 +1000
committerBen Skeggs <bskeggs@redhat.com>2013-02-20 16:00:29 +1000
commit708ff04b137f1ec233b9e82cb4852ee53ad26f9f (patch)
treeef5e9ce0f59cbd03031f0ffeb169403cb2d622bd /drivers/gpu
parente8c3cc0803b7f70f2f96d3bae3c4a4ac5238ed10 (diff)
downloadop-kernel-dev-708ff04b137f1ec233b9e82cb4852ee53ad26f9f.zip
op-kernel-dev-708ff04b137f1ec233b9e82cb4852ee53ad26f9f.tar.gz
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>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h7
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/therm/fan.c23
2 files changed, 23 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h b/drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
index cb06057..96d3364 100644
--- a/drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
+++ b/drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
@@ -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;
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c b/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c
index edc1664..ddb23dc 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c
@@ -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);
OpenPOWER on IntegriCloud