Linux IIO development
 help / color / mirror / Atom feed
From: Lorenzo Bianconi <lorenzo@kernel.org>
To: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Philippe De Muyter <phdm@macq.eu>, linux-iio@vger.kernel.org
Subject: Re: sysfs mount_matrix for st_lsm6dsx gyro
Date: Thu, 12 Jan 2023 11:12:52 +0100	[thread overview]
Message-ID: <Y7/dJDbHXtlid8SD@lore-desk> (raw)
In-Reply-To: <20230111171732.00006941@Huawei.com>

[-- Attachment #1: Type: text/plain, Size: 6075 bytes --]

> On Wed, 11 Jan 2023 13:09:40 +0100
> Philippe De Muyter <phdm@macq.eu> wrote:
> 
> > Hello Lorenzo and list,
> > 
> > I do not find a "*mount_matrix" entry in sysfs for a 'ism330dlc_gyro'
> > iio device.
> > Is that normal ?
> > Is a fix available ?
> 
> Looks like the channel definition for the gyro does not include an
> appropriate ext_info entry unlike the accelerometer channels which
> have one with mount_matrix support.
> 
> From a quick glance looks like a simple fix. Add that entry.

something like (per-sensor mount_matrix):

diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
index 5b6f195748fc..5e0c184e1055 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
@@ -113,6 +113,8 @@ enum st_lsm6dsx_hw_id {
 		.storagebits = 16,					\
 		.endianness = IIO_LE,					\
 	},								\
+	.ext_info = st_lsm6dsx_gyro_ext_info,				\
+	.num_event_specs = 1,						\
 }
 
 struct st_lsm6dsx_reg {
@@ -356,6 +358,7 @@ enum st_lsm6dsx_fifo_mode {
  * @decimator: Sensor decimation factor.
  * @sip: Number of samples in a given pattern.
  * @ts_ref: Sensor timestamp reference for hw one.
+ * @orientation: sensor chip orientation relative to main hardware.
  * @ext_info: Sensor settings if it is connected to i2c controller
  */
 struct st_lsm6dsx_sensor {
@@ -371,6 +374,8 @@ struct st_lsm6dsx_sensor {
 	u8 sip;
 	s64 ts_ref;
 
+	struct iio_mount_matrix orientation;
+
 	struct {
 		const struct st_lsm6dsx_ext_dev_settings *settings;
 		u32 slv_odr;
@@ -398,7 +403,6 @@ struct st_lsm6dsx_sensor {
  * @enable_event: enabled event bitmask.
  * @iio_devs: Pointers to acc/gyro iio_dev instances.
  * @settings: Pointer to the specific sensor settings in use.
- * @orientation: sensor chip orientation relative to main hardware.
  * @scan: Temporary buffers used to align data before iio_push_to_buffers()
  */
 struct st_lsm6dsx_hw {
@@ -427,7 +431,6 @@ struct st_lsm6dsx_hw {
 
 	const struct st_lsm6dsx_settings *settings;
 
-	struct iio_mount_matrix orientation;
 	/* Ensure natural alignment of buffer elements */
 	struct {
 		__le16 channels[3];
@@ -511,9 +514,8 @@ st_lsm6dsx_get_mount_matrix(const struct iio_dev *iio_dev,
 			    const struct iio_chan_spec *chan)
 {
 	struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev);
-	struct st_lsm6dsx_hw *hw = sensor->hw;
 
-	return &hw->orientation;
+	return &sensor->orientation;
 }
 
 static inline int
@@ -533,4 +535,10 @@ struct iio_chan_spec_ext_info __maybe_unused st_lsm6dsx_accel_ext_info[] = {
 	{ }
 };
 
+static const
+struct iio_chan_spec_ext_info __maybe_unused st_lsm6dsx_gyro_ext_info[] = {
+	IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, st_lsm6dsx_get_mount_matrix),
+	{ }
+};
+
 #endif /* ST_LSM6DSX_H */
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
index 3f6060c64f32..15c7184a1895 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
@@ -2359,6 +2359,9 @@ static struct iio_dev *st_lsm6dsx_alloc_iiodev(struct st_lsm6dsx_hw *hw,
 	sensor->gain = hw->settings->fs_table[id].fs_avl[0].gain;
 	sensor->watermark = 1;
 
+	if (iio_read_mount_matrix(hw->dev, &sensor->orientation))
+		return NULL;
+
 	switch (id) {
 	case ST_LSM6DSX_ID_ACC:
 		iio_dev->info = &st_lsm6dsx_acc_info;
@@ -2676,10 +2679,6 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
 			return err;
 	}
 
-	err = iio_read_mount_matrix(hw->dev, &hw->orientation);
-	if (err)
-		return err;
-
 	for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {
 		if (!hw->iio_devs[i])
 			continue;

> > 
> > Some more info :
> > 
> > I have backported  drivers/iio/imu/st_lsm6dsx to linux-4.9 in order
> > to drive a ism330dlc imu on a custom board.  The chip is correctly
> > detected and two devices are created in /sys/bus/iio/devices/
> > 
> > the first one (where name is 'ism330dlc_gyro') has the following entries :
> > 
> >  me@proto4:~$ ls /sys/bus/iio/devices/iio\:device1/
> >  buffer                      in_anglvel_x_raw  sampling_frequency
> >  current_timestamp_clock     in_anglvel_y_raw  sampling_frequency_available
> >  dev                         in_anglvel_z_raw  scan_elements
> >  in_anglvel_scale            name              subsystem
> >  in_anglvel_scale_available  power             uevent
> >  me@proto4:~$
> > 
> > the second one (where name is 'ism330dlc_accel') has those entries :
> > 
> >  me@proto4:~$ ls /sys/bus/iio/devices/iio\:device2
> >  buffer                    in_accel_x_raw  sampling_frequency
> >  current_timestamp_clock   in_accel_y_raw  sampling_frequency_available
> >  dev                       in_accel_z_raw  scan_elements
> >  events                    mount_matrix    subsystem
> >  in_accel_scale            name            uevent
> >  in_accel_scale_available  power
> >  me@proto4:~$
> > 
> > The 'mount_matrix' entry is only present in the 'ism330dlc_accel' device
> > but not in the 'ism330dlc_gyro' device.
> > 
> > On a similar board, but with mpu9250 imu, I get only one iio:deviceX
> > entry but with two *mount_matrix entries : 
> > 
> > 	in_accel_mount_matrix
> > 	in_anglvel_mount_matrix
> > 
> > In both cases, I would have expected only one 'iio:deviceX' entry with
> > only one 'mount_matrix' entry.
> 
> There are multiple devices because the driver predates the addition
> of multiple buffer support to IIO and IIRC is capable of producing data
> at different sampling rates for the accelerometer and the gyros.
> Hence when it was implemented the only choice was to register multiple
> devices in order to get the multiple buffers. It's ABI now so we can't
> fix it in an old driver unfortunately.  We'd do this differently today..
> 
> The double mount_matrix for the mpu9250 is a little odd and I can't
> immediately spot why that one is happening.
> 
> 
> > 
> > Best regards
> > 
> > Philippe
> > 
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

      parent reply	other threads:[~2023-01-12 10:16 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-11 12:09 sysfs mount_matrix for st_lsm6dsx gyro Philippe De Muyter
2023-01-11 17:17 ` Jonathan Cameron
2023-01-12  9:51   ` Lorenzo Bianconi
2023-01-12 11:27     ` Philippe De Muyter
2023-01-12 11:32       ` Lorenzo Bianconi
2023-01-12 15:19         ` Jonathan Cameron
2023-01-13 14:45         ` Philippe De Muyter
2023-01-12 10:12   ` Lorenzo Bianconi [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y7/dJDbHXtlid8SD@lore-desk \
    --to=lorenzo@kernel.org \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=phdm@macq.eu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox