Commit 708ff04b authored by Ben Skeggs's avatar Ben Skeggs
Browse files

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: default avatarBen Skeggs <bskeggs@redhat.com>
parent e8c3cc08
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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;
+16 −7
Original line number Diff line number Diff 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)
	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);
	if (ret != 0)
		}
	}

	/* no controllable fan found, create a dummy fan module */
	if (ret != 0) {
		ret = nouveau_fannil_create(therm);
		if (ret)
			return ret;
	}

	nv_info(therm, "FAN control: %s\n", priv->fan->type);