Lines Matching +full:serial +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0
3 * Sensirion SCD30 carbon dioxide sensor serial driver
55 static int scd30_serdev_xfer(struct scd30_state *state, char *txbuf, int txsize, in scd30_serdev_xfer() argument
58 struct serdev_device *serdev = to_serdev_device(state->dev); in scd30_serdev_xfer()
59 struct scd30_serdev_priv *priv = state->priv; in scd30_serdev_xfer()
62 priv->buf = rxbuf; in scd30_serdev_xfer()
63 priv->num_expected = rxsize; in scd30_serdev_xfer()
64 priv->num = 0; in scd30_serdev_xfer()
70 return -EIO; in scd30_serdev_xfer()
72 ret = wait_for_completion_interruptible_timeout(&priv->meas_ready, SCD30_SERDEV_TIMEOUT); in scd30_serdev_xfer()
76 return -ETIMEDOUT; in scd30_serdev_xfer()
81 static int scd30_serdev_command(struct scd30_state *state, enum scd30_cmd cmd, u16 arg, in scd30_serdev_command() argument
85 * Communication over serial line is based on modbus protocol (or rather in scd30_serdev_command()
86 * its variation called modbus over serial to be precise). Upon in scd30_serdev_command()
92 * +------+------+-----+-----+-------+-------+-----+-----+ in scd30_serdev_command()
95 * +------+------+-----+-----+-------+-------+-----+-----+ in scd30_serdev_command()
103 * +------+------+--------+-------+-----+-------+-----+-----+ in scd30_serdev_command()
106 * +------+------+--------+-------+-----+-------+-----+-----+ in scd30_serdev_command()
142 ret = scd30_serdev_xfer(state, txbuf, txsize, rxbuf, rxsize); in scd30_serdev_command()
149 dev_err(state->dev, "wrong message received\n"); in scd30_serdev_command()
150 return -EIO; in scd30_serdev_command()
154 if (rxbuf[2] != (rxsize - SCD30_SERDEV_RX_HEADER_SIZE - SCD30_SERDEV_CRC_SIZE)) { in scd30_serdev_command()
155 dev_err(state->dev, "received data size does not match header\n"); in scd30_serdev_command()
156 return -EIO; in scd30_serdev_command()
159 rxsize -= SCD30_SERDEV_CRC_SIZE; in scd30_serdev_command()
162 dev_err(state->dev, "data integrity check failed\n"); in scd30_serdev_command()
163 return -EIO; in scd30_serdev_command()
166 rxsize -= SCD30_SERDEV_RX_HEADER_SIZE; in scd30_serdev_command()
170 dev_err(state->dev, "received unknown op code\n"); in scd30_serdev_command()
171 return -EIO; in scd30_serdev_command()
182 struct scd30_state *state; in scd30_serdev_receive_buf() local
188 state = iio_priv(indio_dev); in scd30_serdev_receive_buf()
189 priv = state->priv; in scd30_serdev_receive_buf()
192 if (!priv->buf) in scd30_serdev_receive_buf()
195 if (priv->num + size >= priv->num_expected) in scd30_serdev_receive_buf()
196 num = priv->num_expected - priv->num; in scd30_serdev_receive_buf()
200 memcpy(priv->buf + priv->num, buf, num); in scd30_serdev_receive_buf()
201 priv->num += num; in scd30_serdev_receive_buf()
203 if (priv->num == priv->num_expected) { in scd30_serdev_receive_buf()
204 priv->buf = NULL; in scd30_serdev_receive_buf()
205 complete(&priv->meas_ready); in scd30_serdev_receive_buf()
218 struct device *dev = &serdev->dev; in scd30_serdev_probe()
224 return -ENOMEM; in scd30_serdev_probe()
226 init_completion(&priv->meas_ready); in scd30_serdev_probe()
262 MODULE_DESCRIPTION("Sensirion SCD30 carbon dioxide sensor serial driver");