Module Name: src Committed By: macallan Date: Thu Oct 7 20:39:55 UTC 2010
Modified Files: src/sys/dev/pci: r128fb.c Log Message: use WSDISPLAYIO_PARAM_BACKLIGHT as a switch and WSDISPLAYIO_PARAM_BRIGHTNESS for backlight level instead of following radeonfb TODO: adapt radeonfb and powerd scripts To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/dev/pci/r128fb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/r128fb.c diff -u src/sys/dev/pci/r128fb.c:1.13 src/sys/dev/pci/r128fb.c:1.14 --- src/sys/dev/pci/r128fb.c:1.13 Thu Sep 30 03:16:51 2010 +++ src/sys/dev/pci/r128fb.c Thu Oct 7 20:39:54 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: r128fb.c,v 1.13 2010/09/30 03:16:51 macallan Exp $ */ +/* $NetBSD: r128fb.c,v 1.14 2010/10/07 20:39:54 macallan Exp $ */ /* * Copyright (c) 2007 Michael Lorenz @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.13 2010/09/30 03:16:51 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.14 2010/10/07 20:39:54 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -81,7 +81,7 @@ bus_size_t sc_fbsize, sc_regsize; int sc_width, sc_height, sc_depth, sc_stride; - int sc_locked, sc_have_backlight, sc_bl_level; + int sc_locked, sc_have_backlight, sc_bl_level, sc_bl_on; struct vcons_screen sc_console_screen; struct wsscreen_descr sc_defaultscreen_descr; const struct wsscreen_descr *sc_screens[1]; @@ -130,7 +130,10 @@ static void r128fb_brightness_up(device_t); static void r128fb_brightness_down(device_t); +/* set backlight level */ static void r128fb_set_backlight(struct r128fb_softc *, int); +/* turn backlight on and off without messing with the level */ +static void r128fb_switch_backlight(struct r128fb_softc *, int); struct wsdisplay_accessops r128fb_accessops = { r128fb_ioctl, @@ -193,6 +196,7 @@ struct r128fb_softc *sc = device_private(self); struct pci_attach_args *pa = aux; struct rasops_info *ri; + bus_space_tag_t tag; char devinfo[256]; struct wsemuldisplaydev_attach_args aa; prop_dictionary_t dict; @@ -239,7 +243,7 @@ } if (pci_mapreg_map(pa, 0x18, PCI_MAPREG_TYPE_MEM, 0, - &sc->sc_memt, &sc->sc_regh, &sc->sc_reg, &sc->sc_regsize)) { + &tag, &sc->sc_regh, &sc->sc_reg, &sc->sc_regsize)) { aprint_error("%s: failed to map registers.\n", device_xname(sc->sc_dev)); } @@ -308,6 +312,7 @@ DPRINTF("reg: %08x\n", reg); if (reg & R128_LVDS_ON) { sc->sc_have_backlight = 1; + sc->sc_bl_on = 1; sc->sc_bl_level = 255 - ((reg & R128_LEVEL_MASK) >> R128_LEVEL_SHIFT); pmf_event_register(sc->sc_dev, PMFE_DISPLAY_BRIGHTNESS_UP, @@ -387,21 +392,33 @@ case WSDISPLAYIO_GETPARAM: param = (struct wsdisplay_param *)data; - if ((param->param == WSDISPLAYIO_PARAM_BACKLIGHT) && - (sc->sc_have_backlight != 0)) { + if (sc->sc_have_backlight == 0) + return EPASSTHROUGH; + switch (param->param) { + case WSDISPLAYIO_PARAM_BRIGHTNESS: param->min = 0; param->max = 255; param->curval = sc->sc_bl_level; return 0; + case WSDISPLAYIO_PARAM_BACKLIGHT: + param->min = 0; + param->max = 1; + param->curval = sc->sc_bl_on; + return 0; } return EPASSTHROUGH; case WSDISPLAYIO_SETPARAM: param = (struct wsdisplay_param *)data; - if ((param->param == WSDISPLAYIO_PARAM_BACKLIGHT) && - (sc->sc_have_backlight != 0)) { + if (sc->sc_have_backlight == 0) + return EPASSTHROUGH; + switch (param->param) { + case WSDISPLAYIO_PARAM_BRIGHTNESS: r128fb_set_backlight(sc, param->curval); return 0; + case WSDISPLAYIO_PARAM_BACKLIGHT: + r128fb_switch_backlight(sc, param->curval); + return 0; } return EPASSTHROUGH; } @@ -925,17 +942,43 @@ { uint32_t reg; + /* + * should we do nothing when backlight is off, should we just store the + * level and use it when turning back on or should we just flip sc_bl_on + * and turn the backlight on? + * For now turn it on so a crashed screensaver can't get the user stuck + * with a dark screen as long as hotkeys work + */ if (level > 255) level = 255; if (level < 0) level = 0; if (level == sc->sc_bl_level) return; sc->sc_bl_level = level; + if (sc->sc_bl_on == 0) + sc->sc_bl_on = 1; level = 255 - level; reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL); reg &= ~R128_LEVEL_MASK; reg |= level << R128_LEVEL_SHIFT; bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL, reg); - DPRINTF("level: %d reg %08x\n", level, reg); + DPRINTF("backlight level: %d reg %08x\n", level, reg); +} + +static void +r128fb_switch_backlight(struct r128fb_softc *sc, int on) +{ + uint32_t reg; + int level; + + if (on == sc->sc_bl_on) + return; + sc->sc_bl_on = on; + reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL); + reg &= ~R128_LEVEL_MASK; + level = on ? 255 - sc->sc_bl_level : 255; + reg |= level << R128_LEVEL_SHIFT; + bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL, reg); + DPRINTF("backlight state: %d reg %08x\n", on, reg); }