git: 104b311a03e4 - main - asmc: Refactor sensor detection and sysctl registration

From: Adrian Chadd <adrian_at_FreeBSD.org>
Date: Thu, 25 Jun 2026 02:21:26 UTC
The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=104b311a03e45ebb8fd7a93e4ac26644bbae9bae

commit 104b311a03e45ebb8fd7a93e4ac26644bbae9bae
Author:     Abdelkader Boudih <freebsd@seuros.com>
AuthorDate: 2026-06-25 02:06:34 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-06-25 02:06:51 +0000

    asmc: Refactor sensor detection and sysctl registration
    
    Replace repeated per-sensor-type blocks for voltage, current, power,
    and ambient light sensors with table-driven loops.
    
    Reviewed by:    ngie, adrian
    Differential Revision:  https://reviews.freebsd.org/D57595
---
 sys/dev/asmc/asmc.c | 147 ++++++++++++++++++++++++----------------------------
 1 file changed, 67 insertions(+), 80 deletions(-)

diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c
index b55196e69c15..055f98e06892 100644
--- a/sys/dev/asmc/asmc.c
+++ b/sys/dev/asmc/asmc.c
@@ -1659,32 +1659,36 @@ asmc_detect_sensors(device_t dev)
 		}
 	}
 
-	/* Voltage sensors: V..W range */
-	error = asmc_key_search(dev, "V\0\0\0", &start);
-	if (error == 0)
-		error = asmc_key_search(dev, "W\0\0\0", &end);
-	if (error == 0)
-		asmc_scan_sensor_range(dev, start, end, 'V',
-		    &sc->sc_voltage_count, sc->sc_voltage_sensors,
-		    ASMC_MAX_SENSORS);
-
-	/* Current sensors: I..J range */
-	error = asmc_key_search(dev, "I\0\0\0", &start);
-	if (error == 0)
-		error = asmc_key_search(dev, "J\0\0\0", &end);
-	if (error == 0)
-		asmc_scan_sensor_range(dev, start, end, 'I',
-		    &sc->sc_current_count, sc->sc_current_sensors,
-		    ASMC_MAX_SENSORS);
-
-	/* Power sensors: P..Q range */
-	error = asmc_key_search(dev, "P\0\0\0", &start);
-	if (error == 0)
-		error = asmc_key_search(dev, "Q\0\0\0", &end);
-	if (error == 0)
-		asmc_scan_sensor_range(dev, start, end, 'P',
-		    &sc->sc_power_count, sc->sc_power_sensors,
-		    ASMC_MAX_SENSORS);
+	/* Voltage/Current/Power sensors */
+	static const struct {
+		const char	*range_start;
+		const char	*range_end;
+		char		prefix;
+	} sensor_ranges[] = {
+		{ "V\0\0\0", "W\0\0\0", 'V' },	/* Voltage */
+		{ "I\0\0\0", "J\0\0\0", 'I' },	/* Current */
+		{ "P\0\0\0", "Q\0\0\0", 'P' },	/* Power */
+	};
+	static const size_t nsensor_ranges = nitems(sensor_ranges);
+
+	int *sensor_counts[] = {
+	    &sc->sc_voltage_count, &sc->sc_current_count,
+	    &sc->sc_power_count };
+	char **sensor_arrays[] = {
+	    sc->sc_voltage_sensors, sc->sc_current_sensors,
+	    sc->sc_power_sensors };
+
+	for (unsigned int r = 0; r < nsensor_ranges; r++) {
+		error = asmc_key_search(dev, sensor_ranges[r].range_start,
+		    &start);
+		if (error == 0)
+			error = asmc_key_search(dev,
+			    sensor_ranges[r].range_end, &end);
+		if (error == 0)
+			asmc_scan_sensor_range(dev, start, end,
+			    sensor_ranges[r].prefix, sensor_counts[r],
+			    sensor_arrays[r], ASMC_MAX_SENSORS);
+	}
 
 	/* Ambient light sensors: AL* in A..B range */
 	error = asmc_key_search(dev, "A\0\0\0", &start);
@@ -1722,63 +1726,46 @@ asmc_detect_sensors(device_t dev)
 	/* Register sysctls for detected sensors */
 	sysctlctx = device_get_sysctl_ctx(dev);
 
-	/* Voltage sensors */
-	if (sc->sc_voltage_count > 0) {
-		tree_node = SYSCTL_ADD_NODE(sysctlctx,
-		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-		    "voltage", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Voltage sensors (millivolts)");
-
-		for (i = 0; i < sc->sc_voltage_count; i++) {
-			SYSCTL_ADD_PROC(sysctlctx, SYSCTL_CHILDREN(tree_node),
-			    OID_AUTO, sc->sc_voltage_sensors[i],
-			    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
-			    dev, ('V' << 8) | i, asmc_sensor_sysctl, "I",
-			    "Voltage sensor (millivolts)");
-		}
-	}
-
-	/* Current sensors */
-	if (sc->sc_current_count > 0) {
-		tree_node = SYSCTL_ADD_NODE(sysctlctx,
-		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-		    "current", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Current sensors (milliamps)");
-
-		for (i = 0; i < sc->sc_current_count; i++) {
-			SYSCTL_ADD_PROC(sysctlctx, SYSCTL_CHILDREN(tree_node),
-			    OID_AUTO, sc->sc_current_sensors[i],
-			    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
-			    dev, ('I' << 8) | i, asmc_sensor_sysctl, "I",
-			    "Current sensor (milliamps)");
-		}
-	}
-
-	/* Power sensors */
-	if (sc->sc_power_count > 0) {
-		tree_node = SYSCTL_ADD_NODE(sysctlctx,
-		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-		    "power", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Power sensors (milliwatts)");
-
-		for (i = 0; i < sc->sc_power_count; i++) {
-			SYSCTL_ADD_PROC(sysctlctx, SYSCTL_CHILDREN(tree_node),
-			    OID_AUTO, sc->sc_power_sensors[i],
-			    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
-			    dev, ('P' << 8) | i, asmc_sensor_sysctl, "I",
-			    "Power sensor (milliwatts)");
-		}
-	}
-
-	/* Ambient light sensors */
-	if (sc->sc_light_count > 0) {
+	static const struct {
+		const char	*node_name;
+		const char	*node_desc;
+		char		tag;
+		const char	*leaf_desc;
+	} sensor_sysctl[] = {
+		{ "voltage", "Voltage sensors (millivolts)",  'V',
+		    "Voltage sensor (millivolts)" },
+		{ "current", "Current sensors (milliamps)",   'I',
+		    "Current sensor (milliamps)" },
+		{ "power",   "Power sensors (milliwatts)",    'P',
+		    "Power sensor (milliwatts)" },
+		{ "ambient", "Ambient light sensors",         'L',
+		    "Light sensor value" },
+	};
+
+	int *sysctl_counts[] = {
+	    &sc->sc_voltage_count, &sc->sc_current_count,
+	    &sc->sc_power_count, &sc->sc_light_count };
+	char **sysctl_arrays[] = {
+	    sc->sc_voltage_sensors, sc->sc_current_sensors,
+	    sc->sc_power_sensors, sc->sc_light_sensors };
+
+	for (unsigned int s = 0; s < nitems(sensor_sysctl); s++) {
+		int count = *sysctl_counts[s];
+		if (count <= 0)
+			continue;
 		tree_node = SYSCTL_ADD_NODE(sysctlctx,
 		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-		    "ambient", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Ambient light sensors");
-
-		for (i = 0; i < sc->sc_light_count; i++) {
-			SYSCTL_ADD_PROC(sysctlctx, SYSCTL_CHILDREN(tree_node),
-			    OID_AUTO, sc->sc_light_sensors[i],
+		    sensor_sysctl[s].node_name,
+		    CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
+		    sensor_sysctl[s].node_desc);
+		for (i = 0; i < count; i++) {
+			SYSCTL_ADD_PROC(sysctlctx,
+			    SYSCTL_CHILDREN(tree_node),
+			    OID_AUTO, sysctl_arrays[s][i],
 			    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
-			    dev, ('L' << 8) | i, asmc_sensor_sysctl, "I",
-			    "Light sensor value");
+			    dev, (sensor_sysctl[s].tag << 8) | i,
+			    asmc_sensor_sysctl, "I",
+			    sensor_sysctl[s].leaf_desc);
 		}
 	}