git: 104b311a03e4 - main - asmc: Refactor sensor detection and sysctl registration
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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);
}
}