diff --git a/drivers/sensor/st/lps2xdf/lps22df.c b/drivers/sensor/st/lps2xdf/lps22df.c index ff5537cf37c02d..d18536984c486f 100644 --- a/drivers/sensor/st/lps2xdf/lps22df.c +++ b/drivers/sensor/st/lps2xdf/lps22df.c @@ -43,11 +43,29 @@ static int lps22df_sample_fetch(const struct device *dev, enum sensor_channel ch return 0; } +#ifdef CONFIG_LPS2XDF_TRIGGER +/** + * lps22df_config_interrupt - config the interrupt mode + */ +static int lps22df_config_interrupt(const struct device *dev) +{ + const struct lps2xdf_config *const cfg = dev->config; + stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; + lps22df_int_mode_t mode; + + if (lps22df_interrupt_mode_get(ctx, &mode) < 0) { + return -EIO; + } + + mode.drdy_latched = ~cfg->drdy_pulsed; + + return lps22df_interrupt_mode_set(ctx, &mode); +} + /** * lps22df_handle_interrupt - handle the drdy event * read data and call handler if registered any */ -#ifdef CONFIG_LPS2XDF_TRIGGER static void lps22df_handle_interrupt(const struct device *dev) { int ret; @@ -138,6 +156,7 @@ const struct lps2xdf_chip_api st_lps22df_chip_api = { .mode_set_odr_raw = lps22df_mode_set_odr_raw, .sample_fetch = lps22df_sample_fetch, #if CONFIG_LPS2XDF_TRIGGER + .config_interrupt = lps22df_config_interrupt, .handle_interrupt = lps22df_handle_interrupt, .trigger_set = lps22df_trigger_set, #endif diff --git a/drivers/sensor/st/lps2xdf/lps28dfw.c b/drivers/sensor/st/lps2xdf/lps28dfw.c index 40ea39bb571c98..22715d6ff602f1 100644 --- a/drivers/sensor/st/lps2xdf/lps28dfw.c +++ b/drivers/sensor/st/lps2xdf/lps28dfw.c @@ -47,11 +47,29 @@ static int lps28dfw_sample_fetch(const struct device *dev, enum sensor_channel c return 0; } +#ifdef CONFIG_LPS2XDF_TRIGGER +/** + * lps28dfw_config_interrupt - config the interrupt mode + */ +static int lps28dfw_config_interrupt(const struct device *dev) +{ + const struct lps2xdf_config *const cfg = dev->config; + stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; + lps28dfw_int_mode_t mode; + + if (lps28dfw_interrupt_mode_get(ctx, &mode) < 0) { + return -EIO; + } + + mode.drdy_latched = ~cfg->drdy_pulsed; + + return lps28dfw_interrupt_mode_set(ctx, &mode); +} + /** * lps28dfw_handle_interrupt - handle the drdy event * read data and call handler if registered any */ -#ifdef CONFIG_LPS2XDF_TRIGGER static void lps28dfw_handle_interrupt(const struct device *dev) { int ret; @@ -105,7 +123,7 @@ static int lps28dfw_enable_int(const struct device *dev, int enable) } /** - * lps22df_trigger_set - link external trigger to event data ready + * lps28dfw_trigger_set - link external trigger to event data ready */ static int lps28dfw_trigger_set(const struct device *dev, const struct sensor_trigger *trig, @@ -145,6 +163,7 @@ const struct lps2xdf_chip_api st_lps28dfw_chip_api = { .mode_set_odr_raw = lps28dfw_mode_set_odr_raw, .sample_fetch = lps28dfw_sample_fetch, #if CONFIG_LPS2XDF_TRIGGER + .config_interrupt = lps28dfw_config_interrupt, .handle_interrupt = lps28dfw_handle_interrupt, .trigger_set = lps28dfw_trigger_set, #endif diff --git a/drivers/sensor/st/lps2xdf/lps2xdf.h b/drivers/sensor/st/lps2xdf/lps2xdf.h index fab350f93558ce..aebbf13ba6295a 100644 --- a/drivers/sensor/st/lps2xdf/lps2xdf.h +++ b/drivers/sensor/st/lps2xdf/lps2xdf.h @@ -41,6 +41,7 @@ typedef int32_t (*api_lps2xdf_mode_set_odr_raw)(const struct device *dev, uint8_t odr); typedef int32_t (*api_lps2xdf_sample_fetch)(const struct device *dev, enum sensor_channel chan); #ifdef CONFIG_LPS2XDF_TRIGGER +typedef int (*api_lps2xdf_config_interrupt)(const struct device *dev); typedef void (*api_lps2xdf_handle_interrupt)(const struct device *dev); typedef int (*api_lps2xdf_trigger_set)(const struct device *dev, const struct sensor_trigger *trig, @@ -51,6 +52,7 @@ struct lps2xdf_chip_api { api_lps2xdf_mode_set_odr_raw mode_set_odr_raw; api_lps2xdf_sample_fetch sample_fetch; #ifdef CONFIG_LPS2XDF_TRIGGER + api_lps2xdf_config_interrupt config_interrupt; api_lps2xdf_handle_interrupt handle_interrupt; api_lps2xdf_trigger_set trigger_set; #endif @@ -126,6 +128,8 @@ struct lps2xdf_data { }; #ifdef CONFIG_LPS2XDF_TRIGGER +int lps2xdf_config_int(const struct device *dev); + int lps2xdf_trigger_set(const struct device *dev, const struct sensor_trigger *trig, sensor_trigger_handler_t handler); diff --git a/drivers/sensor/st/lps2xdf/lps2xdf_trigger.c b/drivers/sensor/st/lps2xdf/lps2xdf_trigger.c index b196e1f40c2d1a..de51ba14e6ef46 100644 --- a/drivers/sensor/st/lps2xdf/lps2xdf_trigger.c +++ b/drivers/sensor/st/lps2xdf/lps2xdf_trigger.c @@ -27,6 +27,14 @@ LOG_MODULE_DECLARE(LPS2XDF, CONFIG_SENSOR_LOG_LEVEL); +int lps2xdf_config_int(const struct device *dev) +{ + const struct lps2xdf_config *const cfg = dev->config; + const struct lps2xdf_chip_api *chip_api = cfg->chip_api; + + return chip_api->config_interrupt(dev); +} + int lps2xdf_trigger_set(const struct device *dev, const struct sensor_trigger *trig, sensor_trigger_handler_t handler) @@ -111,7 +119,6 @@ int lps2xdf_init_interrupt(const struct device *dev, enum sensor_variant variant { struct lps2xdf_data *lps2xdf = dev->data; const struct lps2xdf_config *cfg = dev->config; - stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; int ret; /* setup data ready gpio interrupt */ @@ -164,32 +171,10 @@ int lps2xdf_init_interrupt(const struct device *dev, enum sensor_variant variant LOG_DBG("drdy_pulsed is %d", (int)cfg->drdy_pulsed); /* enable drdy in pulsed/latched mode */ - if (variant == DEVICE_VARIANT_LPS22DF) { -#if DT_HAS_COMPAT_STATUS_OKAY(st_lps22df) - lps22df_int_mode_t mode; - - if (lps22df_interrupt_mode_get(ctx, &mode) < 0) { - return -EIO; - } - mode.drdy_latched = ~cfg->drdy_pulsed; - if (lps22df_interrupt_mode_set(ctx, &mode) < 0) { - return -EIO; - } -#endif - } else if (variant == DEVICE_VARIANT_LPS28DFW) { -#if DT_HAS_COMPAT_STATUS_OKAY(st_lps28dfw) - lps28dfw_int_mode_t mode; - - if (lps28dfw_interrupt_mode_get(ctx, &mode) < 0) { - return -EIO; - } - mode.drdy_latched = ~cfg->drdy_pulsed; - if (lps28dfw_interrupt_mode_set(ctx, &mode) < 0) { - return -EIO; - } -#endif - } else { - return -ENOTSUP; + ret = lps2xdf_config_int(dev); + if (ret < 0) { + LOG_ERR("Could not configure interrupt mode"); + return ret; } #if (DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(st_lps22df, i3c) ||\