The branch main has been updated by seuros: URL: https://cgit.FreeBSD.org/src/commit/?id=c6db719a548ff6d49564c68ef52c2cbe02b7db15
commit c6db719a548ff6d49564c68ef52c2cbe02b7db15 Author: Abdelkader Boudih <[email protected]> AuthorDate: 2026-09-06 17:53:34 +0000 Commit: Abdelkader Boudih <[email protected]> CommitDate: 2026-09-06 19:47:44 +0000 asmc: add sleep indicator LED control via sysctl Add dev.asmc.0.sil sysctl to control the SIL LED via SMC keys MSLD (duty/brightness) and MSLS (state latch, must be set before re-enabling). MFC After: 1 week Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D58865 --- sys/dev/asmc/asmc.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ sys/dev/asmc/asmcvar.h | 15 +++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c index 80412b9c8daf..4eaa3bf06252 100644 --- a/sys/dev/asmc/asmc.c +++ b/sys/dev/asmc/asmc.c @@ -126,6 +126,7 @@ static int asmc_mbp_sysctl_light_right(SYSCTL_HANDLER_ARGS); static int asmc_mbp_sysctl_light_control(SYSCTL_HANDLER_ARGS); static int asmc_mbp_sysctl_light_left_10byte(SYSCTL_HANDLER_ARGS); static int asmc_aupo_sysctl(SYSCTL_HANDLER_ARGS); +static int asmc_sil_sysctl(SYSCTL_HANDLER_ARGS); static int asmc_key_getinfo(device_t, const char *, uint8_t *, char *); @@ -939,6 +940,16 @@ asmc_init(device_t dev) "Auto power-on after AC power loss (0=off, 1=on)"); } + /* Sleep Indicator LED (SIL) control via MSLD/MSLS keys. */ + if (asmc_key_read(dev, ASMC_KEY_MSLD, buf, 1) == 0) { + SYSCTL_ADD_PROC(sysctlctx, + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), + OID_AUTO, "sil", + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, + dev, 0, asmc_sil_sysctl, "I", + "Sleep indicator LED (0=off, 1=on)"); + } + sc->sc_nfan = asmc_fan_count(dev); if (sc->sc_nfan > ASMC_MAXFANS) { device_printf(dev, @@ -2538,6 +2549,40 @@ asmc_aupo_sysctl(SYSCTL_HANDLER_ARGS) return (0); } +/* Sleep Indicator LED (SIL) control; see ASMC_KEY_MSLD/MSLS in asmcvar.h. */ +static int +asmc_sil_sysctl(SYSCTL_HANDLER_ARGS) +{ + device_t dev = (device_t)arg1; + uint8_t msld; + int val, error; + + if (asmc_key_read(dev, ASMC_KEY_MSLD, &msld, 1) != 0) + return (EIO); + + /* MSLD 0xff means off, anything else means on */ + val = (msld != 0xff) ? 1 : 0; + error = sysctl_handle_int(oidp, &val, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + + if (val != 0) { + /* Turn on: unlatch MSLS first, then set MSLD duty */ + uint8_t msls = 0x01; + if (asmc_key_write(dev, ASMC_KEY_MSLS, &msls, 1) != 0) + return (EIO); + msld = 0x01; + } else { + /* Turn off: just set MSLD to 0xff */ + msld = 0xff; + } + + if (asmc_key_write(dev, ASMC_KEY_MSLD, &msld, 1) != 0) + return (EIO); + + return (0); +} + static int asmc_backlight_update_status(device_t dev, struct backlight_props *props) { diff --git a/sys/dev/asmc/asmcvar.h b/sys/dev/asmc/asmcvar.h index 940119e59774..76c17f4ba2dd 100644 --- a/sys/dev/asmc/asmcvar.h +++ b/sys/dev/asmc/asmcvar.h @@ -175,9 +175,20 @@ struct asmc_softc { #define ASMC_KEY_FANSAFESPEED0 "F0Sf" /* RO; 2 bytes */ /* - * Clamshell. + * Sleep Indicator LED (SIL). + * + * MSLD controls the duty cycle of the front-panel sleep indicator LED. + * 0x00 = LED at idle brightness, 0xff = LED fully off. + * MSLS is the SIL state latch — must be written to 0x01 before MSLD + * can re-enable the LED after it has been turned off. + * + * Protocol: OFF = write MSLD 0xff + * ON = write MSLS 0x01, then write MSLD 0x01 + * + * Present on all Intel Macs with a sleep indicator (laptops + Mac Mini). */ -#define ASMC_KEY_CLAMSHELL "MSLD" /* RO; 1 byte */ +#define ASMC_KEY_MSLD "MSLD" /* RW; 1 byte, SIL duty */ +#define ASMC_KEY_MSLS "MSLS" /* RW; 1 byte, SIL state latch */ /* * Auto power-on after AC power loss (AUPO).
