#include <linux/efi.h>
 #include <linux/input.h>
 #include <linux/input/mt.h>
+#include <linux/ktime.h>
 #include <linux/leds.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
        unsigned int                    cmd_msg_cntr;
        /* lock to protect the above parameters and flags below */
        spinlock_t                      cmd_msg_lock;
-       bool                            cmd_msg_queued;
+       ktime_t                         cmd_msg_queued;
        enum applespi_evt_type          cmd_evt_type;
 
        struct led_classdev             backlight_info;
                wake_up_all(&applespi->drain_complete);
 
        if (is_write_msg) {
-               applespi->cmd_msg_queued = false;
+               applespi->cmd_msg_queued = 0;
                applespi_send_cmd_msg(applespi);
        }
 
                return 0;
 
        /* check whether send is in progress */
-       if (applespi->cmd_msg_queued)
-               return 0;
+       if (applespi->cmd_msg_queued) {
+               if (ktime_ms_delta(ktime_get(), applespi->cmd_msg_queued) < 1000)
+                       return 0;
+
+               dev_warn(&applespi->spi->dev, "Command %d timed out\n",
+                        applespi->cmd_evt_type);
+
+               applespi->cmd_msg_queued = 0;
+               applespi->write_active = false;
+       }
 
        /* set up packet */
        memset(packet, 0, APPLESPI_PACKET_SIZE);
                return sts;
        }
 
-       applespi->cmd_msg_queued = true;
+       applespi->cmd_msg_queued = ktime_get_coarse();
        applespi->write_active = true;
 
        return 0;
        applespi->drain = false;
        applespi->have_cl_led_on = false;
        applespi->have_bl_level = 0;
-       applespi->cmd_msg_queued = false;
+       applespi->cmd_msg_queued = 0;
        applespi->read_active = false;
        applespi->write_active = false;