static irqreturn_t mma8452_interrupt(int irq, void *p) { struct iio_dev *indio_dev = p; struct mma8452_data *data = iio_priv(indio_dev); const struct mma_chip_info *chip = data->chip_info; int ret = IRQ_NONE; int src; src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC); if (src < 0) return IRQ_NONE; if (src & MMA8452_INT_DRDY) { iio_trigger_poll_chained(indio_dev->trig); ret = IRQ_HANDLED; } if ((src & MMA8452_INT_TRANS && chip->ev_src == MMA8452_TRANSIENT_SRC) || (src & MMA8452_INT_FF_MT && chip->ev_src == MMA8452_FF_MT_SRC)) { mma8452_transient_interrupt(indio_dev); ret = IRQ_HANDLED; } return ret; }
static ssize_t iio_sysfs_trigger_poll(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_trigger *trig = dev_get_drvdata(dev); iio_trigger_poll_chained(trig, 0); return count; }
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; }
static irqreturn_t mpu3050_irq_thread(int irq, void *p) { struct iio_trigger *trig = p; struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); struct mpu3050 *mpu3050 = iio_priv(indio_dev); unsigned int val; int ret; /* ACK IRQ and check if it was from us */ ret = regmap_read(mpu3050->map, MPU3050_INT_STATUS, &val); if (ret) { dev_err(mpu3050->dev, "error reading IRQ status\n"); return IRQ_HANDLED; } if (!(val & MPU3050_INT_STATUS_RAW_RDY)) return IRQ_NONE; iio_trigger_poll_chained(p); return IRQ_HANDLED; }
static irqreturn_t mma8452_interrupt(int irq, void *p) { struct iio_dev *indio_dev = p; struct mma8452_data *data = iio_priv(indio_dev); int ret = IRQ_NONE; int src; src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC); if (src < 0) return IRQ_NONE; if (src & MMA8452_INT_DRDY) { iio_trigger_poll_chained(indio_dev->trig); ret = IRQ_HANDLED; } if (src & MMA8452_INT_TRANS) { mma8452_transient_interrupt(indio_dev); ret = IRQ_HANDLED; } return ret; }