Page MenuHomeFreeBSD

D55716.id173319.diff
No OneTemporary

D55716.id173319.diff

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

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)

Event Timeline