mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
iio: accel: mxc4005: Read orientation matrix from ACPI ROTM method
Some devices use the semi-standard ACPI "ROTM" method to store the accelerometers orientation matrix. Add support for this using the new iio_read_acpi_mount_matrix() helper, if the helper fails to read the matrix fall back to iio_read_mount_matrix() which will try to get it from device-properties (devicetree) and if that fails it will fill the matrix with the identity matrix. Link: https://bugzilla.kernel.org/show_bug.cgi?id=218578 Acked-by: Rafael J. Wysocki <rafael@kernel.org> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20240425125754.76010-5-hdegoede@redhat.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
dd3f40b539
commit
4a8e1e020a
|
@ -56,6 +56,7 @@ struct mxc4005_data {
|
|||
struct mutex mutex;
|
||||
struct regmap *regmap;
|
||||
struct iio_trigger *dready_trig;
|
||||
struct iio_mount_matrix orientation;
|
||||
/* Ensure timestamp is naturally aligned */
|
||||
struct {
|
||||
__be16 chans[3];
|
||||
|
@ -259,6 +260,20 @@ static int mxc4005_write_raw(struct iio_dev *indio_dev,
|
|||
}
|
||||
}
|
||||
|
||||
static const struct iio_mount_matrix *
|
||||
mxc4005_get_mount_matrix(const struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan)
|
||||
{
|
||||
struct mxc4005_data *data = iio_priv(indio_dev);
|
||||
|
||||
return &data->orientation;
|
||||
}
|
||||
|
||||
static const struct iio_chan_spec_ext_info mxc4005_ext_info[] = {
|
||||
IIO_MOUNT_MATRIX(IIO_SHARED_BY_TYPE, mxc4005_get_mount_matrix),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct iio_info mxc4005_info = {
|
||||
.read_raw = mxc4005_read_raw,
|
||||
.write_raw = mxc4005_write_raw,
|
||||
|
@ -285,6 +300,7 @@ static const unsigned long mxc4005_scan_masks[] = {
|
|||
.shift = 4, \
|
||||
.endianness = IIO_BE, \
|
||||
}, \
|
||||
.ext_info = mxc4005_ext_info, \
|
||||
}
|
||||
|
||||
static const struct iio_chan_spec mxc4005_channels[] = {
|
||||
|
@ -415,6 +431,12 @@ static int mxc4005_probe(struct i2c_client *client)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
indio_dev->channels = mxc4005_channels;
|
||||
indio_dev->num_channels = ARRAY_SIZE(mxc4005_channels);
|
||||
indio_dev->available_scan_masks = mxc4005_scan_masks;
|
||||
|
|
Loading…
Reference in a new issue