From nobody Mon Mar 09 09:21:50 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4fTs333wP7z6VSZc for ; Mon, 09 Mar 2026 09:21:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fTs326NCDz3ZJ3 for ; Mon, 09 Mar 2026 09:21:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773048110; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=YDKIGhbDBsO/9I1xt+AzVx0QvtM6pGpn1obBWLDGD0E=; b=vr+avFFt+wsMqvhgSVPVhcX6FNTmstyTki5qXC7rOgs4e+1tBKu2RQngHdMcANY5s/NRJe xLY1O4efDBKZ62IVDcy4mKst+r+CZmQerXwl/0vcRkcte2e55Ag0OYR3yZIdMM1Nx4FVFK BT4+EuAFKET1mbEMhBCC46h8G4OUU2r4I2w1cREB4kY29b13xfU2HiRoZ3A9mswPtS++ul ZI+TcklBCNp5FpxHGAHiX5hB8i7vYU1YaBoCwxQP5+vwaMmmalmaClkYFW5a4WFd+cVaU5 Evae7y9/EXCdFAuejf0AojZ42XP+AMjyUr9pbnSKS4s+WjjR9dm2hBZYcpIstA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773048110; a=rsa-sha256; cv=none; b=nC9WotsqMang+ApQWT1Hf69y+RLJDOgqu3kafWpA56/C9qSkZA4a3PJ70C1mQUfv7zyvzW /UiqIyegYTjs1q1NDOh+3hQGbvZMUEzb3lDGUw7SdDcJJDrcG5xiv1TRFbBjTqMHTHugNE 7ubeqEEvCRt+xSNOnc/nxkhoR38PYzEy6aLz1oTUFRYIsATDGlkajLpqRxe5utDR+5dtzA 6Db+MyNHKZvN7Ah5ooWrvK3CRlrUsbpltwiSOMWXbQDOvBYqXWfIsa/puOeW8wrGIJ7wuD KgApLgMkYDUU0sZwoQzMGH4/I8SJOyzyGLvxXY8N52IEEJGv7ed5LBy5ycLx3Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773048110; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=YDKIGhbDBsO/9I1xt+AzVx0QvtM6pGpn1obBWLDGD0E=; b=VfK2ECk5HcxF6OGV7Y6b2a2ybnJ0PBYqWpAA5eolEYfI8zPjTWOFSSui/CF4koo2/4e8ON BeSxqwPcebAFJKJl+hjeE4/7O+VhpAv8teJoJ5+qnfEcHIYaQgks6dDkwkExYHgyQRQKyH ftJ7jFpJGx3zfZNwv/d/4nuGLrAJU84N9MjmEH/6//HZnTVoI/4CQCj9VUzgBgNMDJ5Rs/ kBVfWR8IZdn+35WKO05CrG99DJmoyJvPzSluAOurVfNga3ovJWea6QYsKgVR5Kwq8sRgQo c+kZAv0Eim4K7YDKYD9Td5zNvi99p78/5nFNnmx0WHIqLcIH/osf/UcJNCKe7A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fTs3258Ylz3lT for ; Mon, 09 Mar 2026 09:21:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3d899 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 09 Mar 2026 09:21:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Pouria Mousavizadeh Tehrani Subject: git: 105869a2c78d - main - acpi_system76: Add backlight(9) support for keyboard List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: pouria X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 105869a2c78d21f310a8f271eaa510acea045805 Auto-Submitted: auto-generated Date: Mon, 09 Mar 2026 09:21:50 +0000 Message-Id: <69ae912e.3d899.3605b43c@gitrepo.freebsd.org> The branch main has been updated by pouria: URL: https://cgit.FreeBSD.org/src/commit/?id=105869a2c78d21f310a8f271eaa510acea045805 commit 105869a2c78d21f310a8f271eaa510acea045805 Author: Pouria Mousavizadeh Tehrani AuthorDate: 2026-03-07 22:40:21 +0000 Commit: Pouria Mousavizadeh Tehrani CommitDate: 2026-03-09 09:12:01 +0000 acpi_system76: Add backlight(9) support for keyboard Reviewed by: wulf Differential Revision: https://reviews.freebsd.org/D55716 --- sys/dev/acpi_support/acpi_system76.c | 145 ++++++++++++++++++++++++++++++++ sys/modules/acpi/acpi_system76/Makefile | 1 + 2 files changed, 146 insertions(+) diff --git a/sys/dev/acpi_support/acpi_system76.c b/sys/dev/acpi_support/acpi_system76.c index 9ae7d116be0b..a4ac848a0fec 100644 --- a/sys/dev/acpi_support/acpi_system76.c +++ b/sys/dev/acpi_support/acpi_system76.c @@ -38,6 +38,9 @@ #include #include +#include +#include "backlight_if.h" + #define _COMPONENT ACPI_OEM ACPI_MODULE_NAME("system76") @@ -60,11 +63,16 @@ struct acpi_system76_softc { struct sysctl_ctx_list sysctl_ctx; struct sysctl_oid *sysctl_tree; + struct cdev *kbb_bkl; + uint8_t backlight_level; }; static int acpi_system76_probe(device_t); static int acpi_system76_attach(device_t); static int acpi_system76_detach(device_t); +static int acpi_system76_suspend(device_t); +static int acpi_system76_resume(device_t); +static int acpi_system76_shutdown(device_t); static void acpi_system76_init(struct acpi_system76_softc *); static struct acpi_ctrl * acpi_system76_ctrl_map(struct acpi_system76_softc *, int); @@ -72,6 +80,12 @@ static int acpi_system76_update(struct acpi_system76_softc *, int, bool); static int acpi_system76_sysctl_handler(SYSCTL_HANDLER_ARGS); static void acpi_system76_notify_handler(ACPI_HANDLE, uint32_t, void *); static void acpi_system76_check(struct acpi_system76_softc *); +static int acpi_system76_backlight_update_status(device_t dev, + struct backlight_props *props); +static int acpi_system76_backlight_get_status(device_t dev, + struct backlight_props *props); +static int acpi_system76_backlight_get_info(device_t dev, + struct backlight_info *info); /* methods */ enum { @@ -125,9 +139,18 @@ static const struct s76_ctrl_table s76_sysctl_table[] = { }; static device_method_t acpi_system76_methods[] = { + /* Device interface */ DEVMETHOD(device_probe, acpi_system76_probe), DEVMETHOD(device_attach, acpi_system76_attach), DEVMETHOD(device_detach, acpi_system76_detach), + DEVMETHOD(device_suspend, acpi_system76_suspend), + DEVMETHOD(device_resume, acpi_system76_resume), + DEVMETHOD(device_shutdown, acpi_system76_shutdown), + + /* Backlight interface */ + DEVMETHOD(backlight_update_status, acpi_system76_backlight_update_status), + DEVMETHOD(backlight_get_status, acpi_system76_backlight_get_status), + DEVMETHOD(backlight_get_info, acpi_system76_backlight_get_info), DEVMETHOD_END }; @@ -145,6 +168,33 @@ static driver_t acpi_system76_driver = { sizeof(struct acpi_system76_softc) }; +static const uint32_t acpi_system76_backlight_levels[] = { + 0, 6, 12, 18, 24, 30, 36, 42, + 48, 54, 60, 66, 72, 78, 84, 100 +}; + +static inline uint32_t +devstate_to_backlight(uint32_t val) +{ + return (acpi_system76_backlight_levels[val >> 4 & 0xf]); +} + +static inline uint32_t +backlight_to_devstate(uint32_t bkl) +{ + int i; + uint32_t val; + + for (i = 0; i < nitems(acpi_system76_backlight_levels); i++) { + if (bkl < acpi_system76_backlight_levels[i]) + break; + } + val = (i - 1) * 16; + if (val > 224) + val = 255; + return (val); +} + /* * Returns corresponding acpi_ctrl of softc from method */ @@ -244,6 +294,9 @@ acpi_system76_notify_update(void *arg) acpi_system76_update(sc, method, false); } ACPI_SERIAL_END(system76); + + if (sc->kbb_bkl != NULL) + sc->backlight_level = devstate_to_backlight(sc->kbb.val); } static void @@ -335,6 +388,8 @@ acpi_system76_sysctl_handler(SYSCTL_HANDLER_ARGS) case S76_CTRL_KBB: if (val > UINT8_MAX || val < 0) return (EINVAL); + if (sc->kbb_bkl != NULL) + sc->backlight_level = devstate_to_backlight(val); break; case S76_CTRL_KBC: if (val >= (1 << 24) || val < 0) @@ -386,6 +441,14 @@ acpi_system76_init(struct acpi_system76_softc *sc) if (!ctrl->exists) continue; + if (method == S76_CTRL_KBB) { + sc->kbb_bkl = backlight_register("system76_keyboard", sc->dev); + if (sc->kbb_bkl == NULL) + device_printf(sc->dev, "Can not register backlight\n"); + else + sc->backlight_level = devstate_to_backlight(sc->kbb.val); + } + SYSCTL_ADD_PROC(&sc->sysctl_ctx, SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, s76_sysctl_table[method].name, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, @@ -393,6 +456,45 @@ acpi_system76_init(struct acpi_system76_softc *sc) } } +static int +acpi_system76_backlight_update_status(device_t dev, struct backlight_props + *props) +{ + struct acpi_system76_softc *sc; + + sc = device_get_softc(dev); + if (sc->kbb.val != backlight_to_devstate(props->brightness)) { + sc->kbb.val = backlight_to_devstate(props->brightness); + acpi_system76_update(sc, S76_CTRL_KBB, true); + } + sc->backlight_level = props->brightness; + + return (0); +} + +static int +acpi_system76_backlight_get_status(device_t dev, struct backlight_props *props) +{ + struct acpi_system76_softc *sc; + + sc = device_get_softc(dev); + props->brightness = sc->backlight_level; + props->nlevels = nitems(acpi_system76_backlight_levels); + memcpy(props->levels, acpi_system76_backlight_levels, + sizeof(acpi_system76_backlight_levels)); + + return (0); +} + +static int +acpi_system76_backlight_get_info(device_t dev, struct backlight_info *info) +{ + info->type = BACKLIGHT_TYPE_KEYBOARD; + strlcpy(info->name, "System76 Keyboard", BACKLIGHTMAXNAMELENGTH); + + return (0); +} + static int acpi_system76_attach(device_t dev) { @@ -423,9 +525,51 @@ acpi_system76_detach(device_t dev) if (sysctl_ctx_free(&sc->sysctl_ctx) != 0) return (EBUSY); + AcpiRemoveNotifyHandler(sc->handle, ACPI_SYSTEM_NOTIFY, + acpi_system76_notify_handler); + + if (sc->kbb_bkl != NULL) + backlight_destroy(sc->kbb_bkl); + return (0); } +static int +acpi_system76_suspend(device_t dev) +{ + struct acpi_system76_softc *sc; + struct acpi_ctrl *ctrl; + + sc = device_get_softc(dev); + if ((ctrl = acpi_system76_ctrl_map(sc, S76_CTRL_KBB)) != NULL) { + ctrl->val = 0; + acpi_system76_update(sc, S76_CTRL_KBB, true); + } + + return (0); +} + +static int +acpi_system76_resume(device_t dev) +{ + struct acpi_system76_softc *sc; + struct acpi_ctrl *ctrl; + + sc = device_get_softc(dev); + if ((ctrl = acpi_system76_ctrl_map(sc, S76_CTRL_KBB)) != NULL) { + ctrl->val = backlight_to_devstate(sc->backlight_level); + acpi_system76_update(sc, S76_CTRL_KBB, true); + } + + return (0); +} + +static int +acpi_system76_shutdown(device_t dev) +{ + return (acpi_system76_detach(dev)); +} + static int acpi_system76_probe(device_t dev) { @@ -444,3 +588,4 @@ acpi_system76_probe(device_t dev) DRIVER_MODULE(acpi_system76, acpi, acpi_system76_driver, 0, 0); MODULE_VERSION(acpi_system76, 1); MODULE_DEPEND(acpi_system76, acpi, 1, 1, 1); +MODULE_DEPEND(acpi_system76, backlight, 1, 1, 1); diff --git a/sys/modules/acpi/acpi_system76/Makefile b/sys/modules/acpi/acpi_system76/Makefile index 86d2c91e712d..76bee091dfca 100644 --- a/sys/modules/acpi/acpi_system76/Makefile +++ b/sys/modules/acpi/acpi_system76/Makefile @@ -3,5 +3,6 @@ KMOD= acpi_system76 CFLAGS+=-I${SRCTOP}/sys/dev/acpi_support SRCS= acpi_system76.c opt_acpi.h acpi_if.h device_if.h bus_if.h +SRCS+= backlight_if.h .include