Lines Matching +full:pmin +full:- +full:pascal

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)
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
115 const s32 pmin; member
121 [MPR0001BA] = { .pmin = 0, .pmax = 100000 },
122 [MPR01_6BA] = { .pmin = 0, .pmax = 160000 },
123 [MPR02_5BA] = { .pmin = 0, .pmax = 250000 },
124 [MPR0060MG] = { .pmin = 0, .pmax = 6000 },
125 [MPR0100MG] = { .pmin = 0, .pmax = 10000 },
126 [MPR0160MG] = { .pmin = 0, .pmax = 16000 },
127 [MPR0250MG] = { .pmin = 0, .pmax = 25000 },
128 [MPR0400MG] = { .pmin = 0, .pmax = 40000 },
129 [MPR0600MG] = { .pmin = 0, .pmax = 60000 },
130 [MPR0001BG] = { .pmin = 0, .pmax = 100000 },
131 [MPR01_6BG] = { .pmin = 0, .pmax = 160000 },
132 [MPR02_5BG] = { .pmin = 0, .pmax = 250000 },
133 [MPR0100KA] = { .pmin = 0, .pmax = 100000 },
134 [MPR0160KA] = { .pmin = 0, .pmax = 160000 },
135 [MPR0250KA] = { .pmin = 0, .pmax = 250000 },
136 [MPR0006KG] = { .pmin = 0, .pmax = 6000 },
137 [MPR0010KG] = { .pmin = 0, .pmax = 10000 },
138 [MPR0016KG] = { .pmin = 0, .pmax = 16000 },
139 [MPR0025KG] = { .pmin = 0, .pmax = 25000 },
140 [MPR0040KG] = { .pmin = 0, .pmax = 40000 },
141 [MPR0060KG] = { .pmin = 0, .pmax = 60000 },
142 [MPR0100KG] = { .pmin = 0, .pmax = 100000 },
143 [MPR0160KG] = { .pmin = 0, .pmax = 160000 },
144 [MPR0250KG] = { .pmin = 0, .pmax = 250000 },
145 [MPR0015PA] = { .pmin = 0, .pmax = 103421 },
146 [MPR0025PA] = { .pmin = 0, .pmax = 172369 },
147 [MPR0030PA] = { .pmin = 0, .pmax = 206843 },
148 [MPR0001PG] = { .pmin = 0, .pmax = 6895 },
149 [MPR0005PG] = { .pmin = 0, .pmax = 34474 },
150 [MPR0015PG] = { .pmin = 0, .pmax = 103421 },
151 [MPR0030PG] = { .pmin = 0, .pmax = 206843 },
152 [MPR0300YG] = { .pmin = 0, .pmax = 39997 }
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()
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()
305 mutex_unlock(&data->lock); 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()
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>");