Skip to content

Commit ec10d56

Browse files
Kampimmahadevan108
authored andcommitted
drivers: rtc: rv8263-c8: Alarm reworking
- Fix typos for alarm field identification - Fix a bug where an alarm interrupt starts update interrupts - Rework interrupt code to reduce code size and complexity Signed-off-by: Daniel Kampert <[email protected]>
1 parent e20c095 commit ec10d56

File tree

1 file changed

+43
-51
lines changed

1 file changed

+43
-51
lines changed

drivers/rtc/rtc_rv8263.c

Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
165138
static 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

Comments
 (0)