Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147727115
D55716.id173319.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D55716.id173319.diff
View Options
diff --git a/sys/dev/acpi_support/acpi_system76.c b/sys/dev/acpi_support/acpi_system76.c
--- a/sys/dev/acpi_support/acpi_system76.c
+++ b/sys/dev/acpi_support/acpi_system76.c
@@ -38,6 +38,9 @@
#include <dev/acpica/acpivar.h>
#include <sys/sysctl.h>
+#include <dev/backlight/backlight.h>
+#include "backlight_if.h"
+
#define _COMPONENT ACPI_OEM
ACPI_MODULE_NAME("system76")
@@ -60,6 +63,7 @@
struct sysctl_ctx_list sysctl_ctx;
struct sysctl_oid *sysctl_tree;
+ struct cdev *kbb_bkl;
};
static int acpi_system76_probe(device_t);
@@ -72,6 +76,12 @@
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 */
#define S76_CTRL_KBB 1 /* Keyboard Brightness */
@@ -123,10 +133,16 @@
};
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),
+ /* 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
};
@@ -143,6 +159,33 @@
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_kbd_bkl_level(uint32_t val)
+{
+ return (acpi_system76_backlight_levels[val >> 4 & 0xf]);
+}
+
+static inline uint32_t
+kbb_bkl_level_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
*/
@@ -384,6 +427,12 @@
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");
+ }
+
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,
@@ -391,6 +440,46 @@
}
}
+static int
+acpi_system76_backlight_update_status(device_t dev, struct backlight_props
+ *props)
+{
+ 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)
+ return (ENXIO);
+
+ ctrl->val = kbb_bkl_level_to_devstate(props->brightness);
+ acpi_system76_update(sc, S76_CTRL_KBB, true);
+
+ 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 = devstate_to_kbd_bkl_level(sc->kbb.val);
+ 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)
{
@@ -421,6 +510,9 @@
if (sysctl_ctx_free(&sc->sysctl_ctx) != 0)
return (EBUSY);
+ if (sc->kbb_bkl != NULL)
+ backlight_destroy(sc->kbb_bkl);
+
return (0);
}
@@ -442,3 +534,4 @@
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
--- 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 <bsd.kmod.mk>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 14, 5:55 AM (1 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29655561
Default Alt Text
D55716.id173319.diff (4 KB)
Attached To
Mode
D55716: acpi_system76: Add backlight(9) support for keyboard
Attached
Detach File
Event Timeline
Log In to Comment