diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c b/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c index 5231786851805da5e68840668a29db856f56cdb6..4822733ca8853f4bd0a859bb53e45716d5ca30fa 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c @@ -27,6 +27,7 @@ #include #include + #include #include @@ -104,13 +105,13 @@ nouveau_therm_fan_set(struct nouveau_therm *therm, int percent) int nouveau_therm_fan_sense(struct nouveau_therm *therm) { + struct nouveau_therm_priv *priv = (void *)therm; struct nouveau_timer *ptimer = nouveau_timer(therm); struct nouveau_gpio *gpio = nouveau_gpio(therm); - struct dcb_gpio_func func; u32 cycles, cur, prev; u64 start, end, tach; - if (gpio->find(gpio, 0, DCB_GPIO_FAN_SENSE, 0xff, &func)) + if (priv->fan.tach.func == DCB_GPIO_UNUSED) return -ENODEV; /* Time a complete rotation and extrapolate to RPM: @@ -118,12 +119,12 @@ nouveau_therm_fan_sense(struct nouveau_therm *therm) * We get 4 changes (0 -> 1 -> 0 -> 1) per complete rotation. */ start = ptimer->read(ptimer); - prev = gpio->get(gpio, 0, func.func, func.line); + prev = gpio->get(gpio, 0, priv->fan.tach.func, priv->fan.tach.line); cycles = 0; do { usleep_range(500, 1000); /* supports 0 < rpm < 7500 */ - cur = gpio->get(gpio, 0, func.func, func.line); + cur = gpio->get(gpio, 0, priv->fan.tach.func, priv->fan.tach.line); if (prev != cur) { if (!start) start = ptimer->read(ptimer); @@ -220,7 +221,13 @@ int nouveau_therm_fan_ctor(struct nouveau_therm *therm) { struct nouveau_therm_priv *priv = (void *)therm; + struct nouveau_gpio *gpio = nouveau_gpio(therm); struct nouveau_bios *bios = nouveau_bios(therm); + int ret; + + ret = gpio->find(gpio, 0, DCB_GPIO_FAN_SENSE, 0xff, &priv->fan.tach); + if (ret) + priv->fan.tach.func = DCB_GPIO_UNUSED; nouveau_therm_fan_set_defaults(therm); nvbios_perf_fan_parse(bios, &priv->bios_perf_fan); diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/priv.h b/drivers/gpu/drm/nouveau/core/subdev/therm/priv.h index 64f4a4ab80eabd9dc46b63e435ab68f122b3de2d..33fbc596ee4f802e09ffe6555130c823500f5e31 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/therm/priv.h +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/priv.h @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -44,6 +45,8 @@ struct nouveau_therm_priv { enum nouveau_therm_fan_mode mode; int percent; + struct dcb_gpio_func tach; + int (*pwm_get)(struct nouveau_therm *, int line, u32*, u32*); int (*pwm_set)(struct nouveau_therm *, int line, u32, u32); int (*pwm_clock)(struct nouveau_therm *); @@ -70,9 +73,11 @@ int nouveau_therm_fan_user_set(struct nouveau_therm *therm, int percent); int nouveau_therm_fan_set_mode(struct nouveau_therm *therm, enum nouveau_therm_fan_mode mode); - int nouveau_therm_fan_sense(struct nouveau_therm *therm); +int nv50_fan_pwm_get(struct nouveau_therm *, int, u32 *, u32 *); +int nv50_fan_pwm_set(struct nouveau_therm *, int, u32, u32); +int nv50_fan_pwm_clock(struct nouveau_therm *); int nv50_temp_get(struct nouveau_therm *therm); #endif