.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Murata ZPA2326 pressure and temperature sensor IIO driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (c) 2016 Parrot S.A. |
---|
5 | 6 | * |
---|
6 | 7 | * Author: Gregor Boirie <gregor.boirie@parrot.com> |
---|
7 | | - * |
---|
8 | | - * This program is free software; you can redistribute it and/or modify it |
---|
9 | | - * under the terms of the GNU General Public License version 2 as published by |
---|
10 | | - * the Free Software Foundation. |
---|
11 | | - * |
---|
12 | | - * This program is distributed in the hope that it will be useful, but WITHOUT |
---|
13 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
---|
14 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
---|
15 | | - * more details. |
---|
16 | 8 | */ |
---|
17 | 9 | |
---|
18 | 10 | /** |
---|
.. | .. |
---|
72 | 64 | #include <linux/iio/trigger.h> |
---|
73 | 65 | #include <linux/iio/trigger_consumer.h> |
---|
74 | 66 | #include <linux/iio/triggered_buffer.h> |
---|
| 67 | +#include <asm/unaligned.h> |
---|
75 | 68 | #include "zpa2326.h" |
---|
76 | 69 | |
---|
77 | 70 | /* 200 ms should be enough for the longest conversion time in one-shot mode. */ |
---|
.. | .. |
---|
1015 | 1008 | struct regmap *regs = ((struct zpa2326_private *) |
---|
1016 | 1009 | iio_priv(indio_dev))->regmap; |
---|
1017 | 1010 | int err; |
---|
| 1011 | + u8 v[3]; |
---|
1018 | 1012 | |
---|
1019 | 1013 | switch (type) { |
---|
1020 | 1014 | case IIO_PRESSURE: |
---|
1021 | 1015 | zpa2326_dbg(indio_dev, "fetching raw pressure sample"); |
---|
1022 | 1016 | |
---|
1023 | | - err = regmap_bulk_read(regs, ZPA2326_PRESS_OUT_XL_REG, value, |
---|
1024 | | - 3); |
---|
| 1017 | + err = regmap_bulk_read(regs, ZPA2326_PRESS_OUT_XL_REG, v, sizeof(v)); |
---|
1025 | 1018 | if (err) { |
---|
1026 | 1019 | zpa2326_warn(indio_dev, "failed to fetch pressure (%d)", |
---|
1027 | 1020 | err); |
---|
1028 | 1021 | return err; |
---|
1029 | 1022 | } |
---|
1030 | 1023 | |
---|
1031 | | - /* Pressure is a 24 bits wide little-endian unsigned int. */ |
---|
1032 | | - *value = (((u8 *)value)[2] << 16) | (((u8 *)value)[1] << 8) | |
---|
1033 | | - ((u8 *)value)[0]; |
---|
| 1024 | + *value = get_unaligned_le24(&v[0]); |
---|
1034 | 1025 | |
---|
1035 | 1026 | return IIO_VAL_INT; |
---|
1036 | 1027 | |
---|
.. | .. |
---|
1259 | 1250 | * get rid of samples acquired during previous rounds (if any). |
---|
1260 | 1251 | */ |
---|
1261 | 1252 | err = zpa2326_clear_fifo(indio_dev, 0); |
---|
1262 | | - if (err) |
---|
1263 | | - goto err; |
---|
| 1253 | + if (err) { |
---|
| 1254 | + zpa2326_err(indio_dev, |
---|
| 1255 | + "failed to enable buffering (%d)", err); |
---|
| 1256 | + return err; |
---|
| 1257 | + } |
---|
1264 | 1258 | } |
---|
1265 | 1259 | |
---|
1266 | 1260 | if (!iio_trigger_using_own(indio_dev) && priv->waken) { |
---|
.. | .. |
---|
1269 | 1263 | * powered up: reconfigure one-shot mode. |
---|
1270 | 1264 | */ |
---|
1271 | 1265 | err = zpa2326_config_oneshot(indio_dev, priv->irq); |
---|
1272 | | - if (err) |
---|
1273 | | - goto err; |
---|
| 1266 | + if (err) { |
---|
| 1267 | + zpa2326_err(indio_dev, |
---|
| 1268 | + "failed to enable buffering (%d)", err); |
---|
| 1269 | + return err; |
---|
| 1270 | + } |
---|
1274 | 1271 | } |
---|
1275 | 1272 | |
---|
1276 | | - /* Plug our own trigger event handler. */ |
---|
1277 | | - err = iio_triggered_buffer_postenable(indio_dev); |
---|
1278 | | - if (err) |
---|
1279 | | - goto err; |
---|
1280 | | - |
---|
1281 | 1273 | return 0; |
---|
1282 | | - |
---|
1283 | | -err: |
---|
1284 | | - zpa2326_err(indio_dev, "failed to enable buffering (%d)", err); |
---|
1285 | | - |
---|
1286 | | - return err; |
---|
1287 | 1274 | } |
---|
1288 | 1275 | |
---|
1289 | 1276 | static int zpa2326_postdisable_buffer(struct iio_dev *indio_dev) |
---|
.. | .. |
---|
1296 | 1283 | static const struct iio_buffer_setup_ops zpa2326_buffer_setup_ops = { |
---|
1297 | 1284 | .preenable = zpa2326_preenable_buffer, |
---|
1298 | 1285 | .postenable = zpa2326_postenable_buffer, |
---|
1299 | | - .predisable = iio_triggered_buffer_predisable, |
---|
1300 | 1286 | .postdisable = zpa2326_postdisable_buffer |
---|
1301 | 1287 | }; |
---|
1302 | 1288 | |
---|
.. | .. |
---|
1610 | 1596 | |
---|
1611 | 1597 | /* Setup for userspace synchronous on demand sampling. */ |
---|
1612 | 1598 | indio_dev->modes = INDIO_DIRECT_MODE; |
---|
1613 | | - indio_dev->dev.parent = device; |
---|
1614 | 1599 | indio_dev->channels = zpa2326_channels; |
---|
1615 | 1600 | indio_dev->num_channels = ARRAY_SIZE(zpa2326_channels); |
---|
1616 | 1601 | indio_dev->name = name; |
---|