static LIST_HEAD(mbox_cons);
 static DEFINE_MUTEX(con_mutex);
 
-static void poll_txdone(unsigned long data);
-
 static int add_to_rbuf(struct mbox_chan *chan, void *mssg)
 {
        int idx;
        spin_unlock_irqrestore(&chan->lock, flags);
 
        if (!err && (chan->txdone_method & TXDONE_BY_POLL))
-               poll_txdone((unsigned long)chan->mbox);
+               /* kick start the timer immediately to avoid delays */
+               hrtimer_start(&chan->mbox->poll_hrt, ktime_set(0, 0),
+                             HRTIMER_MODE_REL);
 }
 
 static void tx_tick(struct mbox_chan *chan, int r)
                complete(&chan->tx_complete);
 }
 
-static void poll_txdone(unsigned long data)
+static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer)
 {
-       struct mbox_controller *mbox = (struct mbox_controller *)data;
+       struct mbox_controller *mbox =
+               container_of(hrtimer, struct mbox_controller, poll_hrt);
        bool txdone, resched = false;
        int i;
 
                }
        }
 
-       if (resched)
-               mod_timer(&mbox->poll, jiffies +
-                               msecs_to_jiffies(mbox->txpoll_period));
+       if (resched) {
+               hrtimer_forward_now(hrtimer, ms_to_ktime(mbox->txpoll_period));
+               return HRTIMER_RESTART;
+       }
+       return HRTIMER_NORESTART;
 }
 
 /**
                txdone = TXDONE_BY_ACK;
 
        if (txdone == TXDONE_BY_POLL) {
-               mbox->poll.function = &poll_txdone;
-               mbox->poll.data = (unsigned long)mbox;
-               init_timer(&mbox->poll);
+               hrtimer_init(&mbox->poll_hrt, CLOCK_MONOTONIC,
+                            HRTIMER_MODE_REL);
+               mbox->poll_hrt.function = txdone_hrtimer;
        }
 
        for (i = 0; i < mbox->num_chans; i++) {
                mbox_free_channel(&mbox->chans[i]);
 
        if (mbox->txdone_poll)
-               del_timer_sync(&mbox->poll);
+               hrtimer_cancel(&mbox->poll_hrt);
 
        mutex_unlock(&con_mutex);
 }
 
 
 #include <linux/of.h>
 #include <linux/types.h>
-#include <linux/timer.h>
+#include <linux/hrtimer.h>
 #include <linux/device.h>
 #include <linux/completion.h>
 
  * @txpoll_period:     If 'txdone_poll' is in effect, the API polls for
  *                     last TX's status after these many millisecs
  * @of_xlate:          Controller driver specific mapping of channel via DT
- * @poll:              API private. Used to poll for TXDONE on all channels.
+ * @poll_hrt:          API private. hrtimer used to poll for TXDONE on all
+ *                     channels.
  * @node:              API private. To hook into list of controllers.
  */
 struct mbox_controller {
        struct mbox_chan *(*of_xlate)(struct mbox_controller *mbox,
                                      const struct of_phandle_args *sp);
        /* Internal to API */
-       struct timer_list poll;
+       struct hrtimer poll_hrt;
        struct list_head node;
 };