Commit 1bde330c authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Jonathan Cameron
Browse files

iio: accel: kxcjk1013: Support orientation matrix



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: default avatarDmitry Osipenko <digetx@gmail.com>
Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 04e6fedb
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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