HID: intel_ish-hid: convert timespec to ktime_t
authorArnd Bergmann <arnd@arndb.de>
Thu, 18 May 2017 20:21:42 +0000 (22:21 +0200)
committerJiri Kosina <jkosina@suse.cz>
Tue, 30 May 2017 12:11:52 +0000 (14:11 +0200)
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>
drivers/hid/intel-ish-hid/ipc/ipc.c
drivers/hid/intel-ish-hid/ishtp/client.c
drivers/hid/intel-ish-hid/ishtp/client.h
drivers/hid/intel-ish-hid/ishtp/hbm.c

index 842d8416a7a6f0c8d585eacece02aa319ea20ce3..9a60ec13cb10967a20aa560033a90ac4abe9d65c 100644 (file)
@@ -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;
@@ -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));
 }
 
index f54689ee67e1feae952c5bb2639e35d734db0e16..007443ef5fca44afea6df14267f12cbe24978990 100644 (file)
@@ -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);
        }
@@ -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);
        }
index 444d069c2ed443fdc43cde06ac5dafd64a2e3442..79eade547f5db5663a2c8d7dc0d5b3fc0c96690a 100644 (file)
@@ -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;
 };
 
index b7213608ce43ac111e608d866dc3307a3f059b4f..ae4a69f7f2f48d23b50aa639ac69cc68b04d8f3a 100644 (file)
@@ -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 {