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; }