Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 5
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;
}
Esempio n. 6
0
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;
}