0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/mutex.h>
0013 #include <linux/sysfs.h>
0014 #include <linux/slab.h>
0015 #include <linux/acpi.h>
0016 #include <linux/iio/iio.h>
0017 #include <linux/iio/sysfs.h>
0018 #include <linux/iio/trigger.h>
0019
0020 #include <linux/iio/common/st_sensors.h>
0021 #include "st_accel.h"
0022
0023 #define ST_ACCEL_NUMBER_DATA_CHANNELS 3
0024
0025
0026 #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR 0x28
0027 #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR 0x2a
0028 #define ST_ACCEL_DEFAULT_OUT_Z_L_ADDR 0x2c
0029
0030
0031 #define ST_ACCEL_FS_AVL_2G 2
0032 #define ST_ACCEL_FS_AVL_4G 4
0033 #define ST_ACCEL_FS_AVL_6G 6
0034 #define ST_ACCEL_FS_AVL_8G 8
0035 #define ST_ACCEL_FS_AVL_16G 16
0036 #define ST_ACCEL_FS_AVL_100G 100
0037 #define ST_ACCEL_FS_AVL_200G 200
0038 #define ST_ACCEL_FS_AVL_400G 400
0039
0040 static const struct iio_mount_matrix *
0041 st_accel_get_mount_matrix(const struct iio_dev *indio_dev,
0042 const struct iio_chan_spec *chan)
0043 {
0044 struct st_sensor_data *adata = iio_priv(indio_dev);
0045
0046 return &adata->mount_matrix;
0047 }
0048
0049 static const struct iio_chan_spec_ext_info st_accel_mount_matrix_ext_info[] = {
0050 IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, st_accel_get_mount_matrix),
0051 { }
0052 };
0053
0054 static const struct iio_chan_spec st_accel_8bit_channels[] = {
0055 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0056 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0057 ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
0058 ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1,
0059 st_accel_mount_matrix_ext_info),
0060 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0061 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0062 ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
0063 ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1,
0064 st_accel_mount_matrix_ext_info),
0065 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0066 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0067 ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
0068 ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1,
0069 st_accel_mount_matrix_ext_info),
0070 IIO_CHAN_SOFT_TIMESTAMP(3)
0071 };
0072
0073 static const struct iio_chan_spec st_accel_12bit_channels[] = {
0074 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0075 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0076 ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
0077 ST_ACCEL_DEFAULT_OUT_X_L_ADDR,
0078 st_accel_mount_matrix_ext_info),
0079 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0080 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0081 ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
0082 ST_ACCEL_DEFAULT_OUT_Y_L_ADDR,
0083 st_accel_mount_matrix_ext_info),
0084 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0085 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0086 ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
0087 ST_ACCEL_DEFAULT_OUT_Z_L_ADDR,
0088 st_accel_mount_matrix_ext_info),
0089 IIO_CHAN_SOFT_TIMESTAMP(3)
0090 };
0091
0092 static const struct iio_chan_spec st_accel_16bit_channels[] = {
0093 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0094 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0095 ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
0096 ST_ACCEL_DEFAULT_OUT_X_L_ADDR,
0097 st_accel_mount_matrix_ext_info),
0098 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0099 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0100 ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
0101 ST_ACCEL_DEFAULT_OUT_Y_L_ADDR,
0102 st_accel_mount_matrix_ext_info),
0103 ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
0104 BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
0105 ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
0106 ST_ACCEL_DEFAULT_OUT_Z_L_ADDR,
0107 st_accel_mount_matrix_ext_info),
0108 IIO_CHAN_SOFT_TIMESTAMP(3)
0109 };
0110
0111 static const struct st_sensor_settings st_accel_sensors_settings[] = {
0112 {
0113 .wai = 0x33,
0114 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0115 .sensors_supported = {
0116 [0] = LIS3DH_ACCEL_DEV_NAME,
0117 [1] = LSM303DLHC_ACCEL_DEV_NAME,
0118 [2] = LSM330D_ACCEL_DEV_NAME,
0119 [3] = LSM330DL_ACCEL_DEV_NAME,
0120 [4] = LSM330DLC_ACCEL_DEV_NAME,
0121 [5] = LSM303AGR_ACCEL_DEV_NAME,
0122 [6] = LIS2DH12_ACCEL_DEV_NAME,
0123 [7] = LIS3DE_ACCEL_DEV_NAME,
0124 },
0125 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
0126 .odr = {
0127 .addr = 0x20,
0128 .mask = 0xf0,
0129 .odr_avl = {
0130 { .hz = 1, .value = 0x01, },
0131 { .hz = 10, .value = 0x02, },
0132 { .hz = 25, .value = 0x03, },
0133 { .hz = 50, .value = 0x04, },
0134 { .hz = 100, .value = 0x05, },
0135 { .hz = 200, .value = 0x06, },
0136 { .hz = 400, .value = 0x07, },
0137 { .hz = 1600, .value = 0x08, },
0138 },
0139 },
0140 .pw = {
0141 .addr = 0x20,
0142 .mask = 0xf0,
0143 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0144 },
0145 .enable_axis = {
0146 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0147 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0148 },
0149 .fs = {
0150 .addr = 0x23,
0151 .mask = 0x30,
0152 .fs_avl = {
0153 [0] = {
0154 .num = ST_ACCEL_FS_AVL_2G,
0155 .value = 0x00,
0156 .gain = IIO_G_TO_M_S_2(1000),
0157 },
0158 [1] = {
0159 .num = ST_ACCEL_FS_AVL_4G,
0160 .value = 0x01,
0161 .gain = IIO_G_TO_M_S_2(2000),
0162 },
0163 [2] = {
0164 .num = ST_ACCEL_FS_AVL_8G,
0165 .value = 0x02,
0166 .gain = IIO_G_TO_M_S_2(4000),
0167 },
0168 [3] = {
0169 .num = ST_ACCEL_FS_AVL_16G,
0170 .value = 0x03,
0171 .gain = IIO_G_TO_M_S_2(12000),
0172 },
0173 },
0174 },
0175 .bdu = {
0176 .addr = 0x23,
0177 .mask = 0x80,
0178 },
0179 .drdy_irq = {
0180 .int1 = {
0181 .addr = 0x22,
0182 .mask = 0x10,
0183 },
0184 .addr_ihl = 0x25,
0185 .mask_ihl = 0x02,
0186 .stat_drdy = {
0187 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0188 .mask = 0x07,
0189 },
0190 },
0191 .sim = {
0192 .addr = 0x23,
0193 .value = BIT(0),
0194 },
0195 .multi_read_bit = true,
0196 .bootime = 2,
0197 },
0198 {
0199 .wai = 0x32,
0200 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0201 .sensors_supported = {
0202 [0] = LIS331DLH_ACCEL_DEV_NAME,
0203 [1] = LSM303DL_ACCEL_DEV_NAME,
0204 [2] = LSM303DLH_ACCEL_DEV_NAME,
0205 [3] = LSM303DLM_ACCEL_DEV_NAME,
0206 },
0207 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
0208 .odr = {
0209 .addr = 0x20,
0210 .mask = 0x18,
0211 .odr_avl = {
0212 { .hz = 50, .value = 0x00, },
0213 { .hz = 100, .value = 0x01, },
0214 { .hz = 400, .value = 0x02, },
0215 { .hz = 1000, .value = 0x03, },
0216 },
0217 },
0218 .pw = {
0219 .addr = 0x20,
0220 .mask = 0xe0,
0221 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
0222 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0223 },
0224 .enable_axis = {
0225 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0226 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0227 },
0228 .fs = {
0229 .addr = 0x23,
0230 .mask = 0x30,
0231 .fs_avl = {
0232 [0] = {
0233 .num = ST_ACCEL_FS_AVL_2G,
0234 .value = 0x00,
0235 .gain = IIO_G_TO_M_S_2(1000),
0236 },
0237 [1] = {
0238 .num = ST_ACCEL_FS_AVL_4G,
0239 .value = 0x01,
0240 .gain = IIO_G_TO_M_S_2(2000),
0241 },
0242 [2] = {
0243 .num = ST_ACCEL_FS_AVL_8G,
0244 .value = 0x03,
0245 .gain = IIO_G_TO_M_S_2(3900),
0246 },
0247 },
0248 },
0249 .bdu = {
0250 .addr = 0x23,
0251 .mask = 0x80,
0252 },
0253 .drdy_irq = {
0254 .int1 = {
0255 .addr = 0x22,
0256 .mask = 0x02,
0257 .addr_od = 0x22,
0258 .mask_od = 0x40,
0259 },
0260 .int2 = {
0261 .addr = 0x22,
0262 .mask = 0x10,
0263 .addr_od = 0x22,
0264 .mask_od = 0x40,
0265 },
0266 .addr_ihl = 0x22,
0267 .mask_ihl = 0x80,
0268 .stat_drdy = {
0269 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0270 .mask = 0x07,
0271 },
0272 },
0273 .sim = {
0274 .addr = 0x23,
0275 .value = BIT(0),
0276 },
0277 .multi_read_bit = true,
0278 .bootime = 2,
0279 },
0280 {
0281 .wai = 0x40,
0282 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0283 .sensors_supported = {
0284 [0] = LSM330_ACCEL_DEV_NAME,
0285 },
0286 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
0287 .odr = {
0288 .addr = 0x20,
0289 .mask = 0xf0,
0290 .odr_avl = {
0291 { .hz = 3, .value = 0x01, },
0292 { .hz = 6, .value = 0x02, },
0293 { .hz = 12, .value = 0x03, },
0294 { .hz = 25, .value = 0x04, },
0295 { .hz = 50, .value = 0x05, },
0296 { .hz = 100, .value = 0x06, },
0297 { .hz = 200, .value = 0x07, },
0298 { .hz = 400, .value = 0x08, },
0299 { .hz = 800, .value = 0x09, },
0300 { .hz = 1600, .value = 0x0a, },
0301 },
0302 },
0303 .pw = {
0304 .addr = 0x20,
0305 .mask = 0xf0,
0306 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0307 },
0308 .enable_axis = {
0309 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0310 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0311 },
0312 .fs = {
0313 .addr = 0x24,
0314 .mask = 0x38,
0315 .fs_avl = {
0316 [0] = {
0317 .num = ST_ACCEL_FS_AVL_2G,
0318 .value = 0x00,
0319 .gain = IIO_G_TO_M_S_2(61),
0320 },
0321 [1] = {
0322 .num = ST_ACCEL_FS_AVL_4G,
0323 .value = 0x01,
0324 .gain = IIO_G_TO_M_S_2(122),
0325 },
0326 [2] = {
0327 .num = ST_ACCEL_FS_AVL_6G,
0328 .value = 0x02,
0329 .gain = IIO_G_TO_M_S_2(183),
0330 },
0331 [3] = {
0332 .num = ST_ACCEL_FS_AVL_8G,
0333 .value = 0x03,
0334 .gain = IIO_G_TO_M_S_2(244),
0335 },
0336 [4] = {
0337 .num = ST_ACCEL_FS_AVL_16G,
0338 .value = 0x04,
0339 .gain = IIO_G_TO_M_S_2(732),
0340 },
0341 },
0342 },
0343 .bdu = {
0344 .addr = 0x20,
0345 .mask = 0x08,
0346 },
0347 .drdy_irq = {
0348 .int1 = {
0349 .addr = 0x23,
0350 .mask = 0x80,
0351 },
0352 .addr_ihl = 0x23,
0353 .mask_ihl = 0x40,
0354 .stat_drdy = {
0355 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0356 .mask = 0x07,
0357 },
0358 .ig1 = {
0359 .en_addr = 0x23,
0360 .en_mask = 0x08,
0361 },
0362 },
0363 .sim = {
0364 .addr = 0x24,
0365 .value = BIT(0),
0366 },
0367 .multi_read_bit = false,
0368 .bootime = 2,
0369 },
0370 {
0371 .wai = 0x3a,
0372 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0373 .sensors_supported = {
0374 [0] = LIS3LV02DL_ACCEL_DEV_NAME,
0375 },
0376 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
0377 .odr = {
0378 .addr = 0x20,
0379 .mask = 0x30,
0380 .odr_avl = {
0381 { .hz = 40, .value = 0x00, },
0382 { .hz = 160, .value = 0x01, },
0383 { .hz = 640, .value = 0x02, },
0384 { .hz = 2560, .value = 0x03, },
0385 },
0386 },
0387 .pw = {
0388 .addr = 0x20,
0389 .mask = 0xc0,
0390 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
0391 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0392 },
0393 .enable_axis = {
0394 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0395 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0396 },
0397 .fs = {
0398 .addr = 0x21,
0399 .mask = 0x80,
0400 .fs_avl = {
0401 [0] = {
0402 .num = ST_ACCEL_FS_AVL_2G,
0403 .value = 0x00,
0404 .gain = IIO_G_TO_M_S_2(1000),
0405 },
0406 [1] = {
0407 .num = ST_ACCEL_FS_AVL_6G,
0408 .value = 0x01,
0409 .gain = IIO_G_TO_M_S_2(3000),
0410 },
0411 },
0412 },
0413 .bdu = {
0414 .addr = 0x21,
0415 .mask = 0x40,
0416 },
0417
0418
0419
0420
0421 .das = {
0422 .addr = 0x21,
0423 .mask = 0x01,
0424 },
0425 .drdy_irq = {
0426 .int1 = {
0427 .addr = 0x21,
0428 .mask = 0x04,
0429 },
0430 .stat_drdy = {
0431 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0432 .mask = 0x07,
0433 },
0434 },
0435 .sim = {
0436 .addr = 0x21,
0437 .value = BIT(1),
0438 },
0439 .multi_read_bit = true,
0440 .bootime = 2,
0441 },
0442 {
0443 .wai = 0x3b,
0444 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0445 .sensors_supported = {
0446 [0] = LIS331DL_ACCEL_DEV_NAME,
0447 [1] = LIS302DL_ACCEL_DEV_NAME,
0448 },
0449 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
0450 .odr = {
0451 .addr = 0x20,
0452 .mask = 0x80,
0453 .odr_avl = {
0454 { .hz = 100, .value = 0x00, },
0455 { .hz = 400, .value = 0x01, },
0456 },
0457 },
0458 .pw = {
0459 .addr = 0x20,
0460 .mask = 0x40,
0461 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
0462 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0463 },
0464 .enable_axis = {
0465 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0466 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0467 },
0468 .fs = {
0469 .addr = 0x20,
0470 .mask = 0x20,
0471
0472
0473
0474
0475 .fs_avl = {
0476 [0] = {
0477 .num = ST_ACCEL_FS_AVL_2G,
0478 .value = 0x00,
0479 .gain = IIO_G_TO_M_S_2(18000),
0480 },
0481 [1] = {
0482 .num = ST_ACCEL_FS_AVL_8G,
0483 .value = 0x01,
0484 .gain = IIO_G_TO_M_S_2(72000),
0485 },
0486 },
0487 },
0488 .drdy_irq = {
0489 .int1 = {
0490 .addr = 0x22,
0491 .mask = 0x04,
0492 .addr_od = 0x22,
0493 .mask_od = 0x40,
0494 },
0495 .int2 = {
0496 .addr = 0x22,
0497 .mask = 0x20,
0498 .addr_od = 0x22,
0499 .mask_od = 0x40,
0500 },
0501 .addr_ihl = 0x22,
0502 .mask_ihl = 0x80,
0503 .stat_drdy = {
0504 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0505 .mask = 0x07,
0506 },
0507 },
0508 .sim = {
0509 .addr = 0x21,
0510 .value = BIT(7),
0511 },
0512 .multi_read_bit = false,
0513 .bootime = 2,
0514 },
0515 {
0516 .wai = 0x32,
0517 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0518 .sensors_supported = {
0519 [0] = H3LIS331DL_ACCEL_DEV_NAME,
0520 },
0521 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
0522 .odr = {
0523 .addr = 0x20,
0524 .mask = 0x18,
0525 .odr_avl = {
0526 { .hz = 50, .value = 0x00, },
0527 { .hz = 100, .value = 0x01, },
0528 { .hz = 400, .value = 0x02, },
0529 { .hz = 1000, .value = 0x03, },
0530 },
0531 },
0532 .pw = {
0533 .addr = 0x20,
0534 .mask = 0x20,
0535 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
0536 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0537 },
0538 .enable_axis = {
0539 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0540 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0541 },
0542 .fs = {
0543 .addr = 0x23,
0544 .mask = 0x30,
0545 .fs_avl = {
0546 [0] = {
0547 .num = ST_ACCEL_FS_AVL_100G,
0548 .value = 0x00,
0549 .gain = IIO_G_TO_M_S_2(49000),
0550 },
0551 [1] = {
0552 .num = ST_ACCEL_FS_AVL_200G,
0553 .value = 0x01,
0554 .gain = IIO_G_TO_M_S_2(98000),
0555 },
0556 [2] = {
0557 .num = ST_ACCEL_FS_AVL_400G,
0558 .value = 0x03,
0559 .gain = IIO_G_TO_M_S_2(195000),
0560 },
0561 },
0562 },
0563 .bdu = {
0564 .addr = 0x23,
0565 .mask = 0x80,
0566 },
0567 .drdy_irq = {
0568 .int1 = {
0569 .addr = 0x22,
0570 .mask = 0x02,
0571 },
0572 .int2 = {
0573 .addr = 0x22,
0574 .mask = 0x10,
0575 },
0576 .addr_ihl = 0x22,
0577 .mask_ihl = 0x80,
0578 },
0579 .sim = {
0580 .addr = 0x23,
0581 .value = BIT(0),
0582 },
0583 .multi_read_bit = true,
0584 .bootime = 2,
0585 },
0586 {
0587
0588 .sensors_supported = {
0589 [0] = LIS3L02DQ_ACCEL_DEV_NAME,
0590 },
0591 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
0592 .odr = {
0593 .addr = 0x20,
0594 .mask = 0x30,
0595 .odr_avl = {
0596 { .hz = 280, .value = 0x00, },
0597 { .hz = 560, .value = 0x01, },
0598 { .hz = 1120, .value = 0x02, },
0599 { .hz = 4480, .value = 0x03, },
0600 },
0601 },
0602 .pw = {
0603 .addr = 0x20,
0604 .mask = 0xc0,
0605 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
0606 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0607 },
0608 .enable_axis = {
0609 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0610 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0611 },
0612 .fs = {
0613 .fs_avl = {
0614 [0] = {
0615 .num = ST_ACCEL_FS_AVL_2G,
0616 .gain = IIO_G_TO_M_S_2(488),
0617 },
0618 },
0619 },
0620
0621
0622
0623
0624 .bdu = {
0625 },
0626 .drdy_irq = {
0627 .int1 = {
0628 .addr = 0x21,
0629 .mask = 0x04,
0630 },
0631 .stat_drdy = {
0632 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0633 .mask = 0x07,
0634 },
0635 },
0636 .sim = {
0637 .addr = 0x21,
0638 .value = BIT(1),
0639 },
0640 .multi_read_bit = false,
0641 .bootime = 2,
0642 },
0643 {
0644 .wai = 0x33,
0645 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0646 .sensors_supported = {
0647 [0] = LNG2DM_ACCEL_DEV_NAME,
0648 },
0649 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
0650 .odr = {
0651 .addr = 0x20,
0652 .mask = 0xf0,
0653 .odr_avl = {
0654 { .hz = 1, .value = 0x01, },
0655 { .hz = 10, .value = 0x02, },
0656 { .hz = 25, .value = 0x03, },
0657 { .hz = 50, .value = 0x04, },
0658 { .hz = 100, .value = 0x05, },
0659 { .hz = 200, .value = 0x06, },
0660 { .hz = 400, .value = 0x07, },
0661 { .hz = 1600, .value = 0x08, },
0662 },
0663 },
0664 .pw = {
0665 .addr = 0x20,
0666 .mask = 0xf0,
0667 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0668 },
0669 .enable_axis = {
0670 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0671 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0672 },
0673 .fs = {
0674 .addr = 0x23,
0675 .mask = 0x30,
0676 .fs_avl = {
0677 [0] = {
0678 .num = ST_ACCEL_FS_AVL_2G,
0679 .value = 0x00,
0680 .gain = IIO_G_TO_M_S_2(15600),
0681 },
0682 [1] = {
0683 .num = ST_ACCEL_FS_AVL_4G,
0684 .value = 0x01,
0685 .gain = IIO_G_TO_M_S_2(31200),
0686 },
0687 [2] = {
0688 .num = ST_ACCEL_FS_AVL_8G,
0689 .value = 0x02,
0690 .gain = IIO_G_TO_M_S_2(62500),
0691 },
0692 [3] = {
0693 .num = ST_ACCEL_FS_AVL_16G,
0694 .value = 0x03,
0695 .gain = IIO_G_TO_M_S_2(187500),
0696 },
0697 },
0698 },
0699 .drdy_irq = {
0700 .int1 = {
0701 .addr = 0x22,
0702 .mask = 0x10,
0703 },
0704 .addr_ihl = 0x25,
0705 .mask_ihl = 0x02,
0706 .stat_drdy = {
0707 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0708 .mask = 0x07,
0709 },
0710 },
0711 .sim = {
0712 .addr = 0x23,
0713 .value = BIT(0),
0714 },
0715 .multi_read_bit = true,
0716 .bootime = 2,
0717 },
0718 {
0719 .wai = 0x44,
0720 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0721 .sensors_supported = {
0722 [0] = LIS2DW12_ACCEL_DEV_NAME,
0723 },
0724 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
0725 .odr = {
0726 .addr = 0x20,
0727 .mask = 0xf0,
0728 .odr_avl = {
0729 { .hz = 1, .value = 0x01, },
0730 { .hz = 12, .value = 0x02, },
0731 { .hz = 25, .value = 0x03, },
0732 { .hz = 50, .value = 0x04, },
0733 { .hz = 100, .value = 0x05, },
0734 { .hz = 200, .value = 0x06, },
0735 },
0736 },
0737 .pw = {
0738 .addr = 0x20,
0739 .mask = 0xf0,
0740 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0741 },
0742 .fs = {
0743 .addr = 0x25,
0744 .mask = 0x30,
0745 .fs_avl = {
0746 [0] = {
0747 .num = ST_ACCEL_FS_AVL_2G,
0748 .value = 0x00,
0749 .gain = IIO_G_TO_M_S_2(976),
0750 },
0751 [1] = {
0752 .num = ST_ACCEL_FS_AVL_4G,
0753 .value = 0x01,
0754 .gain = IIO_G_TO_M_S_2(1952),
0755 },
0756 [2] = {
0757 .num = ST_ACCEL_FS_AVL_8G,
0758 .value = 0x02,
0759 .gain = IIO_G_TO_M_S_2(3904),
0760 },
0761 [3] = {
0762 .num = ST_ACCEL_FS_AVL_16G,
0763 .value = 0x03,
0764 .gain = IIO_G_TO_M_S_2(7808),
0765 },
0766 },
0767 },
0768 .bdu = {
0769 .addr = 0x21,
0770 .mask = 0x08,
0771 },
0772 .drdy_irq = {
0773 .int1 = {
0774 .addr = 0x23,
0775 .mask = 0x01,
0776 .addr_od = 0x22,
0777 .mask_od = 0x20,
0778 },
0779 .int2 = {
0780 .addr = 0x24,
0781 .mask = 0x01,
0782 .addr_od = 0x22,
0783 .mask_od = 0x20,
0784 },
0785 .addr_ihl = 0x22,
0786 .mask_ihl = 0x08,
0787 .stat_drdy = {
0788 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0789 .mask = 0x01,
0790 },
0791 },
0792 .sim = {
0793 .addr = 0x21,
0794 .value = BIT(0),
0795 },
0796 .multi_read_bit = false,
0797 .bootime = 2,
0798 },
0799 {
0800 .wai = 0x11,
0801 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0802 .sensors_supported = {
0803 [0] = LIS3DHH_ACCEL_DEV_NAME,
0804 },
0805 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
0806 .odr = {
0807
0808 .odr_avl = {
0809 { .hz = 1100, .value = 0x00, },
0810 },
0811 },
0812 .pw = {
0813 .addr = 0x20,
0814 .mask = 0x80,
0815 .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
0816 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0817 },
0818 .fs = {
0819 .fs_avl = {
0820 [0] = {
0821 .num = ST_ACCEL_FS_AVL_2G,
0822 .gain = IIO_G_TO_M_S_2(76),
0823 },
0824 },
0825 },
0826 .bdu = {
0827 .addr = 0x20,
0828 .mask = 0x01,
0829 },
0830 .drdy_irq = {
0831 .int1 = {
0832 .addr = 0x21,
0833 .mask = 0x80,
0834 .addr_od = 0x23,
0835 .mask_od = 0x04,
0836 },
0837 .int2 = {
0838 .addr = 0x22,
0839 .mask = 0x80,
0840 .addr_od = 0x23,
0841 .mask_od = 0x08,
0842 },
0843 .stat_drdy = {
0844 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0845 .mask = 0x07,
0846 },
0847 },
0848 .multi_read_bit = false,
0849 .bootime = 2,
0850 },
0851 {
0852 .wai = 0x33,
0853 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0854 .sensors_supported = {
0855 [0] = LIS2DE12_ACCEL_DEV_NAME,
0856 },
0857 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
0858 .odr = {
0859 .addr = 0x20,
0860 .mask = 0xf0,
0861 .odr_avl = {
0862 { .hz = 1, .value = 0x01, },
0863 { .hz = 10, .value = 0x02, },
0864 { .hz = 25, .value = 0x03, },
0865 { .hz = 50, .value = 0x04, },
0866 { .hz = 100, .value = 0x05, },
0867 { .hz = 200, .value = 0x06, },
0868 { .hz = 400, .value = 0x07, },
0869 { .hz = 1620, .value = 0x08, },
0870 { .hz = 5376, .value = 0x09, },
0871 },
0872 },
0873 .pw = {
0874 .addr = 0x20,
0875 .mask = 0xf0,
0876 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0877 },
0878 .enable_axis = {
0879 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0880 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0881 },
0882 .fs = {
0883 .addr = 0x23,
0884 .mask = 0x30,
0885 .fs_avl = {
0886 [0] = {
0887 .num = ST_ACCEL_FS_AVL_2G,
0888 .value = 0x00,
0889 .gain = IIO_G_TO_M_S_2(15600),
0890 },
0891 [1] = {
0892 .num = ST_ACCEL_FS_AVL_4G,
0893 .value = 0x01,
0894 .gain = IIO_G_TO_M_S_2(31200),
0895 },
0896 [2] = {
0897 .num = ST_ACCEL_FS_AVL_8G,
0898 .value = 0x02,
0899 .gain = IIO_G_TO_M_S_2(62500),
0900 },
0901 [3] = {
0902 .num = ST_ACCEL_FS_AVL_16G,
0903 .value = 0x03,
0904 .gain = IIO_G_TO_M_S_2(187500),
0905 },
0906 },
0907 },
0908 .drdy_irq = {
0909 .int1 = {
0910 .addr = 0x22,
0911 .mask = 0x10,
0912 },
0913 .addr_ihl = 0x25,
0914 .mask_ihl = 0x02,
0915 .stat_drdy = {
0916 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0917 .mask = 0x07,
0918 },
0919 },
0920 .sim = {
0921 .addr = 0x23,
0922 .value = BIT(0),
0923 },
0924 .multi_read_bit = true,
0925 .bootime = 2,
0926 },
0927 {
0928 .wai = 0x41,
0929 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
0930 .sensors_supported = {
0931 [0] = LIS2HH12_ACCEL_DEV_NAME,
0932 },
0933 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
0934 .odr = {
0935 .addr = 0x20,
0936 .mask = 0x70,
0937 .odr_avl = {
0938 { .hz = 10, .value = 0x01, },
0939 { .hz = 50, .value = 0x02, },
0940 { .hz = 100, .value = 0x03, },
0941 { .hz = 200, .value = 0x04, },
0942 { .hz = 400, .value = 0x05, },
0943 { .hz = 800, .value = 0x06, },
0944 },
0945 },
0946 .pw = {
0947 .addr = 0x20,
0948 .mask = 0x70,
0949 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
0950 },
0951 .enable_axis = {
0952 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
0953 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
0954 },
0955 .fs = {
0956 .addr = 0x23,
0957 .mask = 0x30,
0958 .fs_avl = {
0959 [0] = {
0960 .num = ST_ACCEL_FS_AVL_2G,
0961 .value = 0x00,
0962 .gain = IIO_G_TO_M_S_2(61),
0963 },
0964 [1] = {
0965 .num = ST_ACCEL_FS_AVL_4G,
0966 .value = 0x02,
0967 .gain = IIO_G_TO_M_S_2(122),
0968 },
0969 [2] = {
0970 .num = ST_ACCEL_FS_AVL_8G,
0971 .value = 0x03,
0972 .gain = IIO_G_TO_M_S_2(244),
0973 },
0974 },
0975 },
0976 .bdu = {
0977 .addr = 0x20,
0978 .mask = 0x08,
0979 },
0980 .drdy_irq = {
0981 .int1 = {
0982 .addr = 0x22,
0983 .mask = 0x01,
0984 },
0985 .int2 = {
0986 .addr = 0x25,
0987 .mask = 0x01,
0988 },
0989 .addr_ihl = 0x24,
0990 .mask_ihl = 0x02,
0991 .stat_drdy = {
0992 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
0993 .mask = 0x07,
0994 },
0995 },
0996 .sim = {
0997 .addr = 0x23,
0998 .value = BIT(0),
0999 },
1000 .multi_read_bit = true,
1001 .bootime = 2,
1002 },
1003 {
1004 .wai = 0x49,
1005 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
1006 .sensors_supported = {
1007 [0] = LSM9DS0_IMU_DEV_NAME,
1008 },
1009 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
1010 .odr = {
1011 .addr = 0x20,
1012 .mask = GENMASK(7, 4),
1013 .odr_avl = {
1014 { 3, 0x01, },
1015 { 6, 0x02, },
1016 { 12, 0x03, },
1017 { 25, 0x04, },
1018 { 50, 0x05, },
1019 { 100, 0x06, },
1020 { 200, 0x07, },
1021 { 400, 0x08, },
1022 { 800, 0x09, },
1023 { 1600, 0x0a, },
1024 },
1025 },
1026 .pw = {
1027 .addr = 0x20,
1028 .mask = GENMASK(7, 4),
1029 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
1030 },
1031 .enable_axis = {
1032 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
1033 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
1034 },
1035 .fs = {
1036 .addr = 0x21,
1037 .mask = GENMASK(5, 3),
1038 .fs_avl = {
1039 [0] = {
1040 .num = ST_ACCEL_FS_AVL_2G,
1041 .value = 0x00,
1042 .gain = IIO_G_TO_M_S_2(61),
1043 },
1044 [1] = {
1045 .num = ST_ACCEL_FS_AVL_4G,
1046 .value = 0x01,
1047 .gain = IIO_G_TO_M_S_2(122),
1048 },
1049 [2] = {
1050 .num = ST_ACCEL_FS_AVL_6G,
1051 .value = 0x02,
1052 .gain = IIO_G_TO_M_S_2(183),
1053 },
1054 [3] = {
1055 .num = ST_ACCEL_FS_AVL_8G,
1056 .value = 0x03,
1057 .gain = IIO_G_TO_M_S_2(244),
1058 },
1059 [4] = {
1060 .num = ST_ACCEL_FS_AVL_16G,
1061 .value = 0x04,
1062 .gain = IIO_G_TO_M_S_2(732),
1063 },
1064 },
1065 },
1066 .bdu = {
1067 .addr = 0x20,
1068 .mask = BIT(3),
1069 },
1070 .drdy_irq = {
1071 .int1 = {
1072 .addr = 0x22,
1073 .mask = BIT(2),
1074 },
1075 .int2 = {
1076 .addr = 0x23,
1077 .mask = BIT(3),
1078 },
1079 .stat_drdy = {
1080 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
1081 .mask = GENMASK(2, 0),
1082 },
1083 },
1084 .sim = {
1085 .addr = 0x21,
1086 .value = BIT(0),
1087 },
1088 .multi_read_bit = true,
1089 .bootime = 2,
1090 },
1091 {
1092
1093
1094
1095
1096 .wai = 0x11,
1097 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
1098 .sensors_supported = {
1099 [0] = SC7A20_ACCEL_DEV_NAME,
1100 },
1101 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
1102 .odr = {
1103 .addr = 0x20,
1104 .mask = 0xf0,
1105 .odr_avl = {
1106 { .hz = 1, .value = 0x01, },
1107 { .hz = 10, .value = 0x02, },
1108 { .hz = 25, .value = 0x03, },
1109 { .hz = 50, .value = 0x04, },
1110 { .hz = 100, .value = 0x05, },
1111 { .hz = 200, .value = 0x06, },
1112 { .hz = 400, .value = 0x07, },
1113 { .hz = 1600, .value = 0x08, },
1114 },
1115 },
1116 .pw = {
1117 .addr = 0x20,
1118 .mask = 0xf0,
1119 .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
1120 },
1121 .enable_axis = {
1122 .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
1123 .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
1124 },
1125 .fs = {
1126 .addr = 0x23,
1127 .mask = 0x30,
1128 .fs_avl = {
1129 [0] = {
1130 .num = ST_ACCEL_FS_AVL_2G,
1131 .value = 0x00,
1132 .gain = IIO_G_TO_M_S_2(1000),
1133 },
1134 [1] = {
1135 .num = ST_ACCEL_FS_AVL_4G,
1136 .value = 0x01,
1137 .gain = IIO_G_TO_M_S_2(2000),
1138 },
1139 [2] = {
1140 .num = ST_ACCEL_FS_AVL_8G,
1141 .value = 0x02,
1142 .gain = IIO_G_TO_M_S_2(4000),
1143 },
1144 [3] = {
1145 .num = ST_ACCEL_FS_AVL_16G,
1146 .value = 0x03,
1147 .gain = IIO_G_TO_M_S_2(12000),
1148 },
1149 },
1150 },
1151 .bdu = {
1152 .addr = 0x23,
1153 .mask = 0x80,
1154 },
1155 .drdy_irq = {
1156 .int1 = {
1157 .addr = 0x22,
1158 .mask = 0x10,
1159 },
1160 .addr_ihl = 0x25,
1161 .mask_ihl = 0x02,
1162 .stat_drdy = {
1163 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
1164 .mask = 0x07,
1165 },
1166 },
1167 .sim = {
1168 .addr = 0x23,
1169 .value = BIT(0),
1170 },
1171 .multi_read_bit = true,
1172 .bootime = 2,
1173 },
1174 };
1175
1176
1177 static const struct st_sensors_platform_data default_accel_pdata = {
1178 .drdy_int_pin = 1,
1179 };
1180
1181 static int st_accel_read_raw(struct iio_dev *indio_dev,
1182 struct iio_chan_spec const *ch, int *val,
1183 int *val2, long mask)
1184 {
1185 int err;
1186 struct st_sensor_data *adata = iio_priv(indio_dev);
1187
1188 switch (mask) {
1189 case IIO_CHAN_INFO_RAW:
1190 err = st_sensors_read_info_raw(indio_dev, ch, val);
1191 if (err < 0)
1192 goto read_error;
1193
1194 return IIO_VAL_INT;
1195 case IIO_CHAN_INFO_SCALE:
1196 *val = adata->current_fullscale->gain / 1000000;
1197 *val2 = adata->current_fullscale->gain % 1000000;
1198 return IIO_VAL_INT_PLUS_MICRO;
1199 case IIO_CHAN_INFO_SAMP_FREQ:
1200 *val = adata->odr;
1201 return IIO_VAL_INT;
1202 default:
1203 return -EINVAL;
1204 }
1205
1206 read_error:
1207 return err;
1208 }
1209
1210 static int st_accel_write_raw(struct iio_dev *indio_dev,
1211 struct iio_chan_spec const *chan, int val, int val2, long mask)
1212 {
1213 switch (mask) {
1214 case IIO_CHAN_INFO_SCALE: {
1215 int gain;
1216
1217 gain = val * 1000000 + val2;
1218 return st_sensors_set_fullscale_by_gain(indio_dev, gain);
1219 }
1220 case IIO_CHAN_INFO_SAMP_FREQ:
1221 if (val2)
1222 return -EINVAL;
1223
1224 return st_sensors_set_odr(indio_dev, val);
1225 default:
1226 return -EINVAL;
1227 }
1228 }
1229
1230 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
1231 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
1232
1233 static struct attribute *st_accel_attributes[] = {
1234 &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
1235 &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
1236 NULL,
1237 };
1238
1239 static const struct attribute_group st_accel_attribute_group = {
1240 .attrs = st_accel_attributes,
1241 };
1242
1243 static const struct iio_info accel_info = {
1244 .attrs = &st_accel_attribute_group,
1245 .read_raw = &st_accel_read_raw,
1246 .write_raw = &st_accel_write_raw,
1247 .debugfs_reg_access = &st_sensors_debugfs_reg_access,
1248 };
1249
1250 #ifdef CONFIG_IIO_TRIGGER
1251 static const struct iio_trigger_ops st_accel_trigger_ops = {
1252 .set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
1253 .validate_device = st_sensors_validate_device,
1254 };
1255 #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
1256 #else
1257 #define ST_ACCEL_TRIGGER_OPS NULL
1258 #endif
1259
1260 #ifdef CONFIG_ACPI
1261
1262
1263
1264 static int apply_acpi_orientation(struct iio_dev *indio_dev)
1265 {
1266 struct st_sensor_data *adata = iio_priv(indio_dev);
1267 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
1268 struct acpi_device *adev;
1269 union acpi_object *ont;
1270 union acpi_object *elements;
1271 acpi_status status;
1272 int ret = -EINVAL;
1273 unsigned int val;
1274 int i, j;
1275 int final_ont[3][3] = { { 0 }, };
1276
1277
1278
1279
1280
1281
1282
1283 const int default_ont[3][3] = {
1284 { 0, 1, 0 },
1285 { -1, 0, 0 },
1286 { 0, 0, -1 },
1287 };
1288
1289
1290 adev = ACPI_COMPANION(indio_dev->dev.parent);
1291 if (!adev)
1292 return 0;
1293
1294
1295 status = acpi_evaluate_object(adev->handle, "_ONT", NULL, &buffer);
1296 if (status == AE_NOT_FOUND) {
1297 return 0;
1298 } else if (ACPI_FAILURE(status)) {
1299 dev_warn(&indio_dev->dev, "failed to execute _ONT: %d\n",
1300 status);
1301 return status;
1302 }
1303
1304 ont = buffer.pointer;
1305 if (ont->type != ACPI_TYPE_PACKAGE || ont->package.count != 6)
1306 goto out;
1307
1308
1309
1310
1311
1312 elements = ont->package.elements;
1313 for (i = 0; i < 3; i++) {
1314 if (elements[i].type != ACPI_TYPE_INTEGER)
1315 goto out;
1316
1317 val = elements[i].integer.value;
1318 if (val > 2)
1319 goto out;
1320
1321
1322
1323
1324
1325 final_ont[0][i] = default_ont[0][val];
1326 final_ont[1][i] = default_ont[1][val];
1327 final_ont[2][i] = default_ont[2][val];
1328 }
1329
1330
1331
1332
1333
1334
1335 elements += 3;
1336 for (i = 0; i < 3; i++) {
1337 if (elements[i].type != ACPI_TYPE_INTEGER)
1338 goto out;
1339
1340 val = elements[i].integer.value;
1341 if (val != 0 && val != 1)
1342 goto out;
1343 if (!val)
1344 continue;
1345
1346
1347 final_ont[0][i] *= -1;
1348 final_ont[1][i] *= -1;
1349 final_ont[2][i] *= -1;
1350 }
1351
1352
1353 for (i = 0; i < 3; i++) {
1354 for (j = 0; j < 3; j++) {
1355 int matrix_val = final_ont[i][j];
1356 char *str_value;
1357
1358 switch (matrix_val) {
1359 case -1:
1360 str_value = "-1";
1361 break;
1362 case 0:
1363 str_value = "0";
1364 break;
1365 case 1:
1366 str_value = "1";
1367 break;
1368 default:
1369 goto out;
1370 }
1371 adata->mount_matrix.rotation[i * 3 + j] = str_value;
1372 }
1373 }
1374
1375 ret = 0;
1376 dev_info(&indio_dev->dev, "computed mount matrix from ACPI\n");
1377
1378 out:
1379 kfree(buffer.pointer);
1380 if (ret)
1381 dev_dbg(&indio_dev->dev,
1382 "failed to apply ACPI orientation data: %d\n", ret);
1383
1384 return ret;
1385 }
1386 #else
1387 static int apply_acpi_orientation(struct iio_dev *indio_dev)
1388 {
1389 return -EINVAL;
1390 }
1391 #endif
1392
1393
1394
1395
1396
1397
1398
1399 const struct st_sensor_settings *st_accel_get_settings(const char *name)
1400 {
1401 int index = st_sensors_get_settings_index(name,
1402 st_accel_sensors_settings,
1403 ARRAY_SIZE(st_accel_sensors_settings));
1404 if (index < 0)
1405 return NULL;
1406
1407 return &st_accel_sensors_settings[index];
1408 }
1409 EXPORT_SYMBOL_NS(st_accel_get_settings, IIO_ST_SENSORS);
1410
1411 int st_accel_common_probe(struct iio_dev *indio_dev)
1412 {
1413 struct st_sensor_data *adata = iio_priv(indio_dev);
1414 struct device *parent = indio_dev->dev.parent;
1415 struct st_sensors_platform_data *pdata = dev_get_platdata(parent);
1416 int err;
1417
1418 indio_dev->modes = INDIO_DIRECT_MODE;
1419 indio_dev->info = &accel_info;
1420
1421 err = st_sensors_verify_id(indio_dev);
1422 if (err < 0)
1423 return err;
1424
1425 adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
1426 indio_dev->channels = adata->sensor_settings->ch;
1427 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
1428
1429
1430
1431
1432
1433 err = apply_acpi_orientation(indio_dev);
1434 if (err) {
1435 err = iio_read_mount_matrix(parent, &adata->mount_matrix);
1436 if (err)
1437 return err;
1438 }
1439
1440 adata->current_fullscale = &adata->sensor_settings->fs.fs_avl[0];
1441 adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
1442
1443 if (!pdata)
1444 pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
1445
1446 err = st_sensors_init_sensor(indio_dev, pdata);
1447 if (err < 0)
1448 return err;
1449
1450 err = st_accel_allocate_ring(indio_dev);
1451 if (err < 0)
1452 return err;
1453
1454 if (adata->irq > 0) {
1455 err = st_sensors_allocate_trigger(indio_dev,
1456 ST_ACCEL_TRIGGER_OPS);
1457 if (err < 0)
1458 return err;
1459 }
1460
1461 return devm_iio_device_register(parent, indio_dev);
1462 }
1463 EXPORT_SYMBOL_NS(st_accel_common_probe, IIO_ST_SENSORS);
1464
1465 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
1466 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
1467 MODULE_LICENSE("GPL v2");
1468 MODULE_IMPORT_NS(IIO_ST_SENSORS);