diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2013-03-19 20:47:23 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2013-03-19 20:47:23 +0000 |
commit | 2417f46ff18bac52f71fbfb12544a617912d9e06 (patch) | |
tree | 591cecc70402bca13aa5a1c26f5d991e1538f034 /driver/xf86-video-intel/src | |
parent | bf6b2d3b02efa9043d4008710630a7efaaba665e (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.c | 75 |
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, ¶m) == -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, ¶m) == -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, ¶m) == -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, |