From b12717bee1660fd7fb3a71e4cb60c74c768ecaec Mon Sep 17 00:00:00 2001 From: Van Petrosyan Date: Thu, 5 Jun 2025 16:17:04 +0200 Subject: [PATCH] sensor: lis2dh: add device runtime PM support Registers driver with pm_device_driver_init(). Moved chip init routine into separate function to be called from PM_DEVICE_ACTION_TURN_ON. Added a delay after power-up. Signed-off-by: Van Petrosyan --- drivers/sensor/st/lis2dh/lis2dh.c | 33 ++++++++++++++++++++++--------- drivers/sensor/st/lis2dh/lis2dh.h | 3 +-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/drivers/sensor/st/lis2dh/lis2dh.c b/drivers/sensor/st/lis2dh/lis2dh.c index 1721fd963bf..97efa6fdab4 100644 --- a/drivers/sensor/st/lis2dh/lis2dh.c +++ b/drivers/sensor/st/lis2dh/lis2dh.c @@ -344,7 +344,7 @@ static DEVICE_API(sensor, lis2dh_driver_api) = { .channel_get = lis2dh_channel_get, }; -int lis2dh_init(const struct device *dev) +int lis2dh_init_chip(const struct device *dev) { struct lis2dh_data *lis2dh = dev->data; const struct lis2dh_config *cfg = dev->config; @@ -352,10 +352,8 @@ int lis2dh_init(const struct device *dev) uint8_t id; uint8_t raw[6]; - status = cfg->bus_init(dev); - if (status < 0) { - return status; - } + /* AN5005: LIS2DH needs 5ms delay to boot */ + k_sleep(K_MSEC(LIS2DH_POR_WAIT_MS)); status = lis2dh->hw_tf->read_reg(dev, LIS2DH_REG_WAI, &id); if (status < 0) { @@ -446,15 +444,17 @@ int lis2dh_init(const struct device *dev) LIS2DH_ODR_BITS); } -#ifdef CONFIG_PM_DEVICE static int lis2dh_pm_action(const struct device *dev, enum pm_device_action action) { - int status; + int status = 0; struct lis2dh_data *lis2dh = dev->data; uint8_t regdata; switch (action) { + case PM_DEVICE_ACTION_TURN_ON: + status = lis2dh_init_chip(dev); + break; case PM_DEVICE_ACTION_RESUME: /* read REFERENCE register (see datasheet rev 6 section 8.9 footnote 1) */ status = lis2dh->hw_tf->read_reg(dev, LIS2DH_REG_REFERENCE, ®data); @@ -486,13 +486,28 @@ static int lis2dh_pm_action(const struct device *dev, return status; } break; + case PM_DEVICE_ACTION_TURN_OFF: + break; default: return -ENOTSUP; } - return 0; + return status; +} + +static int lis2dh_init(const struct device *dev) +{ + const struct lis2dh_config *cfg = dev->config; + int status; + + status = cfg->bus_init(dev); + if (status < 0) { + LOG_ERR("Failed to initialize the bus."); + return status; + } + + return pm_device_driver_init(dev, lis2dh_pm_action); } -#endif /* CONFIG_PM_DEVICE */ #if DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 0 #warning "LIS2DH driver enabled without any devices" diff --git a/drivers/sensor/st/lis2dh/lis2dh.h b/drivers/sensor/st/lis2dh/lis2dh.h index d18d8fb3cd8..670e3d784af 100644 --- a/drivers/sensor/st/lis2dh/lis2dh.h +++ b/drivers/sensor/st/lis2dh/lis2dh.h @@ -17,6 +17,7 @@ #define LIS2DH_REG_WAI 0x0f #define LIS2DH_CHIP_ID 0x33 +#define LIS2DH_POR_WAIT_MS 5 #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #include @@ -262,9 +263,7 @@ struct lis2dh_data { struct sensor_value temperature; #endif -#ifdef CONFIG_PM_DEVICE uint8_t reg_ctrl1_active_val; -#endif #ifdef CONFIG_LIS2DH_TRIGGER const struct device *dev;