diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h
index 5d41dee..78f9aac 100644
--- a/include/linux/rtmutex.h
+++ b/include/linux/rtmutex.h
@@ -89,8 +89,9 @@ extern void rt_mutex_lock(struct rt_mutex *lock);
 extern int rt_mutex_lock_interruptible(struct rt_mutex *lock,
 						int detect_deadlock);
 extern int rt_mutex_timed_lock(struct rt_mutex *lock,
-					struct hrtimer_sleeper *timeout,
+					struct timer_list *timeout,
 					int detect_deadlock);
+extern void rt_mutex_timeout_fn(unsigned long data);
 
 extern int rt_mutex_trylock(struct rt_mutex *lock);
 
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
index 3e13a1e..e92265c 100644
--- a/kernel/rtmutex.c
+++ b/kernel/rtmutex.c
@@ -599,12 +599,18 @@ void rt_mutex_adjust_pi(struct task_struct *task)
 	rt_mutex_adjust_prio_chain(task, 0, NULL, NULL, task);
 }
 
+void rt_mutex_timeout_fn(unsigned long data)
+{
+	struct task_struct *task = (struct task_struct *)data;
+	wake_up_process(task);
+}
+
 /*
  * Slow path lock function:
  */
 static int __sched
 rt_mutex_slowlock(struct rt_mutex *lock, int state,
-		  struct hrtimer_sleeper *timeout,
+		  struct timer_list *timeout,
 		  int detect_deadlock)
 {
 	struct rt_mutex_waiter waiter;
@@ -625,8 +631,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
 
 	/* Setup the timer, when timeout != NULL */
 	if (unlikely(timeout))
-		hrtimer_start(&timeout->timer, timeout->timer.expires,
-			      HRTIMER_ABS);
+		add_timer(timeout);
 
 	for (;;) {
 		/* Try to acquire the lock: */
@@ -641,7 +646,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
 			/* Signal pending? */
 			if (signal_pending(current))
 				ret = -EINTR;
-			if (timeout && !timeout->task)
+			if (timeout && !timer_pending(timeout))
 				ret = -ETIMEDOUT;
 			if (ret)
 				break;
@@ -693,7 +698,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
 
 	/* Remove pending timer: */
 	if (unlikely(timeout))
-		hrtimer_cancel(&timeout->timer);
+		del_timer_sync(timeout);
 
 	/*
 	 * Readjust priority, when we did not get the lock. We might
@@ -769,7 +774,7 @@ static inline int
 rt_mutex_fastlock(struct rt_mutex *lock, int state,
 		  int detect_deadlock,
 		  int (*slowfn)(struct rt_mutex *lock, int state,
-				struct hrtimer_sleeper *timeout,
+				struct timer_list *timeout,
 				int detect_deadlock))
 {
 	if (!detect_deadlock && likely(rt_mutex_cmpxchg(lock, NULL, current))) {
@@ -781,9 +786,9 @@ rt_mutex_fastlock(struct rt_mutex *lock, int state,
 
 static inline int
 rt_mutex_timed_fastlock(struct rt_mutex *lock, int state,
-			struct hrtimer_sleeper *timeout, int detect_deadlock,
+			struct timer_list *timeout, int detect_deadlock,
 			int (*slowfn)(struct rt_mutex *lock, int state,
-				      struct hrtimer_sleeper *timeout,
+				      struct timer_list *timeout,
 				      int detect_deadlock))
 {
 	if (!detect_deadlock && likely(rt_mutex_cmpxchg(lock, NULL, current))) {
@@ -864,7 +869,7 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible);
  * -EDEADLK	when the lock would deadlock (when deadlock detection is on)
  */
 int
-rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout,
+rt_mutex_timed_lock(struct rt_mutex *lock, struct timer_list *timeout,
 		    int detect_deadlock)
 {
 	might_sleep();
