nvkm_therm_update(struct nvkm_therm *obj, int mode)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
-       struct nvkm_timer *tmr = nvkm_timer(therm);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
+       struct nvkm_timer *tmr = subdev->device->timer;
        unsigned long flags;
        bool immd = true;
        bool poll = true;
        spin_unlock_irqrestore(&therm->lock, flags);
 
        if (duty >= 0) {
-               nv_debug(therm, "FAN target request: %d%%\n", duty);
+               nvkm_debug(subdev, "FAN target request: %d%%\n", duty);
                nvkm_therm_fan_set(&therm->base, immd, duty);
        }
 }
 nvkm_therm_cstate(struct nvkm_therm *obj, int fan, int dir)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
        if (!dir || (dir < 0 && fan < therm->cstate) ||
                    (dir > 0 && fan > therm->cstate)) {
-               nv_debug(therm, "default fan speed -> %d%%\n", fan);
+               nvkm_debug(subdev, "default fan speed -> %d%%\n", fan);
                therm->cstate = fan;
                nvkm_therm_update(&therm->base, -1);
        }
 nvkm_therm_fan_mode(struct nvkm_therm *obj, int mode)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
-       struct nvkm_device *device = nv_device(therm);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
+       struct nvkm_device *device = subdev->device;
        static const char *name[] = {
                "disabled",
                "manual",
        if (therm->mode == mode)
                return 0;
 
-       nv_info(therm, "fan management: %s\n", name[mode]);
+       nvkm_debug(subdev, "fan management: %s\n", name[mode]);
        nvkm_therm_update(&therm->base, mode);
        return 0;
 }
 
 nvkm_fan_update(struct nvkm_fan *fan, bool immediate, int target)
 {
        struct nvkm_therm_priv *therm = (void *)fan->parent;
-       struct nvkm_timer *tmr = nvkm_timer(therm);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
+       struct nvkm_timer *tmr = subdev->device->timer;
        unsigned long flags;
        int ret = 0;
        int duty;
        target = max_t(u8, target, fan->bios.min_duty);
        target = min_t(u8, target, fan->bios.max_duty);
        if (fan->percent != target) {
-               nv_debug(therm, "FAN target: %d\n", target);
+               nvkm_debug(subdev, "FAN target: %d\n", target);
                fan->percent = target;
        }
 
                duty = target;
        }
 
-       nv_debug(therm, "FAN update: %d\n", duty);
+       nvkm_debug(subdev, "FAN update: %d\n", duty);
        ret = fan->set(&therm->base, duty);
        if (ret) {
                spin_unlock_irqrestore(&fan->lock, flags);
 nvkm_therm_fan_ctor(struct nvkm_therm *obj)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
-       struct nvkm_gpio *gpio = nvkm_gpio(therm);
-       struct nvkm_bios *bios = nvkm_bios(therm);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
+       struct nvkm_device *device = subdev->device;
+       struct nvkm_gpio *gpio = device->gpio;
+       struct nvkm_bios *bios = device->bios;
        struct dcb_gpio_func func;
        int ret;
 
        if (ret == 0) {
                /* FIXME: is this really the place to perform such checks ? */
                if (func.line != 16 && func.log[0] & DCB_GPIO_LOG_DIR_IN) {
-                       nv_debug(therm, "GPIO_FAN is in input mode\n");
+                       nvkm_debug(subdev, "GPIO_FAN is in input mode\n");
                        ret = -EINVAL;
                } else {
                        ret = nvkm_fanpwm_create(&therm->base, &func);
                        return ret;
        }
 
-       nv_info(therm, "FAN control: %s\n", therm->fan->type);
+       nvkm_debug(subdev, "FAN control: %s\n", therm->fan->type);
 
        /* read the current speed, it is useful when resuming */
        therm->fan->percent = nvkm_therm_fan_get(&therm->base);
        nvkm_therm_fan_set_defaults(&therm->base);
        nvbios_perf_fan_parse(bios, &therm->fan->perf);
        if (!nvbios_fan_parse(bios, &therm->fan->bios)) {
-               nv_debug(therm, "parsing the fan table failed\n");
+               nvkm_debug(subdev, "parsing the fan table failed\n");
                if (nvbios_therm_fan_parse(bios, &therm->fan->bios))
-                       nv_error(therm, "parsing both fan tables failed\n");
+                       nvkm_error(subdev, "parsing both fan tables failed\n");
        }
        nvkm_therm_fan_safety_checks(&therm->base);
        return 0;
 
 g84_therm_program_alarms(struct nvkm_therm *obj)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
-       struct nvkm_device *device = therm->base.subdev.device;
        struct nvbios_therm_sensor *sensor = &therm->bios_sensor;
+       struct nvkm_subdev *subdev = &therm->base.subdev;
+       struct nvkm_device *device = subdev->device;
        unsigned long flags;
 
        spin_lock_irqsave(&therm->sensor.alarm_program_lock, flags);
        nvkm_wr32(device, 0x20414, sensor->thrs_down_clock.temp);
        spin_unlock_irqrestore(&therm->sensor.alarm_program_lock, flags);
 
-       nv_debug(therm,
-                "Programmed thresholds [ %d(%d), %d(%d), %d(%d), %d(%d) ]\n",
-                sensor->thrs_fan_boost.temp, sensor->thrs_fan_boost.hysteresis,
-                sensor->thrs_down_clock.temp,
-                sensor->thrs_down_clock.hysteresis,
-                sensor->thrs_critical.temp, sensor->thrs_critical.hysteresis,
-                sensor->thrs_shutdown.temp, sensor->thrs_shutdown.hysteresis);
+       nvkm_debug(subdev,
+                  "Programmed thresholds [ %d(%d), %d(%d), %d(%d), %d(%d) ]\n",
+                  sensor->thrs_fan_boost.temp,
+                  sensor->thrs_fan_boost.hysteresis,
+                  sensor->thrs_down_clock.temp,
+                  sensor->thrs_down_clock.hysteresis,
+                  sensor->thrs_critical.temp,
+                  sensor->thrs_critical.hysteresis,
+                  sensor->thrs_shutdown.temp,
+                  sensor->thrs_shutdown.hysteresis);
 
 }
 
        }
 
        if (intr)
-               nv_error(therm, "unhandled intr 0x%08x\n", intr);
+               nvkm_error(subdev, "intr %08x\n", intr);
 
        /* ACK everything */
        nvkm_wr32(device, 0x20100, 0xffffffff);
 
 static int
 pwm_info(struct nvkm_therm *therm, int line)
 {
-       struct nvkm_device *device = therm->subdev.device;
+       struct nvkm_subdev *subdev = &therm->subdev;
+       struct nvkm_device *device = subdev->device;
        u32 gpio = nvkm_rd32(device, 0x00d610 + (line * 0x04));
 
        switch (gpio & 0x000000c0) {
                break;
        }
 
-       nv_error(therm, "GPIO %d unknown PWM: 0x%08x\n", line, gpio);
+       nvkm_error(subdev, "GPIO %d unknown PWM: %08x\n", line, gpio);
        return -ENODEV;
 }
 
 
                return false;
        }
 
-       nv_info(therm,
-               "Found an %s at address 0x%x (controlled by lm_sensors, "
-               "temp offset %+i C)\n",
-               info->type, info->addr, sensor->offset_constant);
+       nvkm_debug(&therm->base.subdev,
+                  "Found an %s at address 0x%x (controlled by lm_sensors, "
+                  "temp offset %+i C)\n",
+                  info->type, info->addr, sensor->offset_constant);
        therm->ic = client;
        return true;
 }
 
 static int
 nv40_fan_pwm_ctrl(struct nvkm_therm *therm, int line, bool enable)
 {
-       struct nvkm_device *device = therm->subdev.device;
+       struct nvkm_subdev *subdev = &therm->subdev;
+       struct nvkm_device *device = subdev->device;
        u32 mask = enable ? 0x80000000 : 0x0000000;
        if      (line == 2) nvkm_mask(device, 0x0010f0, 0x80000000, mask);
        else if (line == 9) nvkm_mask(device, 0x0015f4, 0x80000000, mask);
        else {
-               nv_error(therm, "unknown pwm ctrl for gpio %d\n", line);
+               nvkm_error(subdev, "unknown pwm ctrl for gpio %d\n", line);
                return -ENODEV;
        }
        return 0;
 static int
 nv40_fan_pwm_get(struct nvkm_therm *therm, int line, u32 *divs, u32 *duty)
 {
-       struct nvkm_device *device = therm->subdev.device;
+       struct nvkm_subdev *subdev = &therm->subdev;
+       struct nvkm_device *device = subdev->device;
        if (line == 2) {
                u32 reg = nvkm_rd32(device, 0x0010f0);
                if (reg & 0x80000000) {
                        return 0;
                }
        } else {
-               nv_error(therm, "unknown pwm ctrl for gpio %d\n", line);
+               nvkm_error(subdev, "unknown pwm ctrl for gpio %d\n", line);
                return -ENODEV;
        }
 
 static int
 nv40_fan_pwm_set(struct nvkm_therm *therm, int line, u32 divs, u32 duty)
 {
-       struct nvkm_device *device = therm->subdev.device;
+       struct nvkm_subdev *subdev = &therm->subdev;
+       struct nvkm_device *device = subdev->device;
        if (line == 2) {
                nvkm_mask(device, 0x0010f0, 0x7fff7fff, (duty << 16) | divs);
        } else
                nvkm_wr32(device, 0x0015f8, divs);
                nvkm_mask(device, 0x0015f4, 0x7fffffff, duty);
        } else {
-               nv_error(therm, "unknown pwm ctrl for gpio %d\n", line);
+               nvkm_error(subdev, "unknown pwm ctrl for gpio %d\n", line);
                return -ENODEV;
        }
 
        /* ack all IRQs */
        nvkm_wr32(device, 0x1100, 0x70000);
 
-       nv_error(therm, "THERM received an IRQ: stat = %x\n", stat);
+       nvkm_error(subdev, "THERM received an IRQ: stat = %x\n", stat);
 }
 
 static int
 
 static int
 pwm_info(struct nvkm_therm *therm, int *line, int *ctrl, int *indx)
 {
+       struct nvkm_subdev *subdev = &therm->subdev;
+
        if (*line == 0x04) {
                *ctrl = 0x00e100;
                *line = 4;
                *line = 0;
                *indx = 0;
        } else {
-               nv_error(therm, "unknown pwm ctrl for gpio %d\n", *line);
+               nvkm_error(subdev, "unknown pwm ctrl for gpio %d\n", *line);
                return -ENODEV;
        }
 
 
                        enum nvkm_therm_thrs_direction dir)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
        bool active;
        const char *thresolds[] = {
                "fanboost", "downclock", "critical", "shutdown"
                return;
 
        if (dir == NVKM_THERM_THRS_FALLING)
-               nv_info(therm, "temperature (%i C) went below the '%s' threshold\n",
-                       temperature, thresolds[thrs]);
+               nvkm_info(subdev,
+                         "temperature (%i C) went below the '%s' threshold\n",
+                         temperature, thresolds[thrs]);
        else
-               nv_info(therm, "temperature (%i C) hit the '%s' threshold\n",
-                       temperature, thresolds[thrs]);
+               nvkm_info(subdev, "temperature (%i C) hit the '%s' threshold\n",
+                         temperature, thresolds[thrs]);
 
        active = (dir == NVKM_THERM_THRS_RISING);
        switch (thrs) {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
        struct nvbios_therm_sensor *sensor = &therm->bios_sensor;
 
-       nv_debug(therm,
-                "programmed thresholds [ %d(%d), %d(%d), %d(%d), %d(%d) ]\n",
-                sensor->thrs_fan_boost.temp, sensor->thrs_fan_boost.hysteresis,
-                sensor->thrs_down_clock.temp,
-                sensor->thrs_down_clock.hysteresis,
-                sensor->thrs_critical.temp, sensor->thrs_critical.hysteresis,
-                sensor->thrs_shutdown.temp, sensor->thrs_shutdown.hysteresis);
+       nvkm_debug(&therm->base.subdev,
+                  "programmed thresholds [ %d(%d), %d(%d), %d(%d), %d(%d) ]\n",
+                  sensor->thrs_fan_boost.temp,
+                  sensor->thrs_fan_boost.hysteresis,
+                  sensor->thrs_down_clock.temp,
+                  sensor->thrs_down_clock.hysteresis,
+                  sensor->thrs_critical.temp,
+                  sensor->thrs_critical.hysteresis,
+                  sensor->thrs_shutdown.temp,
+                  sensor->thrs_shutdown.hysteresis);
 
        alarm_timer_callback(&therm->sensor.therm_poll_alarm);
 }
        if (therm->temp_get(therm) < 0)
                sensor_avail = "no";
 
-       nv_info(therm, "internal sensor: %s\n", sensor_avail);
+       nvkm_debug(&therm->subdev, "internal sensor: %s\n", sensor_avail);
 }
 
 int
 nvkm_therm_sensor_ctor(struct nvkm_therm *obj)
 {
        struct nvkm_therm_priv *therm = container_of(obj, typeof(*therm), base);
+       struct nvkm_subdev *subdev = &therm->base.subdev;
        struct nvkm_bios *bios = nvkm_bios(therm);
 
        nvkm_alarm_init(&therm->sensor.therm_poll_alarm, alarm_timer_callback);
        nvkm_therm_temp_set_defaults(&therm->base);
        if (nvbios_therm_sensor_parse(bios, NVBIOS_THERM_DOMAIN_CORE,
                                      &therm->bios_sensor))
-               nv_error(therm, "nvbios_therm_sensor_parse failed\n");
+               nvkm_error(subdev, "nvbios_therm_sensor_parse failed\n");
        nvkm_therm_temp_safety_checks(&therm->base);
 
        return 0;