Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtc: add BSM parameter

BSM or Backup Switch Mode is a common feature on RTCs, allowing to select
how the RTC will decide when to switch from its primary power supply to the
backup power supply. It is necessary to be able to set it from userspace as
there are uses cases where it has to be done dynamically.

Supported values are:
RTC_BSM_DISABLED: disabled
RTC_BSM_DIRECT: switching will happen as soon as Vbackup > Vdd
RTC_BSM_LEVEL: switching will happen around a threshold, usually with an
hysteresis
RTC_BSM_STANDBY: switching will not happen until Vdd > Vbackup, this is
useful to ensure the RTC doesn't draw any power until the device is first
powered on.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211018151933.76865-6-alexandre.belloni@bootlin.com

+18 -3
+8 -2
drivers/rtc/dev.c
··· 409 409 break; 410 410 411 411 default: 412 - err = -EINVAL; 412 + if (rtc->ops->param_get) 413 + err = rtc->ops->param_get(rtc->dev.parent, &param); 414 + else 415 + err = -EINVAL; 413 416 } 414 417 415 418 if (!err) ··· 439 436 return rtc_set_offset(rtc, param.svalue); 440 437 441 438 default: 442 - err = -EINVAL; 439 + if (rtc->ops->param_set) 440 + err = rtc->ops->param_set(rtc->dev.parent, &param); 441 + else 442 + err = -EINVAL; 443 443 } 444 444 445 445 break;
+2
include/linux/rtc.h
··· 66 66 int (*alarm_irq_enable)(struct device *, unsigned int enabled); 67 67 int (*read_offset)(struct device *, long *offset); 68 68 int (*set_offset)(struct device *, long offset); 69 + int (*param_get)(struct device *, struct rtc_param *param); 70 + int (*param_set)(struct device *, struct rtc_param *param); 69 71 }; 70 72 71 73 struct rtc_device;
+8 -1
include/uapi/linux/rtc.h
··· 132 132 #define RTC_FEATURE_ALARM_RES_2S 3 133 133 #define RTC_FEATURE_UPDATE_INTERRUPT 4 134 134 #define RTC_FEATURE_CORRECTION 5 135 - #define RTC_FEATURE_CNT 6 135 + #define RTC_FEATURE_BACKUP_SWITCH_MODE 6 136 + #define RTC_FEATURE_CNT 7 136 137 137 138 /* parameter list */ 138 139 #define RTC_PARAM_FEATURES 0 139 140 #define RTC_PARAM_CORRECTION 1 141 + #define RTC_PARAM_BACKUP_SWITCH_MODE 2 142 + 143 + #define RTC_BSM_DISABLED 0 144 + #define RTC_BSM_DIRECT 1 145 + #define RTC_BSM_LEVEL 2 146 + #define RTC_BSM_STANDBY 3 140 147 141 148 #define RTC_MAX_FREQ 8192 142 149