Lines Matching +full:board +full:- +full:mount +full:- +full:pressure +full:- +full:sensors

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * MPRLS0025PA - Honeywell MicroPressure pressure sensor series driver
5 * Copyright (c) Andreas Klinger <ak@it-klinger.de>
8-edam.honeywell.com/content/dam/honeywell-edam/sps/siot/en-us/products/sensors/pressure-sensors/bo…
45 * pressure = (press_cnt - outputmin) * scale + pmin
47 * * pressure - measured pressure in Pascal
48 * * press_cnt - raw value read from sensor
49 * * pmin - minimum pressure range value of sensor (data->pmin)
50 * * pmax - maximum pressure range value of sensor (data->pmax)
51 * * outputmin - minimum numerical range raw value delivered by sensor
53 * * outputmax - maximum numerical range raw value delivered by sensor
55 * * scale - (pmax - pmin) / (outputmax - outputmin)
58 * pressure = (raw + offset) * scale
61 * * raw - press_cnt
62 * * offset - (-1 * outputmin) - pmin / scale
63 * note: With all sensors from the datasheet pmin = 0
64 * which reduces the offset to (-1 * outputmin)
110 * struct mpr_range_config - list of pressure ranges based on nomenclature
111 * @pmin: lowest pressure that can be measured
112 * @pmax: highest pressure that can be measured
174 if (data->gpiod_reset) { in mpr_reset()
175 gpiod_set_value(data->gpiod_reset, 0); in mpr_reset()
177 gpiod_set_value(data->gpiod_reset, 1); in mpr_reset()
182 * mpr_read_pressure() - Read pressure value from sensor
191 * Context: The function can sleep and data->lock should be held when calling it
193 * * 0 - OK, the pressure value could be read
194 * * -ETIMEDOUT - Timeout while waiting for the EOC interrupt or busy flag is
199 struct device *dev = data->dev; in mpr_read_pressure()
203 reinit_completion(&data->completion); in mpr_read_pressure()
205 ret = data->ops->write(data, MPR_CMD_SYNC, MPR_PKT_SYNC_LEN); in mpr_read_pressure()
211 if (data->irq > 0) { in mpr_read_pressure()
212 ret = wait_for_completion_timeout(&data->completion, HZ); in mpr_read_pressure()
215 return -ETIMEDOUT; in mpr_read_pressure()
223 * --> let's try it nloops (10) times which seems to be in mpr_read_pressure()
227 ret = data->ops->read(data, MPR_CMD_NOP, 1); in mpr_read_pressure()
234 if (!(data->buffer[0] & MPR_ST_ERR_FLAG)) in mpr_read_pressure()
239 return -ETIMEDOUT; in mpr_read_pressure()
243 ret = data->ops->read(data, MPR_CMD_NOP, MPR_PKT_NOP_LEN); in mpr_read_pressure()
247 if (data->buffer[0] & MPR_ST_ERR_FLAG) { in mpr_read_pressure()
248 dev_err(data->dev, in mpr_read_pressure()
249 "unexpected status byte %02x\n", data->buffer[0]); in mpr_read_pressure()
250 return -ETIMEDOUT; in mpr_read_pressure()
253 *press = get_unaligned_be24(&data->buffer[1]); in mpr_read_pressure()
255 dev_dbg(dev, "received: %*ph cnt: %d\n", ret, data->buffer, *press); in mpr_read_pressure()
264 complete(&data->completion); in mpr_eoc_handler()
273 struct iio_dev *indio_dev = pf->indio_dev; in mpr_trigger_handler()
276 mutex_lock(&data->lock); in mpr_trigger_handler()
277 ret = mpr_read_pressure(data, &data->chan.pres); in mpr_trigger_handler()
281 iio_push_to_buffers_with_timestamp(indio_dev, &data->chan, in mpr_trigger_handler()
285 mutex_unlock(&data->lock); in mpr_trigger_handler()
286 iio_trigger_notify_done(indio_dev->trig); in mpr_trigger_handler()
295 s32 pressure; in mpr_read_raw() local
298 if (chan->type != IIO_PRESSURE) in mpr_read_raw()
299 return -EINVAL; in mpr_read_raw()
303 mutex_lock(&data->lock); in mpr_read_raw()
304 ret = mpr_read_pressure(data, &pressure); in mpr_read_raw()
305 mutex_unlock(&data->lock); in mpr_read_raw()
308 *val = pressure; in mpr_read_raw()
311 *val = data->scale; in mpr_read_raw()
312 *val2 = data->scale2; in mpr_read_raw()
315 *val = data->offset; in mpr_read_raw()
316 *val2 = data->offset2; in mpr_read_raw()
319 return -EINVAL; in mpr_read_raw()
338 return -ENOMEM; in mpr_common_probe()
341 data->dev = dev; in mpr_common_probe()
342 data->ops = ops; in mpr_common_probe()
343 data->irq = irq; in mpr_common_probe()
345 mutex_init(&data->lock); in mpr_common_probe()
346 init_completion(&data->completion); in mpr_common_probe()
348 indio_dev->name = "mprls0025pa"; in mpr_common_probe()
349 indio_dev->info = &mpr_info; in mpr_common_probe()
350 indio_dev->channels = mpr_channels; in mpr_common_probe()
351 indio_dev->num_channels = ARRAY_SIZE(mpr_channels); in mpr_common_probe()
352 indio_dev->modes = INDIO_DIRECT_MODE; in mpr_common_probe()
359 ret = data->ops->init(data->dev); in mpr_common_probe()
364 "honeywell,transfer-function", &func); in mpr_common_probe()
367 "honeywell,transfer-function could not be read\n"); in mpr_common_probe()
368 data->function = func - 1; in mpr_common_probe()
369 if (data->function > MPR_FUNCTION_C) in mpr_common_probe()
370 return dev_err_probe(dev, -EINVAL, in mpr_common_probe()
371 "honeywell,transfer-function %d invalid\n", in mpr_common_probe()
372 data->function); in mpr_common_probe()
374 ret = device_property_read_string(dev, "honeywell,pressure-triplet", in mpr_common_probe()
377 ret = device_property_read_u32(dev, "honeywell,pmin-pascal", in mpr_common_probe()
378 &data->pmin); in mpr_common_probe()
381 "honeywell,pmin-pascal could not be read\n"); in mpr_common_probe()
383 ret = device_property_read_u32(dev, "honeywell,pmax-pascal", in mpr_common_probe()
384 &data->pmax); in mpr_common_probe()
387 "honeywell,pmax-pascal could not be read\n"); in mpr_common_probe()
390 "honeywell,pressure-triplet", in mpr_common_probe()
394 return dev_err_probe(dev, -EINVAL, in mpr_common_probe()
395 "honeywell,pressure-triplet is invalid\n"); in mpr_common_probe()
397 data->pmin = mpr_range_config[ret].pmin; in mpr_common_probe()
398 data->pmax = mpr_range_config[ret].pmax; in mpr_common_probe()
401 if (data->pmin >= data->pmax) in mpr_common_probe()
402 return dev_err_probe(dev, -EINVAL, in mpr_common_probe()
403 "pressure limits are invalid\n"); in mpr_common_probe()
405 data->outmin = mpr_func_spec[data->function].output_min; in mpr_common_probe()
406 data->outmax = mpr_func_spec[data->function].output_max; in mpr_common_probe()
409 scale = div_s64(((s64)(data->pmax - data->pmin)) * NANO, in mpr_common_probe()
410 data->outmax - data->outmin); in mpr_common_probe()
411 data->scale = div_s64_rem(scale, NANO, &data->scale2); in mpr_common_probe()
416 offset = ((-1LL) * (s64)data->outmin) * NANO - in mpr_common_probe()
417 div_s64(div_s64((s64)data->pmin * NANO, scale), NANO); in mpr_common_probe()
418 data->offset = div_s64_rem(offset, NANO, &data->offset2); in mpr_common_probe()
420 if (data->irq > 0) { in mpr_common_probe()
421 ret = devm_request_irq(dev, data->irq, mpr_eoc_handler, in mpr_common_probe()
427 "request irq %d failed\n", data->irq); in mpr_common_probe()
430 data->gpiod_reset = devm_gpiod_get_optional(dev, "reset", in mpr_common_probe()
432 if (IS_ERR(data->gpiod_reset)) in mpr_common_probe()
433 return dev_err_probe(dev, PTR_ERR(data->gpiod_reset), in mpr_common_probe()
434 "request reset-gpio failed\n"); in mpr_common_probe()
453 MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");
454 MODULE_DESCRIPTION("Honeywell MPR pressure sensor core driver");