static inline void
 fw_domain_arm_timer(struct intel_uncore_forcewake_domain *d)
 {
-       mod_timer_pinned(&d->timer, jiffies + 1);
+       d->wake_count++;
+       hrtimer_start_range_ns(&d->timer,
+                              ktime_set(0, NSEC_PER_MSEC),
+                              NSEC_PER_MSEC,
+                              HRTIMER_MODE_REL);
 }
 
 static inline void
        return ret;
 }
 
-static void intel_uncore_fw_release_timer(unsigned long arg)
+static enum hrtimer_restart
+intel_uncore_fw_release_timer(struct hrtimer *timer)
 {
-       struct intel_uncore_forcewake_domain *domain = (void *)arg;
+       struct intel_uncore_forcewake_domain *domain =
+              container_of(timer, struct intel_uncore_forcewake_domain, timer);
        unsigned long irqflags;
 
        assert_rpm_device_not_suspended(domain->i915);
                                                          1 << domain->id);
 
        spin_unlock_irqrestore(&domain->i915->uncore.lock, irqflags);
+
+       return HRTIMER_NORESTART;
 }
 
 void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
                active_domains = 0;
 
                for_each_fw_domain(domain, dev_priv, id) {
-                       if (del_timer_sync(&domain->timer) == 0)
+                       if (hrtimer_cancel(&domain->timer) == 0)
                                continue;
 
-                       intel_uncore_fw_release_timer((unsigned long)domain);
+                       intel_uncore_fw_release_timer(&domain->timer);
                }
 
                spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
                for_each_fw_domain(domain, dev_priv, id) {
-                       if (timer_pending(&domain->timer))
+                       if (hrtimer_active(&domain->timer))
                                active_domains |= (1 << id);
                }
 
                if (--domain->wake_count)
                        continue;
 
-               domain->wake_count++;
                fw_domain_arm_timer(domain);
        }
 }
                        continue;
                }
 
-               domain->wake_count++;
                fw_domain_arm_timer(domain);
        }
 
        d->i915 = dev_priv;
        d->id = domain_id;
 
-       setup_timer(&d->timer, intel_uncore_fw_release_timer, (unsigned long)d);
+       hrtimer_init(&d->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+       d->timer.function = intel_uncore_fw_release_timer;
 
        dev_priv->uncore.fw_domains |= (1 << domain_id);