Skip to content

Commit 5953a26

Browse files
JordanYatescarlescufi
authored andcommitted
sensor: bme680: support power domains
Support the BME680 being on a power domain, which may not be powered at boot. For example, Nordic Thingy53. Signed-off-by: Jordan Yates <[email protected]>
1 parent ecbcb5b commit 5953a26

File tree

1 file changed

+37
-13
lines changed

1 file changed

+37
-13
lines changed

drivers/sensor/bosch/bme680/bme680.c

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <zephyr/sys/__assert.h>
1919
#include <zephyr/drivers/sensor.h>
2020
#include <zephyr/logging/log.h>
21+
#include <zephyr/pm/device.h>
2122

2223
#include "bme680.h"
2324

@@ -375,17 +376,11 @@ static int bme680_read_compensation(const struct device *dev)
375376
return 0;
376377
}
377378

378-
static int bme680_init(const struct device *dev)
379+
static int bme680_power_up(const struct device *dev)
379380
{
380381
struct bme680_data *data = dev->data;
381382
int err;
382383

383-
err = bme680_bus_check(dev);
384-
if (err < 0) {
385-
LOG_ERR("Bus not ready for '%s'", dev->name);
386-
return err;
387-
}
388-
389384
#if BME680_BUS_SPI
390385
if (bme680_is_on_spi(dev)) {
391386
uint8_t mem_page;
@@ -426,8 +421,7 @@ static int bme680_init(const struct device *dev)
426421
return err;
427422
}
428423

429-
err = bme680_reg_write(dev, BME680_REG_CTRL_GAS_1,
430-
BME680_CTRL_GAS_1_VAL);
424+
err = bme680_reg_write(dev, BME680_REG_CTRL_GAS_1, BME680_CTRL_GAS_1_VAL);
431425
if (err < 0) {
432426
return err;
433427
}
@@ -444,10 +438,39 @@ static int bme680_init(const struct device *dev)
444438
return err;
445439
}
446440

447-
err = bme680_reg_write(dev, BME680_REG_CTRL_MEAS,
448-
BME680_CTRL_MEAS_VAL);
441+
return bme680_reg_write(dev, BME680_REG_CTRL_MEAS, BME680_CTRL_MEAS_VAL);
442+
}
443+
444+
static int bme680_pm_control(const struct device *dev, enum pm_device_action action)
445+
{
446+
int rc = 0;
447+
448+
switch (action) {
449+
case PM_DEVICE_ACTION_SUSPEND:
450+
case PM_DEVICE_ACTION_RESUME:
451+
case PM_DEVICE_ACTION_TURN_OFF:
452+
break;
453+
case PM_DEVICE_ACTION_TURN_ON:
454+
rc = bme680_power_up(dev);
455+
break;
456+
default:
457+
return -ENOTSUP;
458+
}
459+
460+
return rc;
461+
}
462+
463+
static int bme680_init(const struct device *dev)
464+
{
465+
int err;
466+
467+
err = bme680_bus_check(dev);
468+
if (err < 0) {
469+
LOG_ERR("Bus not ready for '%s'", dev->name);
470+
return err;
471+
}
449472

450-
return err;
473+
return pm_device_driver_init(dev, bme680_pm_control);
451474
}
452475

453476
static const struct sensor_driver_api bme680_api_funcs = {
@@ -480,9 +503,10 @@ static const struct sensor_driver_api bme680_api_funcs = {
480503
COND_CODE_1(DT_INST_ON_BUS(inst, spi), \
481504
(BME680_CONFIG_SPI(inst)), \
482505
(BME680_CONFIG_I2C(inst))); \
506+
PM_DEVICE_DT_INST_DEFINE(inst, bme680_pm_control); \
483507
SENSOR_DEVICE_DT_INST_DEFINE(inst, \
484508
bme680_init, \
485-
NULL, \
509+
PM_DEVICE_DT_INST_GET(inst), \
486510
&bme680_data_##inst, \
487511
&bme680_config_##inst, \
488512
POST_KERNEL, \

0 commit comments

Comments
 (0)