@@ -86,16 +86,18 @@ struct rv8263c8_data {
8686 struct gpio_callback gpio_cb ;
8787#endif
8888
89+ #if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE ) && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
90+ struct k_work interrupt_work ;
91+ #endif
92+
8993#if CONFIG_RTC_ALARM && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
9094 rtc_alarm_callback alarm_cb ;
9195 void * alarm_cb_data ;
92- struct k_work alarm_work ;
9396#endif
9497
9598#if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
9699 rtc_update_callback update_cb ;
97100 void * update_cb_data ;
98- struct k_work update_work ;
99101#endif
100102};
101103
@@ -126,41 +128,12 @@ static void rv8263c8_gpio_callback_handler(const struct device *p_port, struct g
126128
127129 struct rv8263c8_data * data = CONTAINER_OF (p_cb , struct rv8263c8_data , gpio_cb );
128130
129- #if CONFIG_RTC_ALARM
130- k_work_submit (& data -> alarm_work );
131- #endif
132-
133- #if CONFIG_RTC_UPDATE
134- k_work_submit (& data -> update_work );
131+ #if CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE
132+ k_work_submit (& data -> interrupt_work );
135133#endif
136134}
137135#endif
138136
139- #if CONFIG_RTC_ALARM && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
140- static void rv8263c8_alarm_worker (struct k_work * p_work )
141- {
142- struct rv8263c8_data * data = CONTAINER_OF (p_work , struct rv8263c8_data , alarm_work );
143- const struct rv8263c8_config * config = data -> dev -> config ;
144-
145- LOG_DBG ("Process alarm worker from interrupt" );
146-
147- if (data -> alarm_cb != NULL ) {
148- uint8_t reg ;
149-
150- i2c_reg_read_byte_dt (& config -> i2c_bus , RV8263C8_REGISTER_CONTROL_2 , & reg );
151-
152- if (reg & RV8263C8_BM_AF ) {
153- reg &= ~RV8263C8_BM_AF ;
154-
155- LOG_DBG ("Calling alarm callback" );
156- data -> alarm_cb (data -> dev , 0 , data -> alarm_cb_data );
157-
158- i2c_reg_write_byte_dt (& config -> i2c_bus , RV8263C8_REGISTER_CONTROL_2 , reg );
159- }
160- }
161- }
162- #endif
163-
164137#if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
165138static int rv8263c8_update_enable_timer (const struct device * dev )
166139{
@@ -181,27 +154,48 @@ static int rv8263c8_update_enable_timer(const struct device *dev)
181154 RV8263_BM_TI_TP_PULSE ;
182155 return i2c_write_dt (& config -> i2c_bus , buf , 2 );
183156}
157+ #endif
184158
185- static void rv8263c8_update_worker (struct k_work * p_work )
159+ #if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE ) && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
160+ static void rv8263c8_interrupt_worker (struct k_work * p_work )
186161{
187162 uint8_t reg ;
188- struct rv8263c8_data * data = CONTAINER_OF (p_work , struct rv8263c8_data , update_work );
163+ struct rv8263c8_data * data = CONTAINER_OF (p_work , struct rv8263c8_data , interrupt_work );
189164 const struct rv8263c8_config * config = data -> dev -> config ;
190165
191- LOG_DBG ( "Process update worker from interrupt" );
166+ i2c_reg_read_byte_dt ( & config -> i2c_bus , RV8263C8_REGISTER_CONTROL_2 , & reg );
192167
193- if (data -> update_cb != NULL ) {
194- i2c_reg_read_byte_dt (& config -> i2c_bus , RV8263C8_REGISTER_CONTROL_2 , & reg );
168+ #if CONFIG_RTC_ALARM
169+ /* An alarm interrupt occurs. Clear the timer flag, */
170+ /* and call the callback. */
171+ if (reg & RV8263C8_BM_AF ) {
172+ LOG_DBG ("Process alarm interrupt" );
173+ reg &= ~RV8263C8_BM_AF ;
195174
196- if (reg & RV8263C8_BM_TF ) {
175+ if (data -> alarm_cb != NULL ) {
176+ LOG_DBG ("Calling alarm callback" );
177+ data -> alarm_cb (data -> dev , 0 , data -> alarm_cb_data );
178+ }
179+ }
180+ #endif
181+
182+ #if CONFIG_RTC_UPDATE
183+ /* A timer interrupt occurs. Clear the timer flag, */
184+ /* enable the timer again and call the callback. */
185+ if (reg & RV8263C8_BM_TF ) {
186+ LOG_DBG ("Process update interrupt" );
187+ reg &= ~RV8263C8_BM_TF ;
188+
189+ if (data -> update_cb != NULL ) {
197190 LOG_DBG ("Calling update callback" );
198191 data -> update_cb (data -> dev , data -> update_cb_data );
199192 }
193+
194+ rv8263c8_update_enable_timer (data -> dev );
200195 }
196+ #endif
201197
202- rv8263c8_update_enable_timer (data -> dev );
203- i2c_reg_update_byte_dt (& config -> i2c_bus , RV8263C8_REGISTER_CONTROL_2 , RV8263C8_BM_TF ,
204- RV8263C8_BM_TF );
198+ i2c_reg_write_byte_dt (& config -> i2c_bus , RV8263C8_REGISTER_CONTROL_2 , reg );
205199}
206200#endif
207201
@@ -336,6 +330,7 @@ static int rv8263c8_init(const struct device *dev)
336330#endif
337331
338332#if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE ) && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
333+ LOG_DBG ("Configure interrupt pin" );
339334 if (!gpio_is_ready_dt (& config -> int_gpio )) {
340335 LOG_ERR ("GPIO not ready!" );
341336 return err ;
@@ -364,18 +359,15 @@ static int rv8263c8_init(const struct device *dev)
364359#endif
365360
366361 (void )k_sem_take (& data -> lock , K_FOREVER );
367- #if CONFIG_RTC_ALARM && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
368- data -> alarm_work .handler = rv8263c8_alarm_worker ;
369- #endif
370-
371- #if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
372- data -> update_work .handler = rv8263c8_update_worker ;
362+ #if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE ) && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
363+ data -> interrupt_work .handler = rv8263c8_interrupt_worker ;
373364#endif
374365
375366#if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE ) && DT_ANY_INST_HAS_PROP_STATUS_OKAY (int_gpios )
376367 data -> dev = dev ;
377368#endif
378369 k_sem_give (& data -> lock );
370+ LOG_DBG ("Done" );
379371
380372 return 0 ;
381373}
@@ -442,19 +434,19 @@ static int rv8263c8_alarm_set_time(const struct device *dev, uint16_t id, uint16
442434 }
443435
444436 if (mask & RTC_ALARM_TIME_MASK_HOUR ) {
445- regs [3 ] = bin2bcd (timeptr -> tm_min ) & HOURS_BITS ;
437+ regs [3 ] = bin2bcd (timeptr -> tm_hour ) & HOURS_BITS ;
446438 } else {
447439 regs [3 ] = RV8263C8_BM_ALARM_DISABLE ;
448440 }
449441
450442 if (mask & RTC_ALARM_TIME_MASK_MONTHDAY ) {
451- regs [4 ] = bin2bcd (timeptr -> tm_min ) & DATE_BITS ;
443+ regs [4 ] = bin2bcd (timeptr -> tm_mday ) & DATE_BITS ;
452444 } else {
453445 regs [4 ] = RV8263C8_BM_ALARM_DISABLE ;
454446 }
455447
456448 if (mask & RTC_ALARM_TIME_MASK_WEEKDAY ) {
457- regs [5 ] = bin2bcd (timeptr -> tm_min ) & WEEKDAY_BITS ;
449+ regs [5 ] = bin2bcd (timeptr -> tm_wday ) & WEEKDAY_BITS ;
458450 } else {
459451 regs [5 ] = RV8263C8_BM_ALARM_DISABLE ;
460452 }
0 commit comments