* [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
@ 2026-06-29 15:13 Fredrik M Olsson
2026-06-29 20:15 ` kernel test robot
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Fredrik M Olsson @ 2026-06-29 15:13 UTC (permalink / raw)
To: Alexandre Belloni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Nobuhiro Iwamatsu
Cc: linux-rtc, devicetree, linux-kernel, kernel, Fredrik M Olsson
Adds support for:
- Reading and writing time to/from the RTC.
- Changing Backup Switch Mode (BSM) to DISABLED/DIRECT/LEVEL using the
RTC_PARAM_SET ioctl.
- Optionally enabling battery charging.
- Reading the battery voltage low status using the RTC_VL_READ ioctl
(only supported in LEVEL BSM), which also reports invalid time
information if the VLF flag is set.
Signed-off-by: Fredrik M Olsson <fredrik.m.olsson@axis.com>
---
Add basic support for the Epson RX8901CE RTC.
Datasheet: https://download.epsondevice.com/td/pdf/app/RX8901CE_en.pdf
Also includes a bug fix for an issue with reading the weekday from the
RTC which affects both the existing rx8130 and this rx8901 driver.
---
Changes in v3:
- Clear CHGEN when trickle battery charging is disabled.
- Link to v2: https://lore.kernel.org/r/20260520-ds1307-rx8901-add-v2-0-e069ea32e1db@axis.com
Changes in v2:
- Squashed the Voltage Low status patch into the driver patch
- Switch from dev_err to dev_dbg
- Implement Backup Switch Mode (BSM) ioctl instead of hard coding
switching mode.
- Change the prototype for the do_trickle_setup function pointer in
order to make it possible to propagate error codes from the added
PWSW_CFG register read operation. This read operation is added so not
to override previously set register fields.
- Link to v1: https://lore.kernel.org/r/20251219-ds1307-rx8901-add-v1-0-b13f346ebe93@axis.com
---
drivers/rtc/rtc-ds1307.c | 218 +++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 209 insertions(+), 9 deletions(-)
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index 0707ded5368b..488fd1d8d8e3 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -9,6 +9,7 @@
*/
#include <linux/bcd.h>
+#include <linux/bitfield.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kstrtox.h>
@@ -48,6 +49,7 @@ enum ds_type {
mcp794xx,
rx_8025,
rx_8130,
+ rx_8901,
last_ds_type /* always last */
/* rs5c372 too? different address... */
};
@@ -129,6 +131,18 @@ enum ds_type {
#define RX8130_REG_CONTROL1_INIEN BIT(4)
#define RX8130_REG_CONTROL1_CHGEN BIT(5)
+#define RX8901_REG_INTF 0x0e
+#define RX8901_REG_INTF_VLF BIT(1)
+#define RX8901_REG_PWSW_CFG 0x37
+#define RX8901_REG_PWSW_CFG_SWSEL GENMASK(3, 2)
+#define RX8901_REG_PWSW_CFG_VBATLDETEN BIT(4)
+#define RX8901_REG_PWSW_CFG_INIEN BIT(6)
+#define RX8901_REG_PWSW_CFG_CHGEN BIT(7)
+#define RX8901_REG_BUF_INTF 0x46
+#define RX8901_REG_BUF_INTF_VBATLF BIT(3)
+#define RX8901_SWSEL_PRIMARY_BACKUP 0x1
+#define RX8901_SWSEL_PRIMARY 0x2
+
#define MCP794XX_REG_CONTROL 0x07
# define MCP794XX_BIT_ALM0_EN 0x10
# define MCP794XX_BIT_ALM1_EN 0x20
@@ -192,8 +206,8 @@ struct chip_desc {
irq_handler_t irq_handler;
const struct rtc_class_ops *rtc_ops;
u16 trickle_charger_reg;
- u8 (*do_trickle_setup)(struct ds1307 *, u32,
- bool);
+ int (*do_trickle_setup)(struct ds1307 *ds1307, u32 ohms,
+ bool diode);
/* Does the RTC require trickle-resistor-ohms to select the value of
* the resistor between Vcc and Vbackup?
*/
@@ -216,6 +230,7 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
if (ds1307->type == rx_8130) {
unsigned int regflag;
+
ret = regmap_read(ds1307->regmap, RX8130_REG_FLAG, ®flag);
if (ret) {
dev_err(dev, "%s error %d\n", "read", ret);
@@ -226,6 +241,19 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
dev_warn_once(dev, "oscillator failed, set time!\n");
return -EINVAL;
}
+ } else if (ds1307->type == rx_8901) {
+ unsigned int regflag;
+
+ ret = regmap_read(ds1307->regmap, RX8901_REG_INTF, ®flag);
+ if (ret) {
+ dev_dbg(dev, "%s error %d\n", "read", ret);
+ return ret;
+ }
+
+ if (regflag & RX8901_REG_INTF_VLF) {
+ dev_warn_once(dev, "oscillator failed, set time!\n");
+ return -EINVAL;
+ }
}
/* read the RTC date and time registers all at once */
@@ -310,7 +338,7 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
tmp = regs[DS1307_REG_HOUR] & 0x3f;
t->tm_hour = bcd2bin(tmp);
/* rx8130 is bit position, not BCD */
- if (ds1307->type == rx_8130)
+ if (ds1307->type == rx_8130 || ds1307->type == rx_8901)
t->tm_wday = fls(regs[DS1307_REG_WDAY] & 0x7f) - 1;
else
t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
@@ -361,7 +389,7 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
regs[DS1307_REG_MIN] = bin2bcd(t->tm_min);
regs[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
/* rx8130 is bit position, not BCD */
- if (ds1307->type == rx_8130)
+ if (ds1307->type == rx_8130 || ds1307->type == rx_8901)
regs[DS1307_REG_WDAY] = 1 << t->tm_wday;
else
regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
@@ -428,11 +456,132 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
dev_err(dev, "%s error %d\n", "write", result);
return result;
}
+ } else if (ds1307->type == rx_8901) {
+ /*
+ * clear Voltage Loss Flag as data is available now (writing 1
+ * to the other bits in the INTF register has no effect)
+ */
+ result = regmap_write(ds1307->regmap, RX8901_REG_INTF,
+ 0xff ^ RX8901_REG_INTF_VLF);
+ if (result) {
+ dev_dbg(dev, "%s error %d\n", "write", result);
+ return result;
+ }
}
return 0;
}
+#ifdef CONFIG_RTC_INTF_DEV
+static int rx8901_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
+{
+ struct ds1307 *ds1307 = dev_get_drvdata(dev);
+ unsigned int regflag, tmp = 0;
+ int ret = 0;
+
+ switch (cmd) {
+ case RTC_VL_READ:
+ ret = regmap_read(ds1307->regmap, RX8901_REG_INTF, ®flag);
+ if (ret)
+ return ret;
+
+ if (regflag & RX8901_REG_INTF_VLF)
+ tmp |= RTC_VL_DATA_INVALID;
+
+ ret = regmap_read(ds1307->regmap, RX8901_REG_BUF_INTF, ®flag);
+ if (ret)
+ return ret;
+
+ if (regflag & RX8901_REG_BUF_INTF_VBATLF)
+ tmp |= RTC_VL_BACKUP_LOW;
+
+ return put_user(tmp, (unsigned int __user *)arg);
+ default:
+ return -ENOIOCTLCMD;
+ }
+ return ret;
+}
+
+static int rx8901_param_get(struct device *dev, struct rtc_param *param)
+{
+ struct ds1307 *ds1307 = dev_get_drvdata(dev);
+ unsigned int regflag;
+ int ret;
+
+ switch (param->param) {
+ case RTC_PARAM_BACKUP_SWITCH_MODE:
+ ret = regmap_read(ds1307->regmap, RX8901_REG_PWSW_CFG, ®flag);
+ if (ret)
+ return ret;
+
+ if (regflag & RX8901_REG_PWSW_CFG_INIEN) {
+ param->uvalue = RTC_BSM_LEVEL;
+ } else {
+ unsigned int swsel = FIELD_GET(RX8901_REG_PWSW_CFG_SWSEL, regflag);
+
+ if (swsel == RX8901_SWSEL_PRIMARY_BACKUP)
+ param->uvalue = RTC_BSM_DIRECT;
+ else
+ param->uvalue = RTC_BSM_DISABLED;
+ }
+
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ return ret;
+}
+
+static int rx8901_param_set(struct device *dev, struct rtc_param *param)
+{
+ struct ds1307 *ds1307 = dev_get_drvdata(dev);
+ unsigned int regmask;
+ unsigned int regval;
+ int ret;
+
+ switch (param->param) {
+ case RTC_PARAM_BACKUP_SWITCH_MODE:
+
+ switch (param->uvalue) {
+ case RTC_BSM_DISABLED:
+ /* Only main power supply is used */
+ regmask = RX8901_REG_PWSW_CFG_INIEN |
+ RX8901_REG_PWSW_CFG_SWSEL;
+ regval = FIELD_PREP(RX8901_REG_PWSW_CFG_SWSEL,
+ RX8901_SWSEL_PRIMARY) |
+ FIELD_PREP(RX8901_REG_PWSW_CFG_INIEN, 0);
+ break;
+ case RTC_BSM_DIRECT:
+ /* Main and battery power supply is put in parallel (default) */
+ regmask = RX8901_REG_PWSW_CFG_INIEN |
+ RX8901_REG_PWSW_CFG_SWSEL;
+ regval = FIELD_PREP(RX8901_REG_PWSW_CFG_SWSEL,
+ RX8901_SWSEL_PRIMARY_BACKUP) |
+ FIELD_PREP(RX8901_REG_PWSW_CFG_INIEN, 0);
+ break;
+ case RTC_BSM_LEVEL:
+ /* Enable auto power switching between main and backup power supply */
+ regmask = RX8901_REG_PWSW_CFG_INIEN;
+ regval = FIELD_PREP(RX8901_REG_PWSW_CFG_INIEN, 1);
+ break;
+ default:
+ return -EINVAL;
+ }
+ ret = regmap_update_bits(ds1307->regmap, RX8901_REG_PWSW_CFG, regmask, regval);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return ret;
+}
+#else
+#define rx8901_ioctl NULL
+#define rx8901_param_get NULL
+#define rx8901_param_set NULL
+#endif
+
static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
{
struct ds1307 *ds1307 = dev_get_drvdata(dev);
@@ -539,7 +688,7 @@ static int ds1307_alarm_irq_enable(struct device *dev, unsigned int enabled)
enabled ? DS1337_BIT_A1IE : 0);
}
-static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307, u32 ohms, bool diode)
+static int do_trickle_setup_ds1339(struct ds1307 *ds1307, u32 ohms, bool diode)
{
u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE :
DS1307_TRICKLE_CHARGER_NO_DIODE;
@@ -564,7 +713,7 @@ static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307, u32 ohms, bool diode)
return setup;
}
-static u8 do_trickle_setup_rx8130(struct ds1307 *ds1307, u32 ohms, bool diode)
+static int do_trickle_setup_rx8130(struct ds1307 *ds1307, u32 ohms, bool diode)
{
/* make sure that the backup battery is enabled */
u8 setup = RX8130_REG_CONTROL1_INIEN;
@@ -574,6 +723,28 @@ static u8 do_trickle_setup_rx8130(struct ds1307 *ds1307, u32 ohms, bool diode)
return setup;
}
+static int do_trickle_setup_rx8901(struct ds1307 *ds1307, u32 ohms __always_unused, bool diode)
+{
+ int ret;
+ unsigned int setup;
+
+ ret = regmap_read(ds1307->regmap, RX8901_REG_PWSW_CFG, &setup);
+ if (ret) {
+ dev_err(ds1307->dev, "Failed to read PWSW_CFG register\n");
+ return ret;
+ }
+
+ /* Enable low battery voltage detection */
+ setup |= RX8901_REG_PWSW_CFG_VBATLDETEN;
+
+ if (diode)
+ setup |= RX8901_REG_PWSW_CFG_CHGEN;
+ else
+ setup &= ~RX8901_REG_PWSW_CFG_CHGEN;
+
+ return setup;
+}
+
static irqreturn_t rx8130_irq(int irq, void *dev_id)
{
struct ds1307 *ds1307 = dev_id;
@@ -966,6 +1137,14 @@ static const struct rtc_class_ops rx8130_rtc_ops = {
.alarm_irq_enable = rx8130_alarm_irq_enable,
};
+static const struct rtc_class_ops rx8901_rtc_ops = {
+ .read_time = ds1307_get_time,
+ .set_time = ds1307_set_time,
+ .ioctl = rx8901_ioctl,
+ .param_get = rx8901_param_get,
+ .param_set = rx8901_param_set,
+};
+
static const struct rtc_class_ops mcp794xx_rtc_ops = {
.read_time = ds1307_get_time,
.set_time = ds1307_set_time,
@@ -1046,6 +1225,12 @@ static const struct chip_desc chips[last_ds_type] = {
.trickle_charger_reg = RX8130_REG_CONTROL1,
.do_trickle_setup = &do_trickle_setup_rx8130,
},
+ [rx_8901] = {
+ .offset = 0x0,
+ .rtc_ops = &rx8901_rtc_ops,
+ .trickle_charger_reg = RX8901_REG_PWSW_CFG,
+ .do_trickle_setup = &do_trickle_setup_rx8901,
+ },
[m41t0] = {
.rtc_ops = &m41txx_rtc_ops,
},
@@ -1087,6 +1272,7 @@ static const struct i2c_device_id ds1307_id[] = {
{ .name = "rx8025", .driver_data = rx_8025 },
{ .name = "isl12057", .driver_data = ds_1337 },
{ .name = "rx8130", .driver_data = rx_8130 },
+ { .name = "rx8901", .driver_data = rx_8901 },
{ }
};
MODULE_DEVICE_TABLE(i2c, ds1307_id);
@@ -1164,6 +1350,10 @@ static const struct of_device_id ds1307_of_match[] = {
.compatible = "epson,rx8130",
.data = (void *)rx_8130
},
+ {
+ .compatible = "epson,rx8901",
+ .data = (void *)rx_8901
+ },
{ }
};
MODULE_DEVICE_TABLE(of, ds1307_of_match);
@@ -1298,7 +1488,7 @@ static int ds1307_nvram_write(void *priv, unsigned int offset, void *val,
/*----------------------------------------------------------------------*/
-static u8 ds1307_trickle_init(struct ds1307 *ds1307,
+static int ds1307_trickle_init(struct ds1307 *ds1307,
const struct chip_desc *chip)
{
u32 ohms, chargeable;
@@ -1886,7 +2076,7 @@ static int ds1307_probe(struct i2c_client *client)
bool ds1307_can_wakeup_device = false;
unsigned char regs[8];
struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
- u8 trickle_charger_setup = 0;
+ int trickle_charger_setup = 0;
ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
if (!ds1307)
@@ -1922,12 +2112,15 @@ static int ds1307_probe(struct i2c_client *client)
else if (pdata->trickle_charger_setup)
trickle_charger_setup = pdata->trickle_charger_setup;
+ if (trickle_charger_setup < 0)
+ return trickle_charger_setup;
+
if (trickle_charger_setup && chip->trickle_charger_reg) {
dev_dbg(ds1307->dev,
"writing trickle charger info 0x%x to 0x%x\n",
trickle_charger_setup, chip->trickle_charger_reg);
regmap_write(ds1307->regmap, chip->trickle_charger_reg,
- trickle_charger_setup);
+ (u8)trickle_charger_setup);
}
/*
@@ -2131,6 +2324,13 @@ static int ds1307_probe(struct i2c_client *client)
}
}
+ switch (ds1307->type) {
+ case rx_8901:
+ set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, ds1307->rtc->features);
+ break;
+ default:
+ }
+
ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
err = ds1307_add_frequency_test(ds1307);
if (err)
---
base-commit: dc59e4fea9d83f03bad6bddf3fa2e52491777482
change-id: 20251126-ds1307-rx8901-add-a0fe173093e3
Best regards,
--
Fredrik M Olsson <fredrik.m.olsson@axis.com>
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
2026-06-29 15:13 [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE Fredrik M Olsson
@ 2026-06-29 20:15 ` kernel test robot
2026-06-29 21:10 ` kernel test robot
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2026-06-29 20:15 UTC (permalink / raw)
To: Fredrik M Olsson, Alexandre Belloni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nobuhiro Iwamatsu
Cc: llvm, oe-kbuild-all, linux-rtc, devicetree, linux-kernel, kernel,
Fredrik M Olsson
Hi Fredrik,
kernel test robot noticed the following build warnings:
[auto build test WARNING on dc59e4fea9d83f03bad6bddf3fa2e52491777482]
url: https://github.com/intel-lab-lkp/linux/commits/Fredrik-M-Olsson/rtc-ds1307-Add-driver-for-Epson-RX8901CE/20260629-232253
base: dc59e4fea9d83f03bad6bddf3fa2e52491777482
patch link: https://lore.kernel.org/r/20260629-ds1307-rx8901-add-v3-1-302dc3cbb71e%40axis.com
patch subject: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
config: um-randconfig-002-20260630 (https://download.01.org/0day-ci/archive/20260630/202606300447.wDrgfpSn-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260630/202606300447.wDrgfpSn-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202606300447.wDrgfpSn-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/rtc/rtc-ds1307.c:2332:2: warning: label at end of compound statement is a C2x extension [-Wc2x-extensions]
2332 | }
| ^
1 warning generated.
vim +2332 drivers/rtc/rtc-ds1307.c
2066
2067 static int ds1307_probe(struct i2c_client *client)
2068 {
2069 const struct i2c_device_id *id = i2c_client_get_device_id(client);
2070 struct ds1307 *ds1307;
2071 const void *match;
2072 int err = -ENODEV;
2073 int tmp;
2074 const struct chip_desc *chip;
2075 bool want_irq;
2076 bool ds1307_can_wakeup_device = false;
2077 unsigned char regs[8];
2078 struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
2079 int trickle_charger_setup = 0;
2080
2081 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
2082 if (!ds1307)
2083 return -ENOMEM;
2084
2085 dev_set_drvdata(&client->dev, ds1307);
2086 ds1307->dev = &client->dev;
2087 ds1307->name = client->name;
2088
2089 ds1307->regmap = devm_regmap_init_i2c(client, ®map_config);
2090 if (IS_ERR(ds1307->regmap)) {
2091 dev_err(ds1307->dev, "regmap allocation failed\n");
2092 return PTR_ERR(ds1307->regmap);
2093 }
2094
2095 i2c_set_clientdata(client, ds1307);
2096
2097 match = device_get_match_data(&client->dev);
2098 if (match) {
2099 ds1307->type = (uintptr_t)match;
2100 chip = &chips[ds1307->type];
2101 } else if (id) {
2102 chip = &chips[id->driver_data];
2103 ds1307->type = id->driver_data;
2104 } else {
2105 return -ENODEV;
2106 }
2107
2108 want_irq = client->irq > 0 && chip->alarm;
2109
2110 if (!pdata)
2111 trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
2112 else if (pdata->trickle_charger_setup)
2113 trickle_charger_setup = pdata->trickle_charger_setup;
2114
2115 if (trickle_charger_setup < 0)
2116 return trickle_charger_setup;
2117
2118 if (trickle_charger_setup && chip->trickle_charger_reg) {
2119 dev_dbg(ds1307->dev,
2120 "writing trickle charger info 0x%x to 0x%x\n",
2121 trickle_charger_setup, chip->trickle_charger_reg);
2122 regmap_write(ds1307->regmap, chip->trickle_charger_reg,
2123 (u8)trickle_charger_setup);
2124 }
2125
2126 /*
2127 * For devices with no IRQ directly connected to the SoC, the RTC chip
2128 * can be forced as a wakeup source by stating that explicitly in
2129 * the device's .dts file using the "wakeup-source" boolean property.
2130 * If the "wakeup-source" property is set, don't request an IRQ.
2131 * This will guarantee the 'wakealarm' sysfs entry is available on the device,
2132 * if supported by the RTC.
2133 */
2134 if (chip->alarm && device_property_read_bool(&client->dev, "wakeup-source"))
2135 ds1307_can_wakeup_device = true;
2136
2137 switch (ds1307->type) {
2138 case ds_1337:
2139 case ds_1339:
2140 case ds_1341:
2141 case ds_3231:
2142 /* get registers that the "rtc" read below won't read... */
2143 err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
2144 regs, 2);
2145 if (err) {
2146 dev_dbg(ds1307->dev, "read error %d\n", err);
2147 goto exit;
2148 }
2149
2150 /* oscillator off? turn it on, so clock can tick. */
2151 if (regs[0] & DS1337_BIT_nEOSC)
2152 regs[0] &= ~DS1337_BIT_nEOSC;
2153
2154 /*
2155 * Using IRQ or defined as wakeup-source?
2156 * Disable the square wave and both alarms.
2157 * For some variants, be sure alarms can trigger when we're
2158 * running on Vbackup (BBSQI/BBSQW)
2159 */
2160 if (want_irq || ds1307_can_wakeup_device)
2161 regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
2162
2163 regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
2164 regs[0]);
2165
2166 /* oscillator fault? warn */
2167 if (regs[1] & DS1337_BIT_OSF) {
2168 dev_warn(ds1307->dev, "SET TIME!\n");
2169 }
2170 break;
2171
2172 case rx_8025:
2173 err = regmap_bulk_read(ds1307->regmap,
2174 RX8025_REG_CTRL1 << 4 | 0x08, regs, 2);
2175 if (err) {
2176 dev_dbg(ds1307->dev, "read error %d\n", err);
2177 goto exit;
2178 }
2179
2180 /* oscillator off? turn it on, so clock can tick. */
2181 if (!(regs[1] & RX8025_BIT_XST)) {
2182 regs[1] |= RX8025_BIT_XST;
2183 regmap_write(ds1307->regmap,
2184 RX8025_REG_CTRL2 << 4 | 0x08,
2185 regs[1]);
2186 dev_warn(ds1307->dev,
2187 "oscillator stop detected - SET TIME!\n");
2188 }
2189
2190 if (regs[1] & RX8025_BIT_PON) {
2191 regs[1] &= ~RX8025_BIT_PON;
2192 regmap_write(ds1307->regmap,
2193 RX8025_REG_CTRL2 << 4 | 0x08,
2194 regs[1]);
2195 dev_warn(ds1307->dev, "power-on detected\n");
2196 }
2197
2198 if (regs[1] & RX8025_BIT_VDET) {
2199 regs[1] &= ~RX8025_BIT_VDET;
2200 regmap_write(ds1307->regmap,
2201 RX8025_REG_CTRL2 << 4 | 0x08,
2202 regs[1]);
2203 dev_warn(ds1307->dev, "voltage drop detected\n");
2204 }
2205
2206 /* make sure we are running in 24hour mode */
2207 if (!(regs[0] & RX8025_BIT_2412)) {
2208 u8 hour;
2209
2210 /* switch to 24 hour mode */
2211 regmap_write(ds1307->regmap,
2212 RX8025_REG_CTRL1 << 4 | 0x08,
2213 regs[0] | RX8025_BIT_2412);
2214
2215 err = regmap_bulk_read(ds1307->regmap,
2216 RX8025_REG_CTRL1 << 4 | 0x08,
2217 regs, 2);
2218 if (err) {
2219 dev_dbg(ds1307->dev, "read error %d\n", err);
2220 goto exit;
2221 }
2222
2223 /* correct hour */
2224 hour = bcd2bin(regs[DS1307_REG_HOUR]);
2225 if (hour == 12)
2226 hour = 0;
2227 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2228 hour += 12;
2229
2230 regmap_write(ds1307->regmap,
2231 DS1307_REG_HOUR << 4 | 0x08, hour);
2232 }
2233 break;
2234 case ds_1388:
2235 err = regmap_read(ds1307->regmap, DS1388_REG_CONTROL, &tmp);
2236 if (err) {
2237 dev_dbg(ds1307->dev, "read error %d\n", err);
2238 goto exit;
2239 }
2240
2241 /* oscillator off? turn it on, so clock can tick. */
2242 if (tmp & DS1388_BIT_nEOSC) {
2243 tmp &= ~DS1388_BIT_nEOSC;
2244 regmap_write(ds1307->regmap, DS1388_REG_CONTROL, tmp);
2245 }
2246 break;
2247 default:
2248 break;
2249 }
2250
2251 /* read RTC registers */
2252 err = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
2253 sizeof(regs));
2254 if (err) {
2255 dev_dbg(ds1307->dev, "read error %d\n", err);
2256 goto exit;
2257 }
2258
2259 if (ds1307->type == mcp794xx &&
2260 !(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
2261 regmap_write(ds1307->regmap, DS1307_REG_WDAY,
2262 regs[DS1307_REG_WDAY] |
2263 MCP794XX_BIT_VBATEN);
2264 }
2265
2266 tmp = regs[DS1307_REG_HOUR];
2267 switch (ds1307->type) {
2268 case ds_1340:
2269 case m41t0:
2270 case m41t00:
2271 case m41t11:
2272 /*
2273 * NOTE: ignores century bits; fix before deploying
2274 * systems that will run through year 2100.
2275 */
2276 break;
2277 case rx_8025:
2278 break;
2279 default:
2280 if (!(tmp & DS1307_BIT_12HR))
2281 break;
2282
2283 /*
2284 * Be sure we're in 24 hour mode. Multi-master systems
2285 * take note...
2286 */
2287 tmp = bcd2bin(tmp & 0x1f);
2288 if (tmp == 12)
2289 tmp = 0;
2290 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2291 tmp += 12;
2292 regmap_write(ds1307->regmap, chip->offset + DS1307_REG_HOUR,
2293 bin2bcd(tmp));
2294 }
2295
2296 ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
2297 if (IS_ERR(ds1307->rtc))
2298 return PTR_ERR(ds1307->rtc);
2299
2300 if (want_irq || ds1307_can_wakeup_device)
2301 device_set_wakeup_capable(ds1307->dev, true);
2302 else
2303 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2304
2305 if (ds1307_can_wakeup_device && !want_irq) {
2306 dev_info(ds1307->dev,
2307 "'wakeup-source' is set, request for an IRQ is disabled!\n");
2308 /* We cannot support UIE mode if we do not have an IRQ line */
2309 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, ds1307->rtc->features);
2310 }
2311
2312 if (want_irq) {
2313 err = devm_request_threaded_irq(ds1307->dev, client->irq, NULL,
2314 chip->irq_handler ?: ds1307_irq,
2315 IRQF_SHARED | IRQF_ONESHOT,
2316 ds1307->name, ds1307);
2317 if (err) {
2318 client->irq = 0;
2319 device_set_wakeup_capable(ds1307->dev, false);
2320 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2321 dev_err(ds1307->dev, "unable to request IRQ!\n");
2322 } else {
2323 dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
2324 }
2325 }
2326
2327 switch (ds1307->type) {
2328 case rx_8901:
2329 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, ds1307->rtc->features);
2330 break;
2331 default:
> 2332 }
2333
2334 ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
2335 err = ds1307_add_frequency_test(ds1307);
2336 if (err)
2337 return err;
2338
2339 err = devm_rtc_register_device(ds1307->rtc);
2340 if (err)
2341 return err;
2342
2343 if (chip->nvram_size) {
2344 struct nvmem_config nvmem_cfg = {
2345 .name = "ds1307_nvram",
2346 .word_size = 1,
2347 .stride = 1,
2348 .size = chip->nvram_size,
2349 .reg_read = ds1307_nvram_read,
2350 .reg_write = ds1307_nvram_write,
2351 .priv = ds1307,
2352 };
2353
2354 devm_rtc_nvmem_register(ds1307->rtc, &nvmem_cfg);
2355 }
2356
2357 ds1307_hwmon_register(ds1307);
2358 ds1307_clks_register(ds1307);
2359 ds1307_wdt_register(ds1307);
2360
2361 return 0;
2362
2363 exit:
2364 return err;
2365 }
2366
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
2026-06-29 15:13 [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE Fredrik M Olsson
2026-06-29 20:15 ` kernel test robot
@ 2026-06-29 21:10 ` kernel test robot
2026-06-29 21:10 ` kernel test robot
2026-06-30 2:07 ` kernel test robot
3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2026-06-29 21:10 UTC (permalink / raw)
To: Fredrik M Olsson, Alexandre Belloni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nobuhiro Iwamatsu
Cc: llvm, oe-kbuild-all, linux-rtc, devicetree, linux-kernel, kernel,
Fredrik M Olsson
Hi Fredrik,
kernel test robot noticed the following build warnings:
[auto build test WARNING on dc59e4fea9d83f03bad6bddf3fa2e52491777482]
url: https://github.com/intel-lab-lkp/linux/commits/Fredrik-M-Olsson/rtc-ds1307-Add-driver-for-Epson-RX8901CE/20260629-232253
base: dc59e4fea9d83f03bad6bddf3fa2e52491777482
patch link: https://lore.kernel.org/r/20260629-ds1307-rx8901-add-v3-1-302dc3cbb71e%40axis.com
patch subject: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20260630/202606300521.DkMaPRKi-lkp@intel.com/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 6cc609bb250b21b47fc7d394b4019101e9983597)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260630/202606300521.DkMaPRKi-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202606300521.DkMaPRKi-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/rtc/rtc-ds1307.c:2332:2: warning: label at end of compound statement is a C23 extension [-Wc23-extensions]
2332 | }
| ^
1 warning generated.
vim +2332 drivers/rtc/rtc-ds1307.c
2066
2067 static int ds1307_probe(struct i2c_client *client)
2068 {
2069 const struct i2c_device_id *id = i2c_client_get_device_id(client);
2070 struct ds1307 *ds1307;
2071 const void *match;
2072 int err = -ENODEV;
2073 int tmp;
2074 const struct chip_desc *chip;
2075 bool want_irq;
2076 bool ds1307_can_wakeup_device = false;
2077 unsigned char regs[8];
2078 struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
2079 int trickle_charger_setup = 0;
2080
2081 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
2082 if (!ds1307)
2083 return -ENOMEM;
2084
2085 dev_set_drvdata(&client->dev, ds1307);
2086 ds1307->dev = &client->dev;
2087 ds1307->name = client->name;
2088
2089 ds1307->regmap = devm_regmap_init_i2c(client, ®map_config);
2090 if (IS_ERR(ds1307->regmap)) {
2091 dev_err(ds1307->dev, "regmap allocation failed\n");
2092 return PTR_ERR(ds1307->regmap);
2093 }
2094
2095 i2c_set_clientdata(client, ds1307);
2096
2097 match = device_get_match_data(&client->dev);
2098 if (match) {
2099 ds1307->type = (uintptr_t)match;
2100 chip = &chips[ds1307->type];
2101 } else if (id) {
2102 chip = &chips[id->driver_data];
2103 ds1307->type = id->driver_data;
2104 } else {
2105 return -ENODEV;
2106 }
2107
2108 want_irq = client->irq > 0 && chip->alarm;
2109
2110 if (!pdata)
2111 trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
2112 else if (pdata->trickle_charger_setup)
2113 trickle_charger_setup = pdata->trickle_charger_setup;
2114
2115 if (trickle_charger_setup < 0)
2116 return trickle_charger_setup;
2117
2118 if (trickle_charger_setup && chip->trickle_charger_reg) {
2119 dev_dbg(ds1307->dev,
2120 "writing trickle charger info 0x%x to 0x%x\n",
2121 trickle_charger_setup, chip->trickle_charger_reg);
2122 regmap_write(ds1307->regmap, chip->trickle_charger_reg,
2123 (u8)trickle_charger_setup);
2124 }
2125
2126 /*
2127 * For devices with no IRQ directly connected to the SoC, the RTC chip
2128 * can be forced as a wakeup source by stating that explicitly in
2129 * the device's .dts file using the "wakeup-source" boolean property.
2130 * If the "wakeup-source" property is set, don't request an IRQ.
2131 * This will guarantee the 'wakealarm' sysfs entry is available on the device,
2132 * if supported by the RTC.
2133 */
2134 if (chip->alarm && device_property_read_bool(&client->dev, "wakeup-source"))
2135 ds1307_can_wakeup_device = true;
2136
2137 switch (ds1307->type) {
2138 case ds_1337:
2139 case ds_1339:
2140 case ds_1341:
2141 case ds_3231:
2142 /* get registers that the "rtc" read below won't read... */
2143 err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
2144 regs, 2);
2145 if (err) {
2146 dev_dbg(ds1307->dev, "read error %d\n", err);
2147 goto exit;
2148 }
2149
2150 /* oscillator off? turn it on, so clock can tick. */
2151 if (regs[0] & DS1337_BIT_nEOSC)
2152 regs[0] &= ~DS1337_BIT_nEOSC;
2153
2154 /*
2155 * Using IRQ or defined as wakeup-source?
2156 * Disable the square wave and both alarms.
2157 * For some variants, be sure alarms can trigger when we're
2158 * running on Vbackup (BBSQI/BBSQW)
2159 */
2160 if (want_irq || ds1307_can_wakeup_device)
2161 regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
2162
2163 regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
2164 regs[0]);
2165
2166 /* oscillator fault? warn */
2167 if (regs[1] & DS1337_BIT_OSF) {
2168 dev_warn(ds1307->dev, "SET TIME!\n");
2169 }
2170 break;
2171
2172 case rx_8025:
2173 err = regmap_bulk_read(ds1307->regmap,
2174 RX8025_REG_CTRL1 << 4 | 0x08, regs, 2);
2175 if (err) {
2176 dev_dbg(ds1307->dev, "read error %d\n", err);
2177 goto exit;
2178 }
2179
2180 /* oscillator off? turn it on, so clock can tick. */
2181 if (!(regs[1] & RX8025_BIT_XST)) {
2182 regs[1] |= RX8025_BIT_XST;
2183 regmap_write(ds1307->regmap,
2184 RX8025_REG_CTRL2 << 4 | 0x08,
2185 regs[1]);
2186 dev_warn(ds1307->dev,
2187 "oscillator stop detected - SET TIME!\n");
2188 }
2189
2190 if (regs[1] & RX8025_BIT_PON) {
2191 regs[1] &= ~RX8025_BIT_PON;
2192 regmap_write(ds1307->regmap,
2193 RX8025_REG_CTRL2 << 4 | 0x08,
2194 regs[1]);
2195 dev_warn(ds1307->dev, "power-on detected\n");
2196 }
2197
2198 if (regs[1] & RX8025_BIT_VDET) {
2199 regs[1] &= ~RX8025_BIT_VDET;
2200 regmap_write(ds1307->regmap,
2201 RX8025_REG_CTRL2 << 4 | 0x08,
2202 regs[1]);
2203 dev_warn(ds1307->dev, "voltage drop detected\n");
2204 }
2205
2206 /* make sure we are running in 24hour mode */
2207 if (!(regs[0] & RX8025_BIT_2412)) {
2208 u8 hour;
2209
2210 /* switch to 24 hour mode */
2211 regmap_write(ds1307->regmap,
2212 RX8025_REG_CTRL1 << 4 | 0x08,
2213 regs[0] | RX8025_BIT_2412);
2214
2215 err = regmap_bulk_read(ds1307->regmap,
2216 RX8025_REG_CTRL1 << 4 | 0x08,
2217 regs, 2);
2218 if (err) {
2219 dev_dbg(ds1307->dev, "read error %d\n", err);
2220 goto exit;
2221 }
2222
2223 /* correct hour */
2224 hour = bcd2bin(regs[DS1307_REG_HOUR]);
2225 if (hour == 12)
2226 hour = 0;
2227 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2228 hour += 12;
2229
2230 regmap_write(ds1307->regmap,
2231 DS1307_REG_HOUR << 4 | 0x08, hour);
2232 }
2233 break;
2234 case ds_1388:
2235 err = regmap_read(ds1307->regmap, DS1388_REG_CONTROL, &tmp);
2236 if (err) {
2237 dev_dbg(ds1307->dev, "read error %d\n", err);
2238 goto exit;
2239 }
2240
2241 /* oscillator off? turn it on, so clock can tick. */
2242 if (tmp & DS1388_BIT_nEOSC) {
2243 tmp &= ~DS1388_BIT_nEOSC;
2244 regmap_write(ds1307->regmap, DS1388_REG_CONTROL, tmp);
2245 }
2246 break;
2247 default:
2248 break;
2249 }
2250
2251 /* read RTC registers */
2252 err = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
2253 sizeof(regs));
2254 if (err) {
2255 dev_dbg(ds1307->dev, "read error %d\n", err);
2256 goto exit;
2257 }
2258
2259 if (ds1307->type == mcp794xx &&
2260 !(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
2261 regmap_write(ds1307->regmap, DS1307_REG_WDAY,
2262 regs[DS1307_REG_WDAY] |
2263 MCP794XX_BIT_VBATEN);
2264 }
2265
2266 tmp = regs[DS1307_REG_HOUR];
2267 switch (ds1307->type) {
2268 case ds_1340:
2269 case m41t0:
2270 case m41t00:
2271 case m41t11:
2272 /*
2273 * NOTE: ignores century bits; fix before deploying
2274 * systems that will run through year 2100.
2275 */
2276 break;
2277 case rx_8025:
2278 break;
2279 default:
2280 if (!(tmp & DS1307_BIT_12HR))
2281 break;
2282
2283 /*
2284 * Be sure we're in 24 hour mode. Multi-master systems
2285 * take note...
2286 */
2287 tmp = bcd2bin(tmp & 0x1f);
2288 if (tmp == 12)
2289 tmp = 0;
2290 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2291 tmp += 12;
2292 regmap_write(ds1307->regmap, chip->offset + DS1307_REG_HOUR,
2293 bin2bcd(tmp));
2294 }
2295
2296 ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
2297 if (IS_ERR(ds1307->rtc))
2298 return PTR_ERR(ds1307->rtc);
2299
2300 if (want_irq || ds1307_can_wakeup_device)
2301 device_set_wakeup_capable(ds1307->dev, true);
2302 else
2303 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2304
2305 if (ds1307_can_wakeup_device && !want_irq) {
2306 dev_info(ds1307->dev,
2307 "'wakeup-source' is set, request for an IRQ is disabled!\n");
2308 /* We cannot support UIE mode if we do not have an IRQ line */
2309 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, ds1307->rtc->features);
2310 }
2311
2312 if (want_irq) {
2313 err = devm_request_threaded_irq(ds1307->dev, client->irq, NULL,
2314 chip->irq_handler ?: ds1307_irq,
2315 IRQF_SHARED | IRQF_ONESHOT,
2316 ds1307->name, ds1307);
2317 if (err) {
2318 client->irq = 0;
2319 device_set_wakeup_capable(ds1307->dev, false);
2320 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2321 dev_err(ds1307->dev, "unable to request IRQ!\n");
2322 } else {
2323 dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
2324 }
2325 }
2326
2327 switch (ds1307->type) {
2328 case rx_8901:
2329 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, ds1307->rtc->features);
2330 break;
2331 default:
> 2332 }
2333
2334 ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
2335 err = ds1307_add_frequency_test(ds1307);
2336 if (err)
2337 return err;
2338
2339 err = devm_rtc_register_device(ds1307->rtc);
2340 if (err)
2341 return err;
2342
2343 if (chip->nvram_size) {
2344 struct nvmem_config nvmem_cfg = {
2345 .name = "ds1307_nvram",
2346 .word_size = 1,
2347 .stride = 1,
2348 .size = chip->nvram_size,
2349 .reg_read = ds1307_nvram_read,
2350 .reg_write = ds1307_nvram_write,
2351 .priv = ds1307,
2352 };
2353
2354 devm_rtc_nvmem_register(ds1307->rtc, &nvmem_cfg);
2355 }
2356
2357 ds1307_hwmon_register(ds1307);
2358 ds1307_clks_register(ds1307);
2359 ds1307_wdt_register(ds1307);
2360
2361 return 0;
2362
2363 exit:
2364 return err;
2365 }
2366
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
2026-06-29 15:13 [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE Fredrik M Olsson
2026-06-29 20:15 ` kernel test robot
2026-06-29 21:10 ` kernel test robot
@ 2026-06-29 21:10 ` kernel test robot
2026-06-30 2:07 ` kernel test robot
3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2026-06-29 21:10 UTC (permalink / raw)
To: Fredrik M Olsson, Alexandre Belloni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nobuhiro Iwamatsu
Cc: oe-kbuild-all, linux-rtc, devicetree, linux-kernel, kernel,
Fredrik M Olsson
Hi Fredrik,
kernel test robot noticed the following build errors:
[auto build test ERROR on dc59e4fea9d83f03bad6bddf3fa2e52491777482]
url: https://github.com/intel-lab-lkp/linux/commits/Fredrik-M-Olsson/rtc-ds1307-Add-driver-for-Epson-RX8901CE/20260629-232253
base: dc59e4fea9d83f03bad6bddf3fa2e52491777482
patch link: https://lore.kernel.org/r/20260629-ds1307-rx8901-add-v3-1-302dc3cbb71e%40axis.com
patch subject: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
config: sparc64-randconfig-002-20260630 (https://download.01.org/0day-ci/archive/20260630/202606300522.9EnurYvY-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260630/202606300522.9EnurYvY-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202606300522.9EnurYvY-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/rtc/rtc-ds1307.c: In function 'ds1307_probe':
>> drivers/rtc/rtc-ds1307.c:2331:2: error: label at end of compound statement
default:
^~~~~~~
vim +2331 drivers/rtc/rtc-ds1307.c
2066
2067 static int ds1307_probe(struct i2c_client *client)
2068 {
2069 const struct i2c_device_id *id = i2c_client_get_device_id(client);
2070 struct ds1307 *ds1307;
2071 const void *match;
2072 int err = -ENODEV;
2073 int tmp;
2074 const struct chip_desc *chip;
2075 bool want_irq;
2076 bool ds1307_can_wakeup_device = false;
2077 unsigned char regs[8];
2078 struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
2079 int trickle_charger_setup = 0;
2080
2081 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
2082 if (!ds1307)
2083 return -ENOMEM;
2084
2085 dev_set_drvdata(&client->dev, ds1307);
2086 ds1307->dev = &client->dev;
2087 ds1307->name = client->name;
2088
2089 ds1307->regmap = devm_regmap_init_i2c(client, ®map_config);
2090 if (IS_ERR(ds1307->regmap)) {
2091 dev_err(ds1307->dev, "regmap allocation failed\n");
2092 return PTR_ERR(ds1307->regmap);
2093 }
2094
2095 i2c_set_clientdata(client, ds1307);
2096
2097 match = device_get_match_data(&client->dev);
2098 if (match) {
2099 ds1307->type = (uintptr_t)match;
2100 chip = &chips[ds1307->type];
2101 } else if (id) {
2102 chip = &chips[id->driver_data];
2103 ds1307->type = id->driver_data;
2104 } else {
2105 return -ENODEV;
2106 }
2107
2108 want_irq = client->irq > 0 && chip->alarm;
2109
2110 if (!pdata)
2111 trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
2112 else if (pdata->trickle_charger_setup)
2113 trickle_charger_setup = pdata->trickle_charger_setup;
2114
2115 if (trickle_charger_setup < 0)
2116 return trickle_charger_setup;
2117
2118 if (trickle_charger_setup && chip->trickle_charger_reg) {
2119 dev_dbg(ds1307->dev,
2120 "writing trickle charger info 0x%x to 0x%x\n",
2121 trickle_charger_setup, chip->trickle_charger_reg);
2122 regmap_write(ds1307->regmap, chip->trickle_charger_reg,
2123 (u8)trickle_charger_setup);
2124 }
2125
2126 /*
2127 * For devices with no IRQ directly connected to the SoC, the RTC chip
2128 * can be forced as a wakeup source by stating that explicitly in
2129 * the device's .dts file using the "wakeup-source" boolean property.
2130 * If the "wakeup-source" property is set, don't request an IRQ.
2131 * This will guarantee the 'wakealarm' sysfs entry is available on the device,
2132 * if supported by the RTC.
2133 */
2134 if (chip->alarm && device_property_read_bool(&client->dev, "wakeup-source"))
2135 ds1307_can_wakeup_device = true;
2136
2137 switch (ds1307->type) {
2138 case ds_1337:
2139 case ds_1339:
2140 case ds_1341:
2141 case ds_3231:
2142 /* get registers that the "rtc" read below won't read... */
2143 err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
2144 regs, 2);
2145 if (err) {
2146 dev_dbg(ds1307->dev, "read error %d\n", err);
2147 goto exit;
2148 }
2149
2150 /* oscillator off? turn it on, so clock can tick. */
2151 if (regs[0] & DS1337_BIT_nEOSC)
2152 regs[0] &= ~DS1337_BIT_nEOSC;
2153
2154 /*
2155 * Using IRQ or defined as wakeup-source?
2156 * Disable the square wave and both alarms.
2157 * For some variants, be sure alarms can trigger when we're
2158 * running on Vbackup (BBSQI/BBSQW)
2159 */
2160 if (want_irq || ds1307_can_wakeup_device)
2161 regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
2162
2163 regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
2164 regs[0]);
2165
2166 /* oscillator fault? warn */
2167 if (regs[1] & DS1337_BIT_OSF) {
2168 dev_warn(ds1307->dev, "SET TIME!\n");
2169 }
2170 break;
2171
2172 case rx_8025:
2173 err = regmap_bulk_read(ds1307->regmap,
2174 RX8025_REG_CTRL1 << 4 | 0x08, regs, 2);
2175 if (err) {
2176 dev_dbg(ds1307->dev, "read error %d\n", err);
2177 goto exit;
2178 }
2179
2180 /* oscillator off? turn it on, so clock can tick. */
2181 if (!(regs[1] & RX8025_BIT_XST)) {
2182 regs[1] |= RX8025_BIT_XST;
2183 regmap_write(ds1307->regmap,
2184 RX8025_REG_CTRL2 << 4 | 0x08,
2185 regs[1]);
2186 dev_warn(ds1307->dev,
2187 "oscillator stop detected - SET TIME!\n");
2188 }
2189
2190 if (regs[1] & RX8025_BIT_PON) {
2191 regs[1] &= ~RX8025_BIT_PON;
2192 regmap_write(ds1307->regmap,
2193 RX8025_REG_CTRL2 << 4 | 0x08,
2194 regs[1]);
2195 dev_warn(ds1307->dev, "power-on detected\n");
2196 }
2197
2198 if (regs[1] & RX8025_BIT_VDET) {
2199 regs[1] &= ~RX8025_BIT_VDET;
2200 regmap_write(ds1307->regmap,
2201 RX8025_REG_CTRL2 << 4 | 0x08,
2202 regs[1]);
2203 dev_warn(ds1307->dev, "voltage drop detected\n");
2204 }
2205
2206 /* make sure we are running in 24hour mode */
2207 if (!(regs[0] & RX8025_BIT_2412)) {
2208 u8 hour;
2209
2210 /* switch to 24 hour mode */
2211 regmap_write(ds1307->regmap,
2212 RX8025_REG_CTRL1 << 4 | 0x08,
2213 regs[0] | RX8025_BIT_2412);
2214
2215 err = regmap_bulk_read(ds1307->regmap,
2216 RX8025_REG_CTRL1 << 4 | 0x08,
2217 regs, 2);
2218 if (err) {
2219 dev_dbg(ds1307->dev, "read error %d\n", err);
2220 goto exit;
2221 }
2222
2223 /* correct hour */
2224 hour = bcd2bin(regs[DS1307_REG_HOUR]);
2225 if (hour == 12)
2226 hour = 0;
2227 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2228 hour += 12;
2229
2230 regmap_write(ds1307->regmap,
2231 DS1307_REG_HOUR << 4 | 0x08, hour);
2232 }
2233 break;
2234 case ds_1388:
2235 err = regmap_read(ds1307->regmap, DS1388_REG_CONTROL, &tmp);
2236 if (err) {
2237 dev_dbg(ds1307->dev, "read error %d\n", err);
2238 goto exit;
2239 }
2240
2241 /* oscillator off? turn it on, so clock can tick. */
2242 if (tmp & DS1388_BIT_nEOSC) {
2243 tmp &= ~DS1388_BIT_nEOSC;
2244 regmap_write(ds1307->regmap, DS1388_REG_CONTROL, tmp);
2245 }
2246 break;
2247 default:
2248 break;
2249 }
2250
2251 /* read RTC registers */
2252 err = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
2253 sizeof(regs));
2254 if (err) {
2255 dev_dbg(ds1307->dev, "read error %d\n", err);
2256 goto exit;
2257 }
2258
2259 if (ds1307->type == mcp794xx &&
2260 !(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
2261 regmap_write(ds1307->regmap, DS1307_REG_WDAY,
2262 regs[DS1307_REG_WDAY] |
2263 MCP794XX_BIT_VBATEN);
2264 }
2265
2266 tmp = regs[DS1307_REG_HOUR];
2267 switch (ds1307->type) {
2268 case ds_1340:
2269 case m41t0:
2270 case m41t00:
2271 case m41t11:
2272 /*
2273 * NOTE: ignores century bits; fix before deploying
2274 * systems that will run through year 2100.
2275 */
2276 break;
2277 case rx_8025:
2278 break;
2279 default:
2280 if (!(tmp & DS1307_BIT_12HR))
2281 break;
2282
2283 /*
2284 * Be sure we're in 24 hour mode. Multi-master systems
2285 * take note...
2286 */
2287 tmp = bcd2bin(tmp & 0x1f);
2288 if (tmp == 12)
2289 tmp = 0;
2290 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2291 tmp += 12;
2292 regmap_write(ds1307->regmap, chip->offset + DS1307_REG_HOUR,
2293 bin2bcd(tmp));
2294 }
2295
2296 ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
2297 if (IS_ERR(ds1307->rtc))
2298 return PTR_ERR(ds1307->rtc);
2299
2300 if (want_irq || ds1307_can_wakeup_device)
2301 device_set_wakeup_capable(ds1307->dev, true);
2302 else
2303 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2304
2305 if (ds1307_can_wakeup_device && !want_irq) {
2306 dev_info(ds1307->dev,
2307 "'wakeup-source' is set, request for an IRQ is disabled!\n");
2308 /* We cannot support UIE mode if we do not have an IRQ line */
2309 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, ds1307->rtc->features);
2310 }
2311
2312 if (want_irq) {
2313 err = devm_request_threaded_irq(ds1307->dev, client->irq, NULL,
2314 chip->irq_handler ?: ds1307_irq,
2315 IRQF_SHARED | IRQF_ONESHOT,
2316 ds1307->name, ds1307);
2317 if (err) {
2318 client->irq = 0;
2319 device_set_wakeup_capable(ds1307->dev, false);
2320 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2321 dev_err(ds1307->dev, "unable to request IRQ!\n");
2322 } else {
2323 dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
2324 }
2325 }
2326
2327 switch (ds1307->type) {
2328 case rx_8901:
2329 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, ds1307->rtc->features);
2330 break;
> 2331 default:
2332 }
2333
2334 ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
2335 err = ds1307_add_frequency_test(ds1307);
2336 if (err)
2337 return err;
2338
2339 err = devm_rtc_register_device(ds1307->rtc);
2340 if (err)
2341 return err;
2342
2343 if (chip->nvram_size) {
2344 struct nvmem_config nvmem_cfg = {
2345 .name = "ds1307_nvram",
2346 .word_size = 1,
2347 .stride = 1,
2348 .size = chip->nvram_size,
2349 .reg_read = ds1307_nvram_read,
2350 .reg_write = ds1307_nvram_write,
2351 .priv = ds1307,
2352 };
2353
2354 devm_rtc_nvmem_register(ds1307->rtc, &nvmem_cfg);
2355 }
2356
2357 ds1307_hwmon_register(ds1307);
2358 ds1307_clks_register(ds1307);
2359 ds1307_wdt_register(ds1307);
2360
2361 return 0;
2362
2363 exit:
2364 return err;
2365 }
2366
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
2026-06-29 15:13 [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE Fredrik M Olsson
` (2 preceding siblings ...)
2026-06-29 21:10 ` kernel test robot
@ 2026-06-30 2:07 ` kernel test robot
3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2026-06-30 2:07 UTC (permalink / raw)
To: Fredrik M Olsson, Alexandre Belloni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nobuhiro Iwamatsu
Cc: oe-kbuild-all, linux-rtc, devicetree, linux-kernel, kernel,
Fredrik M Olsson
Hi Fredrik,
kernel test robot noticed the following build warnings:
[auto build test WARNING on dc59e4fea9d83f03bad6bddf3fa2e52491777482]
url: https://github.com/intel-lab-lkp/linux/commits/Fredrik-M-Olsson/rtc-ds1307-Add-driver-for-Epson-RX8901CE/20260629-232253
base: dc59e4fea9d83f03bad6bddf3fa2e52491777482
patch link: https://lore.kernel.org/r/20260629-ds1307-rx8901-add-v3-1-302dc3cbb71e%40axis.com
patch subject: [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE
config: loongarch-randconfig-r132-20260630 (https://download.01.org/0day-ci/archive/20260630/202606301024.GdcSNC79-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 16.1.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260630/202606301024.GdcSNC79-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202606301024.GdcSNC79-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> drivers/rtc/rtc-ds1307.c:2332:9: sparse: sparse: statement expected after case label
vim +2332 drivers/rtc/rtc-ds1307.c
2066
2067 static int ds1307_probe(struct i2c_client *client)
2068 {
2069 const struct i2c_device_id *id = i2c_client_get_device_id(client);
2070 struct ds1307 *ds1307;
2071 const void *match;
2072 int err = -ENODEV;
2073 int tmp;
2074 const struct chip_desc *chip;
2075 bool want_irq;
2076 bool ds1307_can_wakeup_device = false;
2077 unsigned char regs[8];
2078 struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
2079 int trickle_charger_setup = 0;
2080
2081 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
2082 if (!ds1307)
2083 return -ENOMEM;
2084
2085 dev_set_drvdata(&client->dev, ds1307);
2086 ds1307->dev = &client->dev;
2087 ds1307->name = client->name;
2088
2089 ds1307->regmap = devm_regmap_init_i2c(client, ®map_config);
2090 if (IS_ERR(ds1307->regmap)) {
2091 dev_err(ds1307->dev, "regmap allocation failed\n");
2092 return PTR_ERR(ds1307->regmap);
2093 }
2094
2095 i2c_set_clientdata(client, ds1307);
2096
2097 match = device_get_match_data(&client->dev);
2098 if (match) {
2099 ds1307->type = (uintptr_t)match;
2100 chip = &chips[ds1307->type];
2101 } else if (id) {
2102 chip = &chips[id->driver_data];
2103 ds1307->type = id->driver_data;
2104 } else {
2105 return -ENODEV;
2106 }
2107
2108 want_irq = client->irq > 0 && chip->alarm;
2109
2110 if (!pdata)
2111 trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
2112 else if (pdata->trickle_charger_setup)
2113 trickle_charger_setup = pdata->trickle_charger_setup;
2114
2115 if (trickle_charger_setup < 0)
2116 return trickle_charger_setup;
2117
2118 if (trickle_charger_setup && chip->trickle_charger_reg) {
2119 dev_dbg(ds1307->dev,
2120 "writing trickle charger info 0x%x to 0x%x\n",
2121 trickle_charger_setup, chip->trickle_charger_reg);
2122 regmap_write(ds1307->regmap, chip->trickle_charger_reg,
2123 (u8)trickle_charger_setup);
2124 }
2125
2126 /*
2127 * For devices with no IRQ directly connected to the SoC, the RTC chip
2128 * can be forced as a wakeup source by stating that explicitly in
2129 * the device's .dts file using the "wakeup-source" boolean property.
2130 * If the "wakeup-source" property is set, don't request an IRQ.
2131 * This will guarantee the 'wakealarm' sysfs entry is available on the device,
2132 * if supported by the RTC.
2133 */
2134 if (chip->alarm && device_property_read_bool(&client->dev, "wakeup-source"))
2135 ds1307_can_wakeup_device = true;
2136
2137 switch (ds1307->type) {
2138 case ds_1337:
2139 case ds_1339:
2140 case ds_1341:
2141 case ds_3231:
2142 /* get registers that the "rtc" read below won't read... */
2143 err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
2144 regs, 2);
2145 if (err) {
2146 dev_dbg(ds1307->dev, "read error %d\n", err);
2147 goto exit;
2148 }
2149
2150 /* oscillator off? turn it on, so clock can tick. */
2151 if (regs[0] & DS1337_BIT_nEOSC)
2152 regs[0] &= ~DS1337_BIT_nEOSC;
2153
2154 /*
2155 * Using IRQ or defined as wakeup-source?
2156 * Disable the square wave and both alarms.
2157 * For some variants, be sure alarms can trigger when we're
2158 * running on Vbackup (BBSQI/BBSQW)
2159 */
2160 if (want_irq || ds1307_can_wakeup_device)
2161 regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
2162
2163 regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
2164 regs[0]);
2165
2166 /* oscillator fault? warn */
2167 if (regs[1] & DS1337_BIT_OSF) {
2168 dev_warn(ds1307->dev, "SET TIME!\n");
2169 }
2170 break;
2171
2172 case rx_8025:
2173 err = regmap_bulk_read(ds1307->regmap,
2174 RX8025_REG_CTRL1 << 4 | 0x08, regs, 2);
2175 if (err) {
2176 dev_dbg(ds1307->dev, "read error %d\n", err);
2177 goto exit;
2178 }
2179
2180 /* oscillator off? turn it on, so clock can tick. */
2181 if (!(regs[1] & RX8025_BIT_XST)) {
2182 regs[1] |= RX8025_BIT_XST;
2183 regmap_write(ds1307->regmap,
2184 RX8025_REG_CTRL2 << 4 | 0x08,
2185 regs[1]);
2186 dev_warn(ds1307->dev,
2187 "oscillator stop detected - SET TIME!\n");
2188 }
2189
2190 if (regs[1] & RX8025_BIT_PON) {
2191 regs[1] &= ~RX8025_BIT_PON;
2192 regmap_write(ds1307->regmap,
2193 RX8025_REG_CTRL2 << 4 | 0x08,
2194 regs[1]);
2195 dev_warn(ds1307->dev, "power-on detected\n");
2196 }
2197
2198 if (regs[1] & RX8025_BIT_VDET) {
2199 regs[1] &= ~RX8025_BIT_VDET;
2200 regmap_write(ds1307->regmap,
2201 RX8025_REG_CTRL2 << 4 | 0x08,
2202 regs[1]);
2203 dev_warn(ds1307->dev, "voltage drop detected\n");
2204 }
2205
2206 /* make sure we are running in 24hour mode */
2207 if (!(regs[0] & RX8025_BIT_2412)) {
2208 u8 hour;
2209
2210 /* switch to 24 hour mode */
2211 regmap_write(ds1307->regmap,
2212 RX8025_REG_CTRL1 << 4 | 0x08,
2213 regs[0] | RX8025_BIT_2412);
2214
2215 err = regmap_bulk_read(ds1307->regmap,
2216 RX8025_REG_CTRL1 << 4 | 0x08,
2217 regs, 2);
2218 if (err) {
2219 dev_dbg(ds1307->dev, "read error %d\n", err);
2220 goto exit;
2221 }
2222
2223 /* correct hour */
2224 hour = bcd2bin(regs[DS1307_REG_HOUR]);
2225 if (hour == 12)
2226 hour = 0;
2227 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2228 hour += 12;
2229
2230 regmap_write(ds1307->regmap,
2231 DS1307_REG_HOUR << 4 | 0x08, hour);
2232 }
2233 break;
2234 case ds_1388:
2235 err = regmap_read(ds1307->regmap, DS1388_REG_CONTROL, &tmp);
2236 if (err) {
2237 dev_dbg(ds1307->dev, "read error %d\n", err);
2238 goto exit;
2239 }
2240
2241 /* oscillator off? turn it on, so clock can tick. */
2242 if (tmp & DS1388_BIT_nEOSC) {
2243 tmp &= ~DS1388_BIT_nEOSC;
2244 regmap_write(ds1307->regmap, DS1388_REG_CONTROL, tmp);
2245 }
2246 break;
2247 default:
2248 break;
2249 }
2250
2251 /* read RTC registers */
2252 err = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
2253 sizeof(regs));
2254 if (err) {
2255 dev_dbg(ds1307->dev, "read error %d\n", err);
2256 goto exit;
2257 }
2258
2259 if (ds1307->type == mcp794xx &&
2260 !(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
2261 regmap_write(ds1307->regmap, DS1307_REG_WDAY,
2262 regs[DS1307_REG_WDAY] |
2263 MCP794XX_BIT_VBATEN);
2264 }
2265
2266 tmp = regs[DS1307_REG_HOUR];
2267 switch (ds1307->type) {
2268 case ds_1340:
2269 case m41t0:
2270 case m41t00:
2271 case m41t11:
2272 /*
2273 * NOTE: ignores century bits; fix before deploying
2274 * systems that will run through year 2100.
2275 */
2276 break;
2277 case rx_8025:
2278 break;
2279 default:
2280 if (!(tmp & DS1307_BIT_12HR))
2281 break;
2282
2283 /*
2284 * Be sure we're in 24 hour mode. Multi-master systems
2285 * take note...
2286 */
2287 tmp = bcd2bin(tmp & 0x1f);
2288 if (tmp == 12)
2289 tmp = 0;
2290 if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
2291 tmp += 12;
2292 regmap_write(ds1307->regmap, chip->offset + DS1307_REG_HOUR,
2293 bin2bcd(tmp));
2294 }
2295
2296 ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
2297 if (IS_ERR(ds1307->rtc))
2298 return PTR_ERR(ds1307->rtc);
2299
2300 if (want_irq || ds1307_can_wakeup_device)
2301 device_set_wakeup_capable(ds1307->dev, true);
2302 else
2303 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2304
2305 if (ds1307_can_wakeup_device && !want_irq) {
2306 dev_info(ds1307->dev,
2307 "'wakeup-source' is set, request for an IRQ is disabled!\n");
2308 /* We cannot support UIE mode if we do not have an IRQ line */
2309 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, ds1307->rtc->features);
2310 }
2311
2312 if (want_irq) {
2313 err = devm_request_threaded_irq(ds1307->dev, client->irq, NULL,
2314 chip->irq_handler ?: ds1307_irq,
2315 IRQF_SHARED | IRQF_ONESHOT,
2316 ds1307->name, ds1307);
2317 if (err) {
2318 client->irq = 0;
2319 device_set_wakeup_capable(ds1307->dev, false);
2320 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
2321 dev_err(ds1307->dev, "unable to request IRQ!\n");
2322 } else {
2323 dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
2324 }
2325 }
2326
2327 switch (ds1307->type) {
2328 case rx_8901:
2329 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, ds1307->rtc->features);
2330 break;
2331 default:
> 2332 }
2333
2334 ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
2335 err = ds1307_add_frequency_test(ds1307);
2336 if (err)
2337 return err;
2338
2339 err = devm_rtc_register_device(ds1307->rtc);
2340 if (err)
2341 return err;
2342
2343 if (chip->nvram_size) {
2344 struct nvmem_config nvmem_cfg = {
2345 .name = "ds1307_nvram",
2346 .word_size = 1,
2347 .stride = 1,
2348 .size = chip->nvram_size,
2349 .reg_read = ds1307_nvram_read,
2350 .reg_write = ds1307_nvram_write,
2351 .priv = ds1307,
2352 };
2353
2354 devm_rtc_nvmem_register(ds1307->rtc, &nvmem_cfg);
2355 }
2356
2357 ds1307_hwmon_register(ds1307);
2358 ds1307_clks_register(ds1307);
2359 ds1307_wdt_register(ds1307);
2360
2361 return 0;
2362
2363 exit:
2364 return err;
2365 }
2366
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-06-30 2:07 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-29 15:13 [PATCH v3] rtc: ds1307: Add driver for Epson RX8901CE Fredrik M Olsson
2026-06-29 20:15 ` kernel test robot
2026-06-29 21:10 ` kernel test robot
2026-06-29 21:10 ` kernel test robot
2026-06-30 2:07 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox