1 /* 2 * STMicroelectronics st_lsm6dsx FIFO buffer library driver 3 * 4 * LSM6DS3/LSM6DS3H/LSM6DSL/LSM6DSM/ISM330DLC: The FIFO buffer can be 5 * configured to store data from gyroscope and accelerometer. Samples are 6 * queued without any tag according to a specific pattern based on 7 * 'FIFO data sets' (6 bytes each): 8 * - 1st data set is reserved for gyroscope data 9 * - 2nd data set is reserved for accelerometer data 10 * The FIFO pattern changes depending on the ODRs and decimation factors 11 * assigned to the FIFO data sets. The first sequence of data stored in FIFO 12 * buffer contains the data of all the enabled FIFO data sets 13 * (e.g. Gx, Gy, Gz, Ax, Ay, Az), then data are repeated depending on the 14 * value of the decimation factor and ODR set for each FIFO data set. 15 * 16 * LSM6DSO: The FIFO buffer can be configured to store data from gyroscope and 17 * accelerometer. Each sample is queued with a tag (1B) indicating data source 18 * (gyroscope, accelerometer, hw timer). 19 * 20 * FIFO supported modes: 21 * - BYPASS: FIFO disabled 22 * - CONTINUOUS: FIFO enabled. When the buffer is full, the FIFO index 23 * restarts from the beginning and the oldest sample is overwritten 24 * 25 * Copyright 2016 STMicroelectronics Inc. 26 * 27 * Lorenzo Bianconi <lorenzo.bianconi@st.com> 28 * Denis Ciocca <denis.ciocca@st.com> 29 * 30 * Licensed under the GPL-2. 31 */ 32 #include <linux/module.h> 33 #include <linux/interrupt.h> 34 #include <linux/irq.h> 35 #include <linux/iio/kfifo_buf.h> 36 #include <linux/iio/iio.h> 37 #include <linux/iio/buffer.h> 38 #include <linux/regmap.h> 39 #include <linux/bitfield.h> 40 41 #include <linux/platform_data/st_sensors_pdata.h> 42 43 #include "st_lsm6dsx.h" 44 45 #define ST_LSM6DSX_REG_HLACTIVE_ADDR 0x12 46 #define ST_LSM6DSX_REG_HLACTIVE_MASK BIT(5) 47 #define ST_LSM6DSX_REG_PP_OD_ADDR 0x12 48 #define ST_LSM6DSX_REG_PP_OD_MASK BIT(4) 49 #define ST_LSM6DSX_REG_FIFO_MODE_ADDR 0x0a 50 #define ST_LSM6DSX_FIFO_MODE_MASK GENMASK(2, 0) 51 #define ST_LSM6DSX_FIFO_ODR_MASK GENMASK(6, 3) 52 #define ST_LSM6DSX_FIFO_EMPTY_MASK BIT(12) 53 #define ST_LSM6DSX_REG_FIFO_OUTL_ADDR 0x3e 54 #define ST_LSM6DSX_REG_FIFO_OUT_TAG_ADDR 0x78 55 #define ST_LSM6DSX_REG_TS_RESET_ADDR 0x42 56 57 #define ST_LSM6DSX_MAX_FIFO_ODR_VAL 0x08 58 59 #define ST_LSM6DSX_TS_SENSITIVITY 25000UL /* 25us */ 60 #define ST_LSM6DSX_TS_RESET_VAL 0xaa 61 62 struct st_lsm6dsx_decimator_entry { 63 u8 decimator; 64 u8 val; 65 }; 66 67 enum st_lsm6dsx_fifo_tag { 68 ST_LSM6DSX_GYRO_TAG = 0x01, 69 ST_LSM6DSX_ACC_TAG = 0x02, 70 ST_LSM6DSX_TS_TAG = 0x04, 71 }; 72 73 static const 74 struct st_lsm6dsx_decimator_entry st_lsm6dsx_decimator_table[] = { 75 { 0, 0x0 }, 76 { 1, 0x1 }, 77 { 2, 0x2 }, 78 { 3, 0x3 }, 79 { 4, 0x4 }, 80 { 8, 0x5 }, 81 { 16, 0x6 }, 82 { 32, 0x7 }, 83 }; 84 85 static int st_lsm6dsx_get_decimator_val(u8 val) 86 { 87 const int max_size = ARRAY_SIZE(st_lsm6dsx_decimator_table); 88 int i; 89 90 for (i = 0; i < max_size; i++) 91 if (st_lsm6dsx_decimator_table[i].decimator == val) 92 break; 93 94 return i == max_size ? 0 : st_lsm6dsx_decimator_table[i].val; 95 } 96 97 static void st_lsm6dsx_get_max_min_odr(struct st_lsm6dsx_hw *hw, 98 u16 *max_odr, u16 *min_odr) 99 { 100 struct st_lsm6dsx_sensor *sensor; 101 int i; 102 103 *max_odr = 0, *min_odr = ~0; 104 for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { 105 sensor = iio_priv(hw->iio_devs[i]); 106 107 if (!(hw->enable_mask & BIT(sensor->id))) 108 continue; 109 110 *max_odr = max_t(u16, *max_odr, sensor->odr); 111 *min_odr = min_t(u16, *min_odr, sensor->odr); 112 } 113 } 114 115 static int st_lsm6dsx_update_decimators(struct st_lsm6dsx_hw *hw) 116 { 117 u16 max_odr, min_odr, sip = 0, ts_sip = 0; 118 const struct st_lsm6dsx_reg *ts_dec_reg; 119 struct st_lsm6dsx_sensor *sensor; 120 int err = 0, i; 121 u8 data; 122 123 st_lsm6dsx_get_max_min_odr(hw, &max_odr, &min_odr); 124 125 for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { 126 const struct st_lsm6dsx_reg *dec_reg; 127 128 sensor = iio_priv(hw->iio_devs[i]); 129 /* update fifo decimators and sample in pattern */ 130 if (hw->enable_mask & BIT(sensor->id)) { 131 sensor->sip = sensor->odr / min_odr; 132 sensor->decimator = max_odr / sensor->odr; 133 data = st_lsm6dsx_get_decimator_val(sensor->decimator); 134 } else { 135 sensor->sip = 0; 136 sensor->decimator = 0; 137 data = 0; 138 } 139 ts_sip = max_t(u16, ts_sip, sensor->sip); 140 141 dec_reg = &hw->settings->decimator[sensor->id]; 142 if (dec_reg->addr) { 143 int val = ST_LSM6DSX_SHIFT_VAL(data, dec_reg->mask); 144 145 err = regmap_update_bits(hw->regmap, dec_reg->addr, 146 dec_reg->mask, val); 147 if (err < 0) 148 return err; 149 } 150 sip += sensor->sip; 151 } 152 hw->sip = sip + ts_sip; 153 hw->ts_sip = ts_sip; 154 155 /* 156 * update hw ts decimator if necessary. Decimator for hw timestamp 157 * is always 1 or 0 in order to have a ts sample for each data 158 * sample in FIFO 159 */ 160 ts_dec_reg = &hw->settings->ts_settings.decimator; 161 if (ts_dec_reg->addr) { 162 int val, ts_dec = !!hw->ts_sip; 163 164 val = ST_LSM6DSX_SHIFT_VAL(ts_dec, ts_dec_reg->mask); 165 err = regmap_update_bits(hw->regmap, ts_dec_reg->addr, 166 ts_dec_reg->mask, val); 167 } 168 return err; 169 } 170 171 int st_lsm6dsx_set_fifo_mode(struct st_lsm6dsx_hw *hw, 172 enum st_lsm6dsx_fifo_mode fifo_mode) 173 { 174 int err; 175 176 err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_FIFO_MODE_ADDR, 177 ST_LSM6DSX_FIFO_MODE_MASK, 178 FIELD_PREP(ST_LSM6DSX_FIFO_MODE_MASK, 179 fifo_mode)); 180 if (err < 0) 181 return err; 182 183 hw->fifo_mode = fifo_mode; 184 185 return 0; 186 } 187 188 static int st_lsm6dsx_set_fifo_odr(struct st_lsm6dsx_sensor *sensor, 189 bool enable) 190 { 191 struct st_lsm6dsx_hw *hw = sensor->hw; 192 const struct st_lsm6dsx_reg *batch_reg; 193 u8 data; 194 195 batch_reg = &hw->settings->batch[sensor->id]; 196 if (batch_reg->addr) { 197 int val; 198 199 if (enable) { 200 int err; 201 202 err = st_lsm6dsx_check_odr(sensor, sensor->odr, 203 &data); 204 if (err < 0) 205 return err; 206 } else { 207 data = 0; 208 } 209 val = ST_LSM6DSX_SHIFT_VAL(data, batch_reg->mask); 210 return regmap_update_bits(hw->regmap, batch_reg->addr, 211 batch_reg->mask, val); 212 } else { 213 data = hw->enable_mask ? ST_LSM6DSX_MAX_FIFO_ODR_VAL : 0; 214 return regmap_update_bits(hw->regmap, 215 ST_LSM6DSX_REG_FIFO_MODE_ADDR, 216 ST_LSM6DSX_FIFO_ODR_MASK, 217 FIELD_PREP(ST_LSM6DSX_FIFO_ODR_MASK, 218 data)); 219 } 220 } 221 222 int st_lsm6dsx_update_watermark(struct st_lsm6dsx_sensor *sensor, u16 watermark) 223 { 224 u16 fifo_watermark = ~0, cur_watermark, fifo_th_mask; 225 struct st_lsm6dsx_hw *hw = sensor->hw; 226 struct st_lsm6dsx_sensor *cur_sensor; 227 int i, err, data; 228 __le16 wdata; 229 230 if (!hw->sip) 231 return 0; 232 233 for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { 234 cur_sensor = iio_priv(hw->iio_devs[i]); 235 236 if (!(hw->enable_mask & BIT(cur_sensor->id))) 237 continue; 238 239 cur_watermark = (cur_sensor == sensor) ? watermark 240 : cur_sensor->watermark; 241 242 fifo_watermark = min_t(u16, fifo_watermark, cur_watermark); 243 } 244 245 fifo_watermark = max_t(u16, fifo_watermark, hw->sip); 246 fifo_watermark = (fifo_watermark / hw->sip) * hw->sip; 247 fifo_watermark = fifo_watermark * hw->settings->fifo_ops.th_wl; 248 249 err = regmap_read(hw->regmap, hw->settings->fifo_ops.fifo_th.addr + 1, 250 &data); 251 if (err < 0) 252 return err; 253 254 fifo_th_mask = hw->settings->fifo_ops.fifo_th.mask; 255 fifo_watermark = ((data << 8) & ~fifo_th_mask) | 256 (fifo_watermark & fifo_th_mask); 257 258 wdata = cpu_to_le16(fifo_watermark); 259 return regmap_bulk_write(hw->regmap, 260 hw->settings->fifo_ops.fifo_th.addr, 261 &wdata, sizeof(wdata)); 262 } 263 264 static int st_lsm6dsx_reset_hw_ts(struct st_lsm6dsx_hw *hw) 265 { 266 struct st_lsm6dsx_sensor *sensor; 267 int i, err; 268 269 /* reset hw ts counter */ 270 err = regmap_write(hw->regmap, ST_LSM6DSX_REG_TS_RESET_ADDR, 271 ST_LSM6DSX_TS_RESET_VAL); 272 if (err < 0) 273 return err; 274 275 for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { 276 sensor = iio_priv(hw->iio_devs[i]); 277 /* 278 * store enable buffer timestamp as reference for 279 * hw timestamp 280 */ 281 sensor->ts_ref = iio_get_time_ns(hw->iio_devs[i]); 282 } 283 return 0; 284 } 285 286 /* 287 * Set max bulk read to ST_LSM6DSX_MAX_WORD_LEN/ST_LSM6DSX_MAX_TAGGED_WORD_LEN 288 * in order to avoid a kmalloc for each bus access 289 */ 290 static inline int st_lsm6dsx_read_block(struct st_lsm6dsx_hw *hw, u8 addr, 291 u8 *data, unsigned int data_len, 292 unsigned int max_word_len) 293 { 294 unsigned int word_len, read_len = 0; 295 int err; 296 297 while (read_len < data_len) { 298 word_len = min_t(unsigned int, data_len - read_len, 299 max_word_len); 300 err = regmap_bulk_read(hw->regmap, addr, data + read_len, 301 word_len); 302 if (err < 0) 303 return err; 304 read_len += word_len; 305 } 306 return 0; 307 } 308 309 #define ST_LSM6DSX_IIO_BUFF_SIZE (ALIGN(ST_LSM6DSX_SAMPLE_SIZE, \ 310 sizeof(s64)) + sizeof(s64)) 311 /** 312 * st_lsm6dsx_read_fifo() - hw FIFO read routine 313 * @hw: Pointer to instance of struct st_lsm6dsx_hw. 314 * 315 * Read samples from the hw FIFO and push them to IIO buffers. 316 * 317 * Return: Number of bytes read from the FIFO 318 */ 319 int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw) 320 { 321 u16 fifo_len, pattern_len = hw->sip * ST_LSM6DSX_SAMPLE_SIZE; 322 u16 fifo_diff_mask = hw->settings->fifo_ops.fifo_diff.mask; 323 int err, acc_sip, gyro_sip, ts_sip, read_len, offset; 324 struct st_lsm6dsx_sensor *acc_sensor, *gyro_sensor; 325 u8 gyro_buff[ST_LSM6DSX_IIO_BUFF_SIZE]; 326 u8 acc_buff[ST_LSM6DSX_IIO_BUFF_SIZE]; 327 bool reset_ts = false; 328 __le16 fifo_status; 329 s64 ts = 0; 330 331 err = regmap_bulk_read(hw->regmap, 332 hw->settings->fifo_ops.fifo_diff.addr, 333 &fifo_status, sizeof(fifo_status)); 334 if (err < 0) { 335 dev_err(hw->dev, "failed to read fifo status (err=%d)\n", 336 err); 337 return err; 338 } 339 340 if (fifo_status & cpu_to_le16(ST_LSM6DSX_FIFO_EMPTY_MASK)) 341 return 0; 342 343 fifo_len = (le16_to_cpu(fifo_status) & fifo_diff_mask) * 344 ST_LSM6DSX_CHAN_SIZE; 345 fifo_len = (fifo_len / pattern_len) * pattern_len; 346 347 acc_sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_ACC]); 348 gyro_sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_GYRO]); 349 350 for (read_len = 0; read_len < fifo_len; read_len += pattern_len) { 351 err = st_lsm6dsx_read_block(hw, ST_LSM6DSX_REG_FIFO_OUTL_ADDR, 352 hw->buff, pattern_len, 353 ST_LSM6DSX_MAX_WORD_LEN); 354 if (err < 0) { 355 dev_err(hw->dev, 356 "failed to read pattern from fifo (err=%d)\n", 357 err); 358 return err; 359 } 360 361 /* 362 * Data are written to the FIFO with a specific pattern 363 * depending on the configured ODRs. The first sequence of data 364 * stored in FIFO contains the data of all enabled sensors 365 * (e.g. Gx, Gy, Gz, Ax, Ay, Az, Ts), then data are repeated 366 * depending on the value of the decimation factor set for each 367 * sensor. 368 * 369 * Supposing the FIFO is storing data from gyroscope and 370 * accelerometer at different ODRs: 371 * - gyroscope ODR = 208Hz, accelerometer ODR = 104Hz 372 * Since the gyroscope ODR is twice the accelerometer one, the 373 * following pattern is repeated every 9 samples: 374 * - Gx, Gy, Gz, Ax, Ay, Az, Ts, Gx, Gy, Gz, Ts, Gx, .. 375 */ 376 gyro_sip = gyro_sensor->sip; 377 acc_sip = acc_sensor->sip; 378 ts_sip = hw->ts_sip; 379 offset = 0; 380 381 while (acc_sip > 0 || gyro_sip > 0) { 382 if (gyro_sip > 0) { 383 memcpy(gyro_buff, &hw->buff[offset], 384 ST_LSM6DSX_SAMPLE_SIZE); 385 offset += ST_LSM6DSX_SAMPLE_SIZE; 386 } 387 if (acc_sip > 0) { 388 memcpy(acc_buff, &hw->buff[offset], 389 ST_LSM6DSX_SAMPLE_SIZE); 390 offset += ST_LSM6DSX_SAMPLE_SIZE; 391 } 392 393 if (ts_sip-- > 0) { 394 u8 data[ST_LSM6DSX_SAMPLE_SIZE]; 395 396 memcpy(data, &hw->buff[offset], sizeof(data)); 397 /* 398 * hw timestamp is 3B long and it is stored 399 * in FIFO using 6B as 4th FIFO data set 400 * according to this schema: 401 * B0 = ts[15:8], B1 = ts[23:16], B3 = ts[7:0] 402 */ 403 ts = data[1] << 16 | data[0] << 8 | data[3]; 404 /* 405 * check if hw timestamp engine is going to 406 * reset (the sensor generates an interrupt 407 * to signal the hw timestamp will reset in 408 * 1.638s) 409 */ 410 if (!reset_ts && ts >= 0xff0000) 411 reset_ts = true; 412 ts *= ST_LSM6DSX_TS_SENSITIVITY; 413 414 offset += ST_LSM6DSX_SAMPLE_SIZE; 415 } 416 417 if (gyro_sip-- > 0) 418 iio_push_to_buffers_with_timestamp( 419 hw->iio_devs[ST_LSM6DSX_ID_GYRO], 420 gyro_buff, gyro_sensor->ts_ref + ts); 421 if (acc_sip-- > 0) 422 iio_push_to_buffers_with_timestamp( 423 hw->iio_devs[ST_LSM6DSX_ID_ACC], 424 acc_buff, acc_sensor->ts_ref + ts); 425 } 426 } 427 428 if (unlikely(reset_ts)) { 429 err = st_lsm6dsx_reset_hw_ts(hw); 430 if (err < 0) { 431 dev_err(hw->dev, "failed to reset hw ts (err=%d)\n", 432 err); 433 return err; 434 } 435 } 436 return read_len; 437 } 438 439 /** 440 * st_lsm6dsx_read_tagged_fifo() - LSM6DSO read FIFO routine 441 * @hw: Pointer to instance of struct st_lsm6dsx_hw. 442 * 443 * Read samples from the hw FIFO and push them to IIO buffers. 444 * 445 * Return: Number of bytes read from the FIFO 446 */ 447 int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *hw) 448 { 449 u16 pattern_len = hw->sip * ST_LSM6DSX_TAGGED_SAMPLE_SIZE; 450 u16 fifo_len, fifo_diff_mask; 451 struct st_lsm6dsx_sensor *acc_sensor, *gyro_sensor; 452 u8 iio_buff[ST_LSM6DSX_IIO_BUFF_SIZE], tag; 453 bool reset_ts = false; 454 int i, err, read_len; 455 __le16 fifo_status; 456 s64 ts = 0; 457 458 err = regmap_bulk_read(hw->regmap, 459 hw->settings->fifo_ops.fifo_diff.addr, 460 &fifo_status, sizeof(fifo_status)); 461 if (err < 0) { 462 dev_err(hw->dev, "failed to read fifo status (err=%d)\n", 463 err); 464 return err; 465 } 466 467 fifo_diff_mask = hw->settings->fifo_ops.fifo_diff.mask; 468 fifo_len = (le16_to_cpu(fifo_status) & fifo_diff_mask) * 469 ST_LSM6DSX_TAGGED_SAMPLE_SIZE; 470 if (!fifo_len) 471 return 0; 472 473 acc_sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_ACC]); 474 gyro_sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_GYRO]); 475 476 for (read_len = 0; read_len < fifo_len; read_len += pattern_len) { 477 err = st_lsm6dsx_read_block(hw, 478 ST_LSM6DSX_REG_FIFO_OUT_TAG_ADDR, 479 hw->buff, pattern_len, 480 ST_LSM6DSX_MAX_TAGGED_WORD_LEN); 481 if (err < 0) { 482 dev_err(hw->dev, 483 "failed to read pattern from fifo (err=%d)\n", 484 err); 485 return err; 486 } 487 488 for (i = 0; i < pattern_len; 489 i += ST_LSM6DSX_TAGGED_SAMPLE_SIZE) { 490 memcpy(iio_buff, &hw->buff[i + ST_LSM6DSX_TAG_SIZE], 491 ST_LSM6DSX_SAMPLE_SIZE); 492 493 tag = hw->buff[i] >> 3; 494 switch (tag) { 495 case ST_LSM6DSX_TS_TAG: 496 /* 497 * hw timestamp is 4B long and it is stored 498 * in FIFO according to this schema: 499 * B0 = ts[7:0], B1 = ts[15:8], B2 = ts[23:16], 500 * B3 = ts[31:24] 501 */ 502 ts = le32_to_cpu(*((__le32 *)iio_buff)); 503 /* 504 * check if hw timestamp engine is going to 505 * reset (the sensor generates an interrupt 506 * to signal the hw timestamp will reset in 507 * 1.638s) 508 */ 509 if (!reset_ts && ts >= 0xffff0000) 510 reset_ts = true; 511 ts *= ST_LSM6DSX_TS_SENSITIVITY; 512 break; 513 case ST_LSM6DSX_GYRO_TAG: 514 iio_push_to_buffers_with_timestamp( 515 hw->iio_devs[ST_LSM6DSX_ID_GYRO], 516 iio_buff, gyro_sensor->ts_ref + ts); 517 break; 518 case ST_LSM6DSX_ACC_TAG: 519 iio_push_to_buffers_with_timestamp( 520 hw->iio_devs[ST_LSM6DSX_ID_ACC], 521 iio_buff, acc_sensor->ts_ref + ts); 522 break; 523 default: 524 break; 525 } 526 } 527 } 528 529 if (unlikely(reset_ts)) { 530 err = st_lsm6dsx_reset_hw_ts(hw); 531 if (err < 0) 532 return err; 533 } 534 return read_len; 535 } 536 537 int st_lsm6dsx_flush_fifo(struct st_lsm6dsx_hw *hw) 538 { 539 int err; 540 541 mutex_lock(&hw->fifo_lock); 542 543 hw->settings->fifo_ops.read_fifo(hw); 544 err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_BYPASS); 545 546 mutex_unlock(&hw->fifo_lock); 547 548 return err; 549 } 550 551 static int st_lsm6dsx_update_fifo(struct iio_dev *iio_dev, bool enable) 552 { 553 struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev); 554 struct st_lsm6dsx_hw *hw = sensor->hw; 555 int err; 556 557 mutex_lock(&hw->conf_lock); 558 559 if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS) { 560 err = st_lsm6dsx_flush_fifo(hw); 561 if (err < 0) 562 goto out; 563 } 564 565 if (enable) { 566 err = st_lsm6dsx_sensor_enable(sensor); 567 if (err < 0) 568 goto out; 569 } else { 570 err = st_lsm6dsx_sensor_disable(sensor); 571 if (err < 0) 572 goto out; 573 } 574 575 err = st_lsm6dsx_set_fifo_odr(sensor, enable); 576 if (err < 0) 577 goto out; 578 579 err = st_lsm6dsx_update_decimators(hw); 580 if (err < 0) 581 goto out; 582 583 err = st_lsm6dsx_update_watermark(sensor, sensor->watermark); 584 if (err < 0) 585 goto out; 586 587 if (hw->enable_mask) { 588 /* reset hw ts counter */ 589 err = st_lsm6dsx_reset_hw_ts(hw); 590 if (err < 0) 591 goto out; 592 593 err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_CONT); 594 } 595 596 out: 597 mutex_unlock(&hw->conf_lock); 598 599 return err; 600 } 601 602 static irqreturn_t st_lsm6dsx_handler_irq(int irq, void *private) 603 { 604 struct st_lsm6dsx_hw *hw = private; 605 606 return hw->sip > 0 ? IRQ_WAKE_THREAD : IRQ_NONE; 607 } 608 609 static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private) 610 { 611 struct st_lsm6dsx_hw *hw = private; 612 int count; 613 614 mutex_lock(&hw->fifo_lock); 615 count = hw->settings->fifo_ops.read_fifo(hw); 616 mutex_unlock(&hw->fifo_lock); 617 618 return !count ? IRQ_NONE : IRQ_HANDLED; 619 } 620 621 static int st_lsm6dsx_buffer_preenable(struct iio_dev *iio_dev) 622 { 623 return st_lsm6dsx_update_fifo(iio_dev, true); 624 } 625 626 static int st_lsm6dsx_buffer_postdisable(struct iio_dev *iio_dev) 627 { 628 return st_lsm6dsx_update_fifo(iio_dev, false); 629 } 630 631 static const struct iio_buffer_setup_ops st_lsm6dsx_buffer_ops = { 632 .preenable = st_lsm6dsx_buffer_preenable, 633 .postdisable = st_lsm6dsx_buffer_postdisable, 634 }; 635 636 int st_lsm6dsx_fifo_setup(struct st_lsm6dsx_hw *hw) 637 { 638 struct device_node *np = hw->dev->of_node; 639 struct st_sensors_platform_data *pdata; 640 struct iio_buffer *buffer; 641 unsigned long irq_type; 642 bool irq_active_low; 643 int i, err; 644 645 irq_type = irqd_get_trigger_type(irq_get_irq_data(hw->irq)); 646 647 switch (irq_type) { 648 case IRQF_TRIGGER_HIGH: 649 case IRQF_TRIGGER_RISING: 650 irq_active_low = false; 651 break; 652 case IRQF_TRIGGER_LOW: 653 case IRQF_TRIGGER_FALLING: 654 irq_active_low = true; 655 break; 656 default: 657 dev_info(hw->dev, "mode %lx unsupported\n", irq_type); 658 return -EINVAL; 659 } 660 661 err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_HLACTIVE_ADDR, 662 ST_LSM6DSX_REG_HLACTIVE_MASK, 663 FIELD_PREP(ST_LSM6DSX_REG_HLACTIVE_MASK, 664 irq_active_low)); 665 if (err < 0) 666 return err; 667 668 pdata = (struct st_sensors_platform_data *)hw->dev->platform_data; 669 if ((np && of_property_read_bool(np, "drive-open-drain")) || 670 (pdata && pdata->open_drain)) { 671 err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_PP_OD_ADDR, 672 ST_LSM6DSX_REG_PP_OD_MASK, 673 FIELD_PREP(ST_LSM6DSX_REG_PP_OD_MASK, 674 1)); 675 if (err < 0) 676 return err; 677 678 irq_type |= IRQF_SHARED; 679 } 680 681 err = devm_request_threaded_irq(hw->dev, hw->irq, 682 st_lsm6dsx_handler_irq, 683 st_lsm6dsx_handler_thread, 684 irq_type | IRQF_ONESHOT, 685 "lsm6dsx", hw); 686 if (err) { 687 dev_err(hw->dev, "failed to request trigger irq %d\n", 688 hw->irq); 689 return err; 690 } 691 692 for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { 693 buffer = devm_iio_kfifo_allocate(hw->dev); 694 if (!buffer) 695 return -ENOMEM; 696 697 iio_device_attach_buffer(hw->iio_devs[i], buffer); 698 hw->iio_devs[i]->modes |= INDIO_BUFFER_SOFTWARE; 699 hw->iio_devs[i]->setup_ops = &st_lsm6dsx_buffer_ops; 700 } 701 702 return 0; 703 } 704