* [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 @ 2020-04-14 18:49 mani 2020-04-14 18:49 ` [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor mani ` (4 more replies) 0 siblings, 5 replies; 10+ messages in thread From: mani @ 2020-04-14 18:49 UTC (permalink / raw) To: jic23, robh+dt, narcisaanamaria12 Cc: knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko, Manivannan Sadhasivam From: Manivannan Sadhasivam <mani@kernel.org> Hello, This patchset adds external reset and wakeup support for CCS811 VOC gas sensor. The nRESET and nWAKE pins available on the device are utilised to provide these functionalities. The patchset has been validated using CCS811 connected to STM32MP1 based board over I2C. While at it, the devicetree yaml binding and OF match table for this sensor are also added. Thanks, Mani Changes in v3: * Added ccs811_set_wake(false) to all error paths before calling it actually * Added Andy's reviewed-by tag * Added comment for reset procedure and dropped error print for gpio request Changes in v2: * Fixed DT binding schema and switched to dual license (GPL/BSD) * Returned actual error code from devm_gpiod_get_optional() * Dropped of.h include and of_match_ptr() Manivannan Sadhasivam (3): dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor iio: chemical: Add support for external Reset and Wakeup in CCS811 iio: chemical: Add OF match table for CCS811 VOC sensor .../bindings/iio/chemical/ams,ccs811.yaml | 51 ++++++++ drivers/iio/chemical/ccs811.c | 112 ++++++++++++++++-- 2 files changed, 152 insertions(+), 11 deletions(-) create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml -- 2.17.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor 2020-04-14 18:49 [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 mani @ 2020-04-14 18:49 ` mani 2020-04-20 21:11 ` Rob Herring 2020-04-14 18:49 ` [RESEND PATCH v3 2/3] iio: chemical: Add support for external Reset and Wakeup in CCS811 mani ` (3 subsequent siblings) 4 siblings, 1 reply; 10+ messages in thread From: mani @ 2020-04-14 18:49 UTC (permalink / raw) To: jic23, robh+dt, narcisaanamaria12 Cc: knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko, Manivannan Sadhasivam From: Manivannan Sadhasivam <mani@kernel.org> This commit adds devicetree binding for AMS CCS811 VOC sensor. Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> --- .../bindings/iio/chemical/ams,ccs811.yaml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml diff --git a/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml new file mode 100644 index 000000000000..5cb068666a3e --- /dev/null +++ b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/chemical/ams,ccs811.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: AMS CCS811 VOC Sensor + +maintainers: + - Narcisa Vasile <narcisaanamaria12@gmail.com> + +description: | + Ultra-Low Power Digital Gas Sensor for Monitoring Indoor Air Quality. + +properties: + compatible: + enum: + - ams,ccs811 + reg: + maxItems: 1 + + reset-gpios: + description: GPIO connected to the nRESET line. This is an active low + input to CCS811. + maxItems: 1 + + wakeup-gpios: + description: GPIO connected to the nWAKE line. This is an active low + input to CCS811. + maxItems: 1 + +required: + - compatible + - reg + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + i2c { + #address-cells = <1>; + #size-cells = <0>; + + voc@5b { + compatible = "ams,ccs811"; + reg = <0x5b>; + reset-gpios = <&gpioa 11 GPIO_ACTIVE_LOW>; + wakeup-gpios = <&gpioa 12 GPIO_ACTIVE_LOW>; + }; + }; + +... -- 2.17.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor 2020-04-14 18:49 ` [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor mani @ 2020-04-20 21:11 ` Rob Herring 2020-04-22 18:27 ` Manivannan Sadhasivam 0 siblings, 1 reply; 10+ messages in thread From: Rob Herring @ 2020-04-20 21:11 UTC (permalink / raw) To: mani Cc: jic23, narcisaanamaria12, knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko On Wed, Apr 15, 2020 at 12:19:28AM +0530, mani@kernel.org wrote: > From: Manivannan Sadhasivam <mani@kernel.org> > > This commit adds devicetree binding for AMS CCS811 VOC sensor. > > Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> > --- > .../bindings/iio/chemical/ams,ccs811.yaml | 51 +++++++++++++++++++ > 1 file changed, 51 insertions(+) > create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > diff --git a/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > new file mode 100644 > index 000000000000..5cb068666a3e > --- /dev/null > +++ b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > @@ -0,0 +1,51 @@ > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/iio/chemical/ams,ccs811.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: AMS CCS811 VOC Sensor > + > +maintainers: > + - Narcisa Vasile <narcisaanamaria12@gmail.com> > + > +description: | > + Ultra-Low Power Digital Gas Sensor for Monitoring Indoor Air Quality. > + > +properties: > + compatible: > + enum: > + - ams,ccs811 > + reg: > + maxItems: 1 > + > + reset-gpios: > + description: GPIO connected to the nRESET line. This is an active low > + input to CCS811. > + maxItems: 1 > + > + wakeup-gpios: > + description: GPIO connected to the nWAKE line. This is an active low > + input to CCS811. > + maxItems: 1 > + > +required: > + - compatible > + - reg Add: additionalProperties: false With that, Reviewed-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor 2020-04-20 21:11 ` Rob Herring @ 2020-04-22 18:27 ` Manivannan Sadhasivam 2020-04-25 15:24 ` Jonathan Cameron 0 siblings, 1 reply; 10+ messages in thread From: Manivannan Sadhasivam @ 2020-04-22 18:27 UTC (permalink / raw) To: jic23 Cc: Rob Herring, narcisaanamaria12, knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko On Mon, Apr 20, 2020 at 04:11:11PM -0500, Rob Herring wrote: > On Wed, Apr 15, 2020 at 12:19:28AM +0530, mani@kernel.org wrote: > > From: Manivannan Sadhasivam <mani@kernel.org> > > > > This commit adds devicetree binding for AMS CCS811 VOC sensor. > > > > Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> > > --- > > .../bindings/iio/chemical/ams,ccs811.yaml | 51 +++++++++++++++++++ > > 1 file changed, 51 insertions(+) > > create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > > > diff --git a/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > new file mode 100644 > > index 000000000000..5cb068666a3e > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > @@ -0,0 +1,51 @@ > > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) > > +%YAML 1.2 > > +--- > > +$id: http://devicetree.org/schemas/iio/chemical/ams,ccs811.yaml# > > +$schema: http://devicetree.org/meta-schemas/core.yaml# > > + > > +title: AMS CCS811 VOC Sensor > > + > > +maintainers: > > + - Narcisa Vasile <narcisaanamaria12@gmail.com> > > + > > +description: | > > + Ultra-Low Power Digital Gas Sensor for Monitoring Indoor Air Quality. > > + > > +properties: > > + compatible: > > + enum: > > + - ams,ccs811 > > + reg: > > + maxItems: 1 > > + > > + reset-gpios: > > + description: GPIO connected to the nRESET line. This is an active low > > + input to CCS811. > > + maxItems: 1 > > + > > + wakeup-gpios: > > + description: GPIO connected to the nWAKE line. This is an active low > > + input to CCS811. > > + maxItems: 1 > > + > > +required: > > + - compatible > > + - reg > > Add: > > additionalProperties: false > Hi Jonathan, Do you want me to spin another series or you can add it while applying? Thanks, Mani > With that, > > Reviewed-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor 2020-04-22 18:27 ` Manivannan Sadhasivam @ 2020-04-25 15:24 ` Jonathan Cameron 0 siblings, 0 replies; 10+ messages in thread From: Jonathan Cameron @ 2020-04-25 15:24 UTC (permalink / raw) To: Manivannan Sadhasivam Cc: Rob Herring, narcisaanamaria12, knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko On Wed, 22 Apr 2020 23:57:15 +0530 Manivannan Sadhasivam <mani@kernel.org> wrote: > On Mon, Apr 20, 2020 at 04:11:11PM -0500, Rob Herring wrote: > > On Wed, Apr 15, 2020 at 12:19:28AM +0530, mani@kernel.org wrote: > > > From: Manivannan Sadhasivam <mani@kernel.org> > > > > > > This commit adds devicetree binding for AMS CCS811 VOC sensor. > > > > > > Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> > > > --- > > > .../bindings/iio/chemical/ams,ccs811.yaml | 51 +++++++++++++++++++ > > > 1 file changed, 51 insertions(+) > > > create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > > > > > diff --git a/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > > new file mode 100644 > > > index 000000000000..5cb068666a3e > > > --- /dev/null > > > +++ b/Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > > > @@ -0,0 +1,51 @@ > > > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) > > > +%YAML 1.2 > > > +--- > > > +$id: http://devicetree.org/schemas/iio/chemical/ams,ccs811.yaml# > > > +$schema: http://devicetree.org/meta-schemas/core.yaml# > > > + > > > +title: AMS CCS811 VOC Sensor > > > + > > > +maintainers: > > > + - Narcisa Vasile <narcisaanamaria12@gmail.com> > > > + > > > +description: | > > > + Ultra-Low Power Digital Gas Sensor for Monitoring Indoor Air Quality. > > > + > > > +properties: > > > + compatible: > > > + enum: > > > + - ams,ccs811 > > > + reg: > > > + maxItems: 1 > > > + > > > + reset-gpios: > > > + description: GPIO connected to the nRESET line. This is an active low > > > + input to CCS811. > > > + maxItems: 1 > > > + > > > + wakeup-gpios: > > > + description: GPIO connected to the nWAKE line. This is an active low > > > + input to CCS811. > > > + maxItems: 1 > > > + > > > +required: > > > + - compatible > > > + - reg > > > > Add: > > > > additionalProperties: false > > > > Hi Jonathan, > > Do you want me to spin another series or you can add it while applying? Added whilst applying. Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to poke at it. Thanks, Jonathan > > Thanks, > Mani > > > With that, > > > > Reviewed-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [RESEND PATCH v3 2/3] iio: chemical: Add support for external Reset and Wakeup in CCS811 2020-04-14 18:49 [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 mani 2020-04-14 18:49 ` [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor mani @ 2020-04-14 18:49 ` mani 2020-04-15 11:47 ` Andy Shevchenko 2020-04-14 18:49 ` [RESEND PATCH v3 3/3] iio: chemical: Add OF match table for CCS811 VOC sensor mani ` (2 subsequent siblings) 4 siblings, 1 reply; 10+ messages in thread From: mani @ 2020-04-14 18:49 UTC (permalink / raw) To: jic23, robh+dt, narcisaanamaria12 Cc: knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko, Manivannan Sadhasivam From: Manivannan Sadhasivam <mani@kernel.org> CCS811 VOC sensor exposes nRESET and nWAKE pins which can be connected to GPIO pins of the host controller. These pins can be used to externally release the device from reset and also to wake it up before any I2C transaction. The initial driver support assumed that the nRESET pin is not connected and the nWAKE pin is tied to ground. This commit improves it by adding support for controlling those two pins externally using a host controller. For the case of reset, if the hardware reset is not available, the mechanism to do software reset is also added. As a side effect of doing this, the IIO device allocation needs to be slightly moved to top of probe to make use of priv data early. Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> --- drivers/iio/chemical/ccs811.c | 105 ++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 11 deletions(-) diff --git a/drivers/iio/chemical/ccs811.c b/drivers/iio/chemical/ccs811.c index 2ebdfc35bcda..1500e4b0dfbd 100644 --- a/drivers/iio/chemical/ccs811.c +++ b/drivers/iio/chemical/ccs811.c @@ -16,6 +16,7 @@ */ #include <linux/delay.h> +#include <linux/gpio/consumer.h> #include <linux/i2c.h> #include <linux/iio/iio.h> #include <linux/iio/buffer.h> @@ -36,6 +37,7 @@ #define CCS811_ERR 0xE0 /* Used to transition from boot to application mode */ #define CCS811_APP_START 0xF4 +#define CCS811_SW_RESET 0xFF /* Status register flags */ #define CCS811_STATUS_ERROR BIT(0) @@ -74,6 +76,7 @@ struct ccs811_data { struct mutex lock; /* Protect readings */ struct ccs811_reading buffer; struct iio_trigger *drdy_trig; + struct gpio_desc *wakeup_gpio; bool drdy_trig_on; }; @@ -166,10 +169,25 @@ static int ccs811_setup(struct i2c_client *client) CCS811_MODE_IAQ_1SEC); } +static void ccs811_set_wakeup(struct ccs811_data *data, bool enable) +{ + if (!data->wakeup_gpio) + return; + + gpiod_set_value(data->wakeup_gpio, enable); + + if (enable) + usleep_range(50, 60); + else + usleep_range(20, 30); +} + static int ccs811_get_measurement(struct ccs811_data *data) { int ret, tries = 11; + ccs811_set_wakeup(data, true); + /* Maximum waiting time: 1s, as measurements are made every second */ while (tries-- > 0) { ret = i2c_smbus_read_byte_data(data->client, CCS811_STATUS); @@ -183,9 +201,12 @@ static int ccs811_get_measurement(struct ccs811_data *data) if (!(ret & CCS811_STATUS_DATA_READY)) return -EIO; - return i2c_smbus_read_i2c_block_data(data->client, + ret = i2c_smbus_read_i2c_block_data(data->client, CCS811_ALG_RESULT_DATA, 8, (char *)&data->buffer); + ccs811_set_wakeup(data, false); + + return ret; } static int ccs811_read_raw(struct iio_dev *indio_dev, @@ -336,6 +357,45 @@ static irqreturn_t ccs811_data_rdy_trigger_poll(int irq, void *private) return IRQ_HANDLED; } +static int ccs811_reset(struct i2c_client *client) +{ + struct gpio_desc *reset_gpio; + int ret; + + reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", + GPIOD_OUT_LOW); + if (IS_ERR(reset_gpio)) + return PTR_ERR(reset_gpio); + + /* Try to reset using nRESET pin if available else do SW reset */ + if (reset_gpio) { + gpiod_set_value(reset_gpio, 1); + usleep_range(20, 30); + gpiod_set_value(reset_gpio, 0); + } else { + /* + * As per the datasheet, this sequence of values needs to be + * written to the SW_RESET register for triggering the soft + * reset in the device and placing it in boot mode. + */ + static const u8 reset_seq[] = { + 0x11, 0xE5, 0x72, 0x8A, + }; + + ret = i2c_smbus_write_i2c_block_data(client, CCS811_SW_RESET, + sizeof(reset_seq), reset_seq); + if (ret < 0) { + dev_err(&client->dev, "Failed to reset sensor\n"); + return ret; + } + } + + /* tSTART delay required after reset */ + usleep_range(1000, 2000); + + return 0; +} + static int ccs811_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -348,36 +408,59 @@ static int ccs811_probe(struct i2c_client *client, | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) return -EOPNOTSUPP; + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); + if (!indio_dev) + return -ENOMEM; + + data = iio_priv(indio_dev); + i2c_set_clientdata(client, indio_dev); + data->client = client; + + data->wakeup_gpio = devm_gpiod_get_optional(&client->dev, "wakeup", + GPIOD_OUT_HIGH); + if (IS_ERR(data->wakeup_gpio)) + return PTR_ERR(data->wakeup_gpio); + + ccs811_set_wakeup(data, true); + + ret = ccs811_reset(client); + if (ret) { + ccs811_set_wakeup(data, false); + return ret; + } + /* Check hardware id (should be 0x81 for this family of devices) */ ret = i2c_smbus_read_byte_data(client, CCS811_HW_ID); - if (ret < 0) + if (ret < 0) { + ccs811_set_wakeup(data, false); return ret; + } if (ret != CCS811_HW_ID_VALUE) { dev_err(&client->dev, "hardware id doesn't match CCS81x\n"); + ccs811_set_wakeup(data, false); return -ENODEV; } ret = i2c_smbus_read_byte_data(client, CCS811_HW_VERSION); - if (ret < 0) + if (ret < 0) { + ccs811_set_wakeup(data, false); return ret; + } if ((ret & CCS811_HW_VERSION_MASK) != CCS811_HW_VERSION_VALUE) { dev_err(&client->dev, "no CCS811 sensor\n"); + ccs811_set_wakeup(data, false); return -ENODEV; } - indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); - if (!indio_dev) - return -ENOMEM; - ret = ccs811_setup(client); - if (ret < 0) + if (ret < 0) { + ccs811_set_wakeup(data, false); return ret; + } - data = iio_priv(indio_dev); - i2c_set_clientdata(client, indio_dev); - data->client = client; + ccs811_set_wakeup(data, false); mutex_init(&data->lock); -- 2.17.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [RESEND PATCH v3 2/3] iio: chemical: Add support for external Reset and Wakeup in CCS811 2020-04-14 18:49 ` [RESEND PATCH v3 2/3] iio: chemical: Add support for external Reset and Wakeup in CCS811 mani @ 2020-04-15 11:47 ` Andy Shevchenko 0 siblings, 0 replies; 10+ messages in thread From: Andy Shevchenko @ 2020-04-15 11:47 UTC (permalink / raw) To: mani Cc: Jonathan Cameron, Rob Herring, narcisaanamaria12, Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald, linux-iio, devicetree, Linux Kernel Mailing List On Tue, Apr 14, 2020 at 9:49 PM <mani@kernel.org> wrote: > > From: Manivannan Sadhasivam <mani@kernel.org> > > CCS811 VOC sensor exposes nRESET and nWAKE pins which can be connected > to GPIO pins of the host controller. These pins can be used to externally > release the device from reset and also to wake it up before any I2C > transaction. The initial driver support assumed that the nRESET pin is not > connected and the nWAKE pin is tied to ground. > > This commit improves it by adding support for controlling those two pins > externally using a host controller. For the case of reset, if the hardware > reset is not available, the mechanism to do software reset is also added. > > As a side effect of doing this, the IIO device allocation needs to be > slightly moved to top of probe to make use of priv data early. > LGTM, Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> > --- > drivers/iio/chemical/ccs811.c | 105 ++++++++++++++++++++++++++++++---- > 1 file changed, 94 insertions(+), 11 deletions(-) > > diff --git a/drivers/iio/chemical/ccs811.c b/drivers/iio/chemical/ccs811.c > index 2ebdfc35bcda..1500e4b0dfbd 100644 > --- a/drivers/iio/chemical/ccs811.c > +++ b/drivers/iio/chemical/ccs811.c > @@ -16,6 +16,7 @@ > */ > > #include <linux/delay.h> > +#include <linux/gpio/consumer.h> > #include <linux/i2c.h> > #include <linux/iio/iio.h> > #include <linux/iio/buffer.h> > @@ -36,6 +37,7 @@ > #define CCS811_ERR 0xE0 > /* Used to transition from boot to application mode */ > #define CCS811_APP_START 0xF4 > +#define CCS811_SW_RESET 0xFF > > /* Status register flags */ > #define CCS811_STATUS_ERROR BIT(0) > @@ -74,6 +76,7 @@ struct ccs811_data { > struct mutex lock; /* Protect readings */ > struct ccs811_reading buffer; > struct iio_trigger *drdy_trig; > + struct gpio_desc *wakeup_gpio; > bool drdy_trig_on; > }; > > @@ -166,10 +169,25 @@ static int ccs811_setup(struct i2c_client *client) > CCS811_MODE_IAQ_1SEC); > } > > +static void ccs811_set_wakeup(struct ccs811_data *data, bool enable) > +{ > + if (!data->wakeup_gpio) > + return; > + > + gpiod_set_value(data->wakeup_gpio, enable); > + > + if (enable) > + usleep_range(50, 60); > + else > + usleep_range(20, 30); > +} > + > static int ccs811_get_measurement(struct ccs811_data *data) > { > int ret, tries = 11; > > + ccs811_set_wakeup(data, true); > + > /* Maximum waiting time: 1s, as measurements are made every second */ > while (tries-- > 0) { > ret = i2c_smbus_read_byte_data(data->client, CCS811_STATUS); > @@ -183,9 +201,12 @@ static int ccs811_get_measurement(struct ccs811_data *data) > if (!(ret & CCS811_STATUS_DATA_READY)) > return -EIO; > > - return i2c_smbus_read_i2c_block_data(data->client, > + ret = i2c_smbus_read_i2c_block_data(data->client, > CCS811_ALG_RESULT_DATA, 8, > (char *)&data->buffer); > + ccs811_set_wakeup(data, false); > + > + return ret; > } > > static int ccs811_read_raw(struct iio_dev *indio_dev, > @@ -336,6 +357,45 @@ static irqreturn_t ccs811_data_rdy_trigger_poll(int irq, void *private) > return IRQ_HANDLED; > } > > +static int ccs811_reset(struct i2c_client *client) > +{ > + struct gpio_desc *reset_gpio; > + int ret; > + > + reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", > + GPIOD_OUT_LOW); > + if (IS_ERR(reset_gpio)) > + return PTR_ERR(reset_gpio); > + > + /* Try to reset using nRESET pin if available else do SW reset */ > + if (reset_gpio) { > + gpiod_set_value(reset_gpio, 1); > + usleep_range(20, 30); > + gpiod_set_value(reset_gpio, 0); > + } else { > + /* > + * As per the datasheet, this sequence of values needs to be > + * written to the SW_RESET register for triggering the soft > + * reset in the device and placing it in boot mode. > + */ > + static const u8 reset_seq[] = { > + 0x11, 0xE5, 0x72, 0x8A, > + }; > + > + ret = i2c_smbus_write_i2c_block_data(client, CCS811_SW_RESET, > + sizeof(reset_seq), reset_seq); > + if (ret < 0) { > + dev_err(&client->dev, "Failed to reset sensor\n"); > + return ret; > + } > + } > + > + /* tSTART delay required after reset */ > + usleep_range(1000, 2000); > + > + return 0; > +} > + > static int ccs811_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > @@ -348,36 +408,59 @@ static int ccs811_probe(struct i2c_client *client, > | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) > return -EOPNOTSUPP; > > + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); > + if (!indio_dev) > + return -ENOMEM; > + > + data = iio_priv(indio_dev); > + i2c_set_clientdata(client, indio_dev); > + data->client = client; > + > + data->wakeup_gpio = devm_gpiod_get_optional(&client->dev, "wakeup", > + GPIOD_OUT_HIGH); > + if (IS_ERR(data->wakeup_gpio)) > + return PTR_ERR(data->wakeup_gpio); > + > + ccs811_set_wakeup(data, true); > + > + ret = ccs811_reset(client); > + if (ret) { > + ccs811_set_wakeup(data, false); > + return ret; > + } > + > /* Check hardware id (should be 0x81 for this family of devices) */ > ret = i2c_smbus_read_byte_data(client, CCS811_HW_ID); > - if (ret < 0) > + if (ret < 0) { > + ccs811_set_wakeup(data, false); > return ret; > + } > > if (ret != CCS811_HW_ID_VALUE) { > dev_err(&client->dev, "hardware id doesn't match CCS81x\n"); > + ccs811_set_wakeup(data, false); > return -ENODEV; > } > > ret = i2c_smbus_read_byte_data(client, CCS811_HW_VERSION); > - if (ret < 0) > + if (ret < 0) { > + ccs811_set_wakeup(data, false); > return ret; > + } > > if ((ret & CCS811_HW_VERSION_MASK) != CCS811_HW_VERSION_VALUE) { > dev_err(&client->dev, "no CCS811 sensor\n"); > + ccs811_set_wakeup(data, false); > return -ENODEV; > } > > - indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); > - if (!indio_dev) > - return -ENOMEM; > - > ret = ccs811_setup(client); > - if (ret < 0) > + if (ret < 0) { > + ccs811_set_wakeup(data, false); > return ret; > + } > > - data = iio_priv(indio_dev); > - i2c_set_clientdata(client, indio_dev); > - data->client = client; > + ccs811_set_wakeup(data, false); > > mutex_init(&data->lock); > > -- > 2.17.1 > -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 10+ messages in thread
* [RESEND PATCH v3 3/3] iio: chemical: Add OF match table for CCS811 VOC sensor 2020-04-14 18:49 [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 mani 2020-04-14 18:49 ` [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor mani 2020-04-14 18:49 ` [RESEND PATCH v3 2/3] iio: chemical: Add support for external Reset and Wakeup in CCS811 mani @ 2020-04-14 18:49 ` mani 2020-04-18 18:53 ` [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 Jonathan Cameron 2020-04-25 15:26 ` Jonathan Cameron 4 siblings, 0 replies; 10+ messages in thread From: mani @ 2020-04-14 18:49 UTC (permalink / raw) To: jic23, robh+dt, narcisaanamaria12 Cc: knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko, Manivannan Sadhasivam From: Manivannan Sadhasivam <mani@kernel.org> Add devicetree OF match table support for CCS811 VOC sensor. Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> --- drivers/iio/chemical/ccs811.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/iio/chemical/ccs811.c b/drivers/iio/chemical/ccs811.c index 1500e4b0dfbd..3ecd633f9ed3 100644 --- a/drivers/iio/chemical/ccs811.c +++ b/drivers/iio/chemical/ccs811.c @@ -549,9 +549,16 @@ static const struct i2c_device_id ccs811_id[] = { }; MODULE_DEVICE_TABLE(i2c, ccs811_id); +static const struct of_device_id ccs811_dt_ids[] = { + { .compatible = "ams,ccs811" }, + { } +}; +MODULE_DEVICE_TABLE(of, ccs811_dt_ids); + static struct i2c_driver ccs811_driver = { .driver = { .name = "ccs811", + .of_match_table = ccs811_dt_ids, }, .probe = ccs811_probe, .remove = ccs811_remove, -- 2.17.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 2020-04-14 18:49 [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 mani ` (2 preceding siblings ...) 2020-04-14 18:49 ` [RESEND PATCH v3 3/3] iio: chemical: Add OF match table for CCS811 VOC sensor mani @ 2020-04-18 18:53 ` Jonathan Cameron 2020-04-25 15:26 ` Jonathan Cameron 4 siblings, 0 replies; 10+ messages in thread From: Jonathan Cameron @ 2020-04-18 18:53 UTC (permalink / raw) To: mani Cc: robh+dt, narcisaanamaria12, knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko On Wed, 15 Apr 2020 00:19:27 +0530 mani@kernel.org wrote: > From: Manivannan Sadhasivam <mani@kernel.org> > > Hello, > > This patchset adds external reset and wakeup support for CCS811 VOC > gas sensor. The nRESET and nWAKE pins available on the device are > utilised to provide these functionalities. > > The patchset has been validated using CCS811 connected to STM32MP1 based > board over I2C. > > While at it, the devicetree yaml binding and OF match table for this sensor > are also added. > Looks good to me. I'd just like to give it a bit longer to allow dt maintainers to take a look if they wish. Thanks, Jonathan > Thanks, > Mani > > Changes in v3: > > * Added ccs811_set_wake(false) to all error paths before calling it actually > * Added Andy's reviewed-by tag > * Added comment for reset procedure and dropped error print for gpio request > > Changes in v2: > > * Fixed DT binding schema and switched to dual license (GPL/BSD) > * Returned actual error code from devm_gpiod_get_optional() > * Dropped of.h include and of_match_ptr() > > Manivannan Sadhasivam (3): > dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor > iio: chemical: Add support for external Reset and Wakeup in CCS811 > iio: chemical: Add OF match table for CCS811 VOC sensor > > .../bindings/iio/chemical/ams,ccs811.yaml | 51 ++++++++ > drivers/iio/chemical/ccs811.c | 112 ++++++++++++++++-- > 2 files changed, 152 insertions(+), 11 deletions(-) > create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 2020-04-14 18:49 [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 mani ` (3 preceding siblings ...) 2020-04-18 18:53 ` [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 Jonathan Cameron @ 2020-04-25 15:26 ` Jonathan Cameron 4 siblings, 0 replies; 10+ messages in thread From: Jonathan Cameron @ 2020-04-25 15:26 UTC (permalink / raw) To: mani Cc: robh+dt, narcisaanamaria12, knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel, andy.shevchenko On Wed, 15 Apr 2020 00:19:27 +0530 mani@kernel.org wrote: > From: Manivannan Sadhasivam <mani@kernel.org> > > Hello, > > This patchset adds external reset and wakeup support for CCS811 VOC > gas sensor. The nRESET and nWAKE pins available on the device are > utilised to provide these functionalities. > > The patchset has been validated using CCS811 connected to STM32MP1 based > board over I2C. > > While at it, the devicetree yaml binding and OF match table for this sensor > are also added. > > Thanks, > Mani All applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it. Thanks, Jonathan > > Changes in v3: > > * Added ccs811_set_wake(false) to all error paths before calling it actually > * Added Andy's reviewed-by tag > * Added comment for reset procedure and dropped error print for gpio request > > Changes in v2: > > * Fixed DT binding schema and switched to dual license (GPL/BSD) > * Returned actual error code from devm_gpiod_get_optional() > * Dropped of.h include and of_match_ptr() > > Manivannan Sadhasivam (3): > dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor > iio: chemical: Add support for external Reset and Wakeup in CCS811 > iio: chemical: Add OF match table for CCS811 VOC sensor > > .../bindings/iio/chemical/ams,ccs811.yaml | 51 ++++++++ > drivers/iio/chemical/ccs811.c | 112 ++++++++++++++++-- > 2 files changed, 152 insertions(+), 11 deletions(-) > create mode 100644 Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml > ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-04-25 15:26 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-04-14 18:49 [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 mani 2020-04-14 18:49 ` [RESEND PATCH v3 1/3] dt-bindings: iio: chemical: Add binding for CCS811 VOC sensor mani 2020-04-20 21:11 ` Rob Herring 2020-04-22 18:27 ` Manivannan Sadhasivam 2020-04-25 15:24 ` Jonathan Cameron 2020-04-14 18:49 ` [RESEND PATCH v3 2/3] iio: chemical: Add support for external Reset and Wakeup in CCS811 mani 2020-04-15 11:47 ` Andy Shevchenko 2020-04-14 18:49 ` [RESEND PATCH v3 3/3] iio: chemical: Add OF match table for CCS811 VOC sensor mani 2020-04-18 18:53 ` [RESEND PATCH v3 0/3] Add Reset and Wakeup support for CCS811 Jonathan Cameron 2020-04-25 15:26 ` Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).