* [PATCH v7 0/3] iio: chemical: atlas-sensor: add DO support
@ 2020-02-18 3:42 Matt Ranostay
2020-02-18 3:42 ` [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line Matt Ranostay
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Matt Ranostay @ 2020-02-18 3:42 UTC (permalink / raw)
To: linux-iio; +Cc: jic23, Matt Ranostay
Changes from v1:
* combined dt binding docs
* added making interrupt line is optional patchset
* broke out dt changes from DO-SM module patchset
Changes from v2:
* switch docs to YAML format
Changes from v3:
* fix up issues reported with dt-schema
Changes from v4:
* fix logic issue in optional interrupt patchset
Changes from v5:
* Update license on yaml conversion to GPLv2.0+ and BSD clause
Changes from v6:
* Don't set interrupt bits in buffer pre/postenable if no interrupt line
is registered
Matt Ranostay (3):
iio: chemical: atlas-sensor: allow probe without interrupt line
iio: chemical: atlas-sensor: add DO-SM module support
dt-bindings: iio: chemical: consolidate atlas-sensor docs
.../bindings/iio/chemical/atlas,ec-sm.txt | 21 ----
.../bindings/iio/chemical/atlas,orp-sm.txt | 21 ----
.../bindings/iio/chemical/atlas,ph-sm.txt | 21 ----
.../bindings/iio/chemical/atlas,sensor.yaml | 53 ++++++++++
drivers/iio/chemical/atlas-sensor.c | 97 +++++++++++++++----
5 files changed, 131 insertions(+), 82 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
create mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
--
2.25.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line
2020-02-18 3:42 [PATCH v7 0/3] iio: chemical: atlas-sensor: add DO support Matt Ranostay
@ 2020-02-18 3:42 ` Matt Ranostay
2020-02-21 12:09 ` Jonathan Cameron
2020-02-18 3:42 ` [PATCH v7 2/3] iio: chemical: atlas-sensor: add DO-SM module support Matt Ranostay
2020-02-18 3:42 ` [PATCH v7 3/3] dt-bindings: iio: chemical: consolidate atlas-sensor docs Matt Ranostay
2 siblings, 1 reply; 7+ messages in thread
From: Matt Ranostay @ 2020-02-18 3:42 UTC (permalink / raw)
To: linux-iio; +Cc: jic23, Matt Ranostay
Sensors don't actually need a interrupt line to give valid readings,
and can triggered with CONFIG_IIO_HRTIMER_TRIGGER as well. Remove
the required check for interrupt, and continue along in the probe
function.
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
---
drivers/iio/chemical/atlas-sensor.c | 33 ++++++++++++++++-------------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/drivers/iio/chemical/atlas-sensor.c b/drivers/iio/chemical/atlas-sensor.c
index 2f0a6fed2589..d95818b74770 100644
--- a/drivers/iio/chemical/atlas-sensor.c
+++ b/drivers/iio/chemical/atlas-sensor.c
@@ -76,6 +76,7 @@ struct atlas_data {
struct atlas_device *chip;
struct regmap *regmap;
struct irq_work work;
+ unsigned int interrupt_enabled;
__be32 buffer[6]; /* 96-bit data + 32-bit pad + 64-bit timestamp */
};
@@ -304,6 +305,9 @@ static int atlas_set_powermode(struct atlas_data *data, int on)
static int atlas_set_interrupt(struct atlas_data *data, bool state)
{
+ if (!data->interrupt_enabled)
+ return 0;
+
return regmap_update_bits(data->regmap, ATLAS_REG_INT_CONTROL,
ATLAS_REG_INT_CONTROL_EN,
state ? ATLAS_REG_INT_CONTROL_EN : 0);
@@ -572,11 +576,6 @@ static int atlas_probe(struct i2c_client *client,
if (ret)
return ret;
- if (client->irq <= 0) {
- dev_err(&client->dev, "no valid irq defined\n");
- return -EINVAL;
- }
-
ret = chip->calibration(data);
if (ret)
return ret;
@@ -596,16 +595,20 @@ static int atlas_probe(struct i2c_client *client,
init_irq_work(&data->work, atlas_work_handler);
- /* interrupt pin toggles on new conversion */
- ret = devm_request_threaded_irq(&client->dev, client->irq,
- NULL, atlas_interrupt_handler,
- IRQF_TRIGGER_RISING |
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
- "atlas_irq",
- indio_dev);
- if (ret) {
- dev_err(&client->dev, "request irq (%d) failed\n", client->irq);
- goto unregister_buffer;
+ if (client->irq > 0) {
+ /* interrupt pin toggles on new conversion */
+ ret = devm_request_threaded_irq(&client->dev, client->irq,
+ NULL, atlas_interrupt_handler,
+ IRQF_TRIGGER_RISING |
+ IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+ "atlas_irq",
+ indio_dev);
+
+ if (ret)
+ dev_warn(&client->dev,
+ "request irq (%d) failed\n", client->irq);
+ else
+ data->interrupt_enabled = 1;
}
ret = atlas_set_powermode(data, 1);
--
2.25.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 2/3] iio: chemical: atlas-sensor: add DO-SM module support
2020-02-18 3:42 [PATCH v7 0/3] iio: chemical: atlas-sensor: add DO support Matt Ranostay
2020-02-18 3:42 ` [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line Matt Ranostay
@ 2020-02-18 3:42 ` Matt Ranostay
2020-02-21 12:11 ` Jonathan Cameron
2020-02-18 3:42 ` [PATCH v7 3/3] dt-bindings: iio: chemical: consolidate atlas-sensor docs Matt Ranostay
2 siblings, 1 reply; 7+ messages in thread
From: Matt Ranostay @ 2020-02-18 3:42 UTC (permalink / raw)
To: linux-iio; +Cc: jic23, Matt Ranostay
Atlas Scientific DO-SM OEM sensor reads disolved oxygen in
a solution. This is reported back as mg/L which maps directly
to ppm and so the IIO_CONCENTRATION channel type can be used.
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
---
drivers/iio/chemical/atlas-sensor.c | 64 +++++++++++++++++++++++++++--
1 file changed, 60 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/chemical/atlas-sensor.c b/drivers/iio/chemical/atlas-sensor.c
index d95818b74770..82d470561ad3 100644
--- a/drivers/iio/chemical/atlas-sensor.c
+++ b/drivers/iio/chemical/atlas-sensor.c
@@ -48,6 +48,11 @@
#define ATLAS_REG_EC_CALIB_STATUS_LOW BIT(2)
#define ATLAS_REG_EC_CALIB_STATUS_HIGH BIT(3)
+#define ATLAS_REG_DO_CALIB_STATUS 0x09
+#define ATLAS_REG_DO_CALIB_STATUS_MASK 0x03
+#define ATLAS_REG_DO_CALIB_STATUS_PRESSURE BIT(0)
+#define ATLAS_REG_DO_CALIB_STATUS_DO BIT(1)
+
#define ATLAS_REG_PH_TEMP_DATA 0x0e
#define ATLAS_REG_PH_DATA 0x16
@@ -60,14 +65,19 @@
#define ATLAS_REG_ORP_CALIB_STATUS 0x0d
#define ATLAS_REG_ORP_DATA 0x0e
+#define ATLAS_REG_DO_TEMP_DATA 0x12
+#define ATLAS_REG_DO_DATA 0x22
+
#define ATLAS_PH_INT_TIME_IN_MS 450
#define ATLAS_EC_INT_TIME_IN_MS 650
#define ATLAS_ORP_INT_TIME_IN_MS 450
+#define ATLAS_DO_INT_TIME_IN_MS 450
enum {
ATLAS_PH_SM,
ATLAS_EC_SM,
ATLAS_ORP_SM,
+ ATLAS_DO_SM,
};
struct atlas_data {
@@ -122,7 +132,7 @@ static const struct iio_chan_spec atlas_ph_channels[] = {
},
};
-#define ATLAS_EC_CHANNEL(_idx, _addr) \
+#define ATLAS_CONCENTRATION_CHANNEL(_idx, _addr) \
{\
.type = IIO_CONCENTRATION, \
.indexed = 1, \
@@ -153,8 +163,8 @@ static const struct iio_chan_spec atlas_ec_channels[] = {
.endianness = IIO_BE,
},
},
- ATLAS_EC_CHANNEL(0, ATLAS_REG_TDS_DATA),
- ATLAS_EC_CHANNEL(1, ATLAS_REG_PSS_DATA),
+ ATLAS_CONCENTRATION_CHANNEL(0, ATLAS_REG_TDS_DATA),
+ ATLAS_CONCENTRATION_CHANNEL(1, ATLAS_REG_PSS_DATA),
IIO_CHAN_SOFT_TIMESTAMP(3),
{
.type = IIO_TEMP,
@@ -183,6 +193,19 @@ static const struct iio_chan_spec atlas_orp_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(1),
};
+static const struct iio_chan_spec atlas_do_channels[] = {
+ ATLAS_CONCENTRATION_CHANNEL(0, ATLAS_REG_DO_DATA),
+ IIO_CHAN_SOFT_TIMESTAMP(1),
+ {
+ .type = IIO_TEMP,
+ .address = ATLAS_REG_DO_TEMP_DATA,
+ .info_mask_separate =
+ BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
+ .output = 1,
+ .scan_index = -1
+ },
+};
+
static int atlas_check_ph_calibration(struct atlas_data *data)
{
struct device *dev = &data->client->dev;
@@ -263,7 +286,31 @@ static int atlas_check_orp_calibration(struct atlas_data *data)
dev_warn(dev, "device has not been calibrated\n");
return 0;
-};
+}
+
+static int atlas_check_do_calibration(struct atlas_data *data)
+{
+ struct device *dev = &data->client->dev;
+ int ret;
+ unsigned int val;
+
+ ret = regmap_read(data->regmap, ATLAS_REG_DO_CALIB_STATUS, &val);
+ if (ret)
+ return ret;
+
+ if (!(val & ATLAS_REG_DO_CALIB_STATUS_MASK)) {
+ dev_warn(dev, "device has not been calibrated\n");
+ return 0;
+ }
+
+ if (!(val & ATLAS_REG_DO_CALIB_STATUS_PRESSURE))
+ dev_warn(dev, "device missing atmospheric pressure calibration\n");
+
+ if (!(val & ATLAS_REG_DO_CALIB_STATUS_DO))
+ dev_warn(dev, "device missing dissolved oxygen calibration\n");
+
+ return 0;
+}
struct atlas_device {
const struct iio_chan_spec *channels;
@@ -296,6 +343,13 @@ static struct atlas_device atlas_devices[] = {
.calibration = &atlas_check_orp_calibration,
.delay = ATLAS_ORP_INT_TIME_IN_MS,
},
+ [ATLAS_DO_SM] = {
+ .channels = atlas_do_channels,
+ .num_channels = 3,
+ .data_reg = ATLAS_REG_DO_DATA,
+ .calibration = &atlas_check_do_calibration,
+ .delay = ATLAS_DO_INT_TIME_IN_MS,
+ },
};
static int atlas_set_powermode(struct atlas_data *data, int on)
@@ -511,6 +565,7 @@ static const struct i2c_device_id atlas_id[] = {
{ "atlas-ph-sm", ATLAS_PH_SM},
{ "atlas-ec-sm", ATLAS_EC_SM},
{ "atlas-orp-sm", ATLAS_ORP_SM},
+ { "atlas-do-sm", ATLAS_DO_SM},
{}
};
MODULE_DEVICE_TABLE(i2c, atlas_id);
@@ -519,6 +574,7 @@ static const struct of_device_id atlas_dt_ids[] = {
{ .compatible = "atlas,ph-sm", .data = (void *)ATLAS_PH_SM, },
{ .compatible = "atlas,ec-sm", .data = (void *)ATLAS_EC_SM, },
{ .compatible = "atlas,orp-sm", .data = (void *)ATLAS_ORP_SM, },
+ { .compatible = "atlas,do-sm", .data = (void *)ATLAS_DO_SM, },
{ }
};
MODULE_DEVICE_TABLE(of, atlas_dt_ids);
--
2.25.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 3/3] dt-bindings: iio: chemical: consolidate atlas-sensor docs
2020-02-18 3:42 [PATCH v7 0/3] iio: chemical: atlas-sensor: add DO support Matt Ranostay
2020-02-18 3:42 ` [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line Matt Ranostay
2020-02-18 3:42 ` [PATCH v7 2/3] iio: chemical: atlas-sensor: add DO-SM module support Matt Ranostay
@ 2020-02-18 3:42 ` Matt Ranostay
2020-02-21 12:13 ` Jonathan Cameron
2 siblings, 1 reply; 7+ messages in thread
From: Matt Ranostay @ 2020-02-18 3:42 UTC (permalink / raw)
To: linux-iio; +Cc: jic23, Matt Ranostay, Rob Herring
Since Atlas Scientific device support only varies from the compatible
string is ideal all the respective docs are merged into a single doc
named atlas,sensor.yaml
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
---
.../bindings/iio/chemical/atlas,ec-sm.txt | 21 --------
.../bindings/iio/chemical/atlas,orp-sm.txt | 21 --------
.../bindings/iio/chemical/atlas,ph-sm.txt | 21 --------
.../bindings/iio/chemical/atlas,sensor.yaml | 53 +++++++++++++++++++
4 files changed, 53 insertions(+), 63 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
create mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt b/Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
deleted file mode 100644
index f4320595b851..000000000000
--- a/Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-* Atlas Scientific EC-SM OEM sensor
-
-http://www.atlas-scientific.com/_files/_datasheets/_oem/EC_oem_datasheet.pdf
-
-Required properties:
-
- - compatible: must be "atlas,ec-sm"
- - reg: the I2C address of the sensor
- - interrupts: the sole interrupt generated by the device
-
- Refer to interrupt-controller/interrupts.txt for generic interrupt client
- node bindings.
-
-Example:
-
-atlas@64 {
- compatible = "atlas,ec-sm";
- reg = <0x64>;
- interrupt-parent = <&gpio1>;
- interrupts = <16 2>;
-};
diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt b/Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
deleted file mode 100644
index af1f5a9aa4da..000000000000
--- a/Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-* Atlas Scientific ORP-SM OEM sensor
-
-https://www.atlas-scientific.com/_files/_datasheets/_oem/ORP_oem_datasheet.pdf
-
-Required properties:
-
- - compatible: must be "atlas,orp-sm"
- - reg: the I2C address of the sensor
- - interrupts: the sole interrupt generated by the device
-
- Refer to interrupt-controller/interrupts.txt for generic interrupt client
- node bindings.
-
-Example:
-
-atlas@66 {
- compatible = "atlas,orp-sm";
- reg = <0x66>;
- interrupt-parent = <&gpio1>;
- interrupts = <16 2>;
-};
diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt b/Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
deleted file mode 100644
index 79d90f060327..000000000000
--- a/Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-* Atlas Scientific pH-SM OEM sensor
-
-http://www.atlas-scientific.com/_files/_datasheets/_oem/pH_oem_datasheet.pdf
-
-Required properties:
-
- - compatible: must be "atlas,ph-sm"
- - reg: the I2C address of the sensor
- - interrupts: the sole interrupt generated by the device
-
- Refer to interrupt-controller/interrupts.txt for generic interrupt client
- node bindings.
-
-Example:
-
-atlas@65 {
- compatible = "atlas,ph-sm";
- reg = <0x65>;
- interrupt-parent = <&gpio1>;
- interrupts = <16 2>;
-};
diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml b/Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
new file mode 100644
index 000000000000..edcd2904d50e
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
@@ -0,0 +1,53 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/chemical/atlas,sensor.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Atlas Scientific OEM sensors
+
+maintainers:
+ - Matt Ranostay <matt.ranostay@konsulko.com>
+
+description: |
+ Atlas Scientific OEM sensors connected via I2C
+
+ Datasheets:
+ http://www.atlas-scientific.com/_files/_datasheets/_oem/DO_oem_datasheet.pdf
+ http://www.atlas-scientific.com/_files/_datasheets/_oem/EC_oem_datasheet.pdf
+ http://www.atlas-scientific.com/_files/_datasheets/_oem/ORP_oem_datasheet.pdf
+ http://www.atlas-scientific.com/_files/_datasheets/_oem/pH_oem_datasheet.pdf
+
+properties:
+ compatible:
+ enum:
+ - atlas,do-sm
+ - atlas,ec-sm
+ - atlas,orp-sm
+ - atlas,ph-sm
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ atlas@66 {
+ compatible = "atlas,orp-sm";
+ reg = <0x66>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <16 2>;
+ };
+ };
--
2.25.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line
2020-02-18 3:42 ` [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line Matt Ranostay
@ 2020-02-21 12:09 ` Jonathan Cameron
0 siblings, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2020-02-21 12:09 UTC (permalink / raw)
To: Matt Ranostay; +Cc: linux-iio
On Mon, 17 Feb 2020 19:42:37 -0800
Matt Ranostay <matt.ranostay@konsulko.com> wrote:
> Sensors don't actually need a interrupt line to give valid readings,
> and can triggered with CONFIG_IIO_HRTIMER_TRIGGER as well. Remove
> the required check for interrupt, and continue along in the probe
> function.
>
> Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Hmm. I'll apply this version, but I'm still not really happy with the logic.
That interrupt enable should occur in the trigger related callbacks (as it's
to do with the trigger) rather than in the buffer ones. The boundary between
the two is blurred when a device is only used with it's own trigger so this
only becomes an issue once we have external triggers being supported.
This is a more minimal change so perhaps you can look at whether the logic
can be tidied up later.
Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it.
Thanks,
Jonathan
> ---
> drivers/iio/chemical/atlas-sensor.c | 33 ++++++++++++++++-------------
> 1 file changed, 18 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/iio/chemical/atlas-sensor.c b/drivers/iio/chemical/atlas-sensor.c
> index 2f0a6fed2589..d95818b74770 100644
> --- a/drivers/iio/chemical/atlas-sensor.c
> +++ b/drivers/iio/chemical/atlas-sensor.c
> @@ -76,6 +76,7 @@ struct atlas_data {
> struct atlas_device *chip;
> struct regmap *regmap;
> struct irq_work work;
> + unsigned int interrupt_enabled;
>
> __be32 buffer[6]; /* 96-bit data + 32-bit pad + 64-bit timestamp */
> };
> @@ -304,6 +305,9 @@ static int atlas_set_powermode(struct atlas_data *data, int on)
>
> static int atlas_set_interrupt(struct atlas_data *data, bool state)
> {
> + if (!data->interrupt_enabled)
> + return 0;
> +
> return regmap_update_bits(data->regmap, ATLAS_REG_INT_CONTROL,
> ATLAS_REG_INT_CONTROL_EN,
> state ? ATLAS_REG_INT_CONTROL_EN : 0);
> @@ -572,11 +576,6 @@ static int atlas_probe(struct i2c_client *client,
> if (ret)
> return ret;
>
> - if (client->irq <= 0) {
> - dev_err(&client->dev, "no valid irq defined\n");
> - return -EINVAL;
> - }
> -
> ret = chip->calibration(data);
> if (ret)
> return ret;
> @@ -596,16 +595,20 @@ static int atlas_probe(struct i2c_client *client,
>
> init_irq_work(&data->work, atlas_work_handler);
>
> - /* interrupt pin toggles on new conversion */
> - ret = devm_request_threaded_irq(&client->dev, client->irq,
> - NULL, atlas_interrupt_handler,
> - IRQF_TRIGGER_RISING |
> - IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> - "atlas_irq",
> - indio_dev);
> - if (ret) {
> - dev_err(&client->dev, "request irq (%d) failed\n", client->irq);
> - goto unregister_buffer;
> + if (client->irq > 0) {
> + /* interrupt pin toggles on new conversion */
> + ret = devm_request_threaded_irq(&client->dev, client->irq,
> + NULL, atlas_interrupt_handler,
> + IRQF_TRIGGER_RISING |
> + IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> + "atlas_irq",
> + indio_dev);
> +
> + if (ret)
> + dev_warn(&client->dev,
> + "request irq (%d) failed\n", client->irq);
> + else
> + data->interrupt_enabled = 1;
> }
>
> ret = atlas_set_powermode(data, 1);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v7 2/3] iio: chemical: atlas-sensor: add DO-SM module support
2020-02-18 3:42 ` [PATCH v7 2/3] iio: chemical: atlas-sensor: add DO-SM module support Matt Ranostay
@ 2020-02-21 12:11 ` Jonathan Cameron
0 siblings, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2020-02-21 12:11 UTC (permalink / raw)
To: Matt Ranostay; +Cc: linux-iio
On Mon, 17 Feb 2020 19:42:38 -0800
Matt Ranostay <matt.ranostay@konsulko.com> wrote:
> Atlas Scientific DO-SM OEM sensor reads disolved oxygen in
> a solution. This is reported back as mg/L which maps directly
> to ppm and so the IIO_CONCENTRATION channel type can be used.
>
> Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.
Thanks,
Jonathan
> ---
> drivers/iio/chemical/atlas-sensor.c | 64 +++++++++++++++++++++++++++--
> 1 file changed, 60 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/iio/chemical/atlas-sensor.c b/drivers/iio/chemical/atlas-sensor.c
> index d95818b74770..82d470561ad3 100644
> --- a/drivers/iio/chemical/atlas-sensor.c
> +++ b/drivers/iio/chemical/atlas-sensor.c
> @@ -48,6 +48,11 @@
> #define ATLAS_REG_EC_CALIB_STATUS_LOW BIT(2)
> #define ATLAS_REG_EC_CALIB_STATUS_HIGH BIT(3)
>
> +#define ATLAS_REG_DO_CALIB_STATUS 0x09
> +#define ATLAS_REG_DO_CALIB_STATUS_MASK 0x03
> +#define ATLAS_REG_DO_CALIB_STATUS_PRESSURE BIT(0)
> +#define ATLAS_REG_DO_CALIB_STATUS_DO BIT(1)
> +
> #define ATLAS_REG_PH_TEMP_DATA 0x0e
> #define ATLAS_REG_PH_DATA 0x16
>
> @@ -60,14 +65,19 @@
> #define ATLAS_REG_ORP_CALIB_STATUS 0x0d
> #define ATLAS_REG_ORP_DATA 0x0e
>
> +#define ATLAS_REG_DO_TEMP_DATA 0x12
> +#define ATLAS_REG_DO_DATA 0x22
> +
> #define ATLAS_PH_INT_TIME_IN_MS 450
> #define ATLAS_EC_INT_TIME_IN_MS 650
> #define ATLAS_ORP_INT_TIME_IN_MS 450
> +#define ATLAS_DO_INT_TIME_IN_MS 450
>
> enum {
> ATLAS_PH_SM,
> ATLAS_EC_SM,
> ATLAS_ORP_SM,
> + ATLAS_DO_SM,
> };
>
> struct atlas_data {
> @@ -122,7 +132,7 @@ static const struct iio_chan_spec atlas_ph_channels[] = {
> },
> };
>
> -#define ATLAS_EC_CHANNEL(_idx, _addr) \
> +#define ATLAS_CONCENTRATION_CHANNEL(_idx, _addr) \
> {\
> .type = IIO_CONCENTRATION, \
> .indexed = 1, \
> @@ -153,8 +163,8 @@ static const struct iio_chan_spec atlas_ec_channels[] = {
> .endianness = IIO_BE,
> },
> },
> - ATLAS_EC_CHANNEL(0, ATLAS_REG_TDS_DATA),
> - ATLAS_EC_CHANNEL(1, ATLAS_REG_PSS_DATA),
> + ATLAS_CONCENTRATION_CHANNEL(0, ATLAS_REG_TDS_DATA),
> + ATLAS_CONCENTRATION_CHANNEL(1, ATLAS_REG_PSS_DATA),
> IIO_CHAN_SOFT_TIMESTAMP(3),
> {
> .type = IIO_TEMP,
> @@ -183,6 +193,19 @@ static const struct iio_chan_spec atlas_orp_channels[] = {
> IIO_CHAN_SOFT_TIMESTAMP(1),
> };
>
> +static const struct iio_chan_spec atlas_do_channels[] = {
> + ATLAS_CONCENTRATION_CHANNEL(0, ATLAS_REG_DO_DATA),
> + IIO_CHAN_SOFT_TIMESTAMP(1),
> + {
> + .type = IIO_TEMP,
> + .address = ATLAS_REG_DO_TEMP_DATA,
> + .info_mask_separate =
> + BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
> + .output = 1,
> + .scan_index = -1
> + },
> +};
> +
> static int atlas_check_ph_calibration(struct atlas_data *data)
> {
> struct device *dev = &data->client->dev;
> @@ -263,7 +286,31 @@ static int atlas_check_orp_calibration(struct atlas_data *data)
> dev_warn(dev, "device has not been calibrated\n");
>
> return 0;
> -};
> +}
> +
> +static int atlas_check_do_calibration(struct atlas_data *data)
> +{
> + struct device *dev = &data->client->dev;
> + int ret;
> + unsigned int val;
> +
> + ret = regmap_read(data->regmap, ATLAS_REG_DO_CALIB_STATUS, &val);
> + if (ret)
> + return ret;
> +
> + if (!(val & ATLAS_REG_DO_CALIB_STATUS_MASK)) {
> + dev_warn(dev, "device has not been calibrated\n");
> + return 0;
> + }
> +
> + if (!(val & ATLAS_REG_DO_CALIB_STATUS_PRESSURE))
> + dev_warn(dev, "device missing atmospheric pressure calibration\n");
> +
> + if (!(val & ATLAS_REG_DO_CALIB_STATUS_DO))
> + dev_warn(dev, "device missing dissolved oxygen calibration\n");
> +
> + return 0;
> +}
>
> struct atlas_device {
> const struct iio_chan_spec *channels;
> @@ -296,6 +343,13 @@ static struct atlas_device atlas_devices[] = {
> .calibration = &atlas_check_orp_calibration,
> .delay = ATLAS_ORP_INT_TIME_IN_MS,
> },
> + [ATLAS_DO_SM] = {
> + .channels = atlas_do_channels,
> + .num_channels = 3,
> + .data_reg = ATLAS_REG_DO_DATA,
> + .calibration = &atlas_check_do_calibration,
> + .delay = ATLAS_DO_INT_TIME_IN_MS,
> + },
> };
>
> static int atlas_set_powermode(struct atlas_data *data, int on)
> @@ -511,6 +565,7 @@ static const struct i2c_device_id atlas_id[] = {
> { "atlas-ph-sm", ATLAS_PH_SM},
> { "atlas-ec-sm", ATLAS_EC_SM},
> { "atlas-orp-sm", ATLAS_ORP_SM},
> + { "atlas-do-sm", ATLAS_DO_SM},
> {}
> };
> MODULE_DEVICE_TABLE(i2c, atlas_id);
> @@ -519,6 +574,7 @@ static const struct of_device_id atlas_dt_ids[] = {
> { .compatible = "atlas,ph-sm", .data = (void *)ATLAS_PH_SM, },
> { .compatible = "atlas,ec-sm", .data = (void *)ATLAS_EC_SM, },
> { .compatible = "atlas,orp-sm", .data = (void *)ATLAS_ORP_SM, },
> + { .compatible = "atlas,do-sm", .data = (void *)ATLAS_DO_SM, },
> { }
> };
> MODULE_DEVICE_TABLE(of, atlas_dt_ids);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v7 3/3] dt-bindings: iio: chemical: consolidate atlas-sensor docs
2020-02-18 3:42 ` [PATCH v7 3/3] dt-bindings: iio: chemical: consolidate atlas-sensor docs Matt Ranostay
@ 2020-02-21 12:13 ` Jonathan Cameron
0 siblings, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2020-02-21 12:13 UTC (permalink / raw)
To: Matt Ranostay; +Cc: linux-iio, Rob Herring
On Mon, 17 Feb 2020 19:42:39 -0800
Matt Ranostay <matt.ranostay@konsulko.com> wrote:
> Since Atlas Scientific device support only varies from the compatible
> string is ideal all the respective docs are merged into a single doc
> named atlas,sensor.yaml
>
> Reviewed-by: Rob Herring <robh@kernel.org>
> Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Great. Appiled to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.
Thanks,
Jonathan
> ---
> .../bindings/iio/chemical/atlas,ec-sm.txt | 21 --------
> .../bindings/iio/chemical/atlas,orp-sm.txt | 21 --------
> .../bindings/iio/chemical/atlas,ph-sm.txt | 21 --------
> .../bindings/iio/chemical/atlas,sensor.yaml | 53 +++++++++++++++++++
> 4 files changed, 53 insertions(+), 63 deletions(-)
> delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
> delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
> delete mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
> create mode 100644 Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
>
> diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt b/Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
> deleted file mode 100644
> index f4320595b851..000000000000
> --- a/Documentation/devicetree/bindings/iio/chemical/atlas,ec-sm.txt
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -* Atlas Scientific EC-SM OEM sensor
> -
> -http://www.atlas-scientific.com/_files/_datasheets/_oem/EC_oem_datasheet.pdf
> -
> -Required properties:
> -
> - - compatible: must be "atlas,ec-sm"
> - - reg: the I2C address of the sensor
> - - interrupts: the sole interrupt generated by the device
> -
> - Refer to interrupt-controller/interrupts.txt for generic interrupt client
> - node bindings.
> -
> -Example:
> -
> -atlas@64 {
> - compatible = "atlas,ec-sm";
> - reg = <0x64>;
> - interrupt-parent = <&gpio1>;
> - interrupts = <16 2>;
> -};
> diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt b/Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
> deleted file mode 100644
> index af1f5a9aa4da..000000000000
> --- a/Documentation/devicetree/bindings/iio/chemical/atlas,orp-sm.txt
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -* Atlas Scientific ORP-SM OEM sensor
> -
> -https://www.atlas-scientific.com/_files/_datasheets/_oem/ORP_oem_datasheet.pdf
> -
> -Required properties:
> -
> - - compatible: must be "atlas,orp-sm"
> - - reg: the I2C address of the sensor
> - - interrupts: the sole interrupt generated by the device
> -
> - Refer to interrupt-controller/interrupts.txt for generic interrupt client
> - node bindings.
> -
> -Example:
> -
> -atlas@66 {
> - compatible = "atlas,orp-sm";
> - reg = <0x66>;
> - interrupt-parent = <&gpio1>;
> - interrupts = <16 2>;
> -};
> diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt b/Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
> deleted file mode 100644
> index 79d90f060327..000000000000
> --- a/Documentation/devicetree/bindings/iio/chemical/atlas,ph-sm.txt
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -* Atlas Scientific pH-SM OEM sensor
> -
> -http://www.atlas-scientific.com/_files/_datasheets/_oem/pH_oem_datasheet.pdf
> -
> -Required properties:
> -
> - - compatible: must be "atlas,ph-sm"
> - - reg: the I2C address of the sensor
> - - interrupts: the sole interrupt generated by the device
> -
> - Refer to interrupt-controller/interrupts.txt for generic interrupt client
> - node bindings.
> -
> -Example:
> -
> -atlas@65 {
> - compatible = "atlas,ph-sm";
> - reg = <0x65>;
> - interrupt-parent = <&gpio1>;
> - interrupts = <16 2>;
> -};
> diff --git a/Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml b/Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
> new file mode 100644
> index 000000000000..edcd2904d50e
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml
> @@ -0,0 +1,53 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/chemical/atlas,sensor.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Atlas Scientific OEM sensors
> +
> +maintainers:
> + - Matt Ranostay <matt.ranostay@konsulko.com>
> +
> +description: |
> + Atlas Scientific OEM sensors connected via I2C
> +
> + Datasheets:
> + http://www.atlas-scientific.com/_files/_datasheets/_oem/DO_oem_datasheet.pdf
> + http://www.atlas-scientific.com/_files/_datasheets/_oem/EC_oem_datasheet.pdf
> + http://www.atlas-scientific.com/_files/_datasheets/_oem/ORP_oem_datasheet.pdf
> + http://www.atlas-scientific.com/_files/_datasheets/_oem/pH_oem_datasheet.pdf
> +
> +properties:
> + compatible:
> + enum:
> + - atlas,do-sm
> + - atlas,ec-sm
> + - atlas,orp-sm
> + - atlas,ph-sm
> +
> + reg:
> + maxItems: 1
> +
> + interrupts:
> + maxItems: 1
> +
> +required:
> + - compatible
> + - reg
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + atlas@66 {
> + compatible = "atlas,orp-sm";
> + reg = <0x66>;
> + interrupt-parent = <&gpio1>;
> + interrupts = <16 2>;
> + };
> + };
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-02-21 12:13 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-18 3:42 [PATCH v7 0/3] iio: chemical: atlas-sensor: add DO support Matt Ranostay
2020-02-18 3:42 ` [PATCH v7 1/3] iio: chemical: atlas-sensor: allow probe without interrupt line Matt Ranostay
2020-02-21 12:09 ` Jonathan Cameron
2020-02-18 3:42 ` [PATCH v7 2/3] iio: chemical: atlas-sensor: add DO-SM module support Matt Ranostay
2020-02-21 12:11 ` Jonathan Cameron
2020-02-18 3:42 ` [PATCH v7 3/3] dt-bindings: iio: chemical: consolidate atlas-sensor docs Matt Ranostay
2020-02-21 12:13 ` Jonathan Cameron
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.