On Sun, 2020-01-12 at 23:33 +0300, Dmitry Osipenko wrote: > Hardware could be physically mounted in any possible direction and > userpspace needs to be aware of the mounting orientation in order to > process sensor's data correctly. In particular this helps iio-sensor- > proxy > to report display's orientation properly on a phone/tablet devices. > > Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx> > --- > drivers/iio/accel/kxcjk-1013.c | 27 +++++++++++++++++++++++++- > - > include/linux/iio/accel/kxcjk_1013.h | 3 +++ > 2 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/accel/kxcjk-1013.c > b/drivers/iio/accel/kxcjk-1013.c > index fee535d6e45b..c9924a65c32a 100644 > --- a/drivers/iio/accel/kxcjk-1013.c > +++ b/drivers/iio/accel/kxcjk-1013.c > @@ -130,6 +130,7 @@ struct kxcjk1013_data { > struct i2c_client *client; > struct iio_trigger *dready_trig; > struct iio_trigger *motion_trig; > + struct iio_mount_matrix orientation; > struct mutex mutex; > s16 buffer[8]; > u8 odr_bits; > @@ -983,6 +984,20 @@ static const struct iio_event_spec > kxcjk1013_event = { > BIT(IIO_EV_INFO_PERIOD) > }; > > +static const struct iio_mount_matrix * > +kxcjk1013_get_mount_matrix(const struct iio_dev *indio_dev, > + const struct iio_chan_spec *chan) > +{ > + struct kxcjk1013_data *data = iio_priv(indio_dev); > + > + return &data->orientation; > +} > + > +static const struct iio_chan_spec_ext_info kxcjk1013_ext_info[] = { > + IIO_MOUNT_MATRIX(IIO_SHARED_BY_TYPE, > kxcjk1013_get_mount_matrix), > + { } > +}; > + > #define KXCJK1013_CHANNEL(_axis) { > \ > .type = IIO_ACCEL, > \ > .modified = 1, > \ > @@ -999,6 +1014,7 @@ static const struct iio_event_spec > kxcjk1013_event = { > .endianness = IIO_LE, > \ > }, > \ > .event_spec = &kxcjk1013_event, \ > + .ext_info = kxcjk1013_ext_info, > \ > .num_event_specs = 1 > \ > } > > @@ -1267,11 +1283,18 @@ static int kxcjk1013_probe(struct i2c_client > *client, > data->client = client; > > pdata = dev_get_platdata(&client->dev); > - if (pdata) > + if (pdata) { > data->active_high_intr = pdata->active_high_intr; > - else > + data->orientation = pdata->orientation; > + } else { > data->active_high_intr = true; /* default polarity */ > > + ret = iio_read_mount_matrix(&client->dev, "mount- > matrix", > + &data->orientation); > + if (ret) > + return ret; > + } > + > if (id) { > data->chipset = (enum kx_chipset)(id->driver_data); > name = id->name; > diff --git a/include/linux/iio/accel/kxcjk_1013.h > b/include/linux/iio/accel/kxcjk_1013.h > index 8c3c78bc9f91..ea0ecb774371 100644 > --- a/include/linux/iio/accel/kxcjk_1013.h > +++ b/include/linux/iio/accel/kxcjk_1013.h > @@ -7,8 +7,11 @@ > #ifndef __IIO_KXCJK_1013_H__ > #define __IIO_KXCJK_1013_H__ > > +#include <linux/iio/iio.h> > + > struct kxcjk_1013_platform_data { > bool active_high_intr; > + struct iio_mount_matrix orientation; > }; > > #endif