staticbool mxc4005_is_readable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MXC4005_REG_XOUT_UPPER: case MXC4005_REG_XOUT_LOWER: case MXC4005_REG_YOUT_UPPER: case MXC4005_REG_YOUT_LOWER: case MXC4005_REG_ZOUT_UPPER: case MXC4005_REG_ZOUT_LOWER: case MXC4005_REG_DEVICE_ID: case MXC4005_REG_CONTROL: returntrue; default: returnfalse;
}
}
staticbool mxc4005_is_writeable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MXC4005_REG_INT_CLR0: case MXC4005_REG_INT_CLR1: case MXC4005_REG_INT_MASK0: case MXC4005_REG_INT_MASK1: case MXC4005_REG_CONTROL: returntrue; default: returnfalse;
}
}
ret = regmap_bulk_read(data->regmap, addr, ®, sizeof(reg)); if (ret < 0) {
dev_err(data->dev, "failed to read reg %02x\n", addr); return ret;
}
return be16_to_cpu(reg);
}
staticint mxc4005_read_scale(struct mxc4005_data *data)
{ unsignedint reg; int ret; int i;
ret = regmap_read(data->regmap, MXC4005_REG_CONTROL, ®); if (ret < 0) {
dev_err(data->dev, "failed to read reg_control\n"); return ret;
}
i = reg >> MXC4005_CONTROL_FSR_SHIFT;
if (i < 0 || i >= ARRAY_SIZE(mxc4005_scale_table)) return -EINVAL;
return mxc4005_scale_table[i].scale;
}
staticint mxc4005_set_scale(struct mxc4005_data *data, int val)
{ unsignedint reg; int i; int ret;
for (i = 0; i < ARRAY_SIZE(mxc4005_scale_table); i++) { if (mxc4005_scale_table[i].scale == val) {
reg = i << MXC4005_CONTROL_FSR_SHIFT;
ret = regmap_update_bits(data->regmap,
MXC4005_REG_CONTROL,
MXC4005_REG_CONTROL_MASK_FSR,
reg); if (ret < 0)
dev_err(data->dev, "failed to write reg_control\n"); return ret;
}
}
return -EINVAL;
}
staticint mxc4005_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct mxc4005_data *data = iio_priv(indio_dev); int ret;
switch (mask) { case IIO_CHAN_INFO_RAW: switch (chan->type) { case IIO_ACCEL: if (iio_buffer_enabled(indio_dev)) return -EBUSY;
ret = mxc4005_read_axis(data, chan->address); if (ret < 0) return ret;
*val = sign_extend32(ret >> chan->scan_type.shift,
chan->scan_type.realbits - 1); return IIO_VAL_INT; default: return -EINVAL;
} case IIO_CHAN_INFO_SCALE:
ret = mxc4005_read_scale(data); if (ret < 0) return ret;
staticvoid mxc4005_clr_intr(struct mxc4005_data *data)
{ int ret;
/* clear interrupt */
ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
MXC4005_REG_INT_CLR1_BIT_DRDYC); if (ret < 0)
dev_err(data->dev, "failed to write to reg_int_clr1\n");
}
ret = mxc4005_chip_init(data); if (ret < 0) {
dev_err(&client->dev, "failed to initialize chip\n"); return ret;
}
mutex_init(&data->mutex);
if (!iio_read_acpi_mount_matrix(&client->dev, &data->orientation, "ROTM")) {
ret = iio_read_mount_matrix(&client->dev, &data->orientation); if (ret) return ret;
}
/* Save control to restore it on resume */
ret = regmap_read(data->regmap, MXC4005_REG_CONTROL, &data->control); if (ret < 0)
dev_err(data->dev, "failed to read reg_control\n");
ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
MXC4005_REG_INT_CLR1_SW_RST); if (ret) {
dev_err(data->dev, "failed to reset chip: %d\n", ret); return ret;
}
fsleep(MXC4005_RESET_TIME_US);
ret = regmap_write(data->regmap, MXC4005_REG_CONTROL, data->control); if (ret) {
dev_err(data->dev, "failed to restore control register\n"); return ret;
}
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK0, 0); if (ret) {
dev_err(data->dev, "failed to restore interrupt 0 mask\n"); return ret;
}
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, data->int_mask1); if (ret) {
dev_err(data->dev, "failed to restore interrupt 1 mask\n"); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.