static int st_lsm6ds3_data_poll(struct iio_dev *indio_dev)
{
	struct lsm6ds3_sensor_data *sdata = iio_priv(indio_dev);
	struct lsm6ds3_data *cdata = sdata->cdata;

	mutex_lock(&indio_dev->mlock);
	cdata->timestamp = st_lsm6ds3_iio_get_boottime_ns();
	iio_trigger_poll_chained(indio_dev->trig, 0);
	mutex_unlock(&indio_dev->mlock);

	return 0;
}
static int st_lsm6ds3_event_poll(struct lsm6ds3_data *cdata, int sensor)
{
	int err;
	u8 src_value_reg = 0x00;

	err = cdata->tf->read(&cdata->tb, cdata->dev,
				ST_LSM6DS3_SRC_FUNC_REG, 1, &src_value_reg);
	if (err < 0)
		return err;

	cdata->timestamp = st_lsm6ds3_iio_get_boottime_ns();

	if (sensor & (1 << ST_INDIO_DEV_SIGN_MOTION)) // STM
	{
		if (src_value_reg & ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL) {
			mutex_lock(&cdata->indio_dev[ST_INDIO_DEV_SIGN_MOTION]->mlock);
			iio_push_event(cdata->indio_dev[ST_INDIO_DEV_SIGN_MOTION],
					IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION,
					0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER),
					cdata->timestamp);
			mutex_unlock(&cdata->indio_dev[ST_INDIO_DEV_SIGN_MOTION]->mlock);
		}
	}
	if (sensor & (1 << ST_INDIO_DEV_STEP_DETECTOR)) {
		if (src_value_reg & ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL) {
			mutex_lock(&cdata->indio_dev[ST_INDIO_DEV_STEP_DETECTOR]->mlock);
			iio_trigger_poll_chained(
					cdata->trig[ST_INDIO_DEV_STEP_COUNTER], 0);
			iio_push_event(cdata->indio_dev[ST_INDIO_DEV_STEP_DETECTOR],
					IIO_UNMOD_EVENT_CODE(IIO_STEP_DETECTOR,
					0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER),
					cdata->timestamp);
			mutex_unlock(&cdata->indio_dev[ST_INDIO_DEV_STEP_DETECTOR]->mlock);
		}
	}
	if (sensor & (1 << ST_INDIO_DEV_TILT)) {
		if (src_value_reg & ST_LSM6DS3_SRC_TILT_DATA_AVL) {
			mutex_lock(&cdata->indio_dev[ST_INDIO_DEV_TILT]->mlock);
			iio_push_event(cdata->indio_dev[ST_INDIO_DEV_TILT],
					IIO_UNMOD_EVENT_CODE(IIO_TILT,
					0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER),
					cdata->timestamp);
			mutex_unlock(&cdata->indio_dev[ST_INDIO_DEV_TILT]->mlock);
		}
	}

	//dev_info(cdata->dev, "%s run...%d\n", __func__, src_value_reg);

	return 0;
}
	sdata = container_of((struct work_struct *)data_work,
						struct lsm6ds3_sensor_data, tmr_work);

	if (sdata->sindex == ST_INDIO_DEV_GYRO)
		st_lsm6ds3_data_poll(sdata->cdata->indio_dev[sdata->sindex]);

	return;
}
EXPORT_SYMBOL(st_lsm6ds3_poll_work_gyr);
#endif

irqreturn_t st_lsm6ds3_save_timestamp(int irq, void *private)
{
	struct lsm6ds3_data *cdata = private;

	cdata->timestamp = st_lsm6ds3_iio_get_boottime_ns();
	queue_work(st_lsm6ds3_wq, &cdata->data_work);

	disable_irq_nosync(irq);

	return IRQ_HANDLED;
}

static void st_lsm6ds3_irq_management(struct work_struct *data_work)
{
	int err;
	struct lsm6ds3_data *cdata;
	u8 src_value_reg1 = 0x00, src_value_reg2 = 0x00, src_wake_up = 0x00;

	cdata = container_of((struct work_struct *)data_work,
						struct lsm6ds3_data, data_work);
irqreturn_t st_lsm6ds3_iio_pollfunc_store_boottime(int irq, void *p)
{
	struct iio_poll_func *pf = p;
	pf->timestamp = st_lsm6ds3_iio_get_boottime_ns();
	return IRQ_WAKE_THREAD;
}