drivers: rtc: Add support for Micro Crystal RV-8263-C8

Remove redundant code

Signed-off-by: Daniel Kampert <DanielKampert@kampis-elektroecke.de>
This commit is contained in:
Daniel Kampert 2024-06-17 07:28:54 +02:00 committed by Alberto Escolar
parent 37d6bc0827
commit 73c05e2079
2 changed files with 40 additions and 55 deletions

View file

@ -98,9 +98,6 @@ struct rv8263c8_data {
#if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE) && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios) #if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE) && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
const struct device *dev; const struct device *dev;
#endif
#if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE) && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
struct gpio_callback gpio_cb; struct gpio_callback gpio_cb;
#endif #endif
@ -120,19 +117,19 @@ struct rv8263c8_data {
static int rv8263c8_update_disable_timer(const struct device *dev) static int rv8263c8_update_disable_timer(const struct device *dev)
{ {
int err; int err;
uint8_t reg; uint8_t buf[2];
const struct rv8263c8_config *config = dev->config; const struct rv8263c8_config *config = dev->config;
/* Value 0 disables the timer. */ /* Value 0 disables the timer. */
reg = 0; buf[0] = RV8263C8_REGISTER_TIMER_VALUE;
err = i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_VALUE, &reg, buf[1] = 0;
sizeof(reg)); err = i2c_write_dt(&config->i2c_bus, buf, 2);
if (err < 0) { if (err < 0) {
return err; return err;
} }
return i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_MODE, &reg, buf[0] = RV8263C8_REGISTER_TIMER_MODE;
sizeof(reg)); return i2c_write_dt(&config->i2c_bus, buf, 2);
} }
#if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE) && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios) #if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE) && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
@ -144,11 +141,11 @@ static void rv8263c8_gpio_callback_handler(const struct device *p_port, struct g
struct rv8263c8_data *data = CONTAINER_OF(p_cb, struct rv8263c8_data, gpio_cb); struct rv8263c8_data *data = CONTAINER_OF(p_cb, struct rv8263c8_data, gpio_cb);
#if CONFIG_RTC_ALARM && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios) #if CONFIG_RTC_ALARM
k_work_submit(&data->alarm_work); k_work_submit(&data->alarm_work);
#endif #endif
#if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios) #if CONFIG_RTC_UPDATE
k_work_submit(&data->update_work); k_work_submit(&data->update_work);
#endif #endif
} }
@ -183,21 +180,21 @@ static void rv8263c8_alarm_worker(struct k_work *p_work)
static int rv8263c8_update_enable_timer(const struct device *dev) static int rv8263c8_update_enable_timer(const struct device *dev)
{ {
int err; int err;
uint8_t reg;
const struct rv8263c8_config *config = dev->config; const struct rv8263c8_config *config = dev->config;
uint8_t buf[2];
/* Set the timer preload value for 1 second. */ /* Set the timer preload value for 1 second. */
reg = 1; buf[0] = RV8263C8_REGISTER_TIMER_VALUE;
err = i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_VALUE, &reg, buf[1] = 1;
sizeof(reg)); err = i2c_write_dt(&config->i2c_bus, buf, 2);
if (err < 0) { if (err < 0) {
return err; return err;
} }
reg = RV8263_BM_TD_1HZ | RV8263_BM_TE_ENABLE | RV8263_BM_TIE_ENABLE | RV8263_BM_TI_TP_PULSE; buf[0] = RV8263C8_REGISTER_TIMER_MODE;
buf[1] = RV8263_BM_TD_1HZ | RV8263_BM_TE_ENABLE | RV8263_BM_TIE_ENABLE |
return i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_MODE, &reg, RV8263_BM_TI_TP_PULSE;
sizeof(reg)); return i2c_write_dt(&config->i2c_bus, buf, 2);
} }
static void rv8263c8_update_worker(struct k_work *p_work) static void rv8263c8_update_worker(struct k_work *p_work)
@ -225,7 +222,7 @@ static void rv8263c8_update_worker(struct k_work *p_work)
static int rv8263c8_time_set(const struct device *dev, const struct rtc_time *timeptr) static int rv8263c8_time_set(const struct device *dev, const struct rtc_time *timeptr)
{ {
uint8_t regs[7]; uint8_t regs[8];
const struct rv8263c8_config *config = dev->config; const struct rv8263c8_config *config = dev->config;
if (timeptr == NULL || (timeptr->tm_year < RV8263_YEAR_OFFSET)) { if (timeptr == NULL || (timeptr->tm_year < RV8263_YEAR_OFFSET)) {
@ -238,15 +235,16 @@ static int rv8263c8_time_set(const struct device *dev, const struct rtc_time *ti
timeptr->tm_year, timeptr->tm_mon, timeptr->tm_mday, timeptr->tm_wday, timeptr->tm_year, timeptr->tm_mon, timeptr->tm_mday, timeptr->tm_wday,
timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec); timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec);
regs[0] = bin2bcd(timeptr->tm_sec) & SECONDS_BITS; regs[0] = RV8263C8_REGISTER_SECONDS;
regs[1] = bin2bcd(timeptr->tm_min) & MINUTES_BITS; regs[1] = bin2bcd(timeptr->tm_sec) & SECONDS_BITS;
regs[2] = bin2bcd(timeptr->tm_hour) & HOURS_BITS; regs[2] = bin2bcd(timeptr->tm_min) & MINUTES_BITS;
regs[3] = bin2bcd(timeptr->tm_mday) & DATE_BITS; regs[3] = bin2bcd(timeptr->tm_hour) & HOURS_BITS;
regs[4] = bin2bcd(timeptr->tm_wday) & WEEKDAY_BITS; regs[4] = bin2bcd(timeptr->tm_mday) & DATE_BITS;
regs[5] = bin2bcd(timeptr->tm_mon) & MONTHS_BITS; regs[5] = bin2bcd(timeptr->tm_wday) & WEEKDAY_BITS;
regs[6] = bin2bcd(timeptr->tm_year - RV8263_YEAR_OFFSET) & YEAR_BITS; regs[6] = bin2bcd(timeptr->tm_mon) & MONTHS_BITS;
regs[7] = bin2bcd(timeptr->tm_year - RV8263_YEAR_OFFSET) & YEAR_BITS;
return i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_SECONDS, regs, sizeof(regs)); return i2c_write_dt(&config->i2c_bus, regs, 8);
} }
static int rv8263c8_time_get(const struct device *dev, struct rtc_time *timeptr) static int rv8263c8_time_get(const struct device *dev, struct rtc_time *timeptr)
@ -328,38 +326,24 @@ static int rv8263c8_init(const struct device *dev)
return err; return err;
} }
temp = 0x00; temp = config->clkout;
if (config->clkout == 0) {
temp = 0x07;
} else if (config->clkout == 1) {
temp = 0x06;
} else if (config->clkout == 1024) {
temp = 0x05;
} else if (config->clkout == 2048) {
temp = 0x04;
} else if (config->clkout == 4096) {
temp = 0x03;
} else if (config->clkout == 8192) {
temp = 0x02;
} else if (config->clkout == 16384) {
temp = 0x01;
}
LOG_DBG("Configure ClkOut: %u", temp); LOG_DBG("Configure ClkOut: %u", temp);
err = i2c_reg_write_byte_dt(&config->i2c_bus, RV8263C8_REGISTER_CONTROL_2, err = i2c_reg_write_byte_dt(&config->i2c_bus, RV8263C8_REGISTER_CONTROL_2,
RV8263C8_BM_MINUTE_INT_DISABLE | RV8263C8_BM_AF | temp);
RV8263C8_BM_HALF_MINUTE_INT_DISABLE | temp);
if (err < 0) { if (err < 0) {
LOG_ERR("Error while writing CONTROL_2! Error: %i", err); LOG_ERR("Error while writing CONTROL_2! Error: %i", err);
return err; return err;
} }
#if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios) LOG_DBG("Configure ClkOut: %u", temp);
uint8_t regs = 0;
err = i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_MODE, &regs, #if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
sizeof(regs)); uint8_t buf[2];
buf[0] = RV8263C8_REGISTER_TIMER_MODE;
buf[1] = 0;
err = i2c_write_dt(&config->i2c_bus, buf, 2);
if (err < 0) { if (err < 0) {
LOG_ERR("Error while writing CONTROL2! Error: %i", err); LOG_ERR("Error while writing CONTROL2! Error: %i", err);
return err; return err;
@ -777,7 +761,7 @@ static const struct rtc_driver_api rv8263c8_driver_api = {
static struct rv8263c8_data rv8263c8_data_##inst; \ static struct rv8263c8_data rv8263c8_data_##inst; \
static const struct rv8263c8_config rv8263c8_config_##inst = { \ static const struct rv8263c8_config rv8263c8_config_##inst = { \
.i2c_bus = I2C_DT_SPEC_INST_GET(inst), \ .i2c_bus = I2C_DT_SPEC_INST_GET(inst), \
.clkout = DT_INST_PROP_OR(inst, clkout, 0), \ .clkout = DT_INST_ENUM_IDX(inst, clkout), \
IF_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios), \ IF_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios), \
(.int_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0})))}; \ (.int_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0})))}; \
DEVICE_DT_INST_DEFINE(inst, &rv8263c8_init, NULL, &rv8263c8_data_##inst, \ DEVICE_DT_INST_DEFINE(inst, &rv8263c8_init, NULL, &rv8263c8_data_##inst, \

View file

@ -16,15 +16,16 @@ properties:
clkout: clkout:
type: int type: int
default: 32768 default: 0
enum: enum:
- 32768 - 32768
- 16384 - 16384
- 8192 - 8192
- 4096 - 4096
- 2048
- 1024 - 1024
- 1 - 1
- 0 - 0
description: description:
Enable CLKOUT at given frequency. When disabled, CLKOUT pin is LOW. Set to 0 to Enable CLKOUT at given frequency. When disabled, CLKOUT pin is LOW.
disable the CLKOUT signal. The default is 0 and corresponds to the disable the CLKOUT signal.