* [PATCH v4 0/3] Add support for Sensirion SDP500
@ 2024-07-25 15:37 Petar Stoykov via B4 Relay
2024-07-25 15:37 ` [PATCH v4 1/3] dt-bindings: iio: pressure: Add " Petar Stoykov via B4 Relay
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Petar Stoykov via B4 Relay @ 2024-07-25 15:37 UTC (permalink / raw)
To: linux-iio, Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko
Cc: Petar Stoykov, devicetree, linux-kernel
This patch series introduces support for Sensirion SDP500 in the IIO
subsystem. The series is split into three patches:
1. The first patch adds the device tree bindings.
2. The second patch implements the device driver.
3. The third patch updates the MAINTAINERS file.
The driver is relatively simple. It provides a way to read the measured
differential pressure directly in Pa, as the device has a fixed scale
factor of 1/60. When an applications wants to read the pressure value,
3 bytes are read from the device, 2 are data and 1 is CRC8. If the crc
check passes, the raw value is made available.
The initialization of the device just starts the measurement process.
We have been using this device and driver in a product development for
almost a year now. There the pressure is read every 25ms and is used in a
control loop. We have not even seen crc errors. We are using the
"linux-imx" repository and not the mainline one but I see no risky kernel
functions in use so it should be fine here too.
All feedback is appreciated! Thank you for taking the time to review this.
Changelog
v1->v2:
driver code:
* Removed the use of wrapper functions for logging
* Using built-in crc function instead of a custom one
* Removed the use of a wrapper function for i2c send and receive data
* Use get_unaligned_be16 instead of custom calculation
* Removed error log if devm_iio_device_alloc fails
* indio_dev->name set directly to "sdp500"
* Updated error logging to use "dev_err_probe" in probe function
* Added a sensor readout in the probe function (first one is always bad)
* Used devm_iio_device_register instead of iio_device_register
* Removed trailing comma in "sdp500_id" data
* Deleted sdp500_remove after using devm_iio_device_register in probe
dt-bindings:
* Fixed dt-bindings example wording
* Added vdd-supply in dt-bindings example
v2->v3:
driver code:
* Added link to datasheet at the start of the driver code
* Removed some unnecessary defines
* Removed an unused argument of sdp500_start_measurement function
* Renamed variable that holds the received CRC to "received_crc"
* Switched to returning RAW and SCALE values instead of PROCESSED
* Change logging to use data->dev instead of indio_dev->dev.parent
* Removed unnecessary debug log of the read value from the sensor
* Added vdd regulator handling
* Added "sensirion,sdp510" as compatible
* Removed the aligning of '=' in the sdp500_driver struct
dt-bindings:
* Added "sensirion,sdp510" as possible compatible value in dt-bindings example
Link to v3: https://lore.kernel.org/r/20240702-mainline_sdp500-v3-0-0902047b3eee@gmail.com
v3->v4:
driver code:
* include linux/mod_devicetable.h
* limit all lines to 80 characters
* fix C++ style comment
dt-bindings and MAINTAINERS:
* fix filename
Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com>
---
Petar Stoykov (3):
dt-bindings: iio: pressure: Add Sensirion SDP500
iio: pressure: Add driver for Sensirion SDP500
MAINTAINERS: Add Sensirion SDP500
.../bindings/iio/pressure/sensirion,sdp500.yaml | 46 ++++++
MAINTAINERS | 6 +
drivers/iio/pressure/Kconfig | 9 ++
drivers/iio/pressure/Makefile | 1 +
drivers/iio/pressure/sdp500.c | 157 +++++++++++++++++++++
5 files changed, 219 insertions(+)
---
base-commit: ab27740f76654ed58dd32ac0ba0031c18a6dea3b
change-id: 20240702-mainline_sdp500-0d9f8c499228
Best regards,
--
Petar Stoykov <pd.pstoykov@gmail.com>
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v4 1/3] dt-bindings: iio: pressure: Add Sensirion SDP500 2024-07-25 15:37 [PATCH v4 0/3] Add support for Sensirion SDP500 Petar Stoykov via B4 Relay @ 2024-07-25 15:37 ` Petar Stoykov via B4 Relay 2024-07-28 9:13 ` Krzysztof Kozlowski 2024-07-25 15:37 ` [PATCH v4 2/3] iio: pressure: Add driver for " Petar Stoykov via B4 Relay ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: Petar Stoykov via B4 Relay @ 2024-07-25 15:37 UTC (permalink / raw) To: linux-iio, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko Cc: Petar Stoykov, devicetree, linux-kernel From: Petar Stoykov <pd.pstoykov@gmail.com> Sensirion SDP500 is a digital differential pressure sensor. It provides a digital I2C output. Add devicetree bindings requiring the compatible string and I2C slave address (reg). Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> --- .../bindings/iio/pressure/sensirion,sdp500.yaml | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Documentation/devicetree/bindings/iio/pressure/sensirion,sdp500.yaml b/Documentation/devicetree/bindings/iio/pressure/sensirion,sdp500.yaml new file mode 100644 index 000000000000..813239f6879a --- /dev/null +++ b/Documentation/devicetree/bindings/iio/pressure/sensirion,sdp500.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/pressure/sensirion,sdp500.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: sdp500/sdp510 pressure sensor with I2C bus interface + +maintainers: + - Petar Stoykov <petar.stoykov@prodrive-technologies.com> + +description: | + Pressure sensor from Sensirion with I2C bus interface. + There is no software difference between sdp500 and sdp510. + +properties: + compatible: + oneOf: + - items: + - const: sensirion,sdp510 + - const: sensirion,sdp500 + - const: sensirion,sdp500 + + reg: + maxItems: 1 + + vdd-supply: true + +required: + - compatible + - reg + - vdd-supply + +additionalProperties: false + +examples: + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + pressure@40 { + compatible = "sensirion,sdp500"; + reg = <0x40>; + vdd-supply = <&foo>; + }; + }; -- 2.39.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 1/3] dt-bindings: iio: pressure: Add Sensirion SDP500 2024-07-25 15:37 ` [PATCH v4 1/3] dt-bindings: iio: pressure: Add " Petar Stoykov via B4 Relay @ 2024-07-28 9:13 ` Krzysztof Kozlowski 0 siblings, 0 replies; 9+ messages in thread From: Krzysztof Kozlowski @ 2024-07-28 9:13 UTC (permalink / raw) To: pd.pstoykov, linux-iio, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko Cc: devicetree, linux-kernel On 25/07/2024 17:37, Petar Stoykov via B4 Relay wrote: > From: Petar Stoykov <pd.pstoykov@gmail.com> > > Sensirion SDP500 is a digital differential pressure sensor. It provides > a digital I2C output. Add devicetree bindings requiring the compatible > string and I2C slave address (reg). > > Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> --- <form letter> This is an automated instruction, just in case, because many review tags are being ignored. If you know the process, you can skip it (please do not feel offended by me posting it here - no bad intentions intended). If you do not know the process, here is a short explanation: Please add Acked-by/Reviewed-by/Tested-by tags when posting new versions, under or above your Signed-off-by tag. Tag is "received", when provided in a message replied to you on the mailing list. Tools like b4 can help here. However, there's no need to repost patches *only* to add the tags. The upstream maintainer will do that for tags received on the version they apply. https://elixir.bootlin.com/linux/v6.5-rc3/source/Documentation/process/submitting-patches.rst#L577 </form letter> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v4 2/3] iio: pressure: Add driver for Sensirion SDP500 2024-07-25 15:37 [PATCH v4 0/3] Add support for Sensirion SDP500 Petar Stoykov via B4 Relay 2024-07-25 15:37 ` [PATCH v4 1/3] dt-bindings: iio: pressure: Add " Petar Stoykov via B4 Relay @ 2024-07-25 15:37 ` Petar Stoykov via B4 Relay 2024-07-28 9:12 ` Krzysztof Kozlowski 2024-07-28 15:28 ` Jonathan Cameron 2024-07-25 15:37 ` [PATCH v4 3/3] MAINTAINERS: Add " Petar Stoykov via B4 Relay 2024-07-28 15:30 ` [PATCH v4 0/3] Add support for " Jonathan Cameron 3 siblings, 2 replies; 9+ messages in thread From: Petar Stoykov via B4 Relay @ 2024-07-25 15:37 UTC (permalink / raw) To: linux-iio, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko Cc: Petar Stoykov, devicetree, linux-kernel From: Petar Stoykov <pd.pstoykov@gmail.com> Sensirion SDP500 is a digital differential pressure sensor. The sensor is accessed over I2C. Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> --- drivers/iio/pressure/Kconfig | 9 +++ drivers/iio/pressure/Makefile | 1 + drivers/iio/pressure/sdp500.c | 157 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+) diff --git a/drivers/iio/pressure/Kconfig b/drivers/iio/pressure/Kconfig index 95efa32e4289..5debdfbd5324 100644 --- a/drivers/iio/pressure/Kconfig +++ b/drivers/iio/pressure/Kconfig @@ -212,6 +212,15 @@ config MS5637 This driver can also be built as a module. If so, the module will be called ms5637. +config SDP500 + tristate "Sensirion SDP500 differential pressure sensor I2C driver" + depends on I2C + help + Say Y here to build support for Sensirion SDP500 differential pressure + sensor I2C driver. + To compile this driver as a module, choose M here: the core module + will be called sdp500. + config IIO_ST_PRESS tristate "STMicroelectronics pressure sensor Driver" depends on (I2C || SPI_MASTER) && SYSFS diff --git a/drivers/iio/pressure/Makefile b/drivers/iio/pressure/Makefile index 436aec7e65f3..489ef7b7befa 100644 --- a/drivers/iio/pressure/Makefile +++ b/drivers/iio/pressure/Makefile @@ -25,6 +25,7 @@ obj-$(CONFIG_MS5611) += ms5611_core.o obj-$(CONFIG_MS5611_I2C) += ms5611_i2c.o obj-$(CONFIG_MS5611_SPI) += ms5611_spi.o obj-$(CONFIG_MS5637) += ms5637.o +obj-$(CONFIG_SDP500) += sdp500.o obj-$(CONFIG_IIO_ST_PRESS) += st_pressure.o st_pressure-y := st_pressure_core.o st_pressure-$(CONFIG_IIO_BUFFER) += st_pressure_buffer.o diff --git a/drivers/iio/pressure/sdp500.c b/drivers/iio/pressure/sdp500.c new file mode 100644 index 000000000000..77d7e68f5dea --- /dev/null +++ b/drivers/iio/pressure/sdp500.c @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Driver for Sensirion sdp500 and sdp510 pressure sensors + * + * Datasheet: https://sensirion.com/resource/datasheet/sdp600 + */ + +#include <linux/i2c.h> +#include <linux/crc8.h> +#include <linux/iio/iio.h> +#include <linux/mod_devicetable.h> +#include <linux/regulator/consumer.h> +#include <asm/unaligned.h> + +#define SDP500_CRC8_POLYNOMIAL 0x31 /* x8+x5+x4+1 (normalized to 0x31) */ +#define SDP500_READ_SIZE 3 + +#define SDP500_I2C_START_MEAS 0xF1 + +struct sdp500_data { + struct device *dev; +}; + +DECLARE_CRC8_TABLE(sdp500_crc8_table); + +static int sdp500_start_measurement(struct sdp500_data *data) +{ + struct i2c_client *client = to_i2c_client(data->dev); + + return i2c_smbus_write_byte(client, SDP500_I2C_START_MEAS); +} + +static const struct iio_chan_spec sdp500_channels[] = { + { + .type = IIO_PRESSURE, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE), + }, +}; + +static int sdp500_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, int *val2, long mask) +{ + int ret; + u8 rxbuf[SDP500_READ_SIZE]; + u8 received_crc, calculated_crc; + struct sdp500_data *data = iio_priv(indio_dev); + struct i2c_client *client = to_i2c_client(data->dev); + + switch (mask) { + case IIO_CHAN_INFO_RAW: + ret = i2c_master_recv(client, rxbuf, SDP500_READ_SIZE); + if (ret < 0) { + dev_err(data->dev, "Failed to receive data"); + return ret; + } + if (ret != SDP500_READ_SIZE) { + dev_err(data->dev, "Data is received wrongly"); + return -EIO; + } + + received_crc = rxbuf[2]; + calculated_crc = crc8(sdp500_crc8_table, rxbuf, + sizeof(rxbuf) - 1, 0x00); + if (received_crc != calculated_crc) { + dev_err(data->dev, + "calculated crc = 0x%.2X, received 0x%.2X", + calculated_crc, received_crc); + return -EIO; + } + + *val = get_unaligned_be16(rxbuf); + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + *val = 1; + *val2 = 60; + + return IIO_VAL_FRACTIONAL; + default: + return -EINVAL; + } +} + +static const struct iio_info sdp500_info = { + .read_raw = &sdp500_read_raw, +}; + +static int sdp500_probe(struct i2c_client *client) +{ + struct iio_dev *indio_dev; + struct sdp500_data *data; + struct device *dev = &client->dev; + int ret; + u8 rxbuf[SDP500_READ_SIZE]; + + ret = devm_regulator_get_enable(dev, "vdd"); + if (ret) + return dev_err_probe(dev, ret, + "Failed to get and enable regulator\n"); + + indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); + if (!indio_dev) + return -ENOMEM; + + /* has to be done before the first i2c communication */ + crc8_populate_msb(sdp500_crc8_table, SDP500_CRC8_POLYNOMIAL); + + data = iio_priv(indio_dev); + data->dev = dev; + + indio_dev->name = "sdp500"; + indio_dev->channels = sdp500_channels; + indio_dev->info = &sdp500_info; + indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->num_channels = ARRAY_SIZE(sdp500_channels); + + ret = sdp500_start_measurement(data); + if (ret) + return dev_err_probe(dev, ret, "Failed to start measurement"); + + /* First measurement is not correct, read it out to get rid of it */ + i2c_master_recv(client, rxbuf, SDP500_READ_SIZE); + + ret = devm_iio_device_register(dev, indio_dev); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to register indio_dev"); + + return 0; +} + +static const struct i2c_device_id sdp500_id[] = { + { "sdp500" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, sdp500_id); + +static const struct of_device_id sdp500_of_match[] = { + { .compatible = "sensirion,sdp500" }, + { .compatible = "sensirion,sdp510" }, + { } +}; +MODULE_DEVICE_TABLE(of, sdp500_of_match); + +static struct i2c_driver sdp500_driver = { + .driver = { + .name = "sensirion,sdp500", + .of_match_table = sdp500_of_match, + }, + .probe = sdp500_probe, + .id_table = sdp500_id, +}; +module_i2c_driver(sdp500_driver); + +MODULE_AUTHOR("Thomas Sioutas <thomas.sioutas@prodrive-technologies.com>"); +MODULE_DESCRIPTION("Driver for Sensirion SDP500 differential pressure sensor"); +MODULE_LICENSE("GPL"); -- 2.39.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/3] iio: pressure: Add driver for Sensirion SDP500 2024-07-25 15:37 ` [PATCH v4 2/3] iio: pressure: Add driver for " Petar Stoykov via B4 Relay @ 2024-07-28 9:12 ` Krzysztof Kozlowski 2024-07-28 15:29 ` Jonathan Cameron 2024-07-28 15:28 ` Jonathan Cameron 1 sibling, 1 reply; 9+ messages in thread From: Krzysztof Kozlowski @ 2024-07-28 9:12 UTC (permalink / raw) To: pd.pstoykov, linux-iio, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko Cc: devicetree, linux-kernel On 25/07/2024 17:37, Petar Stoykov via B4 Relay wrote: > From: Petar Stoykov <pd.pstoykov@gmail.com> > > Sensirion SDP500 is a digital differential pressure sensor. The sensor is > accessed over I2C. > > Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> > --- > + > +static const struct i2c_device_id sdp500_id[] = { > + { "sdp500" }, > + { } > +}; > +MODULE_DEVICE_TABLE(i2c, sdp500_id); > + > +static const struct of_device_id sdp500_of_match[] = { > + { .compatible = "sensirion,sdp500" }, > + { .compatible = "sensirion,sdp510" }, Drop, why do you need it? I asked about this last time. Also, your OF table is not in sync with I2C table, so this should raise questions. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/3] iio: pressure: Add driver for Sensirion SDP500 2024-07-28 9:12 ` Krzysztof Kozlowski @ 2024-07-28 15:29 ` Jonathan Cameron 0 siblings, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-07-28 15:29 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: pd.pstoykov, linux-iio, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko, devicetree, linux-kernel On Sun, 28 Jul 2024 11:12:45 +0200 Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> wrote: > On 25/07/2024 17:37, Petar Stoykov via B4 Relay wrote: > > From: Petar Stoykov <pd.pstoykov@gmail.com> > > > > Sensirion SDP500 is a digital differential pressure sensor. The sensor is > > accessed over I2C. > > > > Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> > > --- > > > + > > +static const struct i2c_device_id sdp500_id[] = { > > + { "sdp500" }, > > + { } > > +}; > > +MODULE_DEVICE_TABLE(i2c, sdp500_id); > > + > > +static const struct of_device_id sdp500_of_match[] = { > > + { .compatible = "sensirion,sdp500" }, > > + { .compatible = "sensirion,sdp510" }, > > Drop, why do you need it? I asked about this last time. Also, your OF > table is not in sync with I2C table, so this should raise questions. > Agreed. I dropped the sdp510 entry whilst applying. Petar, if that is wrong for some reason we are missing, then shout. This won't go upstream for a little while yet so we can always put it back again :) Jonathan > Best regards, > Krzysztof > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/3] iio: pressure: Add driver for Sensirion SDP500 2024-07-25 15:37 ` [PATCH v4 2/3] iio: pressure: Add driver for " Petar Stoykov via B4 Relay 2024-07-28 9:12 ` Krzysztof Kozlowski @ 2024-07-28 15:28 ` Jonathan Cameron 1 sibling, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-07-28 15:28 UTC (permalink / raw) To: Petar Stoykov via B4 Relay Cc: pd.pstoykov, linux-iio, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko, devicetree, linux-kernel On Thu, 25 Jul 2024 17:37:28 +0200 Petar Stoykov via B4 Relay <devnull+pd.pstoykov.gmail.com@kernel.org> wrote: > From: Petar Stoykov <pd.pstoykov@gmail.com> > > Sensirion SDP500 is a digital differential pressure sensor. The sensor is > accessed over I2C. > > Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> Hi Petar, Some really trivial things inline + Krzysztof's comment. Rather than go around again, I'll tidy them up as follows and apply this series to the testing branch of iio.git Thanks, Jonathan diff --git a/drivers/iio/pressure/sdp500.c b/drivers/iio/pressure/sdp500.c index 77d7e68f5dea..6ff32e3fa637 100644 --- a/drivers/iio/pressure/sdp500.c +++ b/drivers/iio/pressure/sdp500.c @@ -62,7 +62,7 @@ static int sdp500_read_raw(struct iio_dev *indio_dev, received_crc = rxbuf[2]; calculated_crc = crc8(sdp500_crc8_table, rxbuf, - sizeof(rxbuf) - 1, 0x00); + sizeof(rxbuf) - 1, 0x00); if (received_crc != calculated_crc) { dev_err(data->dev, "calculated crc = 0x%.2X, received 0x%.2X", @@ -123,7 +123,7 @@ static int sdp500_probe(struct i2c_client *client) i2c_master_recv(client, rxbuf, SDP500_READ_SIZE); ret = devm_iio_device_register(dev, indio_dev); - if (ret < 0) + if (ret) return dev_err_probe(dev, ret, "Failed to register indio_dev"); return 0; @@ -137,7 +137,6 @@ MODULE_DEVICE_TABLE(i2c, sdp500_id); static const struct of_device_id sdp500_of_match[] = { { .compatible = "sensirion,sdp500" }, - { .compatible = "sensirion,sdp510" }, { } }; MODULE_DEVICE_TABLE(of, sdp500_of_match); > st_pressure-$(CONFIG_IIO_BUFFER) += st_pressure_buffer.o > diff --git a/drivers/iio/pressure/sdp500.c b/drivers/iio/pressure/sdp500.c > new file mode 100644 > index 000000000000..77d7e68f5dea > --- /dev/null > +++ b/drivers/iio/pressure/sdp500.c > @@ -0,0 +1,157 @@ ... > + > +static int sdp500_read_raw(struct iio_dev *indio_dev, > + struct iio_chan_spec const *chan, > + int *val, int *val2, long mask) > +{ > + int ret; > + u8 rxbuf[SDP500_READ_SIZE]; > + u8 received_crc, calculated_crc; > + struct sdp500_data *data = iio_priv(indio_dev); > + struct i2c_client *client = to_i2c_client(data->dev); > + > + switch (mask) { > + case IIO_CHAN_INFO_RAW: > + ret = i2c_master_recv(client, rxbuf, SDP500_READ_SIZE); > + if (ret < 0) { > + dev_err(data->dev, "Failed to receive data"); > + return ret; > + } > + if (ret != SDP500_READ_SIZE) { > + dev_err(data->dev, "Data is received wrongly"); > + return -EIO; > + } > + > + received_crc = rxbuf[2]; > + calculated_crc = crc8(sdp500_crc8_table, rxbuf, > + sizeof(rxbuf) - 1, 0x00); align just after ( > + if (received_crc != calculated_crc) { > + dev_err(data->dev, > + "calculated crc = 0x%.2X, received 0x%.2X", > + calculated_crc, received_crc); > + return -EIO; > + } > + > + *val = get_unaligned_be16(rxbuf); > + return IIO_VAL_INT; > + case IIO_CHAN_INFO_SCALE: > + *val = 1; > + *val2 = 60; > + > + return IIO_VAL_FRACTIONAL; > + default: > + return -EINVAL; > + } > +} > + > +static const struct iio_info sdp500_info = { > + .read_raw = &sdp500_read_raw, > +}; > + > +static int sdp500_probe(struct i2c_client *client) > +{ > + struct iio_dev *indio_dev; > + struct sdp500_data *data; > + struct device *dev = &client->dev; > + int ret; > + u8 rxbuf[SDP500_READ_SIZE]; > + > + ret = devm_regulator_get_enable(dev, "vdd"); > + if (ret) > + return dev_err_probe(dev, ret, > + "Failed to get and enable regulator\n"); > + > + indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); > + if (!indio_dev) > + return -ENOMEM; > + > + /* has to be done before the first i2c communication */ > + crc8_populate_msb(sdp500_crc8_table, SDP500_CRC8_POLYNOMIAL); > + > + data = iio_priv(indio_dev); > + data->dev = dev; > + > + indio_dev->name = "sdp500"; > + indio_dev->channels = sdp500_channels; > + indio_dev->info = &sdp500_info; > + indio_dev->modes = INDIO_DIRECT_MODE; > + indio_dev->num_channels = ARRAY_SIZE(sdp500_channels); > + > + ret = sdp500_start_measurement(data); > + if (ret) > + return dev_err_probe(dev, ret, "Failed to start measurement"); > + > + /* First measurement is not correct, read it out to get rid of it */ > + i2c_master_recv(client, rxbuf, SDP500_READ_SIZE); > + > + ret = devm_iio_device_register(dev, indio_dev); > + if (ret < 0) if (ret) is more consistent with other handling in the driver (and my preference in general for checking IIO core code calls). > + return dev_err_probe(dev, ret, "Failed to register indio_dev"); > + > + return 0; > +} ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v4 3/3] MAINTAINERS: Add Sensirion SDP500 2024-07-25 15:37 [PATCH v4 0/3] Add support for Sensirion SDP500 Petar Stoykov via B4 Relay 2024-07-25 15:37 ` [PATCH v4 1/3] dt-bindings: iio: pressure: Add " Petar Stoykov via B4 Relay 2024-07-25 15:37 ` [PATCH v4 2/3] iio: pressure: Add driver for " Petar Stoykov via B4 Relay @ 2024-07-25 15:37 ` Petar Stoykov via B4 Relay 2024-07-28 15:30 ` [PATCH v4 0/3] Add support for " Jonathan Cameron 3 siblings, 0 replies; 9+ messages in thread From: Petar Stoykov via B4 Relay @ 2024-07-25 15:37 UTC (permalink / raw) To: linux-iio, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko Cc: Petar Stoykov, devicetree, linux-kernel From: Petar Stoykov <pd.pstoykov@gmail.com> Add myself as a maintainer for Sensirion SDP500 pressure sensor driver Signed-off-by: Petar Stoykov <pd.pstoykov@gmail.com> --- MAINTAINERS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 40c754b4c39c..fae39d65d676 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19533,6 +19533,12 @@ S: Maintained F: Documentation/devicetree/bindings/iio/chemical/sensirion,scd4x.yaml F: drivers/iio/chemical/scd4x.c +SENSIRION SDP500 DIFFERENTIAL PRESSURE SENSOR DRIVER +M: Petar Stoykov <petar.stoykov@prodrive-technologies.com> +S: Maintained +F: Documentation/devicetree/bindings/iio/pressure/sensirion,sdp500.yaml +F: drivers/iio/pressure/sdp500.c + SENSIRION SGP40 GAS SENSOR DRIVER M: Andreas Klinger <ak@it-klinger.de> S: Maintained -- 2.39.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 0/3] Add support for Sensirion SDP500 2024-07-25 15:37 [PATCH v4 0/3] Add support for Sensirion SDP500 Petar Stoykov via B4 Relay ` (2 preceding siblings ...) 2024-07-25 15:37 ` [PATCH v4 3/3] MAINTAINERS: Add " Petar Stoykov via B4 Relay @ 2024-07-28 15:30 ` Jonathan Cameron 3 siblings, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-07-28 15:30 UTC (permalink / raw) To: Petar Stoykov via B4 Relay Cc: pd.pstoykov, linux-iio, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Andy Shevchenko, devicetree, linux-kernel On Thu, 25 Jul 2024 17:37:26 +0200 Petar Stoykov via B4 Relay <devnull+pd.pstoykov.gmail.com@kernel.org> wrote: > This patch series introduces support for Sensirion SDP500 in the IIO > subsystem. The series is split into three patches: > > 1. The first patch adds the device tree bindings. > 2. The second patch implements the device driver. > 3. The third patch updates the MAINTAINERS file. Series applied. Tweaks to patch 2 in reply to that patch. Thanks Jonathan ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-07-28 15:30 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-07-25 15:37 [PATCH v4 0/3] Add support for Sensirion SDP500 Petar Stoykov via B4 Relay 2024-07-25 15:37 ` [PATCH v4 1/3] dt-bindings: iio: pressure: Add " Petar Stoykov via B4 Relay 2024-07-28 9:13 ` Krzysztof Kozlowski 2024-07-25 15:37 ` [PATCH v4 2/3] iio: pressure: Add driver for " Petar Stoykov via B4 Relay 2024-07-28 9:12 ` Krzysztof Kozlowski 2024-07-28 15:29 ` Jonathan Cameron 2024-07-28 15:28 ` Jonathan Cameron 2024-07-25 15:37 ` [PATCH v4 3/3] MAINTAINERS: Add " Petar Stoykov via B4 Relay 2024-07-28 15:30 ` [PATCH v4 0/3] Add support for " Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox