Exemple #1
0
static int mma8452_read_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *chan,
                            int *val, int *val2, long mask)
{
    struct mma8452_data *data = iio_priv(indio_dev);
    __be16 buffer[3];
    int i, ret;

    switch (mask) {
    case IIO_CHAN_INFO_RAW:
        if (iio_buffer_enabled(indio_dev))
            return -EBUSY;

        mutex_lock(&data->lock);
        ret = mma8452_read(data, buffer);
        mutex_unlock(&data->lock);
        if (ret < 0)
            return ret;

        *val = sign_extend32(be16_to_cpu(
                                 buffer[chan->scan_index]) >> chan->scan_type.shift,
                             chan->scan_type.realbits - 1);

        return IIO_VAL_INT;
    case IIO_CHAN_INFO_SCALE:
        i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK;
        *val = data->chip_info->mma_scales[i][0];
        *val2 = data->chip_info->mma_scales[i][1];

        return IIO_VAL_INT_PLUS_MICRO;
    case IIO_CHAN_INFO_SAMP_FREQ:
        i = mma8452_get_odr_index(data);
        *val = mma8452_samp_freq[i][0];
        *val2 = mma8452_samp_freq[i][1];

        return IIO_VAL_INT_PLUS_MICRO;
    case IIO_CHAN_INFO_CALIBBIAS:
        ret = i2c_smbus_read_byte_data(data->client,
                                       MMA8452_OFF_X + chan->scan_index);
        if (ret < 0)
            return ret;

        *val = sign_extend32(ret, 7);

        return IIO_VAL_INT;
    case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
        if (data->data_cfg & MMA8452_DATA_CFG_HPF_MASK) {
            ret = mma8452_read_hp_filter(data, val, val2);
            if (ret < 0)
                return ret;
        } else {
            *val = 0;
            *val2 = 0;
        }

        return IIO_VAL_INT_PLUS_MICRO;
    }

    return -EINVAL;
}
Exemple #2
0
static irqreturn_t mma8452_trigger_handler(int irq, void *p)
{
	struct iio_poll_func *pf = p;
	struct iio_dev *indio_dev = pf->indio_dev;
	struct mma8452_data *data = iio_priv(indio_dev);
	u8 buffer[16]; /* 3 16-bit channels + padding + ts */
	int ret;

	ret = mma8452_read(data, (__be16 *) buffer);
	if (ret < 0)
		goto done;

	iio_push_to_buffers_with_timestamp(indio_dev, buffer,
		iio_get_time_ns());

done:
	iio_trigger_notify_done(indio_dev->trig);
	return IRQ_HANDLED;
}
Exemple #3
0
static int mma8452_read_raw(struct iio_dev *indio_dev,
			    struct iio_chan_spec const *chan,
			    int *val, int *val2, long mask)
{
	struct mma8452_data *data = iio_priv(indio_dev);
	__be16 buffer[3];
	int i, ret;

	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		if (iio_buffer_enabled(indio_dev))
			return -EBUSY;

		mutex_lock(&data->lock);
		ret = mma8452_read(data, buffer);
		mutex_unlock(&data->lock);
		if (ret < 0)
			return ret;
		*val = sign_extend32(
			be16_to_cpu(buffer[chan->scan_index]) >> 4, 11);
		return IIO_VAL_INT;
	case IIO_CHAN_INFO_SCALE:
		i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK;
		*val = mma8452_scales[i][0];
		*val2 = mma8452_scales[i][1];
		return IIO_VAL_INT_PLUS_MICRO;
	case IIO_CHAN_INFO_SAMP_FREQ:
		i = (data->ctrl_reg1 & MMA8452_CTRL_DR_MASK) >>
			MMA8452_CTRL_DR_SHIFT;
		*val = mma8452_samp_freq[i][0];
		*val2 = mma8452_samp_freq[i][1];
		return IIO_VAL_INT_PLUS_MICRO;
	case IIO_CHAN_INFO_CALIBBIAS:
		ret = i2c_smbus_read_byte_data(data->client, MMA8452_OFF_X +
			chan->scan_index);
		if (ret < 0)
			return ret;
		*val = sign_extend32(ret, 7);
		return IIO_VAL_INT;
	}
	return -EINVAL;
}