[PATCH v1 2/3] rtc: rs5c372: add support for Ricoh R2223x

From: Heiko Schocher

Date: Mon Aug 24 2026 - 07:05:36 EST


The R2223x is an I2C RTC from the same family as the r2025sd and r2221tl
that this driver already handles. It shares the R2x2x control register
layout, so treat it like the r2221tl. The oscillator interrupt flag is
reported through XSTP, and the 24 hour mode bit lives in CTRL1.

Signed-off-by: Heiko Schocher <hs@xxxxxxxxxxxx>
---
checkpatch reports on this patch

ERROR: trailing statements should be on next line
+ case rtc_r2223x: s = "r2223x"; break;

I did not fix this checkpatch error, as the whole switch statement uses
this format.

drivers/rtc/rtc-rs5c372.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c
index 24bd795d9d95..30e272d65021 100644
--- a/drivers/rtc/rtc-rs5c372.c
+++ b/drivers/rtc/rtc-rs5c372.c
@@ -68,6 +68,7 @@ enum rtc_type {
rtc_undef = 0,
rtc_r2025sd,
rtc_r2221tl,
+ rtc_r2223x,
rtc_rs5c372a,
rtc_rs5c372b,
rtc_rv5c386,
@@ -77,6 +78,7 @@ enum rtc_type {
static const struct i2c_device_id rs5c372_id[] = {
{ .name = "r2025sd", .driver_data = rtc_r2025sd },
{ .name = "r2221tl", .driver_data = rtc_r2221tl },
+ { .name = "r2223x", .driver_data = rtc_r2223x },
{ .name = "rs5c372a", .driver_data = rtc_rs5c372a },
{ .name = "rs5c372b", .driver_data = rtc_rs5c372b },
{ .name = "rv5c386", .driver_data = rtc_rv5c386 },
@@ -94,6 +96,10 @@ static const __maybe_unused struct of_device_id rs5c372_of_match[] = {
.compatible = "ricoh,r2221tl",
.data = (void *)rtc_r2221tl
},
+ {
+ .compatible = "ricoh,r2223x",
+ .data = (void *)rtc_r2223x
+ },
{
.compatible = "ricoh,rs5c372a",
.data = (void *)rtc_rs5c372a
@@ -221,8 +227,10 @@ static int rs5c372_rtc_read_time(struct device *dev, struct rtc_time *tm)
switch (rs5c->type) {
case rtc_r2025sd:
case rtc_r2221tl:
+ case rtc_r2223x:
if ((rs5c->type == rtc_r2025sd && !(ctrl2 & R2x2x_CTRL2_XSTP)) ||
- (rs5c->type == rtc_r2221tl && (ctrl2 & R2x2x_CTRL2_XSTP))) {
+ ((rs5c->type == rtc_r2221tl || rs5c->type == rtc_r2223x) &&
+ (ctrl2 & R2x2x_CTRL2_XSTP))) {
dev_warn(&client->dev, "rtc oscillator interruption detected. Please reset the rtc clock.\n");
return -EINVAL;
}
@@ -292,6 +300,7 @@ static int rs5c372_rtc_set_time(struct device *dev, struct rtc_time *tm)
switch (rs5c->type) {
case rtc_r2025sd:
case rtc_r2221tl:
+ case rtc_r2223x:
ctrl2 &= ~(R2x2x_CTRL2_VDET | R2x2x_CTRL2_PON);
if (rs5c->type == rtc_r2025sd)
ctrl2 |= R2x2x_CTRL2_XSTP;
@@ -750,6 +759,7 @@ static int rs5c_oscillator_setup(struct rs5c372 *rs5c372)
return ret;
break;
case rtc_r2221tl:
+ case rtc_r2223x:
if (!(buf[1] & R2x2x_CTRL2_XSTP))
return ret;
break;
@@ -768,6 +778,7 @@ static int rs5c_oscillator_setup(struct rs5c372 *rs5c372)
break;
case rtc_r2025sd:
case rtc_r2221tl:
+ case rtc_r2223x:
case rtc_rv5c386:
case rtc_rv5c387a:
buf[0] |= RV5C387_CTRL1_24;
@@ -847,6 +858,7 @@ static int rs5c372_probe(struct i2c_client *client)
break;
case rtc_r2025sd:
case rtc_r2221tl:
+ case rtc_r2223x:
case rtc_rv5c386:
case rtc_rv5c387a:
if (rs5c372->regs[RS5C_REG_CTRL1] & RV5C387_CTRL1_24)
@@ -876,6 +888,7 @@ static int rs5c372_probe(struct i2c_client *client)
({ char *s; switch (rs5c372->type) {
case rtc_r2025sd: s = "r2025sd"; break;
case rtc_r2221tl: s = "r2221tl"; break;
+ case rtc_r2223x: s = "r2223x"; break;
case rtc_rs5c372a: s = "rs5c372a"; break;
case rtc_rs5c372b: s = "rs5c372b"; break;
case rtc_rv5c386: s = "rv5c386"; break;
--
2.55.0