Skip to content

Commit

Permalink
iio: humidity: hdc3020: add reset management
Browse files Browse the repository at this point in the history
The HDC3020 provides an active low reset signal that must be handled if
connected. Asserting this signal turns the device into Trigger-on Demand
measurement mode, reducing its power consumption when no measurements
are required like in low-power modes.

According to the datasheet, the longest "Reset Ready" is 3 ms, which is
only taken into account if the reset signal is defined.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Link: https://lore.kernel.org/r/20240303-hdc3020-pm-v3-3-48bc02b5241b@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
  • Loading branch information
Javier Carrasco authored and Jonathan Cameron committed Mar 25, 2024
1 parent 137166e commit e264b08
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/iio/humidity/hdc3020.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/cleanup.h>
#include <linux/crc8.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/interrupt.h>
Expand Down Expand Up @@ -70,6 +71,7 @@

struct hdc3020_data {
struct i2c_client *client;
struct gpio_desc *reset_gpio;
struct regulator *vdd_supply;
/*
* Ensure that the sensor configuration (currently only heater is
Expand Down Expand Up @@ -558,6 +560,9 @@ static int hdc3020_power_off(struct hdc3020_data *data)
{
hdc3020_exec_cmd(data, HDC3020_EXIT_AUTO);

if (data->reset_gpio)
gpiod_set_value_cansleep(data->reset_gpio, 1);

return regulator_disable(data->vdd_supply);
}

Expand All @@ -571,6 +576,11 @@ static int hdc3020_power_on(struct hdc3020_data *data)

fsleep(5000);

if (data->reset_gpio) {
gpiod_set_value_cansleep(data->reset_gpio, 0);
fsleep(3000);
}

if (data->client->irq) {
/*
* The alert output is activated by default upon power up,
Expand Down Expand Up @@ -627,6 +637,12 @@ static int hdc3020_probe(struct i2c_client *client)
return dev_err_probe(&client->dev, PTR_ERR(data->vdd_supply),
"Unable to get VDD regulator\n");

data->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
GPIOD_OUT_HIGH);
if (IS_ERR(data->reset_gpio))
return dev_err_probe(&client->dev, PTR_ERR(data->reset_gpio),
"Cannot get reset GPIO\n");

ret = hdc3020_power_on(data);
if (ret)
return dev_err_probe(&client->dev, ret, "Power on failed\n");
Expand Down

0 comments on commit e264b08

Please sign in to comment.