1515
1616LOG_MODULE_DECLARE (LSM6DSL , CONFIG_SENSOR_LOG_LEVEL );
1717
18+ static inline void setup_irq (struct lsm6dsl_data * drv_data ,
19+ bool enable )
20+ {
21+ unsigned int flags = enable
22+ ? GPIO_INT_EDGE_TO_ACTIVE
23+ : GPIO_INT_DISABLE ;
24+
25+ gpio_pin_interrupt_configure (drv_data -> gpio ,
26+ DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN ,
27+ flags );
28+ }
29+
30+ static inline void handle_irq (struct lsm6dsl_data * drv_data )
31+ {
32+ setup_irq (drv_data , false);
33+
34+ #if defined(CONFIG_LSM6DSL_TRIGGER_OWN_THREAD )
35+ k_sem_give (& drv_data -> gpio_sem );
36+ #elif defined(CONFIG_LSM6DSL_TRIGGER_GLOBAL_THREAD )
37+ k_work_submit (& drv_data -> work );
38+ #endif
39+ }
40+
1841int lsm6dsl_trigger_set (struct device * dev ,
1942 const struct sensor_trigger * trig ,
2043 sensor_trigger_handler_t handler )
@@ -23,7 +46,7 @@ int lsm6dsl_trigger_set(struct device *dev,
2346
2447 __ASSERT_NO_MSG (trig -> type == SENSOR_TRIG_DATA_READY );
2548
26- gpio_pin_disable_callback (drv_data -> gpio , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN );
49+ setup_irq (drv_data , false );
2750
2851 drv_data -> data_ready_handler = handler ;
2952 if (handler == NULL ) {
@@ -32,7 +55,10 @@ int lsm6dsl_trigger_set(struct device *dev,
3255
3356 drv_data -> data_ready_trigger = * trig ;
3457
35- gpio_pin_enable_callback (drv_data -> gpio , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN );
58+ setup_irq (drv_data , true);
59+ if (gpio_pin_get (drv_data -> gpio , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN ) > 0 ) {
60+ handle_irq (drv_data );
61+ }
3662
3763 return 0 ;
3864}
@@ -45,13 +71,7 @@ static void lsm6dsl_gpio_callback(struct device *dev,
4571
4672 ARG_UNUSED (pins );
4773
48- gpio_pin_disable_callback (dev , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN );
49-
50- #if defined(CONFIG_LSM6DSL_TRIGGER_OWN_THREAD )
51- k_sem_give (& drv_data -> gpio_sem );
52- #elif defined(CONFIG_LSM6DSL_TRIGGER_GLOBAL_THREAD )
53- k_work_submit (& drv_data -> work );
54- #endif
74+ handle_irq (drv_data );
5575}
5676
5777static void lsm6dsl_thread_cb (void * arg )
@@ -64,7 +84,7 @@ static void lsm6dsl_thread_cb(void *arg)
6484 & drv_data -> data_ready_trigger );
6585 }
6686
67- gpio_pin_enable_callback (drv_data -> gpio , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN );
87+ setup_irq (drv_data , true );
6888}
6989
7090#ifdef CONFIG_LSM6DSL_TRIGGER_OWN_THREAD
@@ -105,8 +125,7 @@ int lsm6dsl_init_interrupt(struct device *dev)
105125 }
106126
107127 gpio_pin_configure (drv_data -> gpio , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN ,
108- GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE |
109- GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE );
128+ GPIO_INPUT | DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_FLAGS );
110129
111130 gpio_init_callback (& drv_data -> gpio_cb ,
112131 lsm6dsl_gpio_callback ,
@@ -141,7 +160,7 @@ int lsm6dsl_init_interrupt(struct device *dev)
141160 drv_data -> dev = dev ;
142161#endif
143162
144- gpio_pin_enable_callback (drv_data -> gpio , DT_INST_0_ST_LSM6DSL_IRQ_GPIOS_PIN );
163+ setup_irq (drv_data , true );
145164
146165 return 0 ;
147166}
0 commit comments