iio: common: NVS v209 common timestamps
Erik Lilliebjerg [Wed, 21 Oct 2015 19:20:26 +0000 (12:20 -0700)]
- Create a common timestamp function for NVS sensor drivers.
- Timestamp changed from ktime_get_ts to get_monotonic_boottime to address
  the timestamp change through suspend.

- Removed the dependency of the NVI driver on NVS drivers supporting the NVI
  auxiliary bus.  If NVI_MPU is not enabled then these drivers build without
  NVI auxiliary bus API support.

Bug 200142073

Change-Id: I53b16bfb39b53015f3ee1e5418755f9b3f0cd132
Signed-off-by: Erik Lilliebjerg <elilliebjerg@nvidia.com>
Reviewed-on: http://git-master/r/821141
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Robert Collins <rcollins@nvidia.com>
Tested-by: Robert Collins <rcollins@nvidia.com>

20 files changed:
drivers/iio/accel/nvs_ais328dq.c
drivers/iio/common/nvs/Makefile
drivers/iio/common/nvs/nvs_iio.c
drivers/iio/common/nvs/nvs_timestamp.c [new file with mode: 0644]
drivers/iio/gyro/nvs_a3g4250d.c
drivers/iio/imu/nvi_mpu/nvi.c
drivers/iio/imu/nvi_mpu/nvi.h
drivers/iio/light/nvs_bh1730fvc.c
drivers/iio/light/nvs_cm3217.c
drivers/iio/light/nvs_cm3218.c
drivers/iio/light/nvs_isl2902x.c
drivers/iio/light/nvs_jsa1127.c
drivers/iio/light/nvs_ltr659.c
drivers/iio/light/nvs_max4400x.c
drivers/iio/magnetometer/Makefile
drivers/iio/magnetometer/nvi_ak89xx.c
drivers/iio/pressure/Makefile
drivers/iio/pressure/nvi_bmpX80.c
drivers/iio/proximity/nvs_iqs2x3.c
include/linux/nvs.h

index 4e1bde9..18ada97 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -257,14 +256,6 @@ static struct stm_odr stm_odr_tbl[] = {
 };
 
 
-static s64 stm_get_ts_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void stm_err(struct stm_state *st)
 {
        st->errs++;
@@ -399,7 +390,7 @@ static int stm_rd(struct stm_state *st)
                return ret;
 
        if (st->buf[0] & STM_REG_STATUS_DA_MASK)
-               st->nvs->handler(st->nvs_st, &st->buf[1], stm_get_ts_ns());
+               st->nvs->handler(st->nvs_st, &st->buf[1], nvs_timestamp());
        else
                ret = -EAGAIN;
        return ret;
index e6432d8..730af4e 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Makefile for NVSensor IIO.
 #
-obj-$(CONFIG_NVS_IIO) += nvs_iio.o nvs_vreg.o nvs_of_dt.o
+obj-$(CONFIG_NVS_IIO) += nvs_iio.o nvs_vreg.o nvs_of_dt.o nvs_timestamp.o
 obj-$(CONFIG_NVS_LIGHT) += nvs_light.o
 obj-$(CONFIG_NVS_PROXIMITY) += nvs_proximity.o
 
index 24d649a..ee1914b 100644 (file)
@@ -76,7 +76,7 @@
 #include <linux/iio/trigger.h>
 #include <linux/nvs.h>
 
-#define NVS_IIO_DRIVER_VERSION         (208)
+#define NVS_IIO_DRIVER_VERSION         (209)
 #define NVS_ATTRS_ARRAY_SIZE           (12)
 
 enum NVS_ATTR {
diff --git a/drivers/iio/common/nvs/nvs_timestamp.c b/drivers/iio/common/nvs/nvs_timestamp.c
new file mode 100644 (file)
index 0000000..dfbe6fa
--- /dev/null
@@ -0,0 +1,24 @@
+/* Copyright (c) 2015, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+
+#include <linux/time.h>
+
+
+s64 nvs_timestamp(void)
+{
+       struct timespec ts;
+
+       get_monotonic_boottime(&ts);
+       return timespec_to_ns(&ts);
+}
+
index eb31ce4..115b21f 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -214,14 +213,6 @@ static struct stm_odr stm_odr_tbl[] = {
 };
 
 
-static s64 stm_get_ts_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void stm_err(struct stm_state *st)
 {
        st->errs++;
@@ -310,7 +301,7 @@ static int stm_cmd(struct stm_state *st, int enable)
                ret_t |= stm_i2c_wr(st, STM_REG_CTRL3, st->ru_ctrl3);
                ret_t |= stm_i2c_wr(st, STM_REG_CTRL4, st->ru_ctrl4);
                ret_t |= stm_i2c_wr(st, STM_REG_CTRL5, st->ru_ctrl5);
-               st->ts_last = stm_get_ts_ns();
+               st->ts_last = nvs_timestamp();
        }
        ret = stm_i2c_wr(st, STM_REG_CTRL1, ctrl1);
        if (ret) {
@@ -395,7 +386,7 @@ static int stm_rd(struct stm_state *st)
                st->ts_last += ts;
                st->nvs->handler(st->nvs_st, &st->buf[1], st->ts_last);
 #endif
-               ts = stm_get_ts_ns();
+               ts = nvs_timestamp();
                st->nvs->handler(st->nvs_st, &st->buf[1], ts);
        } else {
                ret = -EAGAIN;
@@ -435,7 +426,7 @@ static irqreturn_t stm_irq_handler(int irq, void *dev_id)
 {
        struct stm_state *st = (struct stm_state *)dev_id;
 
-       st->ts_irq = stm_get_ts_ns();
+       st->ts_irq = nvs_timestamp();
        if (st->sts & NVS_STS_SPEW_IRQ)
                dev_info(&st->i2c->dev, "%s %lld\n", __func__, st->ts_irq);
        return IRQ_WAKE_THREAD;
index 42616f2..ab9a4a5 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/interrupt.h>
 #include <linux/regulator/consumer.h>
 #include <linux/of.h>
@@ -88,14 +87,6 @@ static int (* const nvi_nb_vreg_pf[])(struct notifier_block *nb,
        nvi_nb_vreg_vlogic,
 };
 
-s64 nvi_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void nvi_err(struct nvi_state *st)
 {
        st->errs++;
@@ -1252,7 +1243,7 @@ static int nvi_nb_vreg(struct nvi_state *st,
                       unsigned long event, unsigned int i)
 {
        if (event & REGULATOR_EVENT_POST_ENABLE)
-               st->vreg_en_ts[i] = nvi_get_time_ns();
+               st->vreg_en_ts[i] = nvs_timestamp();
        else if (event & (REGULATOR_EVENT_DISABLE |
                          REGULATOR_EVENT_FORCE_DISABLE))
                st->vreg_en_ts[i] = 0;
@@ -1278,7 +1269,7 @@ int nvi_pm_wr(struct nvi_state *st, u8 pwr_mgmt_1, u8 pwr_mgmt_2, u8 lp)
                st->rc_dis = true;
                delay_ms = 0;
                for (i = 0; i < ARRAY_SIZE(nvi_vregs); i++) {
-                       por_ns = nvi_get_time_ns() - st->vreg_en_ts[i];
+                       por_ns = nvs_timestamp() - st->vreg_en_ts[i];
                        if ((por_ns < 0) || (!st->vreg_en_ts[i])) {
                                delay_ms = (POR_MS * 1000000);
                                break;
@@ -1503,7 +1494,7 @@ int nvi_pm(struct nvi_state *st, int pm_req)
                if (pm > NVI_PM_ON_CYCLE)
                        nvi_user_ctrl_en(st, true, true);
                if ((pm == NVI_PM_ON_FULL) && (!st->ts_gyro))
-                       st->ts_gyro = nvi_get_time_ns() +
+                       st->ts_gyro = nvs_timestamp() +
                                           st->chip_config.gyro_start_delay_ns;
        } else {
                /* interrupts are disabled until NVI_PM_AUTO */
@@ -1764,7 +1755,7 @@ static void nvi_aux_read(struct nvi_state *st)
        if (ret)
                return;
 
-       ts = nvi_get_time_ns();
+       ts = nvs_timestamp();
        for (i = 0; i < AUX_PORT_IO; i++) {
                ap = &st->aux.port[i];
                if ((st->rc.i2c_slv_ctrl[i] & BIT_SLV_EN) && (!ap->fifo_en) &&
@@ -1980,7 +1971,7 @@ static int nvi_reset(struct nvi_state *st,
        else
                ret |= nvi_user_ctrl_en(st, true, true);
        if (reset_fifo && (st->rc.user_ctrl & BIT_FIFO_EN))
-               st->ts_last = nvi_get_time_ns();
+               st->ts_last = nvs_timestamp();
        if (irq)
                ret |= nvi_int_able(st, true);
        return ret;
@@ -2058,13 +2049,13 @@ static int nvi_aux_bypass_request(struct nvi_state *st, bool enable)
        int ret = 0;
 
        if ((bool)(st->rc.int_pin_cfg & BIT_BYPASS_EN) == enable) {
-               st->aux.bypass_timeout_ns = nvi_get_time_ns();
+               st->aux.bypass_timeout_ns = nvs_timestamp();
                st->aux.bypass_lock++;
                if (!st->aux.bypass_lock)
                        dev_err(&st->i2c->dev, "%s rollover ERR\n", __func__);
        } else {
                if (st->aux.bypass_lock) {
-                       ns = nvi_get_time_ns() - st->aux.bypass_timeout_ns;
+                       ns = nvs_timestamp() - st->aux.bypass_timeout_ns;
                        to = st->chip_config.bypass_timeout_ms * 1000000;
                        if (ns > to)
                                st->aux.bypass_lock = 0;
@@ -2678,7 +2669,7 @@ static irqreturn_t nvi_irq_thread(int irq, void *dev_id)
 
        /* if only accelermeter data */
        if (st->rc.pwr_mgmt_1 & BIT_CYCLE) {
-               ts = nvi_get_time_ns();
+               ts = nvs_timestamp();
                ret = nvi_accel_read(st, ts);
                goto nvi_irq_thread_exit_ts;
        }
@@ -2689,7 +2680,7 @@ static irqreturn_t nvi_irq_thread(int irq, void *dev_id)
        if (!fifo_sample_size)
                goto nvi_irq_thread_exit;
 
-       ts_now = nvi_get_time_ns();
+       ts_now = nvs_timestamp();
        ret = nvi_i2c_rd(st, st->hal->reg->fifo_count_h.bank,
                         st->hal->reg->fifo_count_h.reg, 2, st->buf);
        if (ret)
@@ -2794,7 +2785,7 @@ nvi_irq_thread_exit_reset:
 static irqreturn_t nvi_irq_handler(int irq, void *dev_id)
 {
        struct nvi_state *st = (struct nvi_state *)dev_id;
-       u64 ts = nvi_get_time_ns();
+       u64 ts = nvs_timestamp();
        u64 ts_old = atomic64_xchg(&st->ts_irq, ts);
        u64 ts_diff = ts - ts_old;
 
index be8dcfa..63b35f3 100644 (file)
@@ -497,7 +497,6 @@ struct nvi_state {
 #endif /* NVI_I2C_DEBUG_INTERFACE */
 };
 
-s64 nvi_get_time_ns(void);
 int nvi_i2c_read(struct nvi_state *st, u16 addr, u8 reg, u16 len, u8 *buf);
 int nvi_i2c_rd(struct nvi_state *st, u8 bank, u8 reg, u16 len, u8 *buf);
 int nvi_i2c_write(struct nvi_state *st, u16 addr, u16 len, u8 *buf);
index e688663..98f7373 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/fs.h>
 #include <asm/uaccess.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/string.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
@@ -108,13 +107,6 @@ struct bh1730_state {
        int always_on;
 };
 
-static s64 bh1730_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
 
 static int bh1730_i2c_wr(struct bh1730_state *st, u8 reg, u8 val)
 {
@@ -281,7 +273,7 @@ static int bh1730_rd(struct bh1730_state *st)
        if (ret)
                return ret;
 
-       ts = bh1730_get_time_ns();
+       ts = nvs_timestamp();
        nl->hw = bh1730_get_lux(st, hw);
        nl->timestamp = ts;
        nvs_light_read(nl);
index d879ee7..a49b64d 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/of.h>
@@ -93,14 +92,6 @@ struct cm_state {
 };
 
 
-static s64 cm_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void cm_err(struct cm_state *st)
 {
        st->errs++;
@@ -245,7 +236,7 @@ static int cm_rd(struct cm_state *st)
        if (ret)
                return ret;
 
-       ts = cm_get_time_ns();
+       ts = nvs_timestamp();
        if (st->sts & NVS_STS_SPEW_DATA)
                dev_info(&st->i2c->dev,
                         "poll light hw %hu %lld  diff=%d %lldns  index=%u\n",
index 828d507..359d3d9 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -153,14 +152,6 @@ struct cm_state {
 };
 
 
-static s64 cm_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void cm_err(struct cm_state *st)
 {
        st->errs++;
@@ -352,7 +343,7 @@ static int cm_rd(struct cm_state *st)
        if (ret)
                return ret;
 
-       ts = cm_get_time_ns();
+       ts = nvs_timestamp();
        if (st->sts & NVS_STS_SPEW_DATA)
                dev_info(&st->i2c->dev,
                         "poll light hw %hu %lld  diff=%d %lldns  index=%u\n",
index c3c400a..2a07dd5 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -135,14 +134,6 @@ struct isl_state {
 };
 
 
-static s64 isl_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void isl_err(struct isl_state *st)
 {
        st->errs++;
@@ -456,7 +447,7 @@ static int isl_rd(struct isl_state *st)
        s64 ts;
        int ret = 0;
 
-       ts = isl_get_time_ns();
+       ts = nvs_timestamp();
        if (st->enabled & (1 << ISL_DEV_PROX))
                ret |= isl_rd_prox(st, ts);
        if (st->enabled & (1 << ISL_DEV_LIGHT))
index 4979463..b11826a 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/of.h>
@@ -88,14 +87,6 @@ struct jsa_state {
 };
 
 
-static s64 jsa_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void jsa_err(struct jsa_state *st)
 {
        st->errs++;
@@ -246,7 +237,7 @@ static int jsa_rd(struct jsa_state *st)
                return -EINVAL;
 
        hw &= ~(1 << JSA_VAL_VALID);
-       ts = jsa_get_time_ns();
+       ts = nvs_timestamp();
        if (st->sts & NVS_STS_SPEW_DATA)
                dev_info(&st->i2c->dev,
                         "%s hw: %hu %lld diff: %d %lldns nld_i(index)=%u hw_it=%x\n",
index 85076b2..566eda2 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -174,13 +173,6 @@ struct ltr_state {
        u8 rc_interrupt;                /* cache of INTERRUPT */
 };
 
-static s64 ltr_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
 
 static void ltr_err(struct ltr_state *st)
 {
@@ -546,7 +538,7 @@ static int ltr_rd(struct ltr_state *st)
                return ret;
 
        if (sts & LTR_REG_STATUS_DATA_MASK) {
-               ts = ltr_get_time_ns();
+               ts = nvs_timestamp();
                if (st->enabled & (1 << LTR_DEV_PROX))
                        ret |= ltr_rd_prox(st, ts);
                if (st->enabled & (1 << LTR_DEV_LIGHT))
index 13a7164..a4baf61 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -208,14 +207,6 @@ struct mx_state {
 };
 
 
-static s64 mx_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void mx_err(struct mx_state *st)
 {
        st->errs++;
@@ -547,7 +538,7 @@ static int mx_rd(struct mx_state *st)
                return RET_POLL_NEXT;
        }
 
-       ts = mx_get_time_ns();
+       ts = nvs_timestamp();
        if (st->enabled & (1 << MX_DEV_PROX))
                ret |= mx_rd_prox(st, ts);
        if (st->enabled & (1 << MX_DEV_LIGHT))
index abbcebb..4949c2d 100644 (file)
@@ -7,6 +7,9 @@ GCOV_PROFILE := y
 ccflags-y += -Werror
 obj-$(CONFIG_AK8975) += ak8975.o
 obj-$(CONFIG_NVI_AK89XX) += nvi-ak89xx.o
+ifdef CONFIG_NVI_MPU
+       CFLAGS_nvi_ak89xx.o += -DAKM_NVI_MPU_SUPPORT=1
+endif
 nvi-ak89xx-objs += nvi_ak89xx.o
 obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) += hid-sensor-magn-3d.o
 
index f7fe696..e8668f7 100644 (file)
 /* See Nvs.cpp in the HAL for the NVS implementation of batch/flush. */
 /* See NvsIio.cpp in the HAL for the IIO enable/disable extension mechanism. */
 
-#define AKM_NVI_MPU_SUPPORT            (1) /* includes NVI MPU code */
 
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -196,14 +194,6 @@ struct akm_hal {
 };
 
 
-static s64 akm_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void akm_err(struct akm_state *st)
 {
        st->errs++;
@@ -551,7 +541,7 @@ static int akm_read(struct akm_state *st)
        if (ret)
                return ret;
 
-       ts = akm_get_time_ns();
+       ts = nvs_timestamp();
        ret = akm_read_sts(st, data);
        if (ret > 0) {
                akm_calc(st, data);
index a7a2145..6c187d4 100644 (file)
@@ -6,5 +6,8 @@ GCOV_PROFILE := y
 
 ccflags-y += -Werror
 obj-$(CONFIG_NVI_BMPX80) += nvi-bmpX80.o
+ifdef CONFIG_NVI_MPU
+       CFLAGS_nvi_bmpX80.o += -DBMP_NVI_MPU_SUPPORT=1
+endif
 nvi-bmpX80-objs += nvi_bmpX80.o
 
index 5ff11c6..176be7c 100644 (file)
 /* See Nvs.cpp in the HAL for the NVS implementation of batch/flush. */
 /* See NvsIio.cpp in the HAL for the IIO enable/disable extension mechanism. */
 
-#define BMP_NVI_MPU_SUPPORT            (1) /* includes NVI MPU code */
 
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/of.h>
@@ -269,14 +267,6 @@ struct bmp_hal {
 };
 
 
-static s64 bmp_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void bmp_err(struct bmp_state *st)
 {
        st->errs++;
@@ -621,7 +611,7 @@ static int bmp_read_180(struct bmp_state *st)
        if (ret)
                return ret;
 
-       ts = bmp_get_time_ns();
+       ts = nvs_timestamp();
        ret = bmp_read_sts_180(st, data, ts);
        if (ret > 0) {
                if (st->nvs_st[BMP_DEV_PRES])
@@ -745,7 +735,7 @@ static int bmp_read_280(struct bmp_state *st)
        if (ret)
                return ret;
 
-       ts = bmp_get_time_ns();
+       ts = nvs_timestamp();
        ret = bmp_read_sts_280(st, data, ts);
        if (ret > 0) {
                if (st->nvs_st[BMP_DEV_PRES])
index 5be3cef..72b2dd4 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/ktime.h>
 #include <linux/regulator/consumer.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
@@ -567,14 +566,6 @@ struct iqs_state {
 };
 
 
-static s64 iqs_get_time_ns(void)
-{
-       struct timespec ts;
-
-       ktime_get_ts(&ts);
-       return timespec_to_ns(&ts);
-}
-
 static void iqs_err(struct iqs_state *st)
 {
        st->errs++;
@@ -611,7 +602,7 @@ static unsigned int iqs_i2c_stop_ms(struct iqs_state *st)
        s64 i2c_stop_t;
        unsigned int ms = 0;
 
-       i2c_stop_t = iqs_get_time_ns() - st->i2c_stop_ts;
+       i2c_stop_t = nvs_timestamp() - st->i2c_stop_ts;
        if (i2c_stop_t < st->i2c_ss_war_ns) {
                i2c_stop_t = st->i2c_ss_war_ns - i2c_stop_t;
                do_div(i2c_stop_t, 1000000); /* ns => ms */
@@ -813,7 +804,7 @@ static int iqs_i2c(struct iqs_state *st, bool poll)
                                           &st->msg[n], st->msg_n);
                        if (st->gpio_sar_dev_asrt == IQS_GPIO_SAR_DBG_I2C)
                                iqs_gpio_sar(st, 0);
-                       st->i2c_stop_ts = iqs_get_time_ns();
+                       st->i2c_stop_ts = nvs_timestamp();
                        if (ret == st->msg_n) {
                                ret = 0;
                                break;
@@ -1481,7 +1472,7 @@ static int iqs_rd(struct iqs_state *st, bool poll)
                        }
                }
                /* read data */
-               ts = iqs_get_time_ns();
+               ts = nvs_timestamp();
                if (st->enabled & (1 << IQS_DEV_PROX))
                        ret |= iqs_rd_snsr(st, ts, IQS_DEV_PROX,
                                           &st->hal_bit->touch_prx,
@@ -2107,7 +2098,7 @@ static int iqs_suspend(struct device *dev)
        s64 ts = 0; /* = 0 to fix compile */
 
        if (st->sts & NVS_STS_SPEW_MSG)
-               ts = iqs_get_time_ns();
+               ts = nvs_timestamp();
        /* Due to the device's horrendous communication protocol that causes
         * unacceptable delays, suspend flag is used to exit pending actions.
         */
@@ -2141,7 +2132,7 @@ static int iqs_suspend(struct device *dev)
        iqs_mutex_unlock(st);
        if (st->sts & NVS_STS_SPEW_MSG)
                dev_info(&client->dev, "%s elapsed t=%lldns  err=%d\n",
-                        __func__, iqs_get_time_ns() - ts, ret);
+                        __func__, nvs_timestamp() - ts, ret);
        return 0;
 }
 
@@ -2153,7 +2144,7 @@ static int iqs_resume(struct device *dev)
        int ret = 0;
 
        if (st->sts & NVS_STS_SPEW_MSG)
-               ts = iqs_get_time_ns();
+               ts = nvs_timestamp();
        st->susrsm = true;
        iqs_mutex_lock(st);
        st->susrsm = false;
@@ -2173,7 +2164,7 @@ static int iqs_resume(struct device *dev)
        iqs_mutex_unlock(st);
        if (st->sts & NVS_STS_SPEW_MSG)
                dev_info(&client->dev, "%s elapsed t=%lldns  err=%d\n",
-                        __func__, iqs_get_time_ns() - ts, ret);
+                        __func__, nvs_timestamp() - ts, ret);
        return 0;
 }
 
index 94b3445..d752485 100644 (file)
@@ -386,5 +386,6 @@ void nvs_vregs_exit(struct device *dev, struct regulator_bulk_data *vregs,
 int nvs_vregs_init(struct device *dev, struct regulator_bulk_data *vregs,
                   unsigned int vregs_n, char **vregs_name);
 int nvs_vregs_sts(struct regulator_bulk_data *vregs, unsigned int vregs_n);
+s64 nvs_timestamp(void);
 
 #endif /* _NVS_H_ */