diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-03-22 11:28:01 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-03-22 11:29:53 +0000 |
commit | ccd6b7e402e731c73163b132a80ae29ae2911613 (patch) | |
tree | 12fc0813100b0977c01b8d0fe0e6add806cfd278 | |
parent | 364e02c7998813643bc81f25ba077a764872d49e (diff) |
sna: Add backlight control implementation
Based on the previous patch by Mark Kettenis <kettenis@openbsd.org>
-rw-r--r-- | src/sna/sna_display.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 9068df99..7891c8d0 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -192,6 +192,78 @@ static void gem_close(int fd, uint32_t handle) (void)drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &close); } +#ifdef __OpenBSD__ + +#include <dev/wscons/wsconsio.h> +#include <xf86Priv.h> + +static void +sna_output_backlight_set(xf86OutputPtr output, int level) +{ + struct sna_output *sna_output = output->driver_private; + struct wsdisplay_param param; + + DBG(("%s: level=%d, max=%d\n", __FUNCTION__, + level, sna_output->backlight_max)); + + if (!sna_output->backlight_iface) + return; + + if ((unsigned)level > sna_output->backlight_max) + level = sna_output->backlight_max; + + VG_CLEAR(param); + 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 +sna_output_backlight_get(xf86OutputPtr output) +{ + struct wsdisplay_param param; + + VG_CLEAR(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; + } + + DBG(("%s: level=%d (max=%d)\n", __FUNCTION__, param.curval, param.max)); + + return param.curval; +} + +static void +sna_output_backlight_init(xf86OutputPtr output) +{ + struct sna_output *sna_output = output->driver_private; + struct wsdisplay_param param; + + VG_CLEAR(param); + param.param = WSDISPLAYIO_PARAM_BRIGHTNESS; + + if (ioctl(xf86Info.consoleFd, WSDISPLAYIO_GETPARAM, ¶m) == -1) + return; + + DBG(("%s: found 'wscons'\n", __FUNCTION__)); + + intel_output->backlight_iface = "wscons"; + intel_output->backlight_max = param.max; + intel_output->backlight_active_level = param.curval; +} + +#else + static void sna_output_backlight_set(xf86OutputPtr output, int level) { @@ -532,6 +604,7 @@ done: "found backlight control interface %s (type '%s')\n", sna_output->backlight_iface, best_iface); } +#endif static void mode_from_kmode(ScrnInfoPtr scrn, |