[v1,1/2] iio: accel: kxcjk1013: Support orientation matrix
diff mbox series

Message ID 20200112203301.30235-1-digetx@gmail.com
State New
Headers show
Series
  • [v1,1/2] iio: accel: kxcjk1013: Support orientation matrix
Related show

Commit Message

Dmitry Osipenko Jan. 12, 2020, 8:33 p.m. UTC
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@gmail.com>
---
 drivers/iio/accel/kxcjk-1013.c       | 27 +++++++++++++++++++++++++--
 include/linux/iio/accel/kxcjk_1013.h |  3 +++
 2 files changed, 28 insertions(+), 2 deletions(-)

Comments

Srinivas Pandruvada Jan. 15, 2020, 5:20 p.m. UTC | #1
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@gmail.com>

Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

> ---
>  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
Dmitry Osipenko Jan. 18, 2020, 2:41 a.m. UTC | #2
15.01.2020 20:20, Srinivas Pandruvada пишет:
> 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@gmail.com>
> 
> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

Thanks!
Jonathan Cameron Jan. 18, 2020, 2:27 p.m. UTC | #3
On Sat, 18 Jan 2020 05:41:33 +0300
Dmitry Osipenko <digetx@gmail.com> wrote:

> 15.01.2020 20:20, Srinivas Pandruvada пишет:
> > 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@gmail.com>  
> > 
> > Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>  
> 
> Thanks!
> 
Applied to the togreg branch of iio.git and pushed out as testing
to let the various automated test systems poke at it before I push
out as non rebasing.

Thanks,

Jonathan

Patch
diff mbox series

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