1 // SPDX-License-Identifier: GPL-2.0-only
3 * STMicroelectronics accelerometers driver
5 * Copyright 2012-2013 STMicroelectronics Inc.
7 * Denis Ciocca <denis.ciocca@st.com>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/slab.h>
13 #include <linux/acpi.h>
14 #include <linux/errno.h>
15 #include <linux/types.h>
16 #include <linux/interrupt.h>
17 #include <linux/i2c.h>
18 #include <linux/irq.h>
19 #include <linux/iio/iio.h>
20 #include <linux/iio/sysfs.h>
21 #include <linux/iio/trigger.h>
22 #include <linux/iio/buffer.h>
24 #include <linux/iio/common/st_sensors.h>
27 #define ST_ACCEL_NUMBER_DATA_CHANNELS 3
29 /* DEFAULT VALUE FOR SENSORS */
30 #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR 0x28
31 #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR 0x2a
32 #define ST_ACCEL_DEFAULT_OUT_Z_L_ADDR 0x2c
35 #define ST_ACCEL_FS_AVL_2G 2
36 #define ST_ACCEL_FS_AVL_4G 4
37 #define ST_ACCEL_FS_AVL_6G 6
38 #define ST_ACCEL_FS_AVL_8G 8
39 #define ST_ACCEL_FS_AVL_16G 16
40 #define ST_ACCEL_FS_AVL_100G 100
41 #define ST_ACCEL_FS_AVL_200G 200
42 #define ST_ACCEL_FS_AVL_400G 400
44 static const struct iio_mount_matrix *
45 st_accel_get_mount_matrix(const struct iio_dev *indio_dev,
46 const struct iio_chan_spec *chan)
48 struct st_sensor_data *adata = iio_priv(indio_dev);
50 return &adata->mount_matrix;
53 static const struct iio_chan_spec_ext_info st_accel_mount_matrix_ext_info[] = {
54 IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, st_accel_get_mount_matrix),
58 static const struct iio_chan_spec st_accel_8bit_channels[] = {
59 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
60 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
61 ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
62 ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1,
63 st_accel_mount_matrix_ext_info),
64 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
65 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
66 ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
67 ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1,
68 st_accel_mount_matrix_ext_info),
69 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
70 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
71 ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
72 ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1,
73 st_accel_mount_matrix_ext_info),
74 IIO_CHAN_SOFT_TIMESTAMP(3)
77 static const struct iio_chan_spec st_accel_12bit_channels[] = {
78 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
79 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
80 ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
81 ST_ACCEL_DEFAULT_OUT_X_L_ADDR,
82 st_accel_mount_matrix_ext_info),
83 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
84 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
85 ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
86 ST_ACCEL_DEFAULT_OUT_Y_L_ADDR,
87 st_accel_mount_matrix_ext_info),
88 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
89 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
90 ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
91 ST_ACCEL_DEFAULT_OUT_Z_L_ADDR,
92 st_accel_mount_matrix_ext_info),
93 IIO_CHAN_SOFT_TIMESTAMP(3)
96 static const struct iio_chan_spec st_accel_16bit_channels[] = {
97 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
98 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
99 ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
100 ST_ACCEL_DEFAULT_OUT_X_L_ADDR,
101 st_accel_mount_matrix_ext_info),
102 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
103 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
104 ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
105 ST_ACCEL_DEFAULT_OUT_Y_L_ADDR,
106 st_accel_mount_matrix_ext_info),
107 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
108 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
109 ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
110 ST_ACCEL_DEFAULT_OUT_Z_L_ADDR,
111 st_accel_mount_matrix_ext_info),
112 IIO_CHAN_SOFT_TIMESTAMP(3)
115 static const struct st_sensor_settings st_accel_sensors_settings[] = {
118 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
119 .sensors_supported = {
120 [0] = LIS3DH_ACCEL_DEV_NAME,
121 [1] = LSM303DLHC_ACCEL_DEV_NAME,
122 [2] = LSM330D_ACCEL_DEV_NAME,
123 [3] = LSM330DL_ACCEL_DEV_NAME,
124 [4] = LSM330DLC_ACCEL_DEV_NAME,
125 [5] = LSM303AGR_ACCEL_DEV_NAME,
126 [6] = LIS2DH12_ACCEL_DEV_NAME,
127 [7] = LIS3DE_ACCEL_DEV_NAME,
129 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
134 { .hz = 1, .value = 0x01, },
135 { .hz = 10, .value = 0x02, },
136 { .hz = 25, .value = 0x03, },
137 { .hz = 50, .value = 0x04, },
138 { .hz = 100, .value = 0x05, },
139 { .hz = 200, .value = 0x06, },
140 { .hz = 400, .value = 0x07, },
141 { .hz = 1600, .value = 0x08, },
147 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
150 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
151 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
158 .num = ST_ACCEL_FS_AVL_2G,
160 .gain = IIO_G_TO_M_S_2(1000),
163 .num = ST_ACCEL_FS_AVL_4G,
165 .gain = IIO_G_TO_M_S_2(2000),
168 .num = ST_ACCEL_FS_AVL_8G,
170 .gain = IIO_G_TO_M_S_2(4000),
173 .num = ST_ACCEL_FS_AVL_16G,
175 .gain = IIO_G_TO_M_S_2(12000),
191 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
199 .multi_read_bit = true,
204 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
205 .sensors_supported = {
206 [0] = LIS331DLH_ACCEL_DEV_NAME,
207 [1] = LSM303DL_ACCEL_DEV_NAME,
208 [2] = LSM303DLH_ACCEL_DEV_NAME,
209 [3] = LSM303DLM_ACCEL_DEV_NAME,
211 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
216 { .hz = 50, .value = 0x00, },
217 { .hz = 100, .value = 0x01, },
218 { .hz = 400, .value = 0x02, },
219 { .hz = 1000, .value = 0x03, },
225 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
226 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
229 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
230 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
237 .num = ST_ACCEL_FS_AVL_2G,
239 .gain = IIO_G_TO_M_S_2(1000),
242 .num = ST_ACCEL_FS_AVL_4G,
244 .gain = IIO_G_TO_M_S_2(2000),
247 .num = ST_ACCEL_FS_AVL_8G,
249 .gain = IIO_G_TO_M_S_2(3900),
273 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
281 .multi_read_bit = true,
286 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
287 .sensors_supported = {
288 [0] = LSM330_ACCEL_DEV_NAME,
290 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
295 { .hz = 3, .value = 0x01, },
296 { .hz = 6, .value = 0x02, },
297 { .hz = 12, .value = 0x03, },
298 { .hz = 25, .value = 0x04, },
299 { .hz = 50, .value = 0x05, },
300 { .hz = 100, .value = 0x06, },
301 { .hz = 200, .value = 0x07, },
302 { .hz = 400, .value = 0x08, },
303 { .hz = 800, .value = 0x09, },
304 { .hz = 1600, .value = 0x0a, },
310 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
313 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
314 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
321 .num = ST_ACCEL_FS_AVL_2G,
323 .gain = IIO_G_TO_M_S_2(61),
326 .num = ST_ACCEL_FS_AVL_4G,
328 .gain = IIO_G_TO_M_S_2(122),
331 .num = ST_ACCEL_FS_AVL_6G,
333 .gain = IIO_G_TO_M_S_2(183),
336 .num = ST_ACCEL_FS_AVL_8G,
338 .gain = IIO_G_TO_M_S_2(244),
341 .num = ST_ACCEL_FS_AVL_16G,
343 .gain = IIO_G_TO_M_S_2(732),
359 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
371 .multi_read_bit = false,
376 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
377 .sensors_supported = {
378 [0] = LIS3LV02DL_ACCEL_DEV_NAME,
380 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
383 .mask = 0x30, /* DF1 and DF0 */
385 { .hz = 40, .value = 0x00, },
386 { .hz = 160, .value = 0x01, },
387 { .hz = 640, .value = 0x02, },
388 { .hz = 2560, .value = 0x03, },
394 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
395 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
398 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
399 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
406 .num = ST_ACCEL_FS_AVL_2G,
408 .gain = IIO_G_TO_M_S_2(1000),
411 .num = ST_ACCEL_FS_AVL_6G,
413 .gain = IIO_G_TO_M_S_2(3000),
422 * Data Alignment Setting - needs to be set to get
423 * left-justified data like all other sensors.
435 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
443 .multi_read_bit = true,
444 .bootime = 2, /* guess */
448 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
449 .sensors_supported = {
450 [0] = LIS331DL_ACCEL_DEV_NAME,
452 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
457 { .hz = 100, .value = 0x00, },
458 { .hz = 400, .value = 0x01, },
464 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
465 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
468 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
469 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
475 * TODO: check these resulting gain settings, these are
476 * not in the datsheet
480 .num = ST_ACCEL_FS_AVL_2G,
482 .gain = IIO_G_TO_M_S_2(18000),
485 .num = ST_ACCEL_FS_AVL_8G,
487 .gain = IIO_G_TO_M_S_2(72000),
507 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
515 .multi_read_bit = false,
516 .bootime = 2, /* guess */
520 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
521 .sensors_supported = {
522 [0] = H3LIS331DL_ACCEL_DEV_NAME,
524 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
529 { .hz = 50, .value = 0x00, },
530 { .hz = 100, .value = 0x01, },
531 { .hz = 400, .value = 0x02, },
532 { .hz = 1000, .value = 0x03, },
538 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
539 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
542 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
543 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
550 .num = ST_ACCEL_FS_AVL_100G,
552 .gain = IIO_G_TO_M_S_2(49000),
555 .num = ST_ACCEL_FS_AVL_200G,
557 .gain = IIO_G_TO_M_S_2(98000),
560 .num = ST_ACCEL_FS_AVL_400G,
562 .gain = IIO_G_TO_M_S_2(195000),
586 .multi_read_bit = true,
590 /* No WAI register present */
591 .sensors_supported = {
592 [0] = LIS3L02DQ_ACCEL_DEV_NAME,
594 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
599 { .hz = 280, .value = 0x00, },
600 { .hz = 560, .value = 0x01, },
601 { .hz = 1120, .value = 0x02, },
602 { .hz = 4480, .value = 0x03, },
608 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
609 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
612 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
613 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
618 .num = ST_ACCEL_FS_AVL_2G,
619 .gain = IIO_G_TO_M_S_2(488),
624 * The part has a BDU bit but if set the data is never
625 * updated so don't set it.
635 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
643 .multi_read_bit = false,
648 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
649 .sensors_supported = {
650 [0] = LNG2DM_ACCEL_DEV_NAME,
652 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
657 { .hz = 1, .value = 0x01, },
658 { .hz = 10, .value = 0x02, },
659 { .hz = 25, .value = 0x03, },
660 { .hz = 50, .value = 0x04, },
661 { .hz = 100, .value = 0x05, },
662 { .hz = 200, .value = 0x06, },
663 { .hz = 400, .value = 0x07, },
664 { .hz = 1600, .value = 0x08, },
670 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
673 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
674 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
681 .num = ST_ACCEL_FS_AVL_2G,
683 .gain = IIO_G_TO_M_S_2(15600),
686 .num = ST_ACCEL_FS_AVL_4G,
688 .gain = IIO_G_TO_M_S_2(31200),
691 .num = ST_ACCEL_FS_AVL_8G,
693 .gain = IIO_G_TO_M_S_2(62500),
696 .num = ST_ACCEL_FS_AVL_16G,
698 .gain = IIO_G_TO_M_S_2(187500),
710 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
718 .multi_read_bit = true,
723 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
724 .sensors_supported = {
725 [0] = LIS2DW12_ACCEL_DEV_NAME,
727 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
732 { .hz = 1, .value = 0x01, },
733 { .hz = 12, .value = 0x02, },
734 { .hz = 25, .value = 0x03, },
735 { .hz = 50, .value = 0x04, },
736 { .hz = 100, .value = 0x05, },
737 { .hz = 200, .value = 0x06, },
743 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
750 .num = ST_ACCEL_FS_AVL_2G,
752 .gain = IIO_G_TO_M_S_2(976),
755 .num = ST_ACCEL_FS_AVL_4G,
757 .gain = IIO_G_TO_M_S_2(1952),
760 .num = ST_ACCEL_FS_AVL_8G,
762 .gain = IIO_G_TO_M_S_2(3904),
765 .num = ST_ACCEL_FS_AVL_16G,
767 .gain = IIO_G_TO_M_S_2(7808),
791 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
799 .multi_read_bit = false,
804 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
805 .sensors_supported = {
806 [0] = LIS3DHH_ACCEL_DEV_NAME,
808 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
810 /* just ODR = 1100Hz available */
812 { .hz = 1100, .value = 0x00, },
818 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
819 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
824 .num = ST_ACCEL_FS_AVL_2G,
825 .gain = IIO_G_TO_M_S_2(76),
847 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
851 .multi_read_bit = false,
856 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
857 .sensors_supported = {
858 [0] = LIS2DE12_ACCEL_DEV_NAME,
860 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
865 { .hz = 1, .value = 0x01, },
866 { .hz = 10, .value = 0x02, },
867 { .hz = 25, .value = 0x03, },
868 { .hz = 50, .value = 0x04, },
869 { .hz = 100, .value = 0x05, },
870 { .hz = 200, .value = 0x06, },
871 { .hz = 400, .value = 0x07, },
872 { .hz = 1620, .value = 0x08, },
873 { .hz = 5376, .value = 0x09, },
879 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
882 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
883 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
890 .num = ST_ACCEL_FS_AVL_2G,
892 .gain = IIO_G_TO_M_S_2(15600),
895 .num = ST_ACCEL_FS_AVL_4G,
897 .gain = IIO_G_TO_M_S_2(31200),
900 .num = ST_ACCEL_FS_AVL_8G,
902 .gain = IIO_G_TO_M_S_2(62500),
905 .num = ST_ACCEL_FS_AVL_16G,
907 .gain = IIO_G_TO_M_S_2(187500),
919 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
927 .multi_read_bit = true,
932 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
933 .sensors_supported = {
934 [0] = LIS2HH12_ACCEL_DEV_NAME,
936 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
941 { .hz = 10, .value = 0x01, },
942 { .hz = 50, .value = 0x02, },
943 { .hz = 100, .value = 0x03, },
944 { .hz = 200, .value = 0x04, },
945 { .hz = 400, .value = 0x05, },
946 { .hz = 800, .value = 0x06, },
952 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
955 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
956 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
963 .num = ST_ACCEL_FS_AVL_2G,
965 .gain = IIO_G_TO_M_S_2(61),
968 .num = ST_ACCEL_FS_AVL_4G,
970 .gain = IIO_G_TO_M_S_2(122),
973 .num = ST_ACCEL_FS_AVL_8G,
975 .gain = IIO_G_TO_M_S_2(244),
995 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
1003 .multi_read_bit = true,
1008 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
1009 .sensors_supported = {
1010 [0] = LSM9DS0_IMU_DEV_NAME,
1012 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
1015 .mask = GENMASK(7, 4),
1031 .mask = GENMASK(7, 4),
1032 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
1035 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
1036 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
1040 .mask = GENMASK(5, 3),
1043 .num = ST_ACCEL_FS_AVL_2G,
1045 .gain = IIO_G_TO_M_S_2(61),
1048 .num = ST_ACCEL_FS_AVL_4G,
1050 .gain = IIO_G_TO_M_S_2(122),
1053 .num = ST_ACCEL_FS_AVL_6G,
1055 .gain = IIO_G_TO_M_S_2(183),
1058 .num = ST_ACCEL_FS_AVL_8G,
1060 .gain = IIO_G_TO_M_S_2(244),
1063 .num = ST_ACCEL_FS_AVL_16G,
1065 .gain = IIO_G_TO_M_S_2(732),
1083 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
1084 .mask = GENMASK(2, 0),
1091 .multi_read_bit = true,
1096 /* Default accel DRDY is available on INT1 pin */
1097 static const struct st_sensors_platform_data default_accel_pdata = {
1101 static int st_accel_read_raw(struct iio_dev *indio_dev,
1102 struct iio_chan_spec const *ch, int *val,
1103 int *val2, long mask)
1106 struct st_sensor_data *adata = iio_priv(indio_dev);
1109 case IIO_CHAN_INFO_RAW:
1110 err = st_sensors_read_info_raw(indio_dev, ch, val);
1115 case IIO_CHAN_INFO_SCALE:
1116 *val = adata->current_fullscale->gain / 1000000;
1117 *val2 = adata->current_fullscale->gain % 1000000;
1118 return IIO_VAL_INT_PLUS_MICRO;
1119 case IIO_CHAN_INFO_SAMP_FREQ:
1130 static int st_accel_write_raw(struct iio_dev *indio_dev,
1131 struct iio_chan_spec const *chan, int val, int val2, long mask)
1136 case IIO_CHAN_INFO_SCALE: {
1139 gain = val * 1000000 + val2;
1140 err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
1143 case IIO_CHAN_INFO_SAMP_FREQ:
1146 mutex_lock(&indio_dev->mlock);
1147 err = st_sensors_set_odr(indio_dev, val);
1148 mutex_unlock(&indio_dev->mlock);
1157 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
1158 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
1160 static struct attribute *st_accel_attributes[] = {
1161 &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
1162 &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
1166 static const struct attribute_group st_accel_attribute_group = {
1167 .attrs = st_accel_attributes,
1170 static const struct iio_info accel_info = {
1171 .attrs = &st_accel_attribute_group,
1172 .read_raw = &st_accel_read_raw,
1173 .write_raw = &st_accel_write_raw,
1174 .debugfs_reg_access = &st_sensors_debugfs_reg_access,
1177 #ifdef CONFIG_IIO_TRIGGER
1178 static const struct iio_trigger_ops st_accel_trigger_ops = {
1179 .set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
1180 .validate_device = st_sensors_validate_device,
1182 #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
1184 #define ST_ACCEL_TRIGGER_OPS NULL
1188 /* Read ST-specific _ONT orientation data from ACPI and generate an
1189 * appropriate mount matrix.
1191 static int apply_acpi_orientation(struct iio_dev *indio_dev)
1193 struct st_sensor_data *adata = iio_priv(indio_dev);
1194 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
1195 struct acpi_device *adev;
1196 union acpi_object *ont;
1197 union acpi_object *elements;
1202 int final_ont[3][3] = { { 0 }, };
1204 /* For some reason, ST's _ONT translation does not apply directly
1205 * to the data read from the sensor. Another translation must be
1206 * performed first, as described by the matrix below. Perhaps
1207 * ST required this specific translation for the first product
1208 * where the device was mounted?
1210 const int default_ont[3][3] = {
1217 adev = ACPI_COMPANION(adata->dev);
1221 /* Read _ONT data, which should be a package of 6 integers. */
1222 status = acpi_evaluate_object(adev->handle, "_ONT", NULL, &buffer);
1223 if (status == AE_NOT_FOUND) {
1225 } else if (ACPI_FAILURE(status)) {
1226 dev_warn(&indio_dev->dev, "failed to execute _ONT: %d\n",
1231 ont = buffer.pointer;
1232 if (ont->type != ACPI_TYPE_PACKAGE || ont->package.count != 6)
1235 /* The first 3 integers provide axis order information.
1236 * e.g. 0 1 2 would indicate normal X,Y,Z ordering.
1237 * e.g. 1 0 2 indicates that data arrives in order Y,X,Z.
1239 elements = ont->package.elements;
1240 for (i = 0; i < 3; i++) {
1241 if (elements[i].type != ACPI_TYPE_INTEGER)
1244 val = elements[i].integer.value;
1248 /* Avoiding full matrix multiplication, we simply reorder the
1249 * columns in the default_ont matrix according to the
1250 * ordering provided by _ONT.
1252 final_ont[0][i] = default_ont[0][val];
1253 final_ont[1][i] = default_ont[1][val];
1254 final_ont[2][i] = default_ont[2][val];
1257 /* The final 3 integers provide sign flip information.
1258 * 0 means no change, 1 means flip.
1259 * e.g. 0 0 1 means that Z data should be sign-flipped.
1260 * This is applied after the axis reordering from above.
1263 for (i = 0; i < 3; i++) {
1264 if (elements[i].type != ACPI_TYPE_INTEGER)
1267 val = elements[i].integer.value;
1268 if (val != 0 && val != 1)
1273 /* Flip the values in the indicated column */
1274 final_ont[0][i] *= -1;
1275 final_ont[1][i] *= -1;
1276 final_ont[2][i] *= -1;
1279 /* Convert our integer matrix to a string-based iio_mount_matrix */
1280 for (i = 0; i < 3; i++) {
1281 for (j = 0; j < 3; j++) {
1282 int matrix_val = final_ont[i][j];
1285 switch (matrix_val) {
1298 adata->mount_matrix.rotation[i * 3 + j] = str_value;
1303 dev_info(&indio_dev->dev, "computed mount matrix from ACPI\n");
1306 kfree(buffer.pointer);
1308 dev_dbg(&indio_dev->dev,
1309 "failed to apply ACPI orientation data: %d\n", ret);
1313 #else /* !CONFIG_ACPI */
1314 static int apply_acpi_orientation(struct iio_dev *indio_dev)
1321 * st_accel_get_settings() - get sensor settings from device name
1322 * @name: device name buffer reference.
1324 * Return: valid reference on success, NULL otherwise.
1326 const struct st_sensor_settings *st_accel_get_settings(const char *name)
1328 int index = st_sensors_get_settings_index(name,
1329 st_accel_sensors_settings,
1330 ARRAY_SIZE(st_accel_sensors_settings));
1334 return &st_accel_sensors_settings[index];
1336 EXPORT_SYMBOL(st_accel_get_settings);
1338 int st_accel_common_probe(struct iio_dev *indio_dev)
1340 struct st_sensor_data *adata = iio_priv(indio_dev);
1341 struct st_sensors_platform_data *pdata = dev_get_platdata(adata->dev);
1344 indio_dev->modes = INDIO_DIRECT_MODE;
1345 indio_dev->info = &accel_info;
1347 err = st_sensors_verify_id(indio_dev);
1351 adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
1352 indio_dev->channels = adata->sensor_settings->ch;
1353 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
1356 * First try specific ACPI methods to retrieve orientation then try the
1359 err = apply_acpi_orientation(indio_dev);
1361 err = iio_read_mount_matrix(adata->dev, &adata->mount_matrix);
1366 adata->current_fullscale = &adata->sensor_settings->fs.fs_avl[0];
1367 adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
1370 pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
1372 err = st_sensors_init_sensor(indio_dev, pdata);
1376 err = st_accel_allocate_ring(indio_dev);
1380 if (adata->irq > 0) {
1381 err = st_sensors_allocate_trigger(indio_dev,
1382 ST_ACCEL_TRIGGER_OPS);
1384 goto st_accel_probe_trigger_error;
1387 err = iio_device_register(indio_dev);
1389 goto st_accel_device_register_error;
1391 dev_info(&indio_dev->dev, "registered accelerometer %s\n",
1396 st_accel_device_register_error:
1398 st_sensors_deallocate_trigger(indio_dev);
1399 st_accel_probe_trigger_error:
1400 st_accel_deallocate_ring(indio_dev);
1403 EXPORT_SYMBOL(st_accel_common_probe);
1405 void st_accel_common_remove(struct iio_dev *indio_dev)
1407 struct st_sensor_data *adata = iio_priv(indio_dev);
1409 iio_device_unregister(indio_dev);
1411 st_sensors_deallocate_trigger(indio_dev);
1413 st_accel_deallocate_ring(indio_dev);
1415 EXPORT_SYMBOL(st_accel_common_remove);
1417 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
1418 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
1419 MODULE_LICENSE("GPL v2");