* [PATCH] rtc: rv3028: configure backup switch mode from device tree
@ 2026-08-22 9:29 Dhaval Shiroya
2026-08-22 13:09 ` Alexandre Belloni
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Dhaval Shiroya @ 2026-08-22 9:29 UTC (permalink / raw)
To: alexandre.belloni; +Cc: Dhaval Shiroya, linux-rtc, linux-kernel
Enable and set the backup switch mode directly from the device tree at
probe, instead of requiring a userspace RTC_PARAM_BACKUP_SWITCH_MODE
ioctl on every unit.
Signed-off-by: Dhaval Shiroya <dhaval.shiroya@siliconsignals.io>
diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
index d96f6bb68850..5dde1aed76dd 100644
--- a/drivers/rtc/rtc-rv3028.c
+++ b/drivers/rtc/rtc-rv3028.c
@@ -80,6 +80,7 @@
#define RV3028_EEBUSY_TIMEOUT 100000
#define RV3028_BACKUP_TCE BIT(5)
+#define RV3028_BACKUP_FEDE BIT(4)
#define RV3028_BACKUP_TCR_MASK GENMASK(1,0)
#define RV3028_BACKUP_BSM GENMASK(3,2)
@@ -519,70 +520,6 @@ static int rv3028_set_offset(struct device *dev, long offset)
}
-static int rv3028_param_get(struct device *dev, struct rtc_param *param)
-{
- struct rv3028_data *rv3028 = dev_get_drvdata(dev);
- int ret;
- u32 value;
-
- switch(param->param) {
- case RTC_PARAM_BACKUP_SWITCH_MODE:
- ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
- if (ret < 0)
- return ret;
-
- value = FIELD_GET(RV3028_BACKUP_BSM, value);
-
- switch(value) {
- case RV3028_BACKUP_BSM_DSM:
- param->uvalue = RTC_BSM_DIRECT;
- break;
- case RV3028_BACKUP_BSM_LSM:
- param->uvalue = RTC_BSM_LEVEL;
- break;
- default:
- param->uvalue = RTC_BSM_DISABLED;
- }
- break;
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int rv3028_param_set(struct device *dev, struct rtc_param *param)
-{
- struct rv3028_data *rv3028 = dev_get_drvdata(dev);
- u8 mode;
-
- switch(param->param) {
- case RTC_PARAM_BACKUP_SWITCH_MODE:
- switch (param->uvalue) {
- case RTC_BSM_DISABLED:
- mode = 0;
- break;
- case RTC_BSM_DIRECT:
- mode = RV3028_BACKUP_BSM_DSM;
- break;
- case RTC_BSM_LEVEL:
- mode = RV3028_BACKUP_BSM_LSM;
- break;
- default:
- return -EINVAL;
- }
-
- return rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_BSM,
- FIELD_PREP(RV3028_BACKUP_BSM, mode));
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
static int rv3028_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
{
struct rv3028_data *rv3028 = dev_get_drvdata(dev);
@@ -852,8 +789,6 @@ static const struct rtc_class_ops rv3028_rtc_ops = {
.read_offset = rv3028_read_offset,
.set_offset = rv3028_set_offset,
.ioctl = rv3028_ioctl,
- .param_get = rv3028_param_get,
- .param_set = rv3028_param_set,
};
static const struct regmap_config regmap_config = {
@@ -920,6 +855,65 @@ static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
return ret;
}
+/*
+ * Configure backup switchover mode from device tree.
+ * 0 = disabled
+ * 1 = DSM (Direct Switching Mode) - switch when VDD < VBACKUP
+ * 3 = LSM (Level Switching Mode) - switch when VDD < 2.0V
+ */
+static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
+ struct i2c_client *client)
+{
+ u32 val_old, bsm_dt, bsm_bits;
+ int ret;
+
+ if (device_property_read_u32(&client->dev, "backup-switch-mode",
+ &bsm_dt))
+ return 0;
+
+ /* Validate and convert DT value to register bits */
+ switch (bsm_dt) {
+ case 0:
+ bsm_bits = 0;
+ break;
+ case 1:
+ bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
+ break;
+ case 3:
+ bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
+ break;
+ default:
+ dev_warn(&client->dev,
+ "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
+ bsm_dt);
+ return 0;
+ }
+
+ /* Read current BACKUP register */
+ ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
+ if (ret < 0)
+ return ret;
+
+ /* Check if BSM and FEDE already match desired values */
+ if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
+ (bsm_bits | RV3028_BACKUP_FEDE)) {
+ dev_dbg(&client->dev,
+ "backup switch mode already set to %u\n", bsm_dt);
+ return 0;
+ }
+
+ dev_info(&client->dev,
+ "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
+ bsm_dt, val_old,
+ (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
+ bsm_bits | RV3028_BACKUP_FEDE);
+
+ /* Set BSM and always enable FEDE as recommended by datasheet */
+ return rv3028_update_cfg(rv3028, RV3028_BACKUP,
+ RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
+ bsm_bits | RV3028_BACKUP_FEDE);
+}
+
static int rv3028_probe(struct i2c_client *client)
{
struct rv3028_data *rv3028;
@@ -1005,11 +999,14 @@ static int rv3028_probe(struct i2c_client *client)
if (ret)
return ret;
- ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
+ /* Configure backup switchover mode from device tree */
+ ret = rv3028_set_bsm_from_dt(rv3028, client);
if (ret)
return ret;
- set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
+ ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
+ if (ret)
+ return ret;
rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
2026-08-22 9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
@ 2026-08-22 13:09 ` Alexandre Belloni
2026-08-24 23:05 ` kernel test robot
2026-08-25 1:34 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: Alexandre Belloni @ 2026-08-22 13:09 UTC (permalink / raw)
To: Dhaval Shiroya; +Cc: linux-rtc, linux-kernel
On 22/08/2026 14:59:11+0530, Dhaval Shiroya wrote:
> Enable and set the backup switch mode directly from the device tree at
> probe, instead of requiring a userspace RTC_PARAM_BACKUP_SWITCH_MODE
> ioctl on every unit.
>
No, just use the ioctl.
> Signed-off-by: Dhaval Shiroya <dhaval.shiroya@siliconsignals.io>
>
> diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
> index d96f6bb68850..5dde1aed76dd 100644
> --- a/drivers/rtc/rtc-rv3028.c
> +++ b/drivers/rtc/rtc-rv3028.c
> @@ -80,6 +80,7 @@
> #define RV3028_EEBUSY_TIMEOUT 100000
>
> #define RV3028_BACKUP_TCE BIT(5)
> +#define RV3028_BACKUP_FEDE BIT(4)
> #define RV3028_BACKUP_TCR_MASK GENMASK(1,0)
> #define RV3028_BACKUP_BSM GENMASK(3,2)
>
> @@ -519,70 +520,6 @@ static int rv3028_set_offset(struct device *dev, long offset)
>
> }
>
> -static int rv3028_param_get(struct device *dev, struct rtc_param *param)
> -{
> - struct rv3028_data *rv3028 = dev_get_drvdata(dev);
> - int ret;
> - u32 value;
> -
> - switch(param->param) {
> - case RTC_PARAM_BACKUP_SWITCH_MODE:
> - ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
> - if (ret < 0)
> - return ret;
> -
> - value = FIELD_GET(RV3028_BACKUP_BSM, value);
> -
> - switch(value) {
> - case RV3028_BACKUP_BSM_DSM:
> - param->uvalue = RTC_BSM_DIRECT;
> - break;
> - case RV3028_BACKUP_BSM_LSM:
> - param->uvalue = RTC_BSM_LEVEL;
> - break;
> - default:
> - param->uvalue = RTC_BSM_DISABLED;
> - }
> - break;
> -
> - default:
> - return -EINVAL;
> - }
> -
> - return 0;
> -}
> -
> -static int rv3028_param_set(struct device *dev, struct rtc_param *param)
> -{
> - struct rv3028_data *rv3028 = dev_get_drvdata(dev);
> - u8 mode;
> -
> - switch(param->param) {
> - case RTC_PARAM_BACKUP_SWITCH_MODE:
> - switch (param->uvalue) {
> - case RTC_BSM_DISABLED:
> - mode = 0;
> - break;
> - case RTC_BSM_DIRECT:
> - mode = RV3028_BACKUP_BSM_DSM;
> - break;
> - case RTC_BSM_LEVEL:
> - mode = RV3028_BACKUP_BSM_LSM;
> - break;
> - default:
> - return -EINVAL;
> - }
> -
> - return rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_BSM,
> - FIELD_PREP(RV3028_BACKUP_BSM, mode));
> -
> - default:
> - return -EINVAL;
> - }
> -
> - return 0;
> -}
> -
> static int rv3028_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
> {
> struct rv3028_data *rv3028 = dev_get_drvdata(dev);
> @@ -852,8 +789,6 @@ static const struct rtc_class_ops rv3028_rtc_ops = {
> .read_offset = rv3028_read_offset,
> .set_offset = rv3028_set_offset,
> .ioctl = rv3028_ioctl,
> - .param_get = rv3028_param_get,
> - .param_set = rv3028_param_set,
> };
>
> static const struct regmap_config regmap_config = {
> @@ -920,6 +855,65 @@ static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
> return ret;
> }
>
> +/*
> + * Configure backup switchover mode from device tree.
> + * 0 = disabled
> + * 1 = DSM (Direct Switching Mode) - switch when VDD < VBACKUP
> + * 3 = LSM (Level Switching Mode) - switch when VDD < 2.0V
> + */
> +static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
> + struct i2c_client *client)
> +{
> + u32 val_old, bsm_dt, bsm_bits;
> + int ret;
> +
> + if (device_property_read_u32(&client->dev, "backup-switch-mode",
> + &bsm_dt))
> + return 0;
> +
> + /* Validate and convert DT value to register bits */
> + switch (bsm_dt) {
> + case 0:
> + bsm_bits = 0;
> + break;
> + case 1:
> + bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
> + break;
> + case 3:
> + bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
> + break;
> + default:
> + dev_warn(&client->dev,
> + "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
> + bsm_dt);
> + return 0;
> + }
> +
> + /* Read current BACKUP register */
> + ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
> + if (ret < 0)
> + return ret;
> +
> + /* Check if BSM and FEDE already match desired values */
> + if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
> + (bsm_bits | RV3028_BACKUP_FEDE)) {
> + dev_dbg(&client->dev,
> + "backup switch mode already set to %u\n", bsm_dt);
> + return 0;
> + }
> +
> + dev_info(&client->dev,
> + "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
> + bsm_dt, val_old,
> + (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
> + bsm_bits | RV3028_BACKUP_FEDE);
> +
> + /* Set BSM and always enable FEDE as recommended by datasheet */
> + return rv3028_update_cfg(rv3028, RV3028_BACKUP,
> + RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
> + bsm_bits | RV3028_BACKUP_FEDE);
> +}
> +
> static int rv3028_probe(struct i2c_client *client)
> {
> struct rv3028_data *rv3028;
> @@ -1005,11 +999,14 @@ static int rv3028_probe(struct i2c_client *client)
> if (ret)
> return ret;
>
> - ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
> + /* Configure backup switchover mode from device tree */
> + ret = rv3028_set_bsm_from_dt(rv3028, client);
> if (ret)
> return ret;
>
> - set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
> + ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
> + if (ret)
> + return ret;
>
> rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
> rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;
> --
> 2.34.1
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
2026-08-22 9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
2026-08-22 13:09 ` Alexandre Belloni
@ 2026-08-24 23:05 ` kernel test robot
2026-08-25 1:34 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2026-08-24 23:05 UTC (permalink / raw)
To: Dhaval Shiroya, alexandre.belloni
Cc: llvm, oe-kbuild-all, Dhaval Shiroya, linux-rtc, linux-kernel
Hi Dhaval,
kernel test robot noticed the following build warnings:
[auto build test WARNING on abelloni/rtc-next]
[also build test WARNING on linus/master v7.2 next-20260821]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Dhaval-Shiroya/rtc-rv3028-configure-backup-switch-mode-from-device-tree/20260822-145911
base: https://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc-next
patch link: https://lore.kernel.org/r/20260822092911.318342-1-dhaval.shiroya%40siliconsignals.io
patch subject: [PATCH] rtc: rv3028: configure backup switch mode from device tree
config: arm64-randconfig-002-20260825 (https://download.01.org/0day-ci/archive/20260825/202608250645.zcZhAAz1-lkp@intel.com/config)
compiler: clang version 24.0.0git (https://github.com/llvm/llvm-project 935bfc708590c60147a79c7df145bb6e68b1d388)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260825/202608250645.zcZhAAz1-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/202608250645.zcZhAAz1-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/rtc/rtc-rv3028.c:908:4: warning: format specifies type 'unsigned int' but the argument has type 'unsigned long' [-Wformat]
906 | "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
| ~~~~
| %02lx
907 | bsm_dt, val_old,
908 | (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
909 | bsm_bits | RV3028_BACKUP_FEDE);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:160:67: note: expanded from macro 'dev_info'
160 | dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ~~~ ^~~~~~~~~~~
include/linux/dev_printk.h:110:23: note: expanded from macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ~~~ ^~~~~~~~~~~
1 warning generated.
vim +908 drivers/rtc/rtc-rv3028.c
857
858 /*
859 * Configure backup switchover mode from device tree.
860 * 0 = disabled
861 * 1 = DSM (Direct Switching Mode) - switch when VDD < VBACKUP
862 * 3 = LSM (Level Switching Mode) - switch when VDD < 2.0V
863 */
864 static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
865 struct i2c_client *client)
866 {
867 u32 val_old, bsm_dt, bsm_bits;
868 int ret;
869
870 if (device_property_read_u32(&client->dev, "backup-switch-mode",
871 &bsm_dt))
872 return 0;
873
874 /* Validate and convert DT value to register bits */
875 switch (bsm_dt) {
876 case 0:
877 bsm_bits = 0;
878 break;
879 case 1:
880 bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
881 break;
882 case 3:
883 bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
884 break;
885 default:
886 dev_warn(&client->dev,
887 "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
888 bsm_dt);
889 return 0;
890 }
891
892 /* Read current BACKUP register */
893 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
894 if (ret < 0)
895 return ret;
896
897 /* Check if BSM and FEDE already match desired values */
898 if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
899 (bsm_bits | RV3028_BACKUP_FEDE)) {
900 dev_dbg(&client->dev,
901 "backup switch mode already set to %u\n", bsm_dt);
902 return 0;
903 }
904
905 dev_info(&client->dev,
906 "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
907 bsm_dt, val_old,
> 908 (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
909 bsm_bits | RV3028_BACKUP_FEDE);
910
911 /* Set BSM and always enable FEDE as recommended by datasheet */
912 return rv3028_update_cfg(rv3028, RV3028_BACKUP,
913 RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
914 bsm_bits | RV3028_BACKUP_FEDE);
915 }
916
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
2026-08-22 9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
2026-08-22 13:09 ` Alexandre Belloni
2026-08-24 23:05 ` kernel test robot
@ 2026-08-25 1:34 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2026-08-25 1:34 UTC (permalink / raw)
To: Dhaval Shiroya, alexandre.belloni
Cc: oe-kbuild-all, Dhaval Shiroya, linux-rtc, linux-kernel
Hi Dhaval,
kernel test robot noticed the following build warnings:
[auto build test WARNING on abelloni/rtc-next]
[also build test WARNING on linus/master v7.2 next-20260821]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Dhaval-Shiroya/rtc-rv3028-configure-backup-switch-mode-from-device-tree/20260822-145911
base: https://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc-next
patch link: https://lore.kernel.org/r/20260822092911.318342-1-dhaval.shiroya%40siliconsignals.io
patch subject: [PATCH] rtc: rv3028: configure backup switch mode from device tree
config: nios2-allmodconfig (https://download.01.org/0day-ci/archive/20260825/202608250920.y0Rb4vg9-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 11.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260825/202608250920.y0Rb4vg9-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/202608250920.y0Rb4vg9-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from include/linux/device.h:15,
from include/linux/acpi.h:15,
from include/linux/i2c.h:13,
from drivers/rtc/rtc-rv3028.c:15:
drivers/rtc/rtc-rv3028.c: In function 'rv3028_set_bsm_from_dt':
>> drivers/rtc/rtc-rv3028.c:906:18: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'long unsigned int' [-Wformat=]
906 | "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:160:58: note: in expansion of macro 'dev_fmt'
160 | dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/rtc/rtc-rv3028.c:905:9: note: in expansion of macro 'dev_info'
905 | dev_info(&client->dev,
| ^~~~~~~~
drivers/rtc/rtc-rv3028.c:906:78: note: format string is defined here
906 | "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
| ~~~^
| |
| unsigned int
| %02lx
vim +906 drivers/rtc/rtc-rv3028.c
857
858 /*
859 * Configure backup switchover mode from device tree.
860 * 0 = disabled
861 * 1 = DSM (Direct Switching Mode) - switch when VDD < VBACKUP
862 * 3 = LSM (Level Switching Mode) - switch when VDD < 2.0V
863 */
864 static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
865 struct i2c_client *client)
866 {
867 u32 val_old, bsm_dt, bsm_bits;
868 int ret;
869
870 if (device_property_read_u32(&client->dev, "backup-switch-mode",
871 &bsm_dt))
872 return 0;
873
874 /* Validate and convert DT value to register bits */
875 switch (bsm_dt) {
876 case 0:
877 bsm_bits = 0;
878 break;
879 case 1:
880 bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
881 break;
882 case 3:
883 bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
884 break;
885 default:
886 dev_warn(&client->dev,
887 "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
888 bsm_dt);
889 return 0;
890 }
891
892 /* Read current BACKUP register */
893 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
894 if (ret < 0)
895 return ret;
896
897 /* Check if BSM and FEDE already match desired values */
898 if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
899 (bsm_bits | RV3028_BACKUP_FEDE)) {
900 dev_dbg(&client->dev,
901 "backup switch mode already set to %u\n", bsm_dt);
902 return 0;
903 }
904
905 dev_info(&client->dev,
> 906 "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
907 bsm_dt, val_old,
908 (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
909 bsm_bits | RV3028_BACKUP_FEDE);
910
911 /* Set BSM and always enable FEDE as recommended by datasheet */
912 return rv3028_update_cfg(rv3028, RV3028_BACKUP,
913 RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
914 bsm_bits | RV3028_BACKUP_FEDE);
915 }
916
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-08-25 1:35 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-22 9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
2026-08-22 13:09 ` Alexandre Belloni
2026-08-24 23:05 ` kernel test robot
2026-08-25 1:34 ` 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