Skip to content

Commit

Permalink
drivers: rtc: Add support for Micro Crystal RV-8263-C8
Browse files Browse the repository at this point in the history
Remove redundant code

Signed-off-by: Daniel Kampert <DanielKampert@kampis-elektroecke.de>
  • Loading branch information
Kampi authored and aescolar committed Jul 29, 2024
1 parent 37d6bc0 commit 73c05e2
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 54 deletions.
86 changes: 35 additions & 51 deletions drivers/rtc/rtc_rv8263.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,6 @@ struct rv8263c8_data {

#if (CONFIG_RTC_ALARM || CONFIG_RTC_UPDATE) && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
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;
#endif

Expand All @@ -120,19 +117,19 @@ struct rv8263c8_data {
static int rv8263c8_update_disable_timer(const struct device *dev)
{
int err;
uint8_t reg;
uint8_t buf[2];
const struct rv8263c8_config *config = dev->config;

/* Value 0 disables the timer. */
reg = 0;
err = i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_VALUE, &reg,
sizeof(reg));
buf[0] = RV8263C8_REGISTER_TIMER_VALUE;
buf[1] = 0;
err = i2c_write_dt(&config->i2c_bus, buf, 2);
if (err < 0) {
return err;
}

return i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_MODE, &reg,
sizeof(reg));
buf[0] = RV8263C8_REGISTER_TIMER_MODE;
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)
Expand All @@ -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);

#if CONFIG_RTC_ALARM && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
#if CONFIG_RTC_ALARM
k_work_submit(&data->alarm_work);
#endif

#if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
#if CONFIG_RTC_UPDATE
k_work_submit(&data->update_work);
#endif
}
Expand Down Expand Up @@ -183,21 +180,21 @@ static void rv8263c8_alarm_worker(struct k_work *p_work)
static int rv8263c8_update_enable_timer(const struct device *dev)
{
int err;
uint8_t reg;
const struct rv8263c8_config *config = dev->config;
uint8_t buf[2];

/* Set the timer preload value for 1 second. */
reg = 1;
err = i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_VALUE, &reg,
sizeof(reg));
buf[0] = RV8263C8_REGISTER_TIMER_VALUE;
buf[1] = 1;
err = i2c_write_dt(&config->i2c_bus, buf, 2);
if (err < 0) {
return err;
}

reg = RV8263_BM_TD_1HZ | RV8263_BM_TE_ENABLE | RV8263_BM_TIE_ENABLE | RV8263_BM_TI_TP_PULSE;

return i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_MODE, &reg,
sizeof(reg));
buf[0] = RV8263C8_REGISTER_TIMER_MODE;
buf[1] = RV8263_BM_TD_1HZ | RV8263_BM_TE_ENABLE | RV8263_BM_TIE_ENABLE |
RV8263_BM_TI_TP_PULSE;
return i2c_write_dt(&config->i2c_bus, buf, 2);
}

static void rv8263c8_update_worker(struct k_work *p_work)
Expand Down Expand Up @@ -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)
{
uint8_t regs[7];
uint8_t regs[8];
const struct rv8263c8_config *config = dev->config;

if (timeptr == NULL || (timeptr->tm_year < RV8263_YEAR_OFFSET)) {
Expand All @@ -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_hour, timeptr->tm_min, timeptr->tm_sec);

regs[0] = bin2bcd(timeptr->tm_sec) & SECONDS_BITS;
regs[1] = bin2bcd(timeptr->tm_min) & MINUTES_BITS;
regs[2] = bin2bcd(timeptr->tm_hour) & HOURS_BITS;
regs[3] = bin2bcd(timeptr->tm_mday) & DATE_BITS;
regs[4] = bin2bcd(timeptr->tm_wday) & WEEKDAY_BITS;
regs[5] = bin2bcd(timeptr->tm_mon) & MONTHS_BITS;
regs[6] = bin2bcd(timeptr->tm_year - RV8263_YEAR_OFFSET) & YEAR_BITS;
regs[0] = RV8263C8_REGISTER_SECONDS;
regs[1] = bin2bcd(timeptr->tm_sec) & SECONDS_BITS;
regs[2] = bin2bcd(timeptr->tm_min) & MINUTES_BITS;
regs[3] = bin2bcd(timeptr->tm_hour) & HOURS_BITS;
regs[4] = bin2bcd(timeptr->tm_mday) & DATE_BITS;
regs[5] = bin2bcd(timeptr->tm_wday) & WEEKDAY_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)
Expand Down Expand Up @@ -328,38 +326,24 @@ static int rv8263c8_init(const struct device *dev)
return err;
}

temp = 0x00;
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;
}

temp = config->clkout;
LOG_DBG("Configure ClkOut: %u", temp);

err = i2c_reg_write_byte_dt(&config->i2c_bus, RV8263C8_REGISTER_CONTROL_2,
RV8263C8_BM_MINUTE_INT_DISABLE |
RV8263C8_BM_HALF_MINUTE_INT_DISABLE | temp);
RV8263C8_BM_AF | temp);
if (err < 0) {
LOG_ERR("Error while writing CONTROL_2! Error: %i", err);
return err;
}

LOG_DBG("Configure ClkOut: %u", temp);

#if CONFIG_RTC_UPDATE && DT_ANY_INST_HAS_PROP_STATUS_OKAY(int_gpios)
uint8_t regs = 0;
uint8_t buf[2];

err = i2c_burst_write_dt(&config->i2c_bus, RV8263C8_REGISTER_TIMER_MODE, &regs,
sizeof(regs));
buf[0] = RV8263C8_REGISTER_TIMER_MODE;
buf[1] = 0;
err = i2c_write_dt(&config->i2c_bus, buf, 2);
if (err < 0) {
LOG_ERR("Error while writing CONTROL2! Error: %i", err);
return err;
Expand Down Expand Up @@ -777,7 +761,7 @@ static const struct rtc_driver_api rv8263c8_driver_api = {
static struct rv8263c8_data rv8263c8_data_##inst; \
static const struct rv8263c8_config rv8263c8_config_##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), \
(.int_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0})))}; \
DEVICE_DT_INST_DEFINE(inst, &rv8263c8_init, NULL, &rv8263c8_data_##inst, \
Expand Down
7 changes: 4 additions & 3 deletions dts/bindings/rtc/microcrystal,rv-8263-c8.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,16 @@ properties:

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

0 comments on commit 73c05e2

Please sign in to comment.