staticint bmp280_read_raw_impl(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct bmp280_data *data = iio_priv(indio_dev); int chan_value; int ret;
guard(mutex)(&data->lock);
switch (mask) { case IIO_CHAN_INFO_PROCESSED:
ret = data->chip_info->set_mode(data, BMP280_FORCED); if (ret) return ret;
ret = data->chip_info->wait_conv(data); if (ret) return ret;
switch (chan->type) { case IIO_HUMIDITYRELATIVE:
ret = data->chip_info->read_humid(data, &chan_value); if (ret) return ret;
*val = data->chip_info->humid_coeffs[0] * chan_value;
*val2 = data->chip_info->humid_coeffs[1]; return data->chip_info->humid_coeffs_type; case IIO_PRESSURE:
ret = data->chip_info->read_press(data, &chan_value); if (ret) return ret;
*val = data->chip_info->press_coeffs[0] * chan_value;
*val2 = data->chip_info->press_coeffs[1]; return data->chip_info->press_coeffs_type; case IIO_TEMP:
ret = data->chip_info->read_temp(data, &chan_value); if (ret) return ret;
*val = data->chip_info->temp_coeffs[0] * chan_value;
*val2 = data->chip_info->temp_coeffs[1]; return data->chip_info->temp_coeffs_type; default: return -EINVAL;
} case IIO_CHAN_INFO_RAW:
ret = data->chip_info->set_mode(data, BMP280_FORCED); if (ret) return ret;
ret = data->chip_info->wait_conv(data); if (ret) return ret;
switch (chan->type) { case IIO_HUMIDITYRELATIVE:
ret = data->chip_info->read_humid(data, &chan_value); if (ret) return ret;
*val = chan_value; return IIO_VAL_INT; case IIO_PRESSURE:
ret = data->chip_info->read_press(data, &chan_value); if (ret) return ret;
*val = chan_value; return IIO_VAL_INT; case IIO_TEMP:
ret = data->chip_info->read_temp(data, &chan_value); if (ret) return ret;
*val = chan_value; return IIO_VAL_INT; default: return -EINVAL;
} case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_HUMIDITYRELATIVE:
*val = data->chip_info->humid_coeffs[0];
*val2 = data->chip_info->humid_coeffs[1]; return data->chip_info->humid_coeffs_type; case IIO_PRESSURE:
*val = data->chip_info->press_coeffs[0];
*val2 = data->chip_info->press_coeffs[1]; return data->chip_info->press_coeffs_type; case IIO_TEMP:
*val = data->chip_info->temp_coeffs[0];
*val2 = data->chip_info->temp_coeffs[1]; return data->chip_info->temp_coeffs_type; default: return -EINVAL;
} case IIO_CHAN_INFO_OVERSAMPLING_RATIO: switch (chan->type) { case IIO_HUMIDITYRELATIVE:
*val = 1 << data->oversampling_humid; return IIO_VAL_INT; case IIO_PRESSURE:
*val = 1 << data->oversampling_press; return IIO_VAL_INT; case IIO_TEMP:
*val = 1 << data->oversampling_temp; return IIO_VAL_INT; default: return -EINVAL;
} case IIO_CHAN_INFO_SAMP_FREQ: if (!data->chip_info->sampling_freq_avail) return -EINVAL;
*val = data->chip_info->sampling_freq_avail[data->sampling_freq][0];
*val2 = data->chip_info->sampling_freq_avail[data->sampling_freq][1]; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: if (!data->chip_info->iir_filter_coeffs_avail) return -EINVAL;
staticint bmp280_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct bmp280_data *data = iio_priv(indio_dev); int ret;
pm_runtime_get_sync(data->dev);
ret = bmp280_read_raw_impl(indio_dev, chan, val, val2, mask);
pm_runtime_mark_last_busy(data->dev);
pm_runtime_put_autosuspend(data->dev);
return ret;
}
staticint bme280_write_oversampling_ratio_humid(struct bmp280_data *data, int val)
{ constint *avail = data->chip_info->oversampling_humid_avail; constint n = data->chip_info->num_oversampling_humid_avail; int ret, prev; int i;
for (i = 0; i < n; i++) { if (avail[i] == val) {
prev = data->oversampling_humid;
data->oversampling_humid = ilog2(val);
ret = data->chip_info->chip_config(data); if (ret) {
data->oversampling_humid = prev;
data->chip_info->chip_config(data); return ret;
} return0;
}
} return -EINVAL;
}
staticint bmp280_write_oversampling_ratio_temp(struct bmp280_data *data, int val)
{ constint *avail = data->chip_info->oversampling_temp_avail; constint n = data->chip_info->num_oversampling_temp_avail; int ret, prev; int i;
for (i = 0; i < n; i++) { if (avail[i] == val) {
prev = data->oversampling_temp;
data->oversampling_temp = ilog2(val);
ret = data->chip_info->chip_config(data); if (ret) {
data->oversampling_temp = prev;
data->chip_info->chip_config(data); return ret;
} return0;
}
} return -EINVAL;
}
staticint bmp280_write_oversampling_ratio_press(struct bmp280_data *data, int val)
{ constint *avail = data->chip_info->oversampling_press_avail; constint n = data->chip_info->num_oversampling_press_avail; int ret, prev; int i;
for (i = 0; i < n; i++) { if (avail[i] == val) {
prev = data->oversampling_press;
data->oversampling_press = ilog2(val);
ret = data->chip_info->chip_config(data); if (ret) {
data->oversampling_press = prev;
data->chip_info->chip_config(data); return ret;
} return0;
}
} return -EINVAL;
}
staticint bmp280_write_sampling_frequency(struct bmp280_data *data, int val, int val2)
{ constint (*avail)[2] = data->chip_info->sampling_freq_avail; constint n = data->chip_info->num_sampling_freq_avail; int ret, prev; int i;
for (i = 0; i < n; i++) { if (avail[i][0] == val && avail[i][1] == val2) {
prev = data->sampling_freq;
data->sampling_freq = i;
ret = data->chip_info->chip_config(data); if (ret) {
data->sampling_freq = prev;
data->chip_info->chip_config(data); return ret;
} return0;
}
} return -EINVAL;
}
staticint bmp280_write_iir_filter_coeffs(struct bmp280_data *data, int val)
{ constint *avail = data->chip_info->iir_filter_coeffs_avail; constint n = data->chip_info->num_iir_filter_coeffs_avail; int ret, prev; int i;
for (i = 0; i < n; i++) { if (avail[i] - 1 == val) {
prev = data->iir_filter_coeff;
data->iir_filter_coeff = i;
ret = data->chip_info->chip_config(data); if (ret) {
data->iir_filter_coeff = prev;
data->chip_info->chip_config(data); return ret;
} return0;
}
} return -EINVAL;
}
staticint bmp280_write_raw_impl(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct bmp280_data *data = iio_priv(indio_dev);
guard(mutex)(&data->lock);
/* *Helperfunctionstoupdatesensorrunningconfiguration. *Ifanerrorhappensapplyingnewsettings,willtryrestore *previousparameterstoensurethesensorisleftinaknown *workingconfiguration.
*/ switch (mask) { case IIO_CHAN_INFO_OVERSAMPLING_RATIO: switch (chan->type) { case IIO_HUMIDITYRELATIVE: return bme280_write_oversampling_ratio_humid(data, val); case IIO_PRESSURE: return bmp280_write_oversampling_ratio_press(data, val); case IIO_TEMP: return bmp280_write_oversampling_ratio_temp(data, val); default: return -EINVAL;
} case IIO_CHAN_INFO_SAMP_FREQ: return bmp280_write_sampling_frequency(data, val, val2); case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: return bmp280_write_iir_filter_coeffs(data, val); default: return -EINVAL;
}
}
staticint bmp280_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct bmp280_data *data = iio_priv(indio_dev); int ret;
pm_runtime_get_sync(data->dev);
ret = bmp280_write_raw_impl(indio_dev, chan, val, val2, mask);
pm_runtime_mark_last_busy(data->dev);
pm_runtime_put_autosuspend(data->dev);
return ret;
}
staticint bmp280_read_avail(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, constint **vals, int *type, int *length, long mask)
{ struct bmp280_data *data = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_OVERSAMPLING_RATIO: switch (chan->type) { case IIO_PRESSURE:
*vals = data->chip_info->oversampling_press_avail;
*length = data->chip_info->num_oversampling_press_avail; break; case IIO_TEMP:
*vals = data->chip_info->oversampling_temp_avail;
*length = data->chip_info->num_oversampling_temp_avail; break; default: return -EINVAL;
}
*type = IIO_VAL_INT; return IIO_AVAIL_LIST; case IIO_CHAN_INFO_SAMP_FREQ:
*vals = (constint *)data->chip_info->sampling_freq_avail;
*type = IIO_VAL_INT_PLUS_MICRO; /* Values are stored in a 2D matrix */
*length = data->chip_info->num_sampling_freq_avail; return IIO_AVAIL_LIST; case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
*vals = data->chip_info->iir_filter_coeffs_avail;
*type = IIO_VAL_INT;
*length = data->chip_info->num_iir_filter_coeffs_avail; return IIO_AVAIL_LIST; default: return -EINVAL;
}
}
staticint bmp280_set_mode(struct bmp280_data *data, enum bmp280_op_mode mode)
{ int ret;
ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,
BMP280_MODE_MASK, bmp280_operation_mode[mode]); if (ret) {
dev_err(data->dev, "failed to write ctrl_meas register.\n"); return ret;
}
data->op_mode = mode;
return0;
}
staticint bmp280_wait_conv(struct bmp280_data *data)
{ unsignedint reg, meas_time_us; int ret;
/* Check if we are using a BME280 device */ if (data->oversampling_humid)
meas_time_us = BMP280_PRESS_HUMID_MEAS_OFFSET +
BIT(data->oversampling_humid) * BMP280_MEAS_DUR;
/* Check if device is ready to process a command */
ret = regmap_read(data->regmap, BMP380_REG_STATUS, ®); if (ret) {
dev_err(data->dev, "failed to read error register\n"); return ret;
} if (!(reg & BMP380_STATUS_CMD_RDY_MASK)) {
dev_err(data->dev, "device is not ready to accept commands\n"); return -EBUSY;
}
/* Send command to process */
ret = regmap_write(data->regmap, BMP380_REG_CMD, cmd); if (ret) {
dev_err(data->dev, "failed to send command to device\n"); return ret;
} /* Wait for 2ms for command to be processed */
fsleep(data->start_up_time_us); /* Check for command processing error */
ret = regmap_read(data->regmap, BMP380_REG_ERROR, ®); if (ret) {
dev_err(data->dev, "error reading ERROR reg\n"); return ret;
} if (reg & BMP380_ERR_CMD_MASK) {
dev_err(data->dev, "error processing command 0x%X\n", cmd); return -EINVAL;
}
/* Read temperature and pressure calibration data */
ret = regmap_bulk_read(data->regmap, BMP380_REG_CALIB_TEMP_START,
data->bmp380_cal_buf, sizeof(data->bmp380_cal_buf)); if (ret) {
dev_err(data->dev, "failed to read calibration parameters\n"); return ret;
}
/* Toss the temperature calibration data into the entropy pool */
add_device_randomness(data->bmp380_cal_buf, sizeof(data->bmp380_cal_buf));
staticint bmp380_set_mode(struct bmp280_data *data, enum bmp280_op_mode mode)
{ int ret;
ret = regmap_write_bits(data->regmap, BMP380_REG_POWER_CONTROL,
BMP380_MODE_MASK,
FIELD_PREP(BMP380_MODE_MASK,
bmp380_operation_mode[mode])); if (ret) {
dev_err(data->dev, "failed to write power control register.\n"); return ret;
}
data->op_mode = mode;
return0;
}
staticint bmp380_wait_conv(struct bmp280_data *data)
{ unsignedint reg; int ret, meas_time_us;
/* Offset measurement time */
meas_time_us = BMP380_MEAS_OFFSET;
/* Configure power control register */
ret = regmap_update_bits(data->regmap, BMP380_REG_POWER_CONTROL,
BMP380_CTRL_SENSORS_MASK,
BMP380_CTRL_SENSORS_PRESS_EN |
BMP380_CTRL_SENSORS_TEMP_EN); if (ret) {
dev_err(data->dev, "failed to write operation control register\n"); return ret;
}
ret = regmap_update_bits_check(data->regmap, BMP380_REG_OSR,
BMP380_OSRS_TEMP_MASK |
BMP380_OSRS_PRESS_MASK,
osrs, &aux); if (ret) {
dev_err(data->dev, "failed to write oversampling register\n"); return ret;
}
change = change || aux;
/* Configure output data rate */
ret = regmap_update_bits_check(data->regmap, BMP380_REG_ODR,
BMP380_ODRS_MASK, data->sampling_freq,
&aux); if (ret) {
dev_err(data->dev, "failed to write ODR selection register\n"); return ret;
}
change = change || aux;
/* Set filter data */
ret = regmap_update_bits(data->regmap, BMP380_REG_CONFIG, BMP380_FILTER_MASK,
FIELD_PREP(BMP380_FILTER_MASK, data->iir_filter_coeff)); if (ret) {
dev_err(data->dev, "failed to write config register\n"); return ret;
}
if (change) { /* *Theconfigurationserrorsaredetectedontheflyduringa *measurementcycle.Ifthesamplingfrequencyistoolow,it's *fastertoresetthemeasurementloopthanwaituntilthenext *measurementisdue. * *Resetssensormeasurementlooptogglingbetweensleepand *normaloperatingmodes.
*/
ret = bmp380_set_mode(data, BMP280_SLEEP); if (ret) {
dev_err(data->dev, "failed to set sleep mode\n"); return ret;
}
ret = bmp380_set_mode(data, BMP280_NORMAL); if (ret) {
dev_err(data->dev, "failed to set normal mode\n"); return ret;
} /* *Waitsformeasurementbeforecheckingconfigurationerror *flag.Selectedlongestmeasurementtime,calculatedfrom *formulaindatasheetsection3.9.2withanoffsetof~+15% *asitseenaswellintable3.9.1.
*/
fsleep(150 * USEC_PER_MSEC);
/* Check config error flag */
ret = regmap_read(data->regmap, BMP380_REG_ERROR, &tmp); if (ret) {
dev_err(data->dev, "failed to read error register\n"); return ret;
} if (tmp & BMP380_ERR_CONF_MASK) {
dev_warn(data->dev, "sensor flagged configuration as incompatible\n"); return -EINVAL;
}
}
/* Dummy read to empty data registers. */
ret = bmp380_read_press(data, &tmp); if (ret) return ret;
ret = bmp380_set_mode(data, BMP280_SLEEP); if (ret)
dev_err(data->dev, "failed to set sleep mode.\n");
staticint bmp380_int_pin_config(struct bmp280_data *data)
{ int pin_drive_cfg = FIELD_PREP(BMP380_INT_CTRL_OPEN_DRAIN,
data->trig_open_drain); int pin_level_cfg = FIELD_PREP(BMP380_INT_CTRL_LEVEL,
data->trig_active_high); int ret, int_pin_cfg = pin_drive_cfg | pin_level_cfg;
ret = regmap_update_bits(data->regmap, BMP380_REG_INT_CONTROL,
BMP380_INT_CTRL_SETTINGS_MASK, int_pin_cfg); if (ret)
dev_err(data->dev, "Could not set interrupt settings.\n");
staticint bmp580_soft_reset(struct bmp280_data *data)
{ unsignedint reg; int ret;
ret = regmap_write(data->regmap, BMP580_REG_CMD, BMP580_CMD_SOFT_RESET); if (ret) {
dev_err(data->dev, "failed to send reset command to device\n"); return ret;
} /* From datasheet's table 4: electrical characteristics */
fsleep(2000);
/* Dummy read of chip_id */
ret = regmap_read(data->regmap, BMP580_REG_CHIP_ID, ®); if (ret) {
dev_err(data->dev, "failed to reestablish comms after reset\n"); return ret;
}
ret = regmap_read(data->regmap, BMP580_REG_INT_STATUS, ®); if (ret) {
dev_err(data->dev, "error reading interrupt status register\n"); return ret;
} if (!(reg & BMP580_INT_STATUS_POR_MASK)) {
dev_err(data->dev, "error resetting sensor\n"); return -EINVAL;
}
/* Issue soft-reset command */
ret = bmp580_soft_reset(data); if (ret) return ret;
/* Post powerup sequence */
ret = regmap_read(data->regmap, BMP580_REG_CHIP_ID, ®); if (ret) {
dev_err(data->dev, "failed to establish comms with the chip\n"); return ret;
}
/* Print warn message if we don't know the chip id */ if (reg != BMP580_CHIP_ID && reg != BMP580_CHIP_ID_ALT)
dev_warn(data->dev, "unexpected chip_id\n");
ret = regmap_read(data->regmap, BMP580_REG_STATUS, ®); if (ret) {
dev_err(data->dev, "failed to read nvm status\n"); return ret;
}
/* Check nvm status */ if (!(reg & BMP580_STATUS_NVM_RDY_MASK) || (reg & BMP580_STATUS_NVM_ERR_MASK)) {
dev_err(data->dev, "nvm error on powerup sequence\n"); return -EIO;
}
if (mode == BMP280_FORCED) {
ret = regmap_set_bits(data->regmap, BMP580_REG_DSP_CONFIG,
BMP580_DSP_IIR_FORCED_FLUSH); if (ret) {
dev_err(dev, "Could not flush IIR filter constants.\n"); return ret;
}
}
ret = regmap_write_bits(data->regmap, BMP580_REG_ODR_CONFIG,
BMP580_MODE_MASK,
FIELD_PREP(BMP580_MODE_MASK,
bmp580_operation_mode[mode])); if (ret) {
dev_err(dev, "failed to write power control register.\n"); return ret;
}
staticint bmp580_int_pin_config(struct bmp280_data *data)
{ int pin_drive_cfg = FIELD_PREP(BMP580_INT_CONFIG_OPEN_DRAIN,
data->trig_open_drain); int pin_level_cfg = FIELD_PREP(BMP580_INT_CONFIG_LEVEL,
data->trig_active_high); int ret, int_pin_cfg = pin_drive_cfg | pin_level_cfg;
ret = regmap_update_bits(data->regmap, BMP580_REG_INT_CONFIG,
BMP580_INT_CONFIG_MASK, int_pin_cfg); if (ret) {
dev_err(data->dev, "Could not set interrupt settings.\n"); return ret;
}
ret = regmap_set_bits(data->regmap, BMP580_REG_INT_SOURCE,
BMP580_INT_SOURCE_DRDY); if (ret)
dev_err(data->dev, "Could not set interrupt source.\n");
if (data->use_eoc)
reinit_completion(&data->done);
ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas); if (ret) {
dev_err(data->dev, "failed to write crtl_meas register\n"); return ret;
}
if (data->use_eoc) { /* *Ifwehaveacompletioninterrupt,useit,waitupto *100ms.Thelongestconversiontimelistedis76.5msfor *advancedresolutionmode.
*/
ret = wait_for_completion_timeout(&data->done, 1 + msecs_to_jiffies(100)); if (!ret)
dev_err(data->dev, "timeout waiting for completion\n");
} else { if (FIELD_GET(BMP180_MEAS_CTRL_MASK, ctrl_meas) == BMP180_MEAS_TEMP)
delay_us = 4500; else
delay_us =
conversion_time_max[data->oversampling_press];
fsleep(delay_us);
}
ret = regmap_read(data->regmap, BMP280_REG_CTRL_MEAS, &ctrl); if (ret) {
dev_err(data->dev, "failed to read ctrl_meas register\n"); return ret;
}
/* The value of this bit reset to "0" after conversion is complete */ if (ctrl & BMP180_MEAS_SCO) {
dev_err(data->dev, "conversion didn't complete\n"); return -EIO;
}
return0;
}
staticint bmp180_read_temp_adc(struct bmp280_data *data, u32 *adc_temp)
{ int ret;
ret = bmp180_wait_for_eoc(data,
FIELD_PREP(BMP180_MEAS_CTRL_MASK, BMP180_MEAS_TEMP) |
BMP180_MEAS_SCO); if (ret) return ret;
ret = regmap_bulk_read(data->regmap, BMP180_REG_OUT_MSB,
&data->be16, sizeof(data->be16)); if (ret) {
dev_err(data->dev, "failed to read temperature\n"); return ret;
}
*adc_temp = be16_to_cpu(data->be16);
return0;
}
staticint bmp180_read_calib(struct bmp280_data *data)
{ struct bmp180_calib *calib = &data->calib.bmp180; int ret; int i;
ret = regmap_bulk_read(data->regmap, BMP180_REG_CALIB_START,
data->bmp180_cal_buf, sizeof(data->bmp180_cal_buf)); if (ret) {
dev_err(data->dev, "failed to read calibration parameters\n"); return ret;
}
/* None of the words has the value 0 or 0xFFFF */ for (i = 0; i < ARRAY_SIZE(data->bmp180_cal_buf); i++) { if (data->bmp180_cal_buf[i] == cpu_to_be16(0) ||
data->bmp180_cal_buf[i] == cpu_to_be16(0xffff)) return -EIO;
}
/* Toss the calibration data into the entropy pool */
add_device_randomness(data->bmp180_cal_buf, sizeof(data->bmp180_cal_buf));
irq = fwnode_irq_get(dev_fwnode(dev), 0); if (irq < 0) return dev_err_probe(dev, irq, "No interrupt found.\n");
irq_trig = irq_get_trigger_type(irq); if (irq_trig != IRQF_TRIGGER_RISING) {
dev_err(dev, "non-rising trigger given for EOC interrupt, trying to enforce it\n");
irq_trig = IRQF_TRIGGER_RISING;
}
init_completion(&data->done);
ret = devm_request_irq(dev, irq, bmp085_eoc_irq, irq_trig,
indio_dev->name, data); if (ret) { /* Bail out without IRQ but keep the driver in place */
dev_err(dev, "unable to request DRDY IRQ\n"); return0;
}
/* Bring up regulators */
regulator_bulk_set_supply_names(data->supplies,
bmp280_supply_names,
BMP280_NUM_SUPPLIES);
ret = devm_regulator_bulk_get(dev,
BMP280_NUM_SUPPLIES, data->supplies); if (ret) {
dev_err(dev, "failed to get regulators\n"); return ret;
}
ret = regulator_bulk_enable(BMP280_NUM_SUPPLIES, data->supplies); if (ret) {
dev_err(dev, "failed to enable regulators\n"); return ret;
}
ret = devm_add_action_or_reset(dev, bmp280_regulators_disable,
data->supplies); if (ret) return ret;
/* Wait to make sure we started up properly */
fsleep(data->start_up_time_us);
/* Bring chip out of reset if there is an assigned GPIO line */
gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(gpiod)) return dev_err_probe(dev, PTR_ERR(gpiod), "failed to get reset GPIO\n");
/* Deassert the signal */
dev_info(dev, "release reset\n");
gpiod_set_value(gpiod, 0);
data->regmap = regmap;
ret = regmap_read(regmap, data->chip_info->id_reg, &chip_id); if (ret) {
dev_err(data->dev, "failed to read chip id\n"); return ret;
}
for (i = 0; i < data->chip_info->num_chip_id; i++) { if (chip_id == data->chip_info->chip_id[i]) {
dev_info(dev, "0x%x is a known chip id for %s\n", chip_id, name); break;
}
}
if (i == data->chip_info->num_chip_id)
dev_warn(dev, "bad chip id: 0x%x is not a known chip id\n", chip_id);
if (data->chip_info->preinit) {
ret = data->chip_info->preinit(data); if (ret) return dev_err_probe(data->dev, ret, "error running preinit tasks\n");
}
ret = data->chip_info->chip_config(data); if (ret) return ret;
if (data->chip_info->read_calib) {
ret = data->chip_info->read_calib(data); if (ret) return dev_err_probe(data->dev, ret, "failed to read calibration coefficients\n");
}
ret = devm_iio_triggered_buffer_setup(data->dev, indio_dev,
iio_pollfunc_store_time,
data->chip_info->trigger_handler,
&bmp280_buffer_setup_ops); if (ret) return dev_err_probe(data->dev, ret, "iio triggered buffer setup failed\n");
/* *AttempttograbanoptionalEOCIRQ-onlytheBMP085hasthis *howeverasithappens,theBMP085sharesthechipIDofBMP180 *sowelookforanIRQifwehavethat.
*/ if (irq > 0) { if (data->chip_info->trigger_probe)
ret = data->chip_info->trigger_probe(indio_dev); if (ret) return ret;
}
ret = data->chip_info->set_mode(data, BMP280_SLEEP); if (ret) return dev_err_probe(dev, ret, "Failed to set sleep mode\n");
MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>");
MODULE_DESCRIPTION("Driver for Bosch Sensortec BMP180/BMP280 pressure and temperature sensor");
MODULE_LICENSE("GPL v2");
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.51 Sekunden
(vorverarbeitet am 2026-09-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.