/** * inv_read_fifo() - Transfer data from FIFO to ring buffer. */ int inv_read_ami306_fifo(struct iio_dev *indio_dev) { struct inv_ami306_state_s *st = iio_priv(indio_dev); struct iio_buffer *ring = indio_dev->buffer; int result, status, d_ind; char b; char *tmp; s64 tmp_buf[2]; result = i2c_smbus_read_i2c_block_data(st->i2c, REG_AMI_STA1, 1, &b); if (result < 0) goto end_session; if (b & AMI_STA1_DRDY_BIT) { status = ami306_read_raw_data(st, st->compass_data); if (status) { pr_err("error reading raw\n"); goto end_session; } tmp = (unsigned char *)tmp_buf; d_ind = put_scan_to_buf(indio_dev, tmp, st->compass_data, INV_AMI306_SCAN_MAGN_X); if (ring->scan_timestamp) tmp_buf[(d_ind + 7)/8] = st->timestamp; ring->access->store_to(indio_dev->buffer, tmp); } else if (b & AMI_STA1_DOR_BIT) pr_err("not ready\n"); end_session: b = AMI_CTRL3_FORCE_BIT; result = i2c_smbus_write_i2c_block_data(st->i2c, REG_AMI_CTRL3, 1, &b); return IRQ_HANDLED; }
/** * inv_read_fifo() - Transfer data from FIFO to ring buffer. */ int inv_read_ami306_fifo(struct iio_dev *indio_dev) { struct inv_ami306_state_s *st = iio_priv(indio_dev); struct iio_buffer *ring = indio_dev->buffer; int result, status, d_ind; char b; char *tmp; s64 tmp_buf[2]; int ii; result = i2c_smbus_read_i2c_block_data(st->i2c, REG_AMI_STA1, 1, &b); if (result < 0) goto end_session; if (b & AMI_STA1_DRDY_BIT) { status = ami306_read_raw_data(st, st->compass_data); if (status) { pr_err("error reading raw\n"); goto end_session; } if (!st->data_chk.load_cali) { for (ii = 0; ii < AMICaliMax; ii++) { result = access_cali_file(st->data_chk.gain, ii); if (!result) { st->data_chk.fexist = 0; break; } } st->data_chk.load_cali = true; } for (ii = 0; ii < 3; ii++) { st->data_chk.ori[ii] = st->compass_data[ii]; if (st->data_chk.gain[ii] > 0) st->compass_data[ii] = (short)((int)st->compass_data[ii] * 100 / st->data_chk.gain[ii]); st->data_chk.post[ii] = st->compass_data[ii]; } tmp = (unsigned char *)tmp_buf; d_ind = put_scan_to_buf(indio_dev, tmp, st->compass_data, INV_AMI306_SCAN_MAGN_X); if (ring->scan_timestamp) tmp_buf[(d_ind + 7)/8] = st->timestamp; ring->access->store_to(indio_dev->buffer, tmp, st->timestamp); } else if (b & AMI_STA1_DOR_BIT) pr_err("not ready\n"); end_session: b = AMI_CTRL3_FORCE_BIT; result = i2c_smbus_write_i2c_block_data(st->i2c, REG_AMI_CTRL3, 1, &b); return IRQ_HANDLED; }