From: Alexander Feilke <[email protected]> Convert the scalar type data to a data struct that also contains a register offset for otherwise compatible RTCs.
Signed-off-by: Alexander Feilke <[email protected]> --- drivers/rtc/ds1307.c | 87 +++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 26 deletions(-) diff --git a/drivers/rtc/ds1307.c b/drivers/rtc/ds1307.c index 4176ab3701e..db9bf43214c 100644 --- a/drivers/rtc/ds1307.c +++ b/drivers/rtc/ds1307.c @@ -29,6 +29,11 @@ enum ds_type { mcp794xx, }; +struct rtc_ds1370_data { + enum ds_type type; + int offset; +}; + /* * RTC register addresses */ @@ -72,7 +77,7 @@ static int ds1307_rtc_set(struct udevice *dev, const struct rtc_time *tm) { int ret; uchar buf[7]; - enum ds_type type = dev_get_driver_data(dev); + struct rtc_ds1370_data *data = (void*)dev_get_driver_data(dev); debug("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday, @@ -89,18 +94,18 @@ static int ds1307_rtc_set(struct udevice *dev, const struct rtc_time *tm) buf[RTC_MIN_REG_ADDR] = bin2bcd(tm->tm_min); buf[RTC_SEC_REG_ADDR] = bin2bcd(tm->tm_sec); - if (type == mcp794xx) { + if (data->type == mcp794xx) { buf[RTC_DAY_REG_ADDR] |= MCP7941X_BIT_VBATEN; buf[RTC_SEC_REG_ADDR] |= MCP7941X_BIT_ST; } - ret = dm_i2c_write(dev, 0, buf, sizeof(buf)); + ret = dm_i2c_write(dev, data->offset, buf, sizeof(buf)); if (ret < 0) return ret; - if (type == ds_1337) { + if (data->type == ds_1337) { /* Ensure oscillator is enabled */ - dm_i2c_reg_write(dev, DS1337_CTL_REG_ADDR, 0); + dm_i2c_reg_write(dev, plat->offset + DS1337_CTL_REG_ADDR, 0); } return 0; @@ -110,21 +115,21 @@ static int ds1307_rtc_get(struct udevice *dev, struct rtc_time *tm) { int ret; uchar buf[7]; - enum ds_type type = dev_get_driver_data(dev); + struct rtc_ds1370_data *data = (void*)dev_get_driver_data(dev); - ret = dm_i2c_read(dev, 0, buf, sizeof(buf)); + ret = dm_i2c_read(dev, data->offset, buf, sizeof(buf)); if (ret < 0) return ret; - if (type == ds_1337 || type == ds_1339 || type == ds_1340) { - uint reg = (type == ds_1340) ? DS1340_STAT_REG_ADDR : + if (data->type == ds_1337 || data->type == ds_1339 || data->type == ds_1340) { + uint reg = (data->type == ds_1340) ? DS1340_STAT_REG_ADDR : DS1337_STAT_REG_ADDR; - int status = dm_i2c_reg_read(dev, reg); + int status = dm_i2c_reg_read(dev, data->offset + reg); if (status >= 0 && (status & RTC_STAT_BIT_OSF)) { printf("### Warning: RTC oscillator has stopped\n"); /* clear the OSF flag */ - dm_i2c_reg_write(dev, reg, status & ~RTC_STAT_BIT_OSF); + dm_i2c_reg_write(dev, data->offset + reg, status & ~RTC_STAT_BIT_OSF); } } @@ -150,7 +155,7 @@ static int ds1307_rtc_get(struct udevice *dev, struct rtc_time *tm) static int ds1307_rtc_reset(struct udevice *dev) { int ret; - enum ds_type type = dev_get_driver_data(dev); + struct rtc_ds1370_data *data = (void*)dev_get_driver_data(dev); /* * reset clock/oscillator in the seconds register: @@ -158,26 +163,26 @@ static int ds1307_rtc_reset(struct udevice *dev) * on DS1340 bit 7 disables the oscillator (not EOSC) * on MCP794xx bit 7 enables Start Oscillator (ST) */ - ret = dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR, 0x00); + ret = dm_i2c_reg_write(dev, data->offset + RTC_SEC_REG_ADDR, 0x00); if (ret < 0) return ret; - if (type == ds_1307) { + if (data->type == ds_1307) { /* Write control register in order to enable square-wave * output (SQWE) and set a default rate of 32.768kHz (RS1|RS0). */ - ret = dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR, + ret = dm_i2c_reg_write(dev, data->offset + RTC_CTL_REG_ADDR, RTC_CTL_BIT_SQWE | RTC_CTL_BIT_RS1 | RTC_CTL_BIT_RS0); - } else if (type == ds_1337) { + } else if (data->type == ds_1337) { /* Write control register in order to enable oscillator output * (not EOSC) and set a default rate of 32.768kHz (RS2|RS1). */ - ret = dm_i2c_reg_write(dev, DS1337_CTL_REG_ADDR, + ret = dm_i2c_reg_write(dev, data->offset + DS1337_CTL_REG_ADDR, DS1337_CTL_BIT_RS2 | DS1337_CTL_BIT_RS1); - } else if (type == ds_1340 || type == mcp794xx || type == m41t11) { + } else if (data->type == ds_1340 || data->type == mcp794xx || data->type == m41t11) { /* Reset clock calibration, frequency test and output level. */ - ret = dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR, 0x00); + ret = dm_i2c_reg_write(dev, data->offset + RTC_CTL_REG_ADDR, 0x00); } return ret; @@ -197,14 +202,44 @@ static const struct rtc_ops ds1307_rtc_ops = { .reset = ds1307_rtc_reset, }; +static const struct rtc_ds1370_data ds_1307_data = { + .type = ds_1307, + .offset = 0, +}; + +static const struct rtc_ds1370_data ds_1337_data = { + .type = ds_1337, + .offset = 0, +}; + +static const struct rtc_ds1370_data ds_1339_data = { + .type = ds_1339, + .offset = 0, +}; + +static const struct rtc_ds1370_data ds_1340_data = { + .type = ds_1340, + .offset = 0, +}; + +static const struct rtc_ds1370_data mcp794xx_data = { + .type = mcp794xx, + .offset = 0, +}; + +static const struct rtc_ds1370_data m41t11_data = { + .type = m41t11, + .offset = 0, +}; + static const struct udevice_id ds1307_rtc_ids[] = { - { .compatible = "dallas,ds1307", .data = ds_1307 }, - { .compatible = "dallas,ds1337", .data = ds_1337 }, - { .compatible = "dallas,ds1339", .data = ds_1339 }, - { .compatible = "dallas,ds1340", .data = ds_1340 }, - { .compatible = "microchip,mcp7940x", .data = mcp794xx }, - { .compatible = "microchip,mcp7941x", .data = mcp794xx }, - { .compatible = "st,m41t11", .data = m41t11 }, + { .compatible = "dallas,ds1307", .data = (ulong)&ds_1307_data }, + { .compatible = "dallas,ds1337", .data = (ulong)&ds_1337_data }, + { .compatible = "dallas,ds1339", .data = (ulong)&ds_1339_data }, + { .compatible = "dallas,ds1340", .data = (ulong)&ds_1340_data }, + { .compatible = "microchip,mcp7940x", .data = (ulong)&mcp794xx_data }, + { .compatible = "microchip,mcp7941x", .data = (ulong)&mcp794xx_data }, + { .compatible = "st,m41t11", .data = (ulong)&m41t11_data }, { } }; -- 2.43.0
