struct completion xfer_ack;
        struct work_struct host_event_work;
        struct rpmsg_endpoint *ept;
+       bool has_pending_host_event;
+       bool probe_done;
 };
 
 /**
                memcpy(ec_dev->din, resp->data, len);
                complete(&ec_rpmsg->xfer_ack);
        } else if (resp->type == HOST_EVENT_MARK) {
-               schedule_work(&ec_rpmsg->host_event_work);
+               /*
+                * If the host event is sent before cros_ec_register is
+                * finished, queue the host event.
+                */
+               if (ec_rpmsg->probe_done)
+                       schedule_work(&ec_rpmsg->host_event_work);
+               else
+                       ec_rpmsg->has_pending_host_event = true;
        } else {
                dev_warn(ec_dev->dev, "rpmsg received invalid type = %d",
                         resp->type);
                return ret;
        }
 
+       ec_rpmsg->probe_done = true;
+
+       if (ec_rpmsg->has_pending_host_event)
+               schedule_work(&ec_rpmsg->host_event_work);
+
        return 0;
 }