drivers:iio:stm:imu:st_ism330dhcx: add module_id sysfs attribute

This attribute has been added in order to support multiple sensors in
a platform.
If two sensors are used, they must use different ids.

commit 82c65e1894 ("drivers:iio:stm:imu:lsm6dsox: add module_id sysfs attribute")

Signed-off-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Mario Tesi <mario.tesi@st.com>
Change-Id: I35f689d3459c1faf90eff8c96bbd447dbebcfd71
Reviewed-on: https://gerrit.st.com/c/linuxandroidopen/stm-ldd-iio/+/279233
Tested-by: CITOOLS <MDG-smet-aci-reviews@list.st.com>
This commit is contained in:
Mario Tesi 2022-12-05 15:28:42 +01:00 committed by Denis CIOCCA
parent 2d41ae5862
commit 453586143a
4 changed files with 50 additions and 0 deletions

View File

@ -26,6 +26,11 @@ Optional properties for all bus drivers:
Refer to interrupt-controller/interrupts.txt for generic interrupt
client node bindings.
- st,module_id: module identifier.
This is used by user-space to identify which devices
are part of the same module (particularly important for
supporting multiple sensors of the same type).
Example for an spi device node:
ism330dhcx-imu@0 {
@ -34,5 +39,6 @@ ism330dhcx-imu@0 {
spi-max-frequency = <1000000>;
interrupt-parent = <&gpio0>;
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
st,module_id = <5>;
st,int-pin = <1>;
};

View File

@ -428,6 +428,7 @@ struct st_ism330dhcx_sensor {
* delta_ts: Delta time between two consecutive interrupts.
* delta_hw_ts:
* ts: Latest timestamp from irq handler.
* @module_id: identify iio devices of the same sensor module.
* iio_devs: Pointers to acc/gyro iio_dev instances.
* tf: Transfer function structure used by I/O operations.
* tb: Transfer buffers used by SPI I/O operations.
@ -462,6 +463,7 @@ struct st_ism330dhcx_hw {
s64 tsample;
s64 delta_ts;
s64 ts;
u32 module_id;
struct iio_dev *iio_devs[ST_ISM330DHCX_ID_MAX];
@ -558,6 +560,10 @@ ssize_t st_ism330dhcx_get_watermark(struct device *dev,
ssize_t st_ism330dhcx_set_watermark(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t size);
ssize_t st_ism330dhcx_get_module_id(struct device *dev,
struct device_attribute *attr,
char *buf);
int st_ism330dhcx_set_page_access(struct st_ism330dhcx_hw *hw, u8 mask, u8 data);
int st_ism330dhcx_suspend_fifo(struct st_ism330dhcx_hw *hw);
int st_ism330dhcx_set_fifo_mode(struct st_ism330dhcx_hw *hw,

View File

@ -1039,6 +1039,17 @@ static int st_ism330dhcx_write_raw_get_fmt(struct iio_dev *indio_dev,
return -EINVAL;
}
ssize_t st_ism330dhcx_get_module_id(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct iio_dev *iio_dev = dev_get_drvdata(dev);
struct st_ism330dhcx_sensor *sensor = iio_priv(iio_dev);
struct st_ism330dhcx_hw *hw = sensor->hw;
return scnprintf(buf, PAGE_SIZE, "%u\n", hw->module_id);
}
static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(st_ism330dhcx_sysfs_sampling_frequency_avail);
static IIO_DEVICE_ATTR(in_accel_scale_available, 0444,
st_ism330dhcx_sysfs_scale_avail, NULL, 0);
@ -1053,6 +1064,7 @@ static IIO_DEVICE_ATTR(hwfifo_watermark, 0644, st_ism330dhcx_get_watermark,
st_ism330dhcx_set_watermark, 0);
static IIO_DEVICE_ATTR(reset_counter, 0200, NULL,
st_ism330dhcx_sysfs_reset_step_counter, 0);
static IIO_DEVICE_ATTR(module_id, 0444, st_ism330dhcx_get_module_id, NULL, 0);
static struct attribute *st_ism330dhcx_acc_attributes[] = {
&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
@ -1060,6 +1072,7 @@ static struct attribute *st_ism330dhcx_acc_attributes[] = {
&iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_flush.dev_attr.attr,
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1084,6 +1097,7 @@ static struct attribute *st_ism330dhcx_gyro_attributes[] = {
&iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_flush.dev_attr.attr,
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1104,6 +1118,7 @@ static struct attribute *st_ism330dhcx_temp_attributes[] = {
&iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_flush.dev_attr.attr,
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1123,6 +1138,7 @@ static struct attribute *st_ism330dhcx_step_counter_attributes[] = {
&iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_reset_counter.dev_attr.attr,
&iio_dev_attr_hwfifo_flush.dev_attr.attr,
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1135,6 +1151,7 @@ static const struct iio_info st_ism330dhcx_step_counter_info = {
};
static struct attribute *st_ism330dhcx_step_detector_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1149,6 +1166,7 @@ static const struct iio_info st_ism330dhcx_step_detector_info = {
};
static struct attribute *st_ism330dhcx_sign_motion_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1163,6 +1181,7 @@ static const struct iio_info st_ism330dhcx_sign_motion_info = {
};
static struct attribute *st_ism330dhcx_tilt_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1177,6 +1196,7 @@ static const struct iio_info st_ism330dhcx_tilt_info = {
};
static struct attribute *st_ism330dhcx_glance_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1191,6 +1211,7 @@ static const struct iio_info st_ism330dhcx_glance_info = {
};
static struct attribute *st_ism330dhcx_motion_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1205,6 +1226,7 @@ static const struct iio_info st_ism330dhcx_motion_info = {
};
static struct attribute *st_ism330dhcx_no_motion_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1219,6 +1241,7 @@ static const struct iio_info st_ism330dhcx_no_motion_info = {
};
static struct attribute *st_ism330dhcx_wakeup_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1233,6 +1256,7 @@ static const struct iio_info st_ism330dhcx_wakeup_info = {
};
static struct attribute *st_ism330dhcx_pickup_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1247,6 +1271,7 @@ static const struct iio_info st_ism330dhcx_pickup_info = {
};
static struct attribute *st_ism330dhcx_orientation_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1259,6 +1284,7 @@ static const struct iio_info st_ism330dhcx_orientation_info = {
};
static struct attribute *st_ism330dhcx_wrist_attributes[] = {
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};
@ -1638,6 +1664,14 @@ static struct iio_dev *st_ism330dhcx_alloc_iiodev(struct st_ism330dhcx_hw *hw,
return iio_dev;
}
static void st_ism330dhcx_get_properties(struct st_ism330dhcx_hw *hw)
{
if (device_property_read_u32(hw->dev, "st,module_id",
&hw->module_id)) {
hw->module_id = 1;
}
}
/**
* Probe device function
* Implements [MODULE] feature for Power Management
@ -1671,6 +1705,8 @@ int st_ism330dhcx_probe(struct device *dev, int irq,
if (err < 0)
return err;
st_ism330dhcx_get_properties(hw);
err = st_ism330dhcx_get_odr_calibration(hw);
if (err < 0)
return err;

View File

@ -819,6 +819,7 @@ static IIO_DEVICE_ATTR(hwfifo_watermark_max, 0444,
static IIO_DEVICE_ATTR(hwfifo_flush, 0200, NULL, st_ism330dhcx_flush_fifo, 0);
static IIO_DEVICE_ATTR(hwfifo_watermark, 0644, st_ism330dhcx_get_watermark,
st_ism330dhcx_set_watermark, 0);
static IIO_DEVICE_ATTR(module_id, 0444, st_ism330dhcx_get_module_id, NULL, 0);
static struct attribute *st_ism330dhcx_ext_attributes[] = {
&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
@ -826,6 +827,7 @@ static struct attribute *st_ism330dhcx_ext_attributes[] = {
&iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_flush.dev_attr.attr,
&iio_dev_attr_module_id.dev_attr.attr,
NULL,
};