diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2009-06-03 20:27:39 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2009-06-03 20:27:39 +0000 |
commit | 76e75159d25ac0cfa6fff1317a7a6108bff7bebe (patch) | |
tree | e69348c6e1e15c1f24998505d384ce94ccb3d746 /sys/dev/acpi | |
parent | 579f4930009e67c9274304f8133f75797a0dbec8 (diff) |
Make sure that the brightness value sent to acpi is one of the values
in the BCL array.
Also add a missing acpivout_get_brightness() call
in acpivout_brightness_cycle().
ok and suggestions from pirofti@, ok miod@ deraadt@ marco@.
Diffstat (limited to 'sys/dev/acpi')
-rw-r--r-- | sys/dev/acpi/acpivout.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/sys/dev/acpi/acpivout.c b/sys/dev/acpi/acpivout.c index d6776719562..7ead669d026 100644 --- a/sys/dev/acpi/acpivout.c +++ b/sys/dev/acpi/acpivout.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpivout.c,v 1.1 2009/06/03 00:36:59 pirofti Exp $ */ +/* $OpenBSD: acpivout.c,v 1.2 2009/06/03 20:27:38 matthieu Exp $ */ /* * Copyright (c) 2009 Paul Irofti <pirofti@openbsd.org> * @@ -74,6 +74,7 @@ void acpivout_brightness_up(struct acpivout_softc *); void acpivout_brightness_down(struct acpivout_softc *); void acpivout_brightness_zero(struct acpivout_softc *); int acpivout_get_brightness(struct acpivout_softc *); +int acpivout_find_brightness(struct acpivout_softc *, int); void acpivout_set_brightness(struct acpivout_softc *, int); void acpivout_get_bcl(struct acpivout_softc *); @@ -166,6 +167,7 @@ acpivout_brightness_cycle(struct acpivout_softc *sc) if (sc->sc_bcl_len == 0) return; + cur_level = acpivout_get_brightness(sc); if (cur_level == sc->sc_bcl[sc->sc_bcl_len - 1]) acpivout_brightness_zero(sc); else @@ -232,11 +234,26 @@ acpivout_get_brightness(struct acpivout_softc *sc) return (level); } +int +acpivout_find_brightness(struct acpivout_softc *sc, int level) +{ + int i, mid; + + for (i = 0; i < sc->sc_bcl_len - 1; i++) { + mid = sc->sc_bcl[i] + (sc->sc_bcl[i+1] - sc->sc_bcl[i]) / 2; + if (sc->sc_bcl[i] <= level && level <= mid) + return sc->sc_bcl[i]; + if (mid < level && level <= sc->sc_bcl[i+1]) + return sc->sc_bcl[i+1]; + } + return sc->sc_bcl[i]; +} + void acpivout_set_brightness(struct acpivout_softc *sc, int level) { struct aml_value args, res; - + memset(&args, 0, sizeof(args)); args.v_integer = level; args.type = AML_OBJTYPE_INTEGER; @@ -313,7 +330,7 @@ acpivout_get_param(struct wsdisplay_param *dp) } if (sc != NULL && sc->sc_bcl_len != 0) { dp->min = sc->sc_bcl[0]; - dp->max = sc->sc_bcl[sc->sc_bcl_len - 1]; + dp->max = sc->sc_bcl[sc->sc_bcl_len - 1]; dp->curval = acpivout_get_brightness(sc); return 0; } @@ -327,7 +344,7 @@ int acpivout_set_param(struct wsdisplay_param *dp) { struct acpivout_softc *sc = NULL; - int i; + int i, exact; switch (dp->param) { case WSDISPLAYIO_PARAM_BRIGHTNESS: @@ -343,7 +360,8 @@ acpivout_set_param(struct wsdisplay_param *dp) break; } if (sc != NULL && sc->sc_bcl_len != 0) { - acpivout_set_brightness(sc, dp->curval); + exact = acpivout_find_brightness(sc, dp->curval); + acpivout_set_brightness(sc, exact); return 0; } return -1; |