root/drivers/iio/imu/bmi160/bmi160_core.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. bmi160_to_sensor
  2. bmi160_set_mode
  3. bmi160_set_scale
  4. bmi160_get_scale
  5. bmi160_get_data
  6. bmi160_set_odr
  7. bmi160_get_odr
  8. bmi160_trigger_handler
  9. bmi160_read_raw
  10. bmi160_write_raw
  11. bmi160_match_acpi_device
  12. bmi160_write_conf_reg
  13. bmi160_config_pin
  14. bmi160_enable_irq
  15. bmi160_get_irq
  16. bmi160_config_device_irq
  17. bmi160_setup_irq
  18. bmi160_chip_init
  19. bmi160_data_rdy_trigger_set_state
  20. bmi160_probe_trigger
  21. bmi160_chip_uninit
  22. bmi160_core_probe

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * BMI160 - Bosch IMU (accel, gyro plus external magnetometer)
   4  *
   5  * Copyright (c) 2016, Intel Corporation.
   6  * Copyright (c) 2019, Martin Kelly.
   7  *
   8  * IIO core driver for BMI160, with support for I2C/SPI busses
   9  *
  10  * TODO: magnetometer, hardware FIFO
  11  */
  12 #include <linux/module.h>
  13 #include <linux/regmap.h>
  14 #include <linux/acpi.h>
  15 #include <linux/delay.h>
  16 #include <linux/irq.h>
  17 #include <linux/of_irq.h>
  18 
  19 #include <linux/iio/iio.h>
  20 #include <linux/iio/triggered_buffer.h>
  21 #include <linux/iio/trigger_consumer.h>
  22 #include <linux/iio/buffer.h>
  23 #include <linux/iio/sysfs.h>
  24 #include <linux/iio/trigger.h>
  25 
  26 #include "bmi160.h"
  27 
  28 #define BMI160_REG_CHIP_ID      0x00
  29 #define BMI160_CHIP_ID_VAL      0xD1
  30 
  31 #define BMI160_REG_PMU_STATUS   0x03
  32 
  33 /* X axis data low byte address, the rest can be obtained using axis offset */
  34 #define BMI160_REG_DATA_MAGN_XOUT_L     0x04
  35 #define BMI160_REG_DATA_GYRO_XOUT_L     0x0C
  36 #define BMI160_REG_DATA_ACCEL_XOUT_L    0x12
  37 
  38 #define BMI160_REG_ACCEL_CONFIG         0x40
  39 #define BMI160_ACCEL_CONFIG_ODR_MASK    GENMASK(3, 0)
  40 #define BMI160_ACCEL_CONFIG_BWP_MASK    GENMASK(6, 4)
  41 
  42 #define BMI160_REG_ACCEL_RANGE          0x41
  43 #define BMI160_ACCEL_RANGE_2G           0x03
  44 #define BMI160_ACCEL_RANGE_4G           0x05
  45 #define BMI160_ACCEL_RANGE_8G           0x08
  46 #define BMI160_ACCEL_RANGE_16G          0x0C
  47 
  48 #define BMI160_REG_GYRO_CONFIG          0x42
  49 #define BMI160_GYRO_CONFIG_ODR_MASK     GENMASK(3, 0)
  50 #define BMI160_GYRO_CONFIG_BWP_MASK     GENMASK(5, 4)
  51 
  52 #define BMI160_REG_GYRO_RANGE           0x43
  53 #define BMI160_GYRO_RANGE_2000DPS       0x00
  54 #define BMI160_GYRO_RANGE_1000DPS       0x01
  55 #define BMI160_GYRO_RANGE_500DPS        0x02
  56 #define BMI160_GYRO_RANGE_250DPS        0x03
  57 #define BMI160_GYRO_RANGE_125DPS        0x04
  58 
  59 #define BMI160_REG_CMD                  0x7E
  60 #define BMI160_CMD_ACCEL_PM_SUSPEND     0x10
  61 #define BMI160_CMD_ACCEL_PM_NORMAL      0x11
  62 #define BMI160_CMD_ACCEL_PM_LOW_POWER   0x12
  63 #define BMI160_CMD_GYRO_PM_SUSPEND      0x14
  64 #define BMI160_CMD_GYRO_PM_NORMAL       0x15
  65 #define BMI160_CMD_GYRO_PM_FAST_STARTUP 0x17
  66 #define BMI160_CMD_SOFTRESET            0xB6
  67 
  68 #define BMI160_REG_INT_EN               0x51
  69 #define BMI160_DRDY_INT_EN              BIT(4)
  70 
  71 #define BMI160_REG_INT_OUT_CTRL         0x53
  72 #define BMI160_INT_OUT_CTRL_MASK        0x0f
  73 #define BMI160_INT1_OUT_CTRL_SHIFT      0
  74 #define BMI160_INT2_OUT_CTRL_SHIFT      4
  75 #define BMI160_EDGE_TRIGGERED           BIT(0)
  76 #define BMI160_ACTIVE_HIGH              BIT(1)
  77 #define BMI160_OPEN_DRAIN               BIT(2)
  78 #define BMI160_OUTPUT_EN                BIT(3)
  79 
  80 #define BMI160_REG_INT_LATCH            0x54
  81 #define BMI160_INT1_LATCH_MASK          BIT(4)
  82 #define BMI160_INT2_LATCH_MASK          BIT(5)
  83 
  84 /* INT1 and INT2 are in the opposite order as in INT_OUT_CTRL! */
  85 #define BMI160_REG_INT_MAP              0x56
  86 #define BMI160_INT1_MAP_DRDY_EN         0x80
  87 #define BMI160_INT2_MAP_DRDY_EN         0x08
  88 
  89 #define BMI160_REG_DUMMY                0x7F
  90 
  91 #define BMI160_NORMAL_WRITE_USLEEP      2
  92 #define BMI160_SUSPENDED_WRITE_USLEEP   450
  93 
  94 #define BMI160_ACCEL_PMU_MIN_USLEEP     3800
  95 #define BMI160_GYRO_PMU_MIN_USLEEP      80000
  96 #define BMI160_SOFTRESET_USLEEP         1000
  97 
  98 #define BMI160_CHANNEL(_type, _axis, _index) {                  \
  99         .type = _type,                                          \
 100         .modified = 1,                                          \
 101         .channel2 = IIO_MOD_##_axis,                            \
 102         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),           \
 103         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
 104                 BIT(IIO_CHAN_INFO_SAMP_FREQ),                   \
 105         .scan_index = _index,                                   \
 106         .scan_type = {                                          \
 107                 .sign = 's',                                    \
 108                 .realbits = 16,                                 \
 109                 .storagebits = 16,                              \
 110                 .endianness = IIO_LE,                           \
 111         },                                                      \
 112 }
 113 
 114 /* scan indexes follow DATA register order */
 115 enum bmi160_scan_axis {
 116         BMI160_SCAN_EXT_MAGN_X = 0,
 117         BMI160_SCAN_EXT_MAGN_Y,
 118         BMI160_SCAN_EXT_MAGN_Z,
 119         BMI160_SCAN_RHALL,
 120         BMI160_SCAN_GYRO_X,
 121         BMI160_SCAN_GYRO_Y,
 122         BMI160_SCAN_GYRO_Z,
 123         BMI160_SCAN_ACCEL_X,
 124         BMI160_SCAN_ACCEL_Y,
 125         BMI160_SCAN_ACCEL_Z,
 126         BMI160_SCAN_TIMESTAMP,
 127 };
 128 
 129 enum bmi160_sensor_type {
 130         BMI160_ACCEL    = 0,
 131         BMI160_GYRO,
 132         BMI160_EXT_MAGN,
 133         BMI160_NUM_SENSORS /* must be last */
 134 };
 135 
 136 enum bmi160_int_pin {
 137         BMI160_PIN_INT1,
 138         BMI160_PIN_INT2
 139 };
 140 
 141 const struct regmap_config bmi160_regmap_config = {
 142         .reg_bits = 8,
 143         .val_bits = 8,
 144 };
 145 EXPORT_SYMBOL(bmi160_regmap_config);
 146 
 147 struct bmi160_regs {
 148         u8 data; /* LSB byte register for X-axis */
 149         u8 config;
 150         u8 config_odr_mask;
 151         u8 config_bwp_mask;
 152         u8 range;
 153         u8 pmu_cmd_normal;
 154         u8 pmu_cmd_suspend;
 155 };
 156 
 157 static struct bmi160_regs bmi160_regs[] = {
 158         [BMI160_ACCEL] = {
 159                 .data   = BMI160_REG_DATA_ACCEL_XOUT_L,
 160                 .config = BMI160_REG_ACCEL_CONFIG,
 161                 .config_odr_mask = BMI160_ACCEL_CONFIG_ODR_MASK,
 162                 .config_bwp_mask = BMI160_ACCEL_CONFIG_BWP_MASK,
 163                 .range  = BMI160_REG_ACCEL_RANGE,
 164                 .pmu_cmd_normal = BMI160_CMD_ACCEL_PM_NORMAL,
 165                 .pmu_cmd_suspend = BMI160_CMD_ACCEL_PM_SUSPEND,
 166         },
 167         [BMI160_GYRO] = {
 168                 .data   = BMI160_REG_DATA_GYRO_XOUT_L,
 169                 .config = BMI160_REG_GYRO_CONFIG,
 170                 .config_odr_mask = BMI160_GYRO_CONFIG_ODR_MASK,
 171                 .config_bwp_mask = BMI160_GYRO_CONFIG_BWP_MASK,
 172                 .range  = BMI160_REG_GYRO_RANGE,
 173                 .pmu_cmd_normal = BMI160_CMD_GYRO_PM_NORMAL,
 174                 .pmu_cmd_suspend = BMI160_CMD_GYRO_PM_SUSPEND,
 175         },
 176 };
 177 
 178 static unsigned long bmi160_pmu_time[] = {
 179         [BMI160_ACCEL] = BMI160_ACCEL_PMU_MIN_USLEEP,
 180         [BMI160_GYRO] = BMI160_GYRO_PMU_MIN_USLEEP,
 181 };
 182 
 183 struct bmi160_scale {
 184         u8 bits;
 185         int uscale;
 186 };
 187 
 188 struct bmi160_odr {
 189         u8 bits;
 190         int odr;
 191         int uodr;
 192 };
 193 
 194 static const struct bmi160_scale bmi160_accel_scale[] = {
 195         { BMI160_ACCEL_RANGE_2G, 598},
 196         { BMI160_ACCEL_RANGE_4G, 1197},
 197         { BMI160_ACCEL_RANGE_8G, 2394},
 198         { BMI160_ACCEL_RANGE_16G, 4788},
 199 };
 200 
 201 static const struct bmi160_scale bmi160_gyro_scale[] = {
 202         { BMI160_GYRO_RANGE_2000DPS, 1065},
 203         { BMI160_GYRO_RANGE_1000DPS, 532},
 204         { BMI160_GYRO_RANGE_500DPS, 266},
 205         { BMI160_GYRO_RANGE_250DPS, 133},
 206         { BMI160_GYRO_RANGE_125DPS, 66},
 207 };
 208 
 209 struct bmi160_scale_item {
 210         const struct bmi160_scale *tbl;
 211         int num;
 212 };
 213 
 214 static const struct  bmi160_scale_item bmi160_scale_table[] = {
 215         [BMI160_ACCEL] = {
 216                 .tbl    = bmi160_accel_scale,
 217                 .num    = ARRAY_SIZE(bmi160_accel_scale),
 218         },
 219         [BMI160_GYRO] = {
 220                 .tbl    = bmi160_gyro_scale,
 221                 .num    = ARRAY_SIZE(bmi160_gyro_scale),
 222         },
 223 };
 224 
 225 static const struct bmi160_odr bmi160_accel_odr[] = {
 226         {0x01, 0, 781250},
 227         {0x02, 1, 562500},
 228         {0x03, 3, 125000},
 229         {0x04, 6, 250000},
 230         {0x05, 12, 500000},
 231         {0x06, 25, 0},
 232         {0x07, 50, 0},
 233         {0x08, 100, 0},
 234         {0x09, 200, 0},
 235         {0x0A, 400, 0},
 236         {0x0B, 800, 0},
 237         {0x0C, 1600, 0},
 238 };
 239 
 240 static const struct bmi160_odr bmi160_gyro_odr[] = {
 241         {0x06, 25, 0},
 242         {0x07, 50, 0},
 243         {0x08, 100, 0},
 244         {0x09, 200, 0},
 245         {0x0A, 400, 0},
 246         {0x0B, 800, 0},
 247         {0x0C, 1600, 0},
 248         {0x0D, 3200, 0},
 249 };
 250 
 251 struct bmi160_odr_item {
 252         const struct bmi160_odr *tbl;
 253         int num;
 254 };
 255 
 256 static const struct  bmi160_odr_item bmi160_odr_table[] = {
 257         [BMI160_ACCEL] = {
 258                 .tbl    = bmi160_accel_odr,
 259                 .num    = ARRAY_SIZE(bmi160_accel_odr),
 260         },
 261         [BMI160_GYRO] = {
 262                 .tbl    = bmi160_gyro_odr,
 263                 .num    = ARRAY_SIZE(bmi160_gyro_odr),
 264         },
 265 };
 266 
 267 static const struct iio_chan_spec bmi160_channels[] = {
 268         BMI160_CHANNEL(IIO_ACCEL, X, BMI160_SCAN_ACCEL_X),
 269         BMI160_CHANNEL(IIO_ACCEL, Y, BMI160_SCAN_ACCEL_Y),
 270         BMI160_CHANNEL(IIO_ACCEL, Z, BMI160_SCAN_ACCEL_Z),
 271         BMI160_CHANNEL(IIO_ANGL_VEL, X, BMI160_SCAN_GYRO_X),
 272         BMI160_CHANNEL(IIO_ANGL_VEL, Y, BMI160_SCAN_GYRO_Y),
 273         BMI160_CHANNEL(IIO_ANGL_VEL, Z, BMI160_SCAN_GYRO_Z),
 274         IIO_CHAN_SOFT_TIMESTAMP(BMI160_SCAN_TIMESTAMP),
 275 };
 276 
 277 static enum bmi160_sensor_type bmi160_to_sensor(enum iio_chan_type iio_type)
 278 {
 279         switch (iio_type) {
 280         case IIO_ACCEL:
 281                 return BMI160_ACCEL;
 282         case IIO_ANGL_VEL:
 283                 return BMI160_GYRO;
 284         default:
 285                 return -EINVAL;
 286         }
 287 }
 288 
 289 static
 290 int bmi160_set_mode(struct bmi160_data *data, enum bmi160_sensor_type t,
 291                     bool mode)
 292 {
 293         int ret;
 294         u8 cmd;
 295 
 296         if (mode)
 297                 cmd = bmi160_regs[t].pmu_cmd_normal;
 298         else
 299                 cmd = bmi160_regs[t].pmu_cmd_suspend;
 300 
 301         ret = regmap_write(data->regmap, BMI160_REG_CMD, cmd);
 302         if (ret)
 303                 return ret;
 304 
 305         usleep_range(bmi160_pmu_time[t], bmi160_pmu_time[t] + 1000);
 306 
 307         return 0;
 308 }
 309 
 310 static
 311 int bmi160_set_scale(struct bmi160_data *data, enum bmi160_sensor_type t,
 312                      int uscale)
 313 {
 314         int i;
 315 
 316         for (i = 0; i < bmi160_scale_table[t].num; i++)
 317                 if (bmi160_scale_table[t].tbl[i].uscale == uscale)
 318                         break;
 319 
 320         if (i == bmi160_scale_table[t].num)
 321                 return -EINVAL;
 322 
 323         return regmap_write(data->regmap, bmi160_regs[t].range,
 324                             bmi160_scale_table[t].tbl[i].bits);
 325 }
 326 
 327 static
 328 int bmi160_get_scale(struct bmi160_data *data, enum bmi160_sensor_type t,
 329                      int *uscale)
 330 {
 331         int i, ret, val;
 332 
 333         ret = regmap_read(data->regmap, bmi160_regs[t].range, &val);
 334         if (ret)
 335                 return ret;
 336 
 337         for (i = 0; i < bmi160_scale_table[t].num; i++)
 338                 if (bmi160_scale_table[t].tbl[i].bits == val) {
 339                         *uscale = bmi160_scale_table[t].tbl[i].uscale;
 340                         return 0;
 341                 }
 342 
 343         return -EINVAL;
 344 }
 345 
 346 static int bmi160_get_data(struct bmi160_data *data, int chan_type,
 347                            int axis, int *val)
 348 {
 349         u8 reg;
 350         int ret;
 351         __le16 sample;
 352         enum bmi160_sensor_type t = bmi160_to_sensor(chan_type);
 353 
 354         reg = bmi160_regs[t].data + (axis - IIO_MOD_X) * sizeof(sample);
 355 
 356         ret = regmap_bulk_read(data->regmap, reg, &sample, sizeof(sample));
 357         if (ret)
 358                 return ret;
 359 
 360         *val = sign_extend32(le16_to_cpu(sample), 15);
 361 
 362         return 0;
 363 }
 364 
 365 static
 366 int bmi160_set_odr(struct bmi160_data *data, enum bmi160_sensor_type t,
 367                    int odr, int uodr)
 368 {
 369         int i;
 370 
 371         for (i = 0; i < bmi160_odr_table[t].num; i++)
 372                 if (bmi160_odr_table[t].tbl[i].odr == odr &&
 373                     bmi160_odr_table[t].tbl[i].uodr == uodr)
 374                         break;
 375 
 376         if (i >= bmi160_odr_table[t].num)
 377                 return -EINVAL;
 378 
 379         return regmap_update_bits(data->regmap,
 380                                   bmi160_regs[t].config,
 381                                   bmi160_regs[t].config_odr_mask,
 382                                   bmi160_odr_table[t].tbl[i].bits);
 383 }
 384 
 385 static int bmi160_get_odr(struct bmi160_data *data, enum bmi160_sensor_type t,
 386                           int *odr, int *uodr)
 387 {
 388         int i, val, ret;
 389 
 390         ret = regmap_read(data->regmap, bmi160_regs[t].config, &val);
 391         if (ret)
 392                 return ret;
 393 
 394         val &= bmi160_regs[t].config_odr_mask;
 395 
 396         for (i = 0; i < bmi160_odr_table[t].num; i++)
 397                 if (val == bmi160_odr_table[t].tbl[i].bits)
 398                         break;
 399 
 400         if (i >= bmi160_odr_table[t].num)
 401                 return -EINVAL;
 402 
 403         *odr = bmi160_odr_table[t].tbl[i].odr;
 404         *uodr = bmi160_odr_table[t].tbl[i].uodr;
 405 
 406         return 0;
 407 }
 408 
 409 static irqreturn_t bmi160_trigger_handler(int irq, void *p)
 410 {
 411         struct iio_poll_func *pf = p;
 412         struct iio_dev *indio_dev = pf->indio_dev;
 413         struct bmi160_data *data = iio_priv(indio_dev);
 414         __le16 buf[16];
 415         /* 3 sens x 3 axis x __le16 + 3 x __le16 pad + 4 x __le16 tstamp */
 416         int i, ret, j = 0, base = BMI160_REG_DATA_MAGN_XOUT_L;
 417         __le16 sample;
 418 
 419         for_each_set_bit(i, indio_dev->active_scan_mask,
 420                          indio_dev->masklength) {
 421                 ret = regmap_bulk_read(data->regmap, base + i * sizeof(sample),
 422                                        &sample, sizeof(sample));
 423                 if (ret)
 424                         goto done;
 425                 buf[j++] = sample;
 426         }
 427 
 428         iio_push_to_buffers_with_timestamp(indio_dev, buf, pf->timestamp);
 429 done:
 430         iio_trigger_notify_done(indio_dev->trig);
 431         return IRQ_HANDLED;
 432 }
 433 
 434 static int bmi160_read_raw(struct iio_dev *indio_dev,
 435                            struct iio_chan_spec const *chan,
 436                            int *val, int *val2, long mask)
 437 {
 438         int ret;
 439         struct bmi160_data *data = iio_priv(indio_dev);
 440 
 441         switch (mask) {
 442         case IIO_CHAN_INFO_RAW:
 443                 ret = bmi160_get_data(data, chan->type, chan->channel2, val);
 444                 if (ret)
 445                         return ret;
 446                 return IIO_VAL_INT;
 447         case IIO_CHAN_INFO_SCALE:
 448                 *val = 0;
 449                 ret = bmi160_get_scale(data,
 450                                        bmi160_to_sensor(chan->type), val2);
 451                 return ret ? ret : IIO_VAL_INT_PLUS_MICRO;
 452         case IIO_CHAN_INFO_SAMP_FREQ:
 453                 ret = bmi160_get_odr(data, bmi160_to_sensor(chan->type),
 454                                      val, val2);
 455                 return ret ? ret : IIO_VAL_INT_PLUS_MICRO;
 456         default:
 457                 return -EINVAL;
 458         }
 459 
 460         return 0;
 461 }
 462 
 463 static int bmi160_write_raw(struct iio_dev *indio_dev,
 464                             struct iio_chan_spec const *chan,
 465                             int val, int val2, long mask)
 466 {
 467         struct bmi160_data *data = iio_priv(indio_dev);
 468 
 469         switch (mask) {
 470         case IIO_CHAN_INFO_SCALE:
 471                 return bmi160_set_scale(data,
 472                                         bmi160_to_sensor(chan->type), val2);
 473                 break;
 474         case IIO_CHAN_INFO_SAMP_FREQ:
 475                 return bmi160_set_odr(data, bmi160_to_sensor(chan->type),
 476                                       val, val2);
 477         default:
 478                 return -EINVAL;
 479         }
 480 
 481         return 0;
 482 }
 483 
 484 static
 485 IIO_CONST_ATTR(in_accel_sampling_frequency_available,
 486                "0.78125 1.5625 3.125 6.25 12.5 25 50 100 200 400 800 1600");
 487 static
 488 IIO_CONST_ATTR(in_anglvel_sampling_frequency_available,
 489                "25 50 100 200 400 800 1600 3200");
 490 static
 491 IIO_CONST_ATTR(in_accel_scale_available,
 492                "0.000598 0.001197 0.002394 0.004788");
 493 static
 494 IIO_CONST_ATTR(in_anglvel_scale_available,
 495                "0.001065 0.000532 0.000266 0.000133 0.000066");
 496 
 497 static struct attribute *bmi160_attrs[] = {
 498         &iio_const_attr_in_accel_sampling_frequency_available.dev_attr.attr,
 499         &iio_const_attr_in_anglvel_sampling_frequency_available.dev_attr.attr,
 500         &iio_const_attr_in_accel_scale_available.dev_attr.attr,
 501         &iio_const_attr_in_anglvel_scale_available.dev_attr.attr,
 502         NULL,
 503 };
 504 
 505 static const struct attribute_group bmi160_attrs_group = {
 506         .attrs = bmi160_attrs,
 507 };
 508 
 509 static const struct iio_info bmi160_info = {
 510         .read_raw = bmi160_read_raw,
 511         .write_raw = bmi160_write_raw,
 512         .attrs = &bmi160_attrs_group,
 513 };
 514 
 515 static const char *bmi160_match_acpi_device(struct device *dev)
 516 {
 517         const struct acpi_device_id *id;
 518 
 519         id = acpi_match_device(dev->driver->acpi_match_table, dev);
 520         if (!id)
 521                 return NULL;
 522 
 523         return dev_name(dev);
 524 }
 525 
 526 static int bmi160_write_conf_reg(struct regmap *regmap, unsigned int reg,
 527                                  unsigned int mask, unsigned int bits,
 528                                  unsigned int write_usleep)
 529 {
 530         int ret;
 531         unsigned int val;
 532 
 533         ret = regmap_read(regmap, reg, &val);
 534         if (ret)
 535                 return ret;
 536 
 537         val = (val & ~mask) | bits;
 538 
 539         ret = regmap_write(regmap, reg, val);
 540         if (ret)
 541                 return ret;
 542 
 543         /*
 544          * We need to wait after writing before we can write again. See the
 545          * datasheet, page 93.
 546          */
 547         usleep_range(write_usleep, write_usleep + 1000);
 548 
 549         return 0;
 550 }
 551 
 552 static int bmi160_config_pin(struct regmap *regmap, enum bmi160_int_pin pin,
 553                              bool open_drain, u8 irq_mask,
 554                              unsigned long write_usleep)
 555 {
 556         int ret;
 557         struct device *dev = regmap_get_device(regmap);
 558         u8 int_out_ctrl_shift;
 559         u8 int_latch_mask;
 560         u8 int_map_mask;
 561         u8 int_out_ctrl_mask;
 562         u8 int_out_ctrl_bits;
 563         const char *pin_name;
 564 
 565         switch (pin) {
 566         case BMI160_PIN_INT1:
 567                 int_out_ctrl_shift = BMI160_INT1_OUT_CTRL_SHIFT;
 568                 int_latch_mask = BMI160_INT1_LATCH_MASK;
 569                 int_map_mask = BMI160_INT1_MAP_DRDY_EN;
 570                 break;
 571         case BMI160_PIN_INT2:
 572                 int_out_ctrl_shift = BMI160_INT2_OUT_CTRL_SHIFT;
 573                 int_latch_mask = BMI160_INT2_LATCH_MASK;
 574                 int_map_mask = BMI160_INT2_MAP_DRDY_EN;
 575                 break;
 576         }
 577         int_out_ctrl_mask = BMI160_INT_OUT_CTRL_MASK << int_out_ctrl_shift;
 578 
 579         /*
 580          * Enable the requested pin with the right settings:
 581          * - Push-pull/open-drain
 582          * - Active low/high
 583          * - Edge/level triggered
 584          */
 585         int_out_ctrl_bits = BMI160_OUTPUT_EN;
 586         if (open_drain)
 587                 /* Default is push-pull. */
 588                 int_out_ctrl_bits |= BMI160_OPEN_DRAIN;
 589         int_out_ctrl_bits |= irq_mask;
 590         int_out_ctrl_bits <<= int_out_ctrl_shift;
 591 
 592         ret = bmi160_write_conf_reg(regmap, BMI160_REG_INT_OUT_CTRL,
 593                                     int_out_ctrl_mask, int_out_ctrl_bits,
 594                                     write_usleep);
 595         if (ret)
 596                 return ret;
 597 
 598         /* Set the pin to input mode with no latching. */
 599         ret = bmi160_write_conf_reg(regmap, BMI160_REG_INT_LATCH,
 600                                     int_latch_mask, int_latch_mask,
 601                                     write_usleep);
 602         if (ret)
 603                 return ret;
 604 
 605         /* Map interrupts to the requested pin. */
 606         ret = bmi160_write_conf_reg(regmap, BMI160_REG_INT_MAP,
 607                                     int_map_mask, int_map_mask,
 608                                     write_usleep);
 609         if (ret) {
 610                 switch (pin) {
 611                 case BMI160_PIN_INT1:
 612                         pin_name = "INT1";
 613                         break;
 614                 case BMI160_PIN_INT2:
 615                         pin_name = "INT2";
 616                         break;
 617                 }
 618                 dev_err(dev, "Failed to configure %s IRQ pin", pin_name);
 619         }
 620 
 621         return ret;
 622 }
 623 
 624 int bmi160_enable_irq(struct regmap *regmap, bool enable)
 625 {
 626         unsigned int enable_bit = 0;
 627 
 628         if (enable)
 629                 enable_bit = BMI160_DRDY_INT_EN;
 630 
 631         return bmi160_write_conf_reg(regmap, BMI160_REG_INT_EN,
 632                                      BMI160_DRDY_INT_EN, enable_bit,
 633                                      BMI160_NORMAL_WRITE_USLEEP);
 634 }
 635 EXPORT_SYMBOL(bmi160_enable_irq);
 636 
 637 static int bmi160_get_irq(struct device_node *of_node, enum bmi160_int_pin *pin)
 638 {
 639         int irq;
 640 
 641         /* Use INT1 if possible, otherwise fall back to INT2. */
 642         irq = of_irq_get_byname(of_node, "INT1");
 643         if (irq > 0) {
 644                 *pin = BMI160_PIN_INT1;
 645                 return irq;
 646         }
 647 
 648         irq = of_irq_get_byname(of_node, "INT2");
 649         if (irq > 0)
 650                 *pin = BMI160_PIN_INT2;
 651 
 652         return irq;
 653 }
 654 
 655 static int bmi160_config_device_irq(struct iio_dev *indio_dev, int irq_type,
 656                                     enum bmi160_int_pin pin)
 657 {
 658         bool open_drain;
 659         u8 irq_mask;
 660         struct bmi160_data *data = iio_priv(indio_dev);
 661         struct device *dev = regmap_get_device(data->regmap);
 662 
 663         /* Level-triggered, active-low is the default if we set all zeroes. */
 664         if (irq_type == IRQF_TRIGGER_RISING)
 665                 irq_mask = BMI160_ACTIVE_HIGH | BMI160_EDGE_TRIGGERED;
 666         else if (irq_type == IRQF_TRIGGER_FALLING)
 667                 irq_mask = BMI160_EDGE_TRIGGERED;
 668         else if (irq_type == IRQF_TRIGGER_HIGH)
 669                 irq_mask = BMI160_ACTIVE_HIGH;
 670         else if (irq_type == IRQF_TRIGGER_LOW)
 671                 irq_mask = 0;
 672         else {
 673                 dev_err(&indio_dev->dev,
 674                         "Invalid interrupt type 0x%x specified\n", irq_type);
 675                 return -EINVAL;
 676         }
 677 
 678         open_drain = of_property_read_bool(dev->of_node, "drive-open-drain");
 679 
 680         return bmi160_config_pin(data->regmap, pin, open_drain, irq_mask,
 681                                  BMI160_NORMAL_WRITE_USLEEP);
 682 }
 683 
 684 static int bmi160_setup_irq(struct iio_dev *indio_dev, int irq,
 685                             enum bmi160_int_pin pin)
 686 {
 687         struct irq_data *desc;
 688         u32 irq_type;
 689         int ret;
 690 
 691         desc = irq_get_irq_data(irq);
 692         if (!desc) {
 693                 dev_err(&indio_dev->dev, "Could not find IRQ %d\n", irq);
 694                 return -EINVAL;
 695         }
 696 
 697         irq_type = irqd_get_trigger_type(desc);
 698 
 699         ret = bmi160_config_device_irq(indio_dev, irq_type, pin);
 700         if (ret)
 701                 return ret;
 702 
 703         return bmi160_probe_trigger(indio_dev, irq, irq_type);
 704 }
 705 
 706 static int bmi160_chip_init(struct bmi160_data *data, bool use_spi)
 707 {
 708         int ret;
 709         unsigned int val;
 710         struct device *dev = regmap_get_device(data->regmap);
 711 
 712         ret = regmap_write(data->regmap, BMI160_REG_CMD, BMI160_CMD_SOFTRESET);
 713         if (ret)
 714                 return ret;
 715 
 716         usleep_range(BMI160_SOFTRESET_USLEEP, BMI160_SOFTRESET_USLEEP + 1);
 717 
 718         /*
 719          * CS rising edge is needed before starting SPI, so do a dummy read
 720          * See Section 3.2.1, page 86 of the datasheet
 721          */
 722         if (use_spi) {
 723                 ret = regmap_read(data->regmap, BMI160_REG_DUMMY, &val);
 724                 if (ret)
 725                         return ret;
 726         }
 727 
 728         ret = regmap_read(data->regmap, BMI160_REG_CHIP_ID, &val);
 729         if (ret) {
 730                 dev_err(dev, "Error reading chip id\n");
 731                 return ret;
 732         }
 733         if (val != BMI160_CHIP_ID_VAL) {
 734                 dev_err(dev, "Wrong chip id, got %x expected %x\n",
 735                         val, BMI160_CHIP_ID_VAL);
 736                 return -ENODEV;
 737         }
 738 
 739         ret = bmi160_set_mode(data, BMI160_ACCEL, true);
 740         if (ret)
 741                 return ret;
 742 
 743         ret = bmi160_set_mode(data, BMI160_GYRO, true);
 744         if (ret)
 745                 return ret;
 746 
 747         return 0;
 748 }
 749 
 750 static int bmi160_data_rdy_trigger_set_state(struct iio_trigger *trig,
 751                                              bool enable)
 752 {
 753         struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
 754         struct bmi160_data *data = iio_priv(indio_dev);
 755 
 756         return bmi160_enable_irq(data->regmap, enable);
 757 }
 758 
 759 static const struct iio_trigger_ops bmi160_trigger_ops = {
 760         .set_trigger_state = &bmi160_data_rdy_trigger_set_state,
 761 };
 762 
 763 int bmi160_probe_trigger(struct iio_dev *indio_dev, int irq, u32 irq_type)
 764 {
 765         struct bmi160_data *data = iio_priv(indio_dev);
 766         int ret;
 767 
 768         data->trig = devm_iio_trigger_alloc(&indio_dev->dev, "%s-dev%d",
 769                                             indio_dev->name, indio_dev->id);
 770 
 771         if (data->trig == NULL)
 772                 return -ENOMEM;
 773 
 774         ret = devm_request_irq(&indio_dev->dev, irq,
 775                                &iio_trigger_generic_data_rdy_poll,
 776                                irq_type, "bmi160", data->trig);
 777         if (ret)
 778                 return ret;
 779 
 780         data->trig->dev.parent = regmap_get_device(data->regmap);
 781         data->trig->ops = &bmi160_trigger_ops;
 782         iio_trigger_set_drvdata(data->trig, indio_dev);
 783 
 784         ret = devm_iio_trigger_register(&indio_dev->dev, data->trig);
 785         if (ret)
 786                 return ret;
 787 
 788         indio_dev->trig = iio_trigger_get(data->trig);
 789 
 790         return 0;
 791 }
 792 
 793 static void bmi160_chip_uninit(void *data)
 794 {
 795         struct bmi160_data *bmi_data = data;
 796 
 797         bmi160_set_mode(bmi_data, BMI160_GYRO, false);
 798         bmi160_set_mode(bmi_data, BMI160_ACCEL, false);
 799 }
 800 
 801 int bmi160_core_probe(struct device *dev, struct regmap *regmap,
 802                       const char *name, bool use_spi)
 803 {
 804         struct iio_dev *indio_dev;
 805         struct bmi160_data *data;
 806         int irq;
 807         enum bmi160_int_pin int_pin;
 808         int ret;
 809 
 810         indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
 811         if (!indio_dev)
 812                 return -ENOMEM;
 813 
 814         data = iio_priv(indio_dev);
 815         dev_set_drvdata(dev, indio_dev);
 816         data->regmap = regmap;
 817 
 818         ret = bmi160_chip_init(data, use_spi);
 819         if (ret)
 820                 return ret;
 821 
 822         ret = devm_add_action_or_reset(dev, bmi160_chip_uninit, data);
 823         if (ret)
 824                 return ret;
 825 
 826         if (!name && ACPI_HANDLE(dev))
 827                 name = bmi160_match_acpi_device(dev);
 828 
 829         indio_dev->dev.parent = dev;
 830         indio_dev->channels = bmi160_channels;
 831         indio_dev->num_channels = ARRAY_SIZE(bmi160_channels);
 832         indio_dev->name = name;
 833         indio_dev->modes = INDIO_DIRECT_MODE;
 834         indio_dev->info = &bmi160_info;
 835 
 836         ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
 837                                               iio_pollfunc_store_time,
 838                                               bmi160_trigger_handler, NULL);
 839         if (ret)
 840                 return ret;
 841 
 842         irq = bmi160_get_irq(dev->of_node, &int_pin);
 843         if (irq > 0) {
 844                 ret = bmi160_setup_irq(indio_dev, irq, int_pin);
 845                 if (ret)
 846                         dev_err(&indio_dev->dev, "Failed to setup IRQ %d\n",
 847                                 irq);
 848         } else {
 849                 dev_info(&indio_dev->dev, "Not setting up IRQ trigger\n");
 850         }
 851 
 852         return devm_iio_device_register(dev, indio_dev);
 853 }
 854 EXPORT_SYMBOL_GPL(bmi160_core_probe);
 855 
 856 MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com");
 857 MODULE_DESCRIPTION("Bosch BMI160 driver");
 858 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */