Skip to content

Commit

Permalink
drivers/sensor: lps2xdf: add API to configure interrupt
Browse files Browse the repository at this point in the history
Add a generic lps2xdf_config_int() API to configure device interrupt
mode, and implement the specific routines for lps22df and lps28dfw.

Signed-off-by: Armando Visconti <armando.visconti@st.com>
  • Loading branch information
avisconti authored and carlescufi committed Oct 23, 2024
1 parent 8fab391 commit 71bb3f7
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 30 deletions.
21 changes: 20 additions & 1 deletion drivers/sensor/st/lps2xdf/lps22df.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
23 changes: 21 additions & 2 deletions drivers/sensor/st/lps2xdf/lps28dfw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions drivers/sensor/st/lps2xdf/lps2xdf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down
39 changes: 12 additions & 27 deletions drivers/sensor/st/lps2xdf/lps2xdf_trigger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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) ||\
Expand Down

0 comments on commit 71bb3f7

Please sign in to comment.