#include <linux/firmware/samsung/exynos-acpm-protocol.h>
 #include <linux/io.h>
 #include <linux/iopoll.h>
+#include <linux/ktime.h>
 #include <linux/mailbox/exynos-message.h>
 #include <linux/mailbox_client.h>
 #include <linux/module.h>
 
 #define ACPM_PROTOCOL_SEQNUM           GENMASK(21, 16)
 
-/* The unit of counter is 20 us. 5000 * 20 = 100 ms */
-#define ACPM_POLL_TIMEOUT              5000
+#define ACPM_POLL_TIMEOUT_US           (100 * USEC_PER_MSEC)
 #define ACPM_TX_TIMEOUT_US             500000
 
 #define ACPM_GS101_INITDATA_BASE       0xa000
                                   const struct acpm_xfer *xfer)
 {
        struct device *dev = achan->acpm->dev;
-       unsigned int cnt_20us = 0;
+       ktime_t timeout;
        u32 seqnum;
        int ret;
 
        seqnum = FIELD_GET(ACPM_PROTOCOL_SEQNUM, xfer->txd[0]);
 
+       timeout = ktime_add_us(ktime_get(), ACPM_POLL_TIMEOUT_US);
        do {
                ret = acpm_get_rx(achan, xfer);
                if (ret)
 
                /* Determined experimentally. */
                usleep_range(20, 30);
-               cnt_20us++;
-       } while (cnt_20us < ACPM_POLL_TIMEOUT);
+       } while (ktime_before(ktime_get(), timeout));
 
-       dev_err(dev, "Timeout! ch:%u s:%u bitmap:%lx, cnt_20us = %d.\n",
-               achan->id, seqnum, achan->bitmap_seqnum[0], cnt_20us);
+       dev_err(dev, "Timeout! ch:%u s:%u bitmap:%lx.\n",
+               achan->id, seqnum, achan->bitmap_seqnum[0]);
 
        return -ETIME;
 }