static irqreturn_t hmc5843_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct hmc5843_data *data = iio_priv(indio_dev); int ret; mutex_lock(&data->lock); ret = hmc5843_wait_measurement(data); if (ret < 0) { mutex_unlock(&data->lock); goto done; } ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS, data->buffer, 3 * sizeof(__be16)); mutex_unlock(&data->lock); if (ret < 0) goto done; iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, iio_get_time_ns(indio_dev)); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
/* Return the measurement value from the specified channel */ static int hmc5843_read_measurement(struct hmc5843_data *data, int idx, int *val) { __be16 values[3]; int ret; mutex_lock(&data->lock); ret = hmc5843_wait_measurement(data); if (ret < 0) { mutex_unlock(&data->lock); return ret; } ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS, values, sizeof(values)); mutex_unlock(&data->lock); if (ret < 0) return ret; *val = sign_extend32(be16_to_cpu(values[idx]), 15); return IIO_VAL_INT; }
/* Return the measurement value from the specified channel */ static int hmc5843_read_measurement(struct hmc5843_data *data, int idx, int *val) { s32 result; __be16 values[3]; mutex_lock(&data->lock); result = hmc5843_wait_measurement(data); if (result < 0) { mutex_unlock(&data->lock); return result; } result = i2c_smbus_read_i2c_block_data(data->client, HMC5843_DATA_OUT_MSB_REGS, sizeof(values), (u8 *) values); mutex_unlock(&data->lock); if (result < 0) return -EINVAL; *val = sign_extend32(be16_to_cpu(values[idx]), 15); return IIO_VAL_INT; }