@@ -81,35 +81,86 @@ int sht3xd_attr_set(struct device *dev,
8181 return 0 ;
8282}
8383
84- static void sht3xd_gpio_callback (struct device * dev ,
85- struct gpio_callback * cb , u32_t pins )
84+ static inline void setup_alert (struct device * dev ,
85+ bool enable )
8686{
87- struct sht3xd_data * data =
88- CONTAINER_OF (cb , struct sht3xd_data , alert_cb );
89- const struct sht3xd_config * cfg = data -> dev -> config -> config_info ;
90-
91- ARG_UNUSED (pins );
87+ struct sht3xd_data * data = (struct sht3xd_data * )dev -> driver_data ;
88+ const struct sht3xd_config * cfg =
89+ (const struct sht3xd_config * )dev -> config -> config_info ;
90+ unsigned int flags = enable
91+ ? GPIO_INT_EDGE_TO_ACTIVE
92+ : GPIO_INT_DISABLE ;
93+
94+ gpio_pin_interrupt_configure (data -> alert_gpio , cfg -> alert_pin , flags );
95+ }
9296
93- gpio_pin_disable_callback (dev , cfg -> alert_pin );
97+ static inline void handle_alert (struct device * dev )
98+ {
99+ setup_alert (dev , false);
94100
95101#if defined(CONFIG_SHT3XD_TRIGGER_OWN_THREAD )
102+ struct sht3xd_data * data = (struct sht3xd_data * )dev -> driver_data ;
103+
96104 k_sem_give (& data -> gpio_sem );
97105#elif defined(CONFIG_SHT3XD_TRIGGER_GLOBAL_THREAD )
106+ struct sht3xd_data * data = (struct sht3xd_data * )dev -> driver_data ;
107+
98108 k_work_submit (& data -> work );
99109#endif
100110}
101111
112+ int sht3xd_trigger_set (struct device * dev ,
113+ const struct sensor_trigger * trig ,
114+ sensor_trigger_handler_t handler )
115+ {
116+ struct sht3xd_data * data = (struct sht3xd_data * )dev -> driver_data ;
117+ const struct sht3xd_config * cfg =
118+ (const struct sht3xd_config * )dev -> config -> config_info ;
119+
120+ setup_alert (dev , false);
121+
122+ if (trig -> type != SENSOR_TRIG_THRESHOLD ) {
123+ return - ENOTSUP ;
124+ }
125+
126+ data -> handler = handler ;
127+ if (handler == NULL ) {
128+ return 0 ;
129+ }
130+
131+ data -> trigger = * trig ;
132+
133+ setup_alert (dev , true);
134+
135+ /* If ALERT is active we probably won't get the rising edge,
136+ * so invoke the callback manually.
137+ */
138+ if (gpio_pin_get (data -> alert_gpio , cfg -> alert_pin )) {
139+ handle_alert (dev );
140+ }
141+
142+ return 0 ;
143+ }
144+
145+ static void sht3xd_gpio_callback (struct device * dev ,
146+ struct gpio_callback * cb , u32_t pins )
147+ {
148+ struct sht3xd_data * data =
149+ CONTAINER_OF (cb , struct sht3xd_data , alert_cb );
150+
151+ handle_alert (data -> dev );
152+ }
153+
102154static void sht3xd_thread_cb (void * arg )
103155{
104- struct device * dev = arg ;
105- struct sht3xd_data * data = dev -> driver_data ;
106- const struct sht3xd_config * cfg = dev -> config -> config_info ;
156+ struct device * dev = (struct device * )arg ;
157+ struct sht3xd_data * data = (struct sht3xd_data * )dev -> driver_data ;
107158
108159 if (data -> handler != NULL ) {
109160 data -> handler (dev , & data -> trigger );
110161 }
111162
112- gpio_pin_enable_callback ( data -> alert_gpio , cfg -> alert_pin );
163+ setup_alert ( dev , true );
113164}
114165
115166#ifdef CONFIG_SHT3XD_TRIGGER_OWN_THREAD
@@ -137,25 +188,6 @@ static void sht3xd_work_cb(struct k_work *work)
137188}
138189#endif
139190
140- int sht3xd_trigger_set (struct device * dev ,
141- const struct sensor_trigger * trig ,
142- sensor_trigger_handler_t handler )
143- {
144- struct sht3xd_data * data = dev -> driver_data ;
145- const struct sht3xd_config * cfg = dev -> config -> config_info ;
146-
147- if (trig -> type != SENSOR_TRIG_THRESHOLD ) {
148- return - ENOTSUP ;
149- }
150-
151- gpio_pin_disable_callback (data -> alert_gpio , cfg -> alert_pin );
152- data -> handler = handler ;
153- data -> trigger = * trig ;
154- gpio_pin_enable_callback (data -> alert_gpio , cfg -> alert_pin );
155-
156- return 0 ;
157- }
158-
159191int sht3xd_init_interrupt (struct device * dev )
160192{
161193 struct sht3xd_data * data = dev -> driver_data ;
@@ -172,9 +204,7 @@ int sht3xd_init_interrupt(struct device *dev)
172204 data -> alert_gpio = gpio ;
173205
174206 rc = gpio_pin_configure (gpio , cfg -> alert_pin ,
175- GPIO_DIR_IN | GPIO_INT |
176- GPIO_INT_EDGE | GPIO_INT_DOUBLE_EDGE |
177- GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE );
207+ GPIO_INPUT | cfg -> alert_flags );
178208 if (rc != 0 ) {
179209 LOG_DBG ("Failed to configure alert pin %u!" , cfg -> alert_pin );
180210 return - EIO ;
0 commit comments