Module Name: src Committed By: macallan Date: Wed Jul 13 22:47:29 UTC 2011
Modified Files: src/sys/dev/wsfb: genfb.c genfbvar.h Log Message: use callbacks that match the ioctl() interface to control backlight To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/dev/wsfb/genfb.c cvs rdiff -u -r1.20 -r1.21 src/sys/dev/wsfb/genfbvar.h 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/wsfb/genfb.c diff -u src/sys/dev/wsfb/genfb.c:1.41 src/sys/dev/wsfb/genfb.c:1.42 --- src/sys/dev/wsfb/genfb.c:1.41 Thu Jun 2 02:33:42 2011 +++ src/sys/dev/wsfb/genfb.c Wed Jul 13 22:47:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: genfb.c,v 1.41 2011/06/02 02:33:42 macallan Exp $ */ +/* $NetBSD: genfb.c,v 1.42 2011/07/13 22:47:29 macallan Exp $ */ /*- * Copyright (c) 2007 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.41 2011/06/02 02:33:42 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.42 2011/07/13 22:47:29 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -64,6 +64,8 @@ #define GPRINTF aprint_verbose #endif +#define GENFB_BRIGHTNESS_STEP 15 + static int genfb_ioctl(void *, void *, u_long, void *, int, struct lwp *); static paddr_t genfb_mmap(void *, void *, off_t, int); static void genfb_init_screen(void *, struct vcons_screen *, int, long *); @@ -75,10 +77,6 @@ static void genfb_brightness_up(device_t); static void genfb_brightness_down(device_t); -/* set backlight level */ -static void genfb_set_backlight(struct genfb_softc *, int); -/* turn backlight on and off without messing with the level */ -static void genfb_switch_backlight(struct genfb_softc *, int); extern const u_char rasops_cmap[768]; @@ -91,7 +89,7 @@ genfb_init(struct genfb_softc *sc) { prop_dictionary_t dict; - uint64_t cmap_cb, pmf_cb, mode_cb, bl_cb, fbaddr; + uint64_t cmap_cb, pmf_cb, mode_cb, bl_cb, br_cb, fbaddr; uint32_t fboffset; bool console; @@ -165,17 +163,24 @@ if (prop_dictionary_get_uint64(dict, "backlight_callback", &bl_cb)) { if (bl_cb != 0) { sc->sc_backlight = (void *)(vaddr_t)bl_cb; - sc->sc_backlight_on = 1; - aprint_naive_dev(sc->sc_dev, + aprint_naive_dev(sc->sc_dev, "enabling backlight control\n"); - sc->sc_backlight_level = - sc->sc_backlight->gpc_get_parameter( - sc->sc_backlight->gpc_cookie); - if (console) { - pmf_event_register(sc->sc_dev, + } + } + + /* optional brightness control callback */ + sc->sc_brightness = NULL; + if (prop_dictionary_get_uint64(dict, "brightness_callback", &br_cb)) { + if (br_cb != 0) { + sc->sc_brightness = (void *)(vaddr_t)br_cb; + aprint_naive_dev(sc->sc_dev, + "enabling brightness control\n"); + if (console && + sc->sc_brightness->gpc_upd_parameter != NULL) { + pmf_event_register(sc->sc_dev, PMFE_DISPLAY_BRIGHTNESS_UP, genfb_brightness_up, TRUE); - pmf_event_register(sc->sc_dev, + pmf_event_register(sc->sc_dev, PMFE_DISPLAY_BRIGHTNESS_DOWN, genfb_brightness_down, TRUE); } @@ -206,8 +211,8 @@ == false) sc->sc_want_clear = true; - aprint_verbose_dev(sc->sc_dev, "framebuffer at %p, size %dx%d," - "depth %d, stride %d\n", + aprint_verbose_dev(sc->sc_dev, "framebuffer at %p, size %dx%d, depth %d, " + "stride %d\n", sc->sc_fboffset ? (void *)(intptr_t)sc->sc_fboffset : sc->sc_fbaddr, sc->sc_width, sc->sc_height, sc->sc_depth, sc->sc_stride); @@ -341,7 +346,7 @@ struct wsdisplay_fbinfo *wdf; struct vcons_screen *ms = vd->active; struct wsdisplay_param *param; - int new_mode, error; + int new_mode, error, val; switch (cmd) { case WSDISPLAYIO_GINFO: @@ -404,35 +409,51 @@ #endif case WSDISPLAYIO_GETPARAM: param = (struct wsdisplay_param *)data; - if (sc->sc_backlight == NULL) - return EPASSTHROUGH; switch (param->param) { case WSDISPLAYIO_PARAM_BRIGHTNESS: + if (sc->sc_brightness == NULL) + return EPASSTHROUGH; param->min = 0; param->max = 255; - param->curval = sc->sc_backlight_level; - return 0; + return sc->sc_brightness->gpc_get_parameter( + sc->sc_brightness->gpc_cookie, + ¶m->curval); case WSDISPLAYIO_PARAM_BACKLIGHT: + if (sc->sc_backlight == NULL) + return EPASSTHROUGH; param->min = 0; param->max = 1; - param->curval = sc->sc_backlight_on; - return 0; + return sc->sc_backlight->gpc_get_parameter( + sc->sc_backlight->gpc_cookie, + ¶m->curval); } return EPASSTHROUGH; case WSDISPLAYIO_SETPARAM: param = (struct wsdisplay_param *)data; - if (sc->sc_backlight == NULL) - return EPASSTHROUGH; switch (param->param) { case WSDISPLAYIO_PARAM_BRIGHTNESS: - genfb_set_backlight(sc, param->curval); - return 0; + if (sc->sc_brightness == NULL) + return EPASSTHROUGH; + val = param->curval; + if (val < 0) val = 0; + if (val > 255) val = 255; + return sc->sc_brightness->gpc_set_parameter( + sc->sc_brightness->gpc_cookie, val); case WSDISPLAYIO_PARAM_BACKLIGHT: - genfb_switch_backlight(sc, param->curval); - return 0; + if (sc->sc_backlight == NULL) + return EPASSTHROUGH; + val = param->curval; + if (val < 0) val = 0; + if (val > 1) val = 1; + return sc->sc_backlight->gpc_set_parameter( + sc->sc_backlight->gpc_cookie, val); } return EPASSTHROUGH; + case WSDISPLAYIO_GET_EDID: { + struct wsdisplayio_edid_info *d = data; + return wsdisplayio_get_edid(sc->sc_dev, d); + } default: if (sc->sc_ops.genfb_ioctl) return sc->sc_ops.genfb_ioctl(sc, vs, cmd, @@ -624,51 +645,15 @@ } static void -genfb_set_backlight(struct genfb_softc *sc, int level) -{ - - KASSERT(sc->sc_backlight != NULL); - - /* - * 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_backlight_level) - return; - sc->sc_backlight_level = level; - if (sc->sc_backlight_on == 0) - sc->sc_backlight_on = 1; - sc->sc_backlight->gpc_set_parameter( - sc->sc_backlight->gpc_cookie, level); -} - -static void -genfb_switch_backlight(struct genfb_softc *sc, int on) -{ - int level; - - KASSERT(sc->sc_backlight != NULL); - - if (on == sc->sc_backlight_on) - return; - sc->sc_backlight_on = on; - level = on ? sc->sc_backlight_level : 0; - sc->sc_backlight->gpc_set_parameter( - sc->sc_backlight->gpc_cookie, level); -} - - -static void genfb_brightness_up(device_t dev) { struct genfb_softc *sc = device_private(dev); - genfb_set_backlight(sc, sc->sc_backlight_level + 8); + KASSERT(sc->sc_brightness != NULL && + sc->sc_brightness->gpc_upd_parameter != NULL); + + (void)sc->sc_brightness->gpc_upd_parameter( + sc->sc_brightness->gpc_cookie, GENFB_BRIGHTNESS_STEP); } static void @@ -676,7 +661,11 @@ { struct genfb_softc *sc = device_private(dev); - genfb_set_backlight(sc, sc->sc_backlight_level - 8); + KASSERT(sc->sc_brightness != NULL && + sc->sc_brightness->gpc_upd_parameter != NULL); + + (void)sc->sc_brightness->gpc_upd_parameter( + sc->sc_brightness->gpc_cookie, - GENFB_BRIGHTNESS_STEP); } void Index: src/sys/dev/wsfb/genfbvar.h diff -u src/sys/dev/wsfb/genfbvar.h:1.20 src/sys/dev/wsfb/genfbvar.h:1.21 --- src/sys/dev/wsfb/genfbvar.h:1.20 Thu Jun 2 02:33:42 2011 +++ src/sys/dev/wsfb/genfbvar.h Wed Jul 13 22:47:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: genfbvar.h,v 1.20 2011/06/02 02:33:42 macallan Exp $ */ +/* $NetBSD: genfbvar.h,v 1.21 2011/07/13 22:47:29 macallan Exp $ */ /*- * Copyright (c) 2007 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfbvar.h,v 1.20 2011/06/02 02:33:42 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfbvar.h,v 1.21 2011/07/13 22:47:29 macallan Exp $"); #ifndef GENFBVAR_H #define GENFBVAR_H @@ -66,10 +66,22 @@ void (*gcc_set_mapreg)(void *, int, int, int, int); }; -struct genfb_parameter_callback{ +/* + * Integer parameter provider. Each callback shall return 0 on success, + * and an error(2) number on failure. The gpc_upd_parameter callback is + * optional (i.e. it can be NULL). + * + * This structure is used for backlight and brightness control. The + * expected parameter range is: + * + * [0, 1] for backlight + * [0, 255] for brightness + */ +struct genfb_parameter_callback { void *gpc_cookie; - void (*gpc_set_parameter)(void *, int); - int (*gpc_get_parameter)(void *); + int (*gpc_get_parameter)(void *, int *); + int (*gpc_set_parameter)(void *, int); + int (*gpc_upd_parameter)(void *, int); }; struct genfb_pmf_callback { @@ -92,6 +104,7 @@ struct genfb_colormap_callback *sc_cmcb; struct genfb_pmf_callback *sc_pmfcb; struct genfb_parameter_callback *sc_backlight; + struct genfb_parameter_callback *sc_brightness; struct genfb_mode_callback *sc_modecb; int sc_backlight_level, sc_backlight_on; void *sc_fbaddr; /* kva */