diff options
Diffstat (limited to 'drivers/platform/chrome/cros_ec_ishtp.c')
| -rw-r--r-- | drivers/platform/chrome/cros_ec_ishtp.c | 25 | 
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/platform/chrome/cros_ec_ishtp.c b/drivers/platform/chrome/cros_ec_ishtp.c index 25ca2c894b4d..e5996821d08b 100644 --- a/drivers/platform/chrome/cros_ec_ishtp.c +++ b/drivers/platform/chrome/cros_ec_ishtp.c @@ -136,11 +136,11 @@ static void ish_evt_handler(struct work_struct *work)  	struct ishtp_cl_data *client_data =  		container_of(work, struct ishtp_cl_data, work_ec_evt);  	struct cros_ec_device *ec_dev = client_data->ec_dev; +	bool ec_has_more_events; -	if (cros_ec_get_next_event(ec_dev, NULL) > 0) { -		blocking_notifier_call_chain(&ec_dev->event_notifier, -					     0, ec_dev); -	} +	do { +		ec_has_more_events = cros_ec_handle_event(ec_dev); +	} while (ec_has_more_events);  }  /** @@ -200,13 +200,14 @@ static int ish_send(struct ishtp_cl_data *client_data,   * process_recv() - Received and parse incoming packet   * @cros_ish_cl: Client instance to get stats   * @rb_in_proc: Host interface message buffer + * @timestamp: Timestamp of when parent callback started   *   * Parse the incoming packet. If it is a response packet then it will   * update per instance flags and wake up the caller waiting to for the   * response. If it is an event packet then it will schedule event work.   */  static void process_recv(struct ishtp_cl *cros_ish_cl, -			 struct ishtp_cl_rb *rb_in_proc) +			 struct ishtp_cl_rb *rb_in_proc, ktime_t timestamp)  {  	size_t data_len = rb_in_proc->buf_idx;  	struct ishtp_cl_data *client_data = @@ -295,6 +296,11 @@ error_wake_up:  		break;  	case CROS_MKBP_EVENT: +		/* +		 * Set timestamp from beginning of function since we actually +		 * got an incoming MKBP event +		 */ +		client_data->ec_dev->last_event_time = timestamp;  		/* The event system doesn't send any data in buffer */  		schedule_work(&client_data->work_ec_evt); @@ -322,10 +328,17 @@ static void ish_event_cb(struct ishtp_cl_device *cl_device)  {  	struct ishtp_cl_rb *rb_in_proc;  	struct ishtp_cl	*cros_ish_cl = ishtp_get_drvdata(cl_device); +	ktime_t timestamp; + +	/* +	 * Take timestamp as close to hardware interrupt as possible for sensor +	 * timestamps. +	 */ +	timestamp = cros_ec_get_time_ns();  	while ((rb_in_proc = ishtp_cl_rx_get_rb(cros_ish_cl)) != NULL) {  		/* Decide what to do with received data */ -		process_recv(cros_ish_cl, rb_in_proc); +		process_recv(cros_ish_cl, rb_in_proc, timestamp);  	}  }  |