Date: Thu, 25 Jun 2026 02:21:26 +0000 From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Abdelkader Boudih <freebsd@seuros.com> Subject: git: 104b311a03e4 - main - asmc: Refactor sensor detection and sysctl registration Message-ID: <6a3c90a6.46073.2f935987@gitrepo.freebsd.org>
index | next in thread | raw e-mail
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); } }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a3c90a6.46073.2f935987>
