summaryrefslogtreecommitdiff
path: root/driver/xf86-video-intel/src
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2013-03-19 20:47:23 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2013-03-19 20:47:23 +0000
commit2417f46ff18bac52f71fbfb12544a617912d9e06 (patch)
tree591cecc70402bca13aa5a1c26f5d991e1538f034 /driver/xf86-video-intel/src
parentbf6b2d3b02efa9043d4008710630a7efaaba665e (diff)
Add an OpenBSD-specific implementation of backlight control that uses the
appropriate wscons ioctls. ok matthieu@
Diffstat (limited to 'driver/xf86-video-intel/src')
-rw-r--r--driver/xf86-video-intel/src/intel_display.c75
1 files changed, 69 insertions, 6 deletions
diff --git a/driver/xf86-video-intel/src/intel_display.c b/driver/xf86-video-intel/src/intel_display.c
index 5ee955ee6..6e6a7a28a 100644
--- a/driver/xf86-video-intel/src/intel_display.c
+++ b/driver/xf86-video-intel/src/intel_display.c
@@ -53,6 +53,11 @@
#include "intel_glamor.h"
+#ifdef __OpenBSD__
+#include <dev/wscons/wsconsio.h>
+#include "xf86Priv.h"
+#endif
+
#define KNOWN_MODE_FLAGS ((1<<14)-1)
struct intel_mode {
@@ -127,6 +132,69 @@ intel_output_dpms(xf86OutputPtr output, int mode);
static void
intel_output_dpms_backlight(xf86OutputPtr output, int oldmode, int mode);
+static inline int
+crtc_id(struct intel_crtc *crtc)
+{
+ return crtc->mode_crtc->crtc_id;
+}
+
+#ifdef __OpenBSD__
+
+static void
+intel_output_backlight_set(xf86OutputPtr output, int level)
+{
+ struct intel_output *intel_output = output->driver_private;
+ struct wsdisplay_param param;
+
+ if (level > intel_output->backlight_max)
+ level = intel_output->backlight_max;
+ if (! intel_output->backlight_iface || level < 0)
+ return;
+
+ param.param = WSDISPLAYIO_PARAM_BRIGHTNESS;
+ param.curval = level;
+ if (ioctl(xf86Info.consoleFd, WSDISPLAYIO_SETPARAM, &param) == -1) {
+ xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
+ "Failed to set backlight level: %s\n",
+ strerror(errno));
+ }
+}
+
+static int
+intel_output_backlight_get(xf86OutputPtr output)
+{
+ struct wsdisplay_param param;
+
+ param.param = WSDISPLAYIO_PARAM_BRIGHTNESS;
+ if (ioctl(xf86Info.consoleFd, WSDISPLAYIO_GETPARAM, &param) == -1) {
+ xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
+ "Failed to get backlight level: %s\n",
+ strerror(errno));
+ return -1;
+ }
+
+ return param.curval;
+}
+
+static void
+intel_output_backlight_init(xf86OutputPtr output)
+{
+ struct intel_output *intel_output = output->driver_private;
+ struct wsdisplay_param param;
+
+ param.param = WSDISPLAYIO_PARAM_BRIGHTNESS;
+ if (ioctl(xf86Info.consoleFd, WSDISPLAYIO_GETPARAM, &param) == -1) {
+ intel_output->backlight_iface = NULL;
+ return;
+ }
+
+ intel_output->backlight_iface = "wscons";
+ intel_output->backlight_max = param.max;
+ intel_output->backlight_active_level = param.curval;
+}
+
+#else
+
#define BACKLIGHT_CLASS "/sys/class/backlight"
/*
@@ -155,12 +223,6 @@ static const char *backlight_interfaces[] = {
/* Enough for 10 digits of backlight + '\n' + '\0' */
#define BACKLIGHT_VALUE_LEN 12
-static inline int
-crtc_id(struct intel_crtc *crtc)
-{
- return crtc->mode_crtc->crtc_id;
-}
-
static void
intel_output_backlight_set(xf86OutputPtr output, int level)
{
@@ -297,6 +359,7 @@ intel_output_backlight_init(xf86OutputPtr output)
intel_output->backlight_iface = NULL;
}
+#endif
static void
mode_from_kmode(ScrnInfoPtr scrn,