| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * BM1390 ROHM pressure sensor
- *
- * Copyright (c) 2023, ROHM Semiconductor.
- * https://fscdn.rohm.com/en/products/databook/datasheet/ic/sensor/pressure/bm1390glv-z-e.pdf
- */
- #include <linux/bitfield.h>
- #include <linux/bits.h>
- #include <linux/device.h>
- #include <linux/i2c.h>
- #include <linux/module.h>
- #include <linux/regmap.h>
- #include <linux/regulator/consumer.h>
- #include <linux/iio/iio.h>
- #include <linux/iio/trigger.h>
- #include <linux/iio/trigger_consumer.h>
- #include <linux/iio/triggered_buffer.h>
- #define BM1390_REG_MANUFACT_ID 0x0f
- #define BM1390_REG_PART_ID 0x10
- #define BM1390_REG_POWER 0x12
- #define BM1390_MASK_POWER BIT(0)
- #define BM1390_POWER_ON BM1390_MASK_POWER
- #define BM1390_POWER_OFF 0x00
- #define BM1390_REG_RESET 0x13
- #define BM1390_MASK_RESET BIT(0)
- #define BM1390_RESET_RELEASE BM1390_MASK_RESET
- #define BM1390_RESET 0x00
- #define BM1390_REG_MODE_CTRL 0x14
- #define BM1390_MASK_MEAS_MODE GENMASK(1, 0)
- #define BM1390_MASK_DRDY_EN BIT(4)
- #define BM1390_MASK_WMI_EN BIT(2)
- #define BM1390_MASK_AVE_NUM GENMASK(7, 5)
- /*
- * Data-sheet states that when the IIR is used, the AVE_NUM must be set to
- * value 110b
- */
- #define BM1390_IIR_AVE_NUM 0x06
- #define BM1390_REG_FIFO_CTRL 0x15
- #define BM1390_MASK_IIR_MODE GENMASK(1, 0)
- #define BM1390_IIR_MODE_OFF 0x0
- #define BM1390_IIR_MODE_WEAK 0x1
- #define BM1390_IIR_MODE_MID 0x2
- #define BM1390_IIR_MODE_STRONG 0x3
- #define BM1390_MASK_FIFO_LEN BIT(6)
- #define BM1390_MASK_FIFO_EN BIT(7)
- #define BM1390_WMI_MIN 2
- #define BM1390_WMI_MAX 3
- #define BM1390_REG_FIFO_LVL 0x18
- #define BM1390_MASK_FIFO_LVL GENMASK(2, 0)
- #define BM1390_REG_STATUS 0x19
- #define BM1390_REG_PRESSURE_BASE 0x1a
- #define BM1390_REG_TEMP_HI 0x1d
- #define BM1390_REG_TEMP_LO 0x1e
- #define BM1390_MAX_REGISTER BM1390_REG_TEMP_LO
- #define BM1390_ID 0x34
- /* Regmap configs */
- static const struct regmap_range bm1390_volatile_ranges[] = {
- {
- .range_min = BM1390_REG_STATUS,
- .range_max = BM1390_REG_STATUS,
- },
- {
- .range_min = BM1390_REG_FIFO_LVL,
- .range_max = BM1390_REG_TEMP_LO,
- },
- };
- static const struct regmap_access_table bm1390_volatile_regs = {
- .yes_ranges = &bm1390_volatile_ranges[0],
- .n_yes_ranges = ARRAY_SIZE(bm1390_volatile_ranges),
- };
- static const struct regmap_range bm1390_precious_ranges[] = {
- {
- .range_min = BM1390_REG_STATUS,
- .range_max = BM1390_REG_STATUS,
- },
- };
- static const struct regmap_access_table bm1390_precious_regs = {
- .yes_ranges = &bm1390_precious_ranges[0],
- .n_yes_ranges = ARRAY_SIZE(bm1390_precious_ranges),
- };
- static const struct regmap_range bm1390_read_only_ranges[] = {
- {
- .range_min = BM1390_REG_MANUFACT_ID,
- .range_max = BM1390_REG_PART_ID,
- }, {
- .range_min = BM1390_REG_FIFO_LVL,
- .range_max = BM1390_REG_TEMP_LO,
- },
- };
- static const struct regmap_access_table bm1390_ro_regs = {
- .no_ranges = &bm1390_read_only_ranges[0],
- .n_no_ranges = ARRAY_SIZE(bm1390_read_only_ranges),
- };
- static const struct regmap_range bm1390_noinc_read_ranges[] = {
- {
- .range_min = BM1390_REG_PRESSURE_BASE,
- .range_max = BM1390_REG_TEMP_LO,
- },
- };
- static const struct regmap_access_table bm1390_nir_regs = {
- .yes_ranges = &bm1390_noinc_read_ranges[0],
- .n_yes_ranges = ARRAY_SIZE(bm1390_noinc_read_ranges),
- };
- static const struct regmap_config bm1390_regmap = {
- .reg_bits = 8,
- .val_bits = 8,
- .volatile_table = &bm1390_volatile_regs,
- .wr_table = &bm1390_ro_regs,
- .rd_noinc_table = &bm1390_nir_regs,
- .precious_table = &bm1390_precious_regs,
- .max_register = BM1390_MAX_REGISTER,
- .cache_type = REGCACHE_RBTREE,
- .disable_locking = true,
- };
- enum {
- BM1390_STATE_SAMPLE,
- BM1390_STATE_FIFO,
- };
- struct bm1390_data_buf {
- u32 pressure;
- __be16 temp;
- s64 ts __aligned(8);
- };
- /* BM1390 has FIFO for 4 pressure samples */
- #define BM1390_FIFO_LENGTH 4
- struct bm1390_data {
- s64 timestamp, old_timestamp;
- struct iio_trigger *trig;
- struct regmap *regmap;
- struct device *dev;
- struct bm1390_data_buf buf;
- int irq;
- unsigned int state;
- bool trigger_enabled;
- u8 watermark;
- /* Prevent accessing sensor during FIFO read sequence */
- struct mutex mutex;
- };
- enum {
- BM1390_CHAN_PRESSURE,
- BM1390_CHAN_TEMP,
- };
- static const struct iio_chan_spec bm1390_channels[] = {
- {
- .type = IIO_PRESSURE,
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
- /*
- * When IIR is used, we must fix amount of averaged samples.
- * Thus we don't allow setting oversampling ratio.
- */
- .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
- .scan_index = BM1390_CHAN_PRESSURE,
- .scan_type = {
- .sign = 'u',
- .realbits = 22,
- .storagebits = 32,
- .endianness = IIO_LE,
- },
- },
- {
- .type = IIO_TEMP,
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
- .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
- .scan_index = BM1390_CHAN_TEMP,
- .scan_type = {
- .sign = 's',
- .realbits = 16,
- .storagebits = 16,
- .endianness = IIO_BE,
- },
- },
- IIO_CHAN_SOFT_TIMESTAMP(2),
- };
- /*
- * We can't skip reading the pressure because the watermark IRQ is acked
- * only when the pressure data is read from the FIFO.
- */
- static const unsigned long bm1390_scan_masks[] = {
- BIT(BM1390_CHAN_PRESSURE),
- BIT(BM1390_CHAN_PRESSURE) | BIT(BM1390_CHAN_TEMP),
- 0
- };
- static int bm1390_read_temp(struct bm1390_data *data, int *temp)
- {
- __be16 temp_raw;
- int ret;
- ret = regmap_bulk_read(data->regmap, BM1390_REG_TEMP_HI, &temp_raw,
- sizeof(temp_raw));
- if (ret)
- return ret;
- *temp = be16_to_cpu(temp_raw);
- return 0;
- }
- static int bm1390_pressure_read(struct bm1390_data *data, u32 *pressure)
- {
- /* Pressure data is in 3 8-bit registers */
- u8 raw[3];
- int ret;
- ret = regmap_bulk_read(data->regmap, BM1390_REG_PRESSURE_BASE,
- raw, sizeof(raw));
- if (ret < 0)
- return ret;
- *pressure = (u32)(raw[2] >> 2 | raw[1] << 6 | raw[0] << 14);
- return 0;
- }
- /* The enum values map directly to register bits */
- enum bm1390_meas_mode {
- BM1390_MEAS_MODE_STOP = 0x0,
- BM1390_MEAS_MODE_1SHOT = 0x1,
- BM1390_MEAS_MODE_CONTINUOUS = 0x2,
- };
- static int bm1390_meas_set(struct bm1390_data *data, enum bm1390_meas_mode mode)
- {
- return regmap_update_bits(data->regmap, BM1390_REG_MODE_CTRL,
- BM1390_MASK_MEAS_MODE, mode);
- }
- /*
- * If the trigger is not used we just wait until the measurement has
- * completed. The data-sheet says maximum measurement cycle (regardless
- * the AVE_NUM) is 200 mS so let's just sleep at least that long. If speed
- * is needed the trigger should be used.
- */
- #define BM1390_MAX_MEAS_TIME_MS 205
- static int bm1390_read_data(struct bm1390_data *data,
- struct iio_chan_spec const *chan, int *val, int *val2)
- {
- int ret, warn;
- mutex_lock(&data->mutex);
- /*
- * We use 'continuous mode' even for raw read because according to the
- * data-sheet an one-shot mode can't be used with IIR filter.
- */
- ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
- if (ret)
- goto unlock_out;
- switch (chan->type) {
- case IIO_PRESSURE:
- msleep(BM1390_MAX_MEAS_TIME_MS);
- ret = bm1390_pressure_read(data, val);
- break;
- case IIO_TEMP:
- msleep(BM1390_MAX_MEAS_TIME_MS);
- ret = bm1390_read_temp(data, val);
- break;
- default:
- ret = -EINVAL;
- }
- warn = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
- if (warn)
- dev_warn(data->dev, "Failed to stop measurement (%d)\n", warn);
- unlock_out:
- mutex_unlock(&data->mutex);
- return ret;
- }
- static int bm1390_read_raw(struct iio_dev *idev,
- struct iio_chan_spec const *chan,
- int *val, int *val2, long mask)
- {
- struct bm1390_data *data = iio_priv(idev);
- int ret;
- switch (mask) {
- case IIO_CHAN_INFO_SCALE:
- if (chan->type == IIO_TEMP) {
- *val = 31;
- *val2 = 250000;
- return IIO_VAL_INT_PLUS_MICRO;
- } else if (chan->type == IIO_PRESSURE) {
- /*
- * pressure in hPa is register value divided by 2048.
- * This means kPa is 1/20480 times the register value,
- */
- *val = 1;
- *val2 = 2048;
- return IIO_VAL_FRACTIONAL;
- }
- return -EINVAL;
- case IIO_CHAN_INFO_RAW:
- ret = iio_device_claim_direct_mode(idev);
- if (ret)
- return ret;
- ret = bm1390_read_data(data, chan, val, val2);
- iio_device_release_direct_mode(idev);
- if (ret)
- return ret;
- return IIO_VAL_INT;
- default:
- return -EINVAL;
- }
- }
- static int __bm1390_fifo_flush(struct iio_dev *idev, unsigned int samples,
- s64 timestamp)
- {
- /* BM1390_FIFO_LENGTH is small so we shouldn't run out of stack */
- struct bm1390_data_buf buffer[BM1390_FIFO_LENGTH];
- struct bm1390_data *data = iio_priv(idev);
- int smp_lvl, ret, i, warn, dummy;
- u64 sample_period;
- __be16 temp = 0;
- ret = regmap_read(data->regmap, BM1390_REG_FIFO_LVL, &smp_lvl);
- if (ret)
- return ret;
- smp_lvl = FIELD_GET(BM1390_MASK_FIFO_LVL, smp_lvl);
- if (!smp_lvl)
- return 0;
- if (smp_lvl > BM1390_FIFO_LENGTH) {
- /*
- * The fifo holds maximum of 4 samples so valid values
- * should be 0, 1, 2, 3, 4 - rest are probably bit errors
- * in I2C line. Don't overflow if this happens.
- */
- dev_err(data->dev, "bad FIFO level %d\n", smp_lvl);
- smp_lvl = BM1390_FIFO_LENGTH;
- }
- sample_period = timestamp - data->old_timestamp;
- do_div(sample_period, smp_lvl);
- if (samples && smp_lvl > samples)
- smp_lvl = samples;
- /*
- * After some testing it appears that the temperature is not readable
- * until the FIFO access has been done after the WMI. Thus, we need
- * to read the all pressure values to memory and read the temperature
- * only after that.
- */
- for (i = 0; i < smp_lvl; i++) {
- /*
- * When we start reading data from the FIFO the sensor goes to
- * special FIFO reading mode. If any other register is accessed
- * during the FIFO read, samples can be dropped. Prevent access
- * until FIFO_LVL is read. We have mutex locked and we do also
- * go performing reading of FIFO_LVL even if this read fails.
- */
- if (test_bit(BM1390_CHAN_PRESSURE, idev->active_scan_mask)) {
- ret = bm1390_pressure_read(data, &buffer[i].pressure);
- if (ret)
- break;
- }
- /*
- * Old timestamp is either the previous sample IRQ time,
- * previous flush-time or, if this was first sample, the enable
- * time. When we add a sample period to that we should get the
- * best approximation of the time-stamp we are handling.
- *
- * Idea is to always keep the "old_timestamp" matching the
- * timestamp which we are currently handling.
- */
- data->old_timestamp += sample_period;
- buffer[i].ts = data->old_timestamp;
- }
- /* Reading the FIFO_LVL closes the FIFO access sequence */
- warn = regmap_read(data->regmap, BM1390_REG_FIFO_LVL, &dummy);
- if (warn)
- dev_warn(data->dev, "Closing FIFO sequence failed\n");
- if (ret)
- return ret;
- if (test_bit(BM1390_CHAN_TEMP, idev->active_scan_mask)) {
- ret = regmap_bulk_read(data->regmap, BM1390_REG_TEMP_HI, &temp,
- sizeof(temp));
- if (ret)
- return ret;
- }
- if (ret)
- return ret;
- for (i = 0; i < smp_lvl; i++) {
- buffer[i].temp = temp;
- iio_push_to_buffers(idev, &buffer[i]);
- }
- return smp_lvl;
- }
- static int bm1390_fifo_flush(struct iio_dev *idev, unsigned int samples)
- {
- struct bm1390_data *data = iio_priv(idev);
- s64 timestamp;
- int ret;
- /*
- * If fifo_flush is being called from IRQ handler we know the stored
- * timestamp is fairly accurate for the last stored sample. If we are
- * called as a result of a read operation from userspace and hence
- * before the watermark interrupt was triggered, take a timestamp
- * now. We can fall anywhere in between two samples so the error in this
- * case is at most one sample period.
- * We need to have the IRQ disabled or we risk of messing-up
- * the timestamps. If we are ran from IRQ, then the
- * IRQF_ONESHOT has us covered - but if we are ran by the
- * user-space read we need to disable the IRQ to be on a safe
- * side. We do this usng synchronous disable so that if the
- * IRQ thread is being ran on other CPU we wait for it to be
- * finished.
- */
- timestamp = iio_get_time_ns(idev);
- mutex_lock(&data->mutex);
- ret = __bm1390_fifo_flush(idev, samples, timestamp);
- mutex_unlock(&data->mutex);
- return ret;
- }
- static int bm1390_set_watermark(struct iio_dev *idev, unsigned int val)
- {
- struct bm1390_data *data = iio_priv(idev);
- if (val < BM1390_WMI_MIN || val > BM1390_WMI_MAX)
- return -EINVAL;
- mutex_lock(&data->mutex);
- data->watermark = val;
- mutex_unlock(&data->mutex);
- return 0;
- }
- static const struct iio_info bm1390_noirq_info = {
- .read_raw = &bm1390_read_raw,
- };
- static const struct iio_info bm1390_info = {
- .read_raw = &bm1390_read_raw,
- .hwfifo_set_watermark = bm1390_set_watermark,
- .hwfifo_flush_to_buffer = bm1390_fifo_flush,
- };
- static int bm1390_chip_init(struct bm1390_data *data)
- {
- int ret;
- ret = regmap_write_bits(data->regmap, BM1390_REG_POWER,
- BM1390_MASK_POWER, BM1390_POWER_ON);
- if (ret)
- return ret;
- msleep(1);
- ret = regmap_write_bits(data->regmap, BM1390_REG_RESET,
- BM1390_MASK_RESET, BM1390_RESET);
- if (ret)
- return ret;
- msleep(1);
- ret = regmap_write_bits(data->regmap, BM1390_REG_RESET,
- BM1390_MASK_RESET, BM1390_RESET_RELEASE);
- if (ret)
- return ret;
- msleep(1);
- ret = regmap_reinit_cache(data->regmap, &bm1390_regmap);
- if (ret) {
- dev_err(data->dev, "Failed to reinit reg cache\n");
- return ret;
- }
- /*
- * Default to use IIR filter in "middle" mode. Also the AVE_NUM must
- * be fixed when IIR is in use.
- */
- ret = regmap_update_bits(data->regmap, BM1390_REG_MODE_CTRL,
- BM1390_MASK_AVE_NUM, BM1390_IIR_AVE_NUM);
- if (ret)
- return ret;
- return regmap_update_bits(data->regmap, BM1390_REG_FIFO_CTRL,
- BM1390_MASK_IIR_MODE, BM1390_IIR_MODE_MID);
- }
- static int bm1390_fifo_set_wmi(struct bm1390_data *data)
- {
- u8 regval;
- regval = FIELD_PREP(BM1390_MASK_FIFO_LEN,
- data->watermark - BM1390_WMI_MIN);
- return regmap_update_bits(data->regmap, BM1390_REG_FIFO_CTRL,
- BM1390_MASK_FIFO_LEN, regval);
- }
- static int bm1390_fifo_enable(struct iio_dev *idev)
- {
- struct bm1390_data *data = iio_priv(idev);
- int ret;
- /* We can't do buffered stuff without IRQ as we never get WMI */
- if (data->irq <= 0)
- return -EINVAL;
- mutex_lock(&data->mutex);
- if (data->trigger_enabled) {
- ret = -EBUSY;
- goto unlock_out;
- }
- /* Update watermark to HW */
- ret = bm1390_fifo_set_wmi(data);
- if (ret)
- goto unlock_out;
- /* Enable WMI_IRQ */
- ret = regmap_set_bits(data->regmap, BM1390_REG_MODE_CTRL,
- BM1390_MASK_WMI_EN);
- if (ret)
- goto unlock_out;
- /* Enable FIFO */
- ret = regmap_set_bits(data->regmap, BM1390_REG_FIFO_CTRL,
- BM1390_MASK_FIFO_EN);
- if (ret)
- goto unlock_out;
- data->state = BM1390_STATE_FIFO;
- data->old_timestamp = iio_get_time_ns(idev);
- ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
- unlock_out:
- mutex_unlock(&data->mutex);
- return ret;
- }
- static int bm1390_fifo_disable(struct iio_dev *idev)
- {
- struct bm1390_data *data = iio_priv(idev);
- int ret;
- msleep(1);
- mutex_lock(&data->mutex);
- ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
- if (ret)
- goto unlock_out;
- /* Disable FIFO */
- ret = regmap_clear_bits(data->regmap, BM1390_REG_FIFO_CTRL,
- BM1390_MASK_FIFO_EN);
- if (ret)
- goto unlock_out;
- data->state = BM1390_STATE_SAMPLE;
- /* Disable WMI_IRQ */
- ret = regmap_clear_bits(data->regmap, BM1390_REG_MODE_CTRL,
- BM1390_MASK_WMI_EN);
- unlock_out:
- mutex_unlock(&data->mutex);
- return ret;
- }
- static int bm1390_buffer_postenable(struct iio_dev *idev)
- {
- /*
- * If we use data-ready trigger, then the IRQ masks should be handled by
- * trigger enable and the hardware buffer is not used but we just update
- * results to the IIO FIFO when data-ready triggers.
- */
- if (iio_device_get_current_mode(idev) == INDIO_BUFFER_TRIGGERED)
- return 0;
- return bm1390_fifo_enable(idev);
- }
- static int bm1390_buffer_predisable(struct iio_dev *idev)
- {
- if (iio_device_get_current_mode(idev) == INDIO_BUFFER_TRIGGERED)
- return 0;
- return bm1390_fifo_disable(idev);
- }
- static const struct iio_buffer_setup_ops bm1390_buffer_ops = {
- .postenable = bm1390_buffer_postenable,
- .predisable = bm1390_buffer_predisable,
- };
- static irqreturn_t bm1390_trigger_handler(int irq, void *p)
- {
- struct iio_poll_func *pf = p;
- struct iio_dev *idev = pf->indio_dev;
- struct bm1390_data *data = iio_priv(idev);
- int ret, status;
- /* DRDY is acked by reading status reg */
- ret = regmap_read(data->regmap, BM1390_REG_STATUS, &status);
- if (ret || !status)
- return IRQ_NONE;
- dev_dbg(data->dev, "DRDY trig status 0x%x\n", status);
- if (test_bit(BM1390_CHAN_PRESSURE, idev->active_scan_mask)) {
- ret = bm1390_pressure_read(data, &data->buf.pressure);
- if (ret) {
- dev_warn(data->dev, "sample read failed %d\n", ret);
- return IRQ_NONE;
- }
- }
- if (test_bit(BM1390_CHAN_TEMP, idev->active_scan_mask)) {
- ret = regmap_bulk_read(data->regmap, BM1390_REG_TEMP_HI,
- &data->buf.temp, sizeof(data->buf.temp));
- if (ret) {
- dev_warn(data->dev, "temp read failed %d\n", ret);
- return IRQ_HANDLED;
- }
- }
- iio_push_to_buffers_with_timestamp(idev, &data->buf, data->timestamp);
- iio_trigger_notify_done(idev->trig);
- return IRQ_HANDLED;
- }
- /* Get timestamps and wake the thread if we need to read data */
- static irqreturn_t bm1390_irq_handler(int irq, void *private)
- {
- struct iio_dev *idev = private;
- struct bm1390_data *data = iio_priv(idev);
- data->timestamp = iio_get_time_ns(idev);
- if (data->state == BM1390_STATE_FIFO || data->trigger_enabled)
- return IRQ_WAKE_THREAD;
- return IRQ_NONE;
- }
- static irqreturn_t bm1390_irq_thread_handler(int irq, void *private)
- {
- struct iio_dev *idev = private;
- struct bm1390_data *data = iio_priv(idev);
- int ret = IRQ_NONE;
- mutex_lock(&data->mutex);
- if (data->trigger_enabled) {
- iio_trigger_poll_nested(data->trig);
- ret = IRQ_HANDLED;
- } else if (data->state == BM1390_STATE_FIFO) {
- int ok;
- ok = __bm1390_fifo_flush(idev, BM1390_FIFO_LENGTH,
- data->timestamp);
- if (ok > 0)
- ret = IRQ_HANDLED;
- }
- mutex_unlock(&data->mutex);
- return ret;
- }
- static int bm1390_set_drdy_irq(struct bm1390_data *data, bool en)
- {
- if (en)
- return regmap_set_bits(data->regmap, BM1390_REG_MODE_CTRL,
- BM1390_MASK_DRDY_EN);
- return regmap_clear_bits(data->regmap, BM1390_REG_MODE_CTRL,
- BM1390_MASK_DRDY_EN);
- }
- static int bm1390_trigger_set_state(struct iio_trigger *trig,
- bool state)
- {
- struct bm1390_data *data = iio_trigger_get_drvdata(trig);
- int ret = 0;
- mutex_lock(&data->mutex);
- if (data->trigger_enabled == state)
- goto unlock_out;
- if (data->state == BM1390_STATE_FIFO) {
- dev_warn(data->dev, "Can't set trigger when FIFO enabled\n");
- ret = -EBUSY;
- goto unlock_out;
- }
- data->trigger_enabled = state;
- if (state) {
- ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
- if (ret)
- goto unlock_out;
- } else {
- int dummy;
- ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
- if (ret)
- goto unlock_out;
- /*
- * We need to read the status register in order to ACK the
- * data-ready which may have been generated just before we
- * disabled the measurement.
- */
- ret = regmap_read(data->regmap, BM1390_REG_STATUS, &dummy);
- if (ret)
- dev_warn(data->dev, "status read failed\n");
- }
- ret = bm1390_set_drdy_irq(data, state);
- unlock_out:
- mutex_unlock(&data->mutex);
- return ret;
- }
- static const struct iio_trigger_ops bm1390_trigger_ops = {
- .set_trigger_state = bm1390_trigger_set_state,
- };
- static int bm1390_setup_buffer(struct bm1390_data *data, struct iio_dev *idev)
- {
- int ret;
- ret = devm_iio_triggered_buffer_setup(data->dev, idev,
- &iio_pollfunc_store_time,
- &bm1390_trigger_handler,
- &bm1390_buffer_ops);
- if (ret)
- return dev_err_probe(data->dev, ret,
- "iio_triggered_buffer_setup FAIL\n");
- idev->available_scan_masks = bm1390_scan_masks;
- return 0;
- }
- static int bm1390_setup_trigger(struct bm1390_data *data, struct iio_dev *idev,
- int irq)
- {
- struct iio_trigger *itrig;
- char *name;
- int ret;
- itrig = devm_iio_trigger_alloc(data->dev, "%sdata-rdy-dev%d", idev->name,
- iio_device_id(idev));
- if (!itrig)
- return -ENOMEM;
- data->trig = itrig;
- itrig->ops = &bm1390_trigger_ops;
- iio_trigger_set_drvdata(itrig, data);
- name = devm_kasprintf(data->dev, GFP_KERNEL, "%s-bm1390",
- dev_name(data->dev));
- if (name == NULL)
- return -ENOMEM;
- ret = devm_request_threaded_irq(data->dev, irq, bm1390_irq_handler,
- &bm1390_irq_thread_handler,
- IRQF_ONESHOT, name, idev);
- if (ret)
- return dev_err_probe(data->dev, ret, "Could not request IRQ\n");
- ret = devm_iio_trigger_register(data->dev, itrig);
- if (ret)
- return dev_err_probe(data->dev, ret,
- "Trigger registration failed\n");
- return 0;
- }
- static int bm1390_probe(struct i2c_client *i2c)
- {
- struct bm1390_data *data;
- struct regmap *regmap;
- struct iio_dev *idev;
- struct device *dev;
- unsigned int part_id;
- int ret;
- dev = &i2c->dev;
- regmap = devm_regmap_init_i2c(i2c, &bm1390_regmap);
- if (IS_ERR(regmap))
- return dev_err_probe(dev, PTR_ERR(regmap),
- "Failed to initialize Regmap\n");
- ret = devm_regulator_get_enable(dev, "vdd");
- if (ret)
- return dev_err_probe(dev, ret, "Failed to get regulator\n");
- ret = regmap_read(regmap, BM1390_REG_PART_ID, &part_id);
- if (ret)
- return dev_err_probe(dev, ret, "Failed to access sensor\n");
- if (part_id != BM1390_ID)
- dev_warn(dev, "unknown device 0x%x\n", part_id);
- idev = devm_iio_device_alloc(dev, sizeof(*data));
- if (!idev)
- return -ENOMEM;
- data = iio_priv(idev);
- data->regmap = regmap;
- data->dev = dev;
- data->irq = i2c->irq;
- /*
- * For now we just allow BM1390_WMI_MIN to BM1390_WMI_MAX and
- * discard every other configuration when triggered mode is not used.
- */
- data->watermark = BM1390_WMI_MAX;
- mutex_init(&data->mutex);
- idev->channels = bm1390_channels;
- idev->num_channels = ARRAY_SIZE(bm1390_channels);
- idev->name = "bm1390";
- idev->modes = INDIO_DIRECT_MODE;
- ret = bm1390_chip_init(data);
- if (ret)
- return dev_err_probe(dev, ret, "sensor init failed\n");
- ret = bm1390_setup_buffer(data, idev);
- if (ret)
- return ret;
- /* No trigger if we don't have IRQ for data-ready and WMI */
- if (i2c->irq > 0) {
- idev->info = &bm1390_info;
- idev->modes |= INDIO_BUFFER_SOFTWARE;
- ret = bm1390_setup_trigger(data, idev, i2c->irq);
- if (ret)
- return ret;
- } else {
- idev->info = &bm1390_noirq_info;
- }
- ret = devm_iio_device_register(dev, idev);
- if (ret < 0)
- return dev_err_probe(dev, ret,
- "Unable to register iio device\n");
- return 0;
- }
- static const struct of_device_id bm1390_of_match[] = {
- { .compatible = "rohm,bm1390glv-z" },
- {}
- };
- MODULE_DEVICE_TABLE(of, bm1390_of_match);
- static const struct i2c_device_id bm1390_id[] = {
- { "bm1390glv-z", },
- {}
- };
- MODULE_DEVICE_TABLE(i2c, bm1390_id);
- static struct i2c_driver bm1390_driver = {
- .driver = {
- .name = "bm1390",
- .of_match_table = bm1390_of_match,
- /*
- * Probing explicitly requires a few millisecond of sleep.
- * Enabling the VDD regulator may include ramp up rates.
- */
- .probe_type = PROBE_PREFER_ASYNCHRONOUS,
- },
- .probe = bm1390_probe,
- .id_table = bm1390_id,
- };
- module_i2c_driver(bm1390_driver);
- MODULE_AUTHOR("Matti Vaittinen <mazziesaccount@gmail.com>");
- MODULE_DESCRIPTION("Driver for ROHM BM1390 pressure sensor");
- MODULE_LICENSE("GPL");
|