Index: src/sys/arch/sparc64/conf/files.sparc64
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/conf/files.sparc64,v
retrieving revision 1.170
diff -u -r1.170 files.sparc64
--- src/sys/arch/sparc64/conf/files.sparc64	4 Jun 2026 13:57:03 -0000	1.170
+++ src/sys/arch/sparc64/conf/files.sparc64	10 Jun 2026 05:09:11 -0000
@@ -95,7 +95,7 @@
 attach rtc at ebus with rtc_ebus
 file	arch/sparc64/dev/rtc.c			rtc
 
-device bq4802rtc
+device bq4802rtc: sysmon_envsys
 attach bq4802rtc at ebus with bq4802rtc_ebus
 file	arch/sparc64/dev/bq4802_ebus.c		bq4802rtc
 
Index: src/sys/arch/sparc64/dev/bq4802_ebus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/dev/bq4802_ebus.c,v
retrieving revision 1.2
diff -u -r1.2 bq4802_ebus.c
--- src/sys/arch/sparc64/dev/bq4802_ebus.c	16 Feb 2026 16:29:59 -0000	1.2
+++ src/sys/arch/sparc64/dev/bq4802_ebus.c	10 Jun 2026 05:09:11 -0000
@@ -39,6 +39,7 @@
 #include <sys/device.h>
 #include <sys/proc.h>
 #include <sys/types.h>
+#include <sys/sysctl.h>
 
 #include <sys/bus.h>
 #include <machine/autoconf.h>
@@ -49,13 +50,22 @@
 #include <dev/ebus/ebusreg.h>
 #include <dev/ebus/ebusvar.h>
 
+#include <dev/sysmon/sysmonvar.h>
+
+
 struct bq4802rtc_softc {
 	device_t	sc_dev;
 
-	struct		todr_chip_handle sc_tch;
+	struct todr_chip_handle	sc_tch;
+
+	bus_space_tag_t		sc_bst;	
+	bus_space_handle_t	sc_bsh;
+
+	struct sysmon_envsys    *sc_sme;	/* envsys config. */
+	envsys_data_t		sc_sensor;
+	int			sc_bvf;		/* Battery valid flag */
 
-	bus_space_tag_t sc_bst;	
-	bus_space_handle_t sc_bsh;
+	int			sc_osc_stp;	/* Oscillator stop (sysctl) */
 };
 
 static int	bq4802rtc_ebus_match(device_t, cfdata_t, void *);
@@ -64,6 +74,8 @@
 		    struct clock_ymdhms *);
 static int	bq4802_settime_ymdhms(struct todr_chip_handle *,
 		    struct clock_ymdhms *);
+void		bq4802_refresh(struct sysmon_envsys *, envsys_data_t *);
+static int	sysctl_bq4802_osc(SYSCTLFN_ARGS);
 
 CFATTACH_DECL_NEW(bq4802rtc_ebus, sizeof(struct bq4802rtc_softc),
     bq4802rtc_ebus_match, bq4802rtc_ebus_attach, NULL, NULL);
@@ -96,8 +108,9 @@
 	struct bq4802rtc_softc *sc = device_private(self);
 	struct ebus_attach_args *ea = aux;
 	todr_chip_handle_t tch = &sc->sc_tch;
+	const struct sysctlnode *me = NULL, *node = NULL;
 	int sz;
-	uint8_t ctrl;
+	uint8_t flags, ctrl;
 
 	sc->sc_dev = self;
 	sc->sc_bst = ea->ea_bustag;
@@ -121,10 +134,62 @@
 	/* Setup: alarms off, disable DST, enable updates, 24-hour mode */
 	ctrl = bq4802_read(sc, BQ4802_CTRL);
 	ctrl = ctrl & ~(BQ4802_CTRL_DSE | BQ4802_CTRL_UTI);
-	ctrl = ctrl | BQ4802_CTRL_24 | BQ4802_CTRL_STP;
+	ctrl = ctrl | BQ4802_CTRL_24;
 	bq4802_write(sc, BQ4802_CTRL, ctrl);
+	if (ctrl & BQ4802_CTRL_STP)
+		sc->sc_osc_stp = 0;
+	else {
+		aprint_error_dev(self,
+		    "WARNING: oscillator is stopped (0x%02x)\n", ctrl);
+		sc->sc_osc_stp = 1;
+	}
 
 	todr_attach(tch);
+
+	/* Setup envsys for the battery valid flag */
+	sc->sc_sme = sysmon_envsys_create();
+
+	sc->sc_sensor.units = ENVSYS_INDICATOR;
+	sc->sc_sensor.state = ENVSYS_SINVALID;
+	sc->sc_sensor.flags |= ENVSYS_FMONCRITICAL;
+	(void)strlcpy(sc->sc_sensor.desc, "battery low",
+	    sizeof(sc->sc_sensor.desc));
+	if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor)) {
+		sysmon_envsys_destroy(sc->sc_sme);
+		sc->sc_sme = NULL;
+		aprint_error_dev(self,
+		    "unable to attach sensor to sysmon\n");
+	} else {
+		sc->sc_sme->sme_name = device_xname(self);
+		sc->sc_sme->sme_cookie = sc;
+		sc->sc_sme->sme_refresh = bq4802_refresh;
+		flags = bq4802_read(sc, BQ4802_FLAGS);
+		sc->sc_bvf = flags & BQ4802_FLG_BVF;
+		if (sysmon_envsys_register(sc->sc_sme)) {
+			sysmon_envsys_destroy(sc->sc_sme);
+			sc->sc_sme = NULL;
+			aprint_error_dev(self,
+			    "unable to register with sysmon\n");
+		}
+	}
+
+	/* Setup sysctl for the oscillator control */
+	sysctl_createv(NULL, 0, NULL, &me,
+	    CTLFLAG_READWRITE,
+	    CTLTYPE_NODE, device_xname(self), NULL,
+	    NULL, 0, NULL, 0,
+	    CTL_HW, CTL_CREATE, CTL_EOL);
+	if (me == NULL)
+		aprint_error_dev(self, "unable to add sysctl root\n");
+	else {
+		sysctl_createv(NULL, 0, NULL, &node,
+		    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
+		    CTLTYPE_INT, "stop_oscillator", "Stop the chip oscillator",
+		    sysctl_bq4802_osc, 1, (void *)sc, 0,
+		    CTL_HW, me->sysctl_num, CTL_CREATE, CTL_EOL);
+		if (node == NULL)
+			aprint_error_dev(self, "unable to add sysctl node\n");
+	}
 }
 
 static int
@@ -182,3 +247,67 @@
 
 	return 0;
 }
+
+void
+bq4802_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+	struct bq4802rtc_softc *sc = sme->sme_cookie;
+
+	/*
+	 * The Battery valid flag is only set at power-up,
+	 * so we always return the saved value.
+	 */
+	if (sc->sc_bvf)
+		edata->state = ENVSYS_SVALID;
+	else
+		edata->state = ENVSYS_SCRITICAL;
+
+}
+
+static int
+sysctl_bq4802_osc(SYSCTLFN_ARGS)
+{
+	struct sysctlnode node = *rnode;
+	struct bq4802rtc_softc *sc = node.sysctl_data;
+	int stp;
+	uint8_t ctrl;
+
+	if (newp) {
+		/* write */
+		stp = sc->sc_osc_stp;
+		node.sysctl_data = &stp;
+		if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) {
+			if (stp != 0 && stp != 1)
+				return EINVAL;
+
+			if (stp != sc->sc_osc_stp) {
+				sc->sc_osc_stp = stp;
+				ctrl = bq4802_read(sc, BQ4802_CTRL);
+				if (stp)
+					ctrl &= ~BQ4802_CTRL_STP;
+				else
+					ctrl |= BQ4802_CTRL_STP;
+				bq4802_write(sc, BQ4802_CTRL, ctrl);
+			}
+
+			return 0;
+		}
+		return EINVAL;
+	} else {
+		node.sysctl_data = &sc->sc_osc_stp;
+		node.sysctl_size = 4;
+		return (sysctl_lookup(SYSCTLFN_CALL(&node)));
+	}
+
+	return 0;
+}
+
+SYSCTL_SETUP(sysctl_bq4802_setup, "sysctl bq4802 subtree setup")
+{
+
+	sysctl_createv(NULL, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT,
+		       CTLTYPE_NODE, "hw", NULL,
+		       NULL, 0, NULL, 0,
+		       CTL_HW, CTL_EOL);
+}
Index: src/share/man/man4/mk48txx.4
===================================================================
RCS file: /cvsroot/src/share/man/man4/mk48txx.4,v
retrieving revision 1.16
diff -u -r1.16 mk48txx.4
--- src/share/man/man4/mk48txx.4	10 Apr 2009 17:14:07 -0000	1.16
+++ src/share/man/man4/mk48txx.4	10 Jun 2026 05:09:11 -0000
@@ -52,6 +52,38 @@
 interface defined in
 .Xr todr 9 .
 .Pp
+The chip checks the battery on power-up and every 24 hours, as long as
+the oscillator is running.
+It sets an internal battery low flag if the battery voltage is less
+than approximately 2.5 V.
+The status of the flag is reported through the
+.Xr envstat 8
+interface.
+.Bl -column ".Li battery low" "TRUE/FALSE" -offset indent
+.It Sy Sensor     Ta Sy Units  Ta Sy Description
+.It Li battery low      Ta TRUE/FALSE    Ta Battery low alert
+.El
+.Pp
+The chip also supports stopping the oscillator to conserve battery life
+if the computer will be stored for an extended period.
+.Nm
+driver
+makes the oscillator control available via
+.Xr sysctl 8 .
+For example:
+.Bd -literal -offset indent
+hw.clock0.stop_oscillator = 0
+.Ed
+.Pp
+A value of
+.Dq 0
+means that the oscillator is running when the computer is powered off,
+and a value of
+.Dq 1
+means that the oscillator is stopped.
+If the oscillator is stopped, then the driver will output a warning message
+at attach time, but does not automatically restart the oscillator.
+.Pp
 To tie an instance of this device to the system, use the
 .Fn mk48txx_attach
 function and the mk48txx_softc structure defined as follows:
Index: src/distrib/sets/lists/man/mi
===================================================================
RCS file: /cvsroot/src/distrib/sets/lists/man/mi,v
retrieving revision 1.1833
diff -u -r1.1833 mi
--- src/distrib/sets/lists/man/mi	4 Jun 2026 14:22:21 -0000	1.1833
+++ src/distrib/sets/lists/man/mi	10 Jun 2026 05:09:12 -0000
@@ -1070,6 +1070,7 @@
 ./usr/share/man/cat4/bochsfb.0			man-sys-catman		.cat
 ./usr/share/man/cat4/bpf.0			man-sys-catman		.cat
 ./usr/share/man/cat4/bpfjit.0			man-sys-catman		.cat
+./usr/share/man/cat4/bq4802rtc.0		man-sys-catman		.cat
 ./usr/share/man/cat4/brgphy.0			man-sys-catman		.cat
 ./usr/share/man/cat4/bridge.0			man-sys-catman		.cat
 ./usr/share/man/cat4/bt.0			man-sys-catman		.cat
@@ -4670,6 +4671,7 @@
 ./usr/share/man/man4/bochsfb.4			man-sys-man		.man
 ./usr/share/man/man4/bpf.4			man-sys-man		.man
 ./usr/share/man/man4/bpfjit.4			man-sys-man		.man
+./usr/share/man/man4/bq4802rtc.4		man-sys-man		.man
 ./usr/share/man/man4/brgphy.4			man-sys-man		.man
 ./usr/share/man/man4/bridge.4			man-sys-man		.man
 ./usr/share/man/man4/bt.4			man-sys-man		.man
Index: src/distrib/sets/lists/manhtml/mi
===================================================================
RCS file: /cvsroot/src/distrib/sets/lists/manhtml/mi,v
retrieving revision 1.51
diff -u -r1.51 mi
--- src/distrib/sets/lists/manhtml/mi	4 Jun 2026 14:22:21 -0000	1.51
+++ src/distrib/sets/lists/manhtml/mi	10 Jun 2026 05:09:12 -0000
@@ -953,6 +953,7 @@
 ./usr/share/man/html4/bochsfb.html		man-sys-htmlman		html
 ./usr/share/man/html4/bpf.html			man-sys-htmlman		html
 ./usr/share/man/html4/bpfjit.html		man-sys-htmlman		html
+./usr/share/man/html4/bq4802rtc.html		man-sys-htmlman		html
 ./usr/share/man/html4/brgphy.html		man-sys-htmlman		html
 ./usr/share/man/html4/bridge.html		man-sys-htmlman		html
 ./usr/share/man/html4/bt.html			man-sys-htmlman		html
