diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c index 24bd795d9d95..c65b76cc0dc6 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; @@ -511,8 +520,10 @@ static int rs5c372_ioctl(struct device *dev, unsigned int cmd, unsigned long arg 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))) { flags |= RTC_VL_DATA_INVALID; } if (ctrl2 & R2x2x_CTRL2_VDET) @@ -527,7 +538,8 @@ static int rs5c372_ioctl(struct device *dev, unsigned int cmd, unsigned long arg return put_user(flags, (unsigned int __user *)arg); case RTC_VL_CLR: /* clear VDET bit */ - if (rs5c->type == rtc_r2025sd || rs5c->type == rtc_r2221tl) { + if (rs5c->type == rtc_r2025sd || rs5c->type == rtc_r2221tl || + rs5c->type == rtc_r2223x) { ctrl2 &= ~R2x2x_CTRL2_VDET; if (i2c_smbus_write_byte_data(rs5c->client, addr, ctrl2) < 0) { dev_dbg(&rs5c->client->dev, "%s: write error in line %i\n", @@ -554,6 +566,7 @@ static int rs5c372_read_offset(struct device *dev, long *offset) switch (rs5c->type) { case rtc_r2221tl: + case rtc_r2223x: ppb_per_step = val & R2221TL_TRIM_DEV ? 1017 : 3051; break; case rtc_rs5c372a: @@ -600,6 +613,7 @@ static int rs5c372_set_offset(struct device *dev, long offset) } break; case rtc_r2221tl: + case rtc_r2223x: /* * Check if it is possible to use high resolution mode (DEV=1). * In this mode, the minimum resolution is 2 / (32768 * 20 * 3), @@ -750,6 +764,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 +783,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 +863,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 +893,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;