| // 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"); |