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
453476static 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