Skip to content

Commit

Permalink
HID: intel_ish-hid: convert timespec to ktime_t
Browse files Browse the repository at this point in the history
The internal accounting uses 'timespec' based time stamps, which is
slightly inefficient and also problematic once we get to the time_t
overflow in 2038.

When communicating to the firmware, we even get an open-coded 64-bit
division that prevents the code from being build-tested on 32-bit
architectures and is inefficient due to the double conversion from
64-bit nanoseconds to seconds+nanoseconds and then microseconds.

This changes the code to use ktime_t instead.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Arnd Bergmann authored and Jiri Kosina committed May 30, 2017
1 parent 538be0a commit 2503f7b
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 23 deletions.
15 changes: 4 additions & 11 deletions drivers/hid/intel-ish-hid/ipc/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,17 +296,12 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
/* If sending MNG_SYNC_FW_CLOCK, update clock again */
if (IPC_HEADER_GET_PROTOCOL(doorbell_val) == IPC_PROTOCOL_MNG &&
IPC_HEADER_GET_MNG_CMD(doorbell_val) == MNG_SYNC_FW_CLOCK) {
struct timespec ts_system;
struct timeval tv_utc;
uint64_t usec_system, usec_utc;
uint64_t usec_system, usec_utc;
struct ipc_time_update_msg time_update;
struct time_sync_format ts_format;

get_monotonic_boottime(&ts_system);
do_gettimeofday(&tv_utc);
usec_system = (timespec_to_ns(&ts_system)) / NSEC_PER_USEC;
usec_utc = (uint64_t)tv_utc.tv_sec * 1000000 +
((uint32_t)tv_utc.tv_usec);
usec_system = ktime_to_us(ktime_get_boottime());
usec_utc = ktime_to_us(ktime_get_real());
ts_format.ts1_source = HOST_SYSTEM_TIME_USEC;
ts_format.ts2_source = HOST_UTC_TIME_USEC;
ts_format.reserved = 0;
Expand Down Expand Up @@ -575,15 +570,13 @@ static void fw_reset_work_fn(struct work_struct *unused)
static void _ish_sync_fw_clock(struct ishtp_device *dev)
{
static unsigned long prev_sync;
struct timespec ts;
uint64_t usec;

if (prev_sync && jiffies - prev_sync < 20 * HZ)
return;

prev_sync = jiffies;
get_monotonic_boottime(&ts);
usec = (timespec_to_ns(&ts)) / NSEC_PER_USEC;
usec = ktime_to_us(ktime_get_boottime());
ipc_send_mng_msg(dev, MNG_SYNC_FW_CLOCK, &usec, sizeof(uint64_t));
}

Expand Down
4 changes: 2 additions & 2 deletions drivers/hid/intel-ish-hid/ishtp/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -921,7 +921,7 @@ void recv_ishtp_cl_msg(struct ishtp_device *dev,

if (complete_rb) {
cl = complete_rb->cl;
getnstimeofday(&cl->ts_rx);
cl->ts_rx = ktime_get();
++cl->recv_msg_cnt_ipc;
ishtp_cl_read_complete(complete_rb);
}
Expand Down Expand Up @@ -1038,7 +1038,7 @@ void recv_ishtp_cl_msg_dma(struct ishtp_device *dev, void *msg,

if (complete_rb) {
cl = complete_rb->cl;
getnstimeofday(&cl->ts_rx);
cl->ts_rx = ktime_get();
++cl->recv_msg_cnt_dma;
ishtp_cl_read_complete(complete_rb);
}
Expand Down
6 changes: 3 additions & 3 deletions drivers/hid/intel-ish-hid/ishtp/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,9 @@ struct ishtp_cl {
unsigned int out_flow_ctrl_cnt;

/* Rx msg ... out FC timing */
struct timespec ts_rx;
struct timespec ts_out_fc;
struct timespec ts_max_fc_delay;
ktime_t ts_rx;
ktime_t ts_out_fc;
ktime_t ts_max_fc_delay;
void *client_data;
};

Expand Down
11 changes: 4 additions & 7 deletions drivers/hid/intel-ish-hid/ishtp/hbm.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,13 +321,10 @@ int ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev,
if (!rv) {
++cl->out_flow_ctrl_creds;
++cl->out_flow_ctrl_cnt;
getnstimeofday(&cl->ts_out_fc);
if (cl->ts_rx.tv_sec && cl->ts_rx.tv_nsec) {
struct timespec ts_diff;

ts_diff = timespec_sub(cl->ts_out_fc, cl->ts_rx);
if (timespec_compare(&ts_diff, &cl->ts_max_fc_delay)
> 0)
cl->ts_out_fc = ktime_get();
if (cl->ts_rx) {
ktime_t ts_diff = ktime_sub(cl->ts_out_fc, cl->ts_rx);
if (ktime_after(ts_diff, cl->ts_max_fc_delay))
cl->ts_max_fc_delay = ts_diff;
}
} else {
Expand Down

0 comments on commit 2503f7b

Please sign in to comment.