What Paul said!

I have been looking at the diff but don't have the gear to test with.
So please test this and report back.

On Thu, Jun 16, 2011 at 10:58:56AM +0300, Paul Irofti wrote:
> People with Toshiba's should test now so that they don't cry later.
> 
> Or is there nobody using toshiba nowadays?! Come on people!
> 
> On Wed, Jun 15, 2011 at 09:35:24PM +0200, Javier Vazquez wrote:
> > Hello,
> >     Sending toshiba patch file with the new changes. 
> > 
> > Thanks,
> > Javier.
> > 
> > On Wed, Jun 15, 2011 at 11:03:49AM +0300, Paul Irofti wrote:
> > > On Tue, Jun 14, 2011 at 10:07:54PM +0200, Javier Vazquez wrote:
> > > > Hello again,
> > > >         Sending toshiba acpi patch as Paul has suggested.
> > > 
> > > Cool!
> > > 
> > > [--snip--]
> > > 
> > > > Index: dev/acpi/acpi.c
> > > > ===================================================================
> > > > RCS file: /cvs/src/sys/dev/acpi/acpi.c,v
> > > > retrieving revision 1.224
> > > > diff -u -p -r1.224 acpi.c
> > > > --- dev/acpi/acpi.c     27 Apr 2011 20:55:42 -0000      1.224
> > > > +++ dev/acpi/acpi.c     14 Jun 2011 20:02:44 -0000
> > > > @@ -93,6 +93,7 @@ void  acpi_pbtn_task(void *, int);
> > > >  #ifndef SMALL_KERNEL
> > > >  
> > > >  int    acpi_thinkpad_enabled;
> > > > +int    acpi_toshiba_enabled;
> > > >  int    acpi_saved_spl;
> > > >  int    acpi_enabled;
> > > >  
> > > > @@ -781,8 +782,8 @@ acpi_attach(struct device *parent, struc
> > > >         /* check if we're running on a sony */
> > > >         aml_find_node(&aml_root, "GBRT", acpi_foundsony, sc);
> > > >  
> > > > -       /* attach video only if this is not a stinkpad */
> > > > -       if (!acpi_thinkpad_enabled)
> > > > +       /* attach video only if this is not a stinkpad or toshiba */
> > > > +       if (!acpi_thinkpad_enabled || !acpi_toshiba_enabled)
> > > >                 aml_find_node(&aml_root, "_DOS", acpi_foundvideo, sc);
> > > 
> > > You forgot to fix this into:
> > > + if (!acpi_thinkpad_enabled && !acpi_toshiba_enabled)
> 
> > ? toshiba_acpi.patch
> > Index: arch/amd64/conf/GENERIC
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v
> > retrieving revision 1.319
> > diff -u -p -r1.319 GENERIC
> > --- arch/amd64/conf/GENERIC 30 May 2011 22:03:47 -0000      1.319
> > +++ arch/amd64/conf/GENERIC 15 Jun 2011 19:35:23 -0000
> > @@ -52,6 +52,7 @@ acpimcfg* at acpi?
> >  acpiasus*  at acpi?
> >  acpisony*  at acpi?
> >  acpithinkpad*      at acpi?
> > +acpitoshiba*       at acpi?
> >  acpivideo* at acpi?
> >  acpivout*  at acpivideo?
> >  acpipwrres*        at acpi?
> > Index: arch/i386/conf/GENERIC
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v
> > retrieving revision 1.716
> > diff -u -p -r1.716 GENERIC
> > --- arch/i386/conf/GENERIC  30 May 2011 22:03:47 -0000      1.716
> > +++ arch/i386/conf/GENERIC  15 Jun 2011 19:35:24 -0000
> > @@ -62,6 +62,7 @@ acpitz*           at acpi?
> >  acpiasus*  at acpi?
> >  acpisony*  at acpi?
> >  acpithinkpad*      at acpi?
> > +acpitoshiba*       at acpi?
> >  acpivideo* at acpi?
> >  acpivout*  at acpivideo?
> >  acpipwrres*        at acpi?
> > Index: dev/acpi/acpi.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/acpi/acpi.c,v
> > retrieving revision 1.224
> > diff -u -p -r1.224 acpi.c
> > --- dev/acpi/acpi.c 27 Apr 2011 20:55:42 -0000      1.224
> > +++ dev/acpi/acpi.c 15 Jun 2011 19:35:27 -0000
> > @@ -93,6 +93,7 @@ void      acpi_pbtn_task(void *, int);
> >  #ifndef SMALL_KERNEL
> >  
> >  int        acpi_thinkpad_enabled;
> > +int        acpi_toshiba_enabled;
> >  int        acpi_saved_spl;
> >  int        acpi_enabled;
> >  
> > @@ -781,8 +782,8 @@ acpi_attach(struct device *parent, struc
> >     /* check if we're running on a sony */
> >     aml_find_node(&aml_root, "GBRT", acpi_foundsony, sc);
> >  
> > -   /* attach video only if this is not a stinkpad */
> > -   if (!acpi_thinkpad_enabled)
> > +   /* attach video only if this is not a stinkpad or toshiba */
> > +   if (!acpi_thinkpad_enabled && !acpi_toshiba_enabled)
> >             aml_find_node(&aml_root, "_DOS", acpi_foundvideo, sc);
> >  
> >     /* create list of devices we want to query when APM come in */
> > @@ -2334,6 +2335,13 @@ acpi_foundhid(struct aml_node *node, voi
> >             acpi_thinkpad_enabled = 1;
> >     } else if (!strcmp(dev, ACPI_DEV_ASUSAIBOOSTER))
> >             aaa.aaa_name = "aibs";
> > +   else if (!strcmp(dev, ACPI_DEV_TOSHIBA_LIBRETTO) ||
> > +       !strcmp(dev, ACPI_DEV_TOSHIBA_DYNABOOK) ||
> > +       !strcmp(dev, ACPI_DEV_TOSHIBA_SPA40)) {
> > +           aaa.aaa_name = "acpitoshiba";
> > +           acpi_toshiba_enabled = 1;
> > +   }
> > +
> >  
> >     if (aaa.aaa_name)
> >             config_found(self, &aaa, acpi_print);
> > Index: dev/acpi/acpireg.h
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/acpi/acpireg.h,v
> > retrieving revision 1.25
> > diff -u -p -r1.25 acpireg.h
> > --- dev/acpi/acpireg.h      27 Apr 2011 20:55:42 -0000      1.25
> > +++ dev/acpi/acpireg.h      15 Jun 2011 19:35:27 -0000
> > @@ -716,5 +716,8 @@ struct acpi_ivrs {
> >  #define ACPI_DEV_IBM       "IBM0068"       /* IBM ThinkPad support */
> >  #define ACPI_DEV_LENOVO    "LEN0068"       /* Lenovo ThinkPad support */
> >  #define ACPI_DEV_ASUSAIBOOSTER     "ATK0110"       /* ASUSTeK AI Booster */
> > +#define ACPI_DEV_TOSHIBA_LIBRETTO  "TOS6200"       /* Toshiba Libretto 
> > support */
> > +#define ACPI_DEV_TOSHIBA_DYNABOOK  "TOS6207"       /* Toshiba Dynabook 
> > support */
> > +#define ACPI_DEV_TOSHIBA_SPA40     "TOS6208"       /* Toshiba SPA40 
> > support */
> >  
> >  #endif     /* !_DEV_ACPI_ACPIREG_H_ */
> > Index: dev/acpi/acpitoshiba.c
> > ===================================================================
> > RCS file: dev/acpi/acpitoshiba.c
> > diff -N dev/acpi/acpitoshiba.c
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ dev/acpi/acpitoshiba.c  15 Jun 2011 19:35:27 -0000
> > @@ -0,0 +1,529 @@
> > +/*-
> > + * Copyright (c) 2003 Hiroyuki Aizu <a...@navi.org>
> > + * All rights reserved.
> > + *
> > + * Redistribution and use in source and binary forms, with or without
> > + * modification, are permitted provided that the following conditions
> > + * are met:
> > + * 1. Redistributions of source code must retain the above copyright
> > + *    notice, this list of conditions and the following disclaimer.
> > + * 2. Redistributions in binary form must reproduce the above copyright
> > + *    notice, this list of conditions and the following disclaimer in the
> > + *    documentation and/or other materials provided with the distribution.
> > + *
> > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
> > PURPOSE
> > + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
> > CONSEQUENTIAL
> > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
> > STRICT
> > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 
> > WAY
> > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> > + * SUCH DAMAGE.
> > + *
> > + */
> > +#include <sys/param.h>
> > +#include <sys/systm.h>
> > +#include <sys/proc.h>
> > +
> > +#include <dev/acpi/acpireg.h>
> > +#include <dev/acpi/acpivar.h>
> > +#include <dev/acpi/acpidev.h>
> > +#include <dev/acpi/amltypes.h>
> > +#include <dev/acpi/dsdt.h>
> > +
> > +#include <machine/apmvar.h>
> > +#include <dev/wscons/wsconsio.h>
> > +
> > +/*
> > + * Toshiba HCI interface definitions
> > + *
> > + * HCI is Toshiba's "Hardware Control Interface" which is supposed to
> > + * be uniform across all their models.     Ideally we would just call
> > + * dedicated ACPI methods instead of using this primitive interface.
> > + * However, the ACPI methods seem to be incomplete in some areas (for
> > + * example they allow setting, but not reading, the LCD brightness
> > + * value), so this is still useful.
> > + */
> > +#define    METHOD_HCI                      "GHCI"
> > +#define    METHOD_HCI_ENABLE               "ENAB"
> > +
> > +/* Operations */
> > +#define    HCI_SET                         0xFF00
> > +#define    HCI_GET                         0xFE00
> > +
> > +/* Functions */
> > +#define    HCI_REG_SYSTEM_EVENT            0x0016
> > +#define    HCI_REG_VIDEO_OUTPUT            0x001C
> > +#define    HCI_REG_LCD_BRIGHTNESS          0x002A
> > +
> > +/* Field definitions */
> > +#define    HCI_LCD_BRIGHTNESS_BITS         3
> > +#define    HCI_LCD_BRIGHTNESS_SHIFT        (16 - HCI_LCD_BRIGHTNESS_BITS)
> > +#define    HCI_LCD_BRIGHTNESS_MAX          ((1 << HCI_LCD_BRIGHTNESS_BITS) 
> > - 1)
> > +#define    HCI_LCD_BRIGHTNESS_MIN          0
> > +#define    HCI_VIDEO_OUTPUT_FLAG           0x0100
> > +#define    HCI_VIDEO_OUTPUT_CYCLE_MIN      0
> > +#define    HCI_VIDEO_OUTPUT_CYCLE_MAX      7
> > +
> > +/* HCI register definitions */
> > +#define    HCI_WORDS                       6 /* Number of register */
> > +#define    HCI_REG_AX                      0 /* Operation, then return 
> > value */
> > +#define    HCI_REG_BX                      1 /* Function */
> > +#define    HCI_REG_CX                      2 /* Argument (in or out) */
> > +
> > +/* Return codes */
> > +#define    HCI_FAILURE                     -1
> > +#define    HCI_SUCCESS                     0
> > +
> > +/* Toshiba fn_keys events */
> > +#define    FN_KEY_VIDEO_OUTPUT             0x01BF
> > +#define    FN_KEY_BRIGHTNESS_DOWN          0x01C0
> > +#define    FN_KEY_BRIGHTNESS_UP            0x01C1
> > +
> > +struct acpitoshiba_softc {
> > +   struct device            sc_dev;
> > +   struct acpi_softc       *sc_acpi;
> > +   struct aml_node         *sc_devnode;
> > +};
> > +
> > +int        toshiba_enable_events(struct acpitoshiba_softc *);
> > +int        toshiba_read_events(struct acpitoshiba_softc *);
> > +int        toshiba_match(struct device *, void *, void *);
> > +void       toshiba_attach(struct device *, struct device *, void *);
> > +int        toshiba_hotkey(struct aml_node *, int, void *);
> > +int        toshiba_get_brightness(struct acpitoshiba_softc *, u_int32_t *);
> > +int        toshiba_set_brightness(struct acpitoshiba_softc *, u_int32_t *);
> > +int        toshiba_get_video_output(struct acpitoshiba_softc *, u_int32_t 
> > *);
> > +int        toshiba_set_video_output(struct acpitoshiba_softc *, u_int32_t 
> > *);
> > +int        toshiba_find_brightness(struct acpitoshiba_softc *, int *);
> > +int        toshiba_fn_key_brightness_up(struct acpitoshiba_softc *);
> > +int        toshiba_fn_key_brightness_down(struct acpitoshiba_softc *);
> > +int        toshiba_fn_key_video_output(struct acpitoshiba_softc *);
> > +
> > +/* wconsole hook functions */
> > +int        acpitoshiba_get_param(struct wsdisplay_param *);
> > +int        acpitoshiba_set_param(struct wsdisplay_param *);
> > +extern int (*ws_get_param)(struct wsdisplay_param *);
> > +extern int (*ws_set_param)(struct wsdisplay_param *);
> > +int        get_param_brightness(struct wsdisplay_param *);
> > +int        set_param_brightness(struct wsdisplay_param *);
> > +
> > +struct cfattach acpitoshiba_ca = {
> > +   sizeof(struct acpitoshiba_softc), toshiba_match, toshiba_attach
> > +};
> > +
> > +struct cfdriver acpitoshiba_cd = {
> > +   NULL, "acpitoshiba", DV_DULL
> > +};
> > +
> > +int
> > +get_param_brightness(struct wsdisplay_param *dp)
> > +{
> > +   struct acpitoshiba_softc        *sc = NULL;
> > +   int i, ret;
> > +
> > +   for (i = 0; i < acpitoshiba_cd.cd_ndevs; i++) {
> > +           if (acpitoshiba_cd.cd_devs[i] == NULL)
> > +                   continue;
> > +
> > +           sc = (struct acpitoshiba_softc *)acpitoshiba_cd.cd_devs[i];
> > +   }
> > +
> > +   if (sc != NULL) {
> > +           rw_enter_write(&sc->sc_acpi->sc_lck);
> > +
> > +           /* default settings */
> > +           dp->min = HCI_LCD_BRIGHTNESS_MIN;
> > +           dp->max = HCI_LCD_BRIGHTNESS_MAX;
> > +
> > +           ret = toshiba_get_brightness(sc, &dp->curval);
> > +
> > +           rw_exit_write(&sc->sc_acpi->sc_lck);
> > +
> > +           if ((dp->curval != -1) && (ret != HCI_FAILURE) )
> > +                   return (0);
> > +   }
> > +
> > +   return (1);
> > +}
> > +
> > +int
> > +acpitoshiba_get_param(struct wsdisplay_param *dp)
> > +{
> > +   int ret;
> > +
> > +   switch (dp->param) {
> > +   case WSDISPLAYIO_PARAM_BRIGHTNESS:
> > +           ret = get_param_brightness(dp);
> > +           return (ret);
> > +   default:
> > +           return (1);
> > +   }
> > +}
> > +
> > +int
> > +set_param_brightness(struct wsdisplay_param *dp)
> > +{
> > +   struct acpitoshiba_softc        *sc = NULL;
> > +   int i, ret;
> > +
> > +   for (i = 0; i < acpitoshiba_cd.cd_ndevs; i++) {
> > +           if (acpitoshiba_cd.cd_devs[i] == NULL)
> > +                   continue;
> > +
> > +           sc = (struct acpitoshiba_softc *)acpitoshiba_cd.cd_devs[i];
> > +   }
> > +
> > +   if (sc != NULL) {
> > +           rw_enter_write(&sc->sc_acpi->sc_lck);
> > +           ret = toshiba_find_brightness(sc, &dp->curval);
> > +           rw_exit_write(&sc->sc_acpi->sc_lck);
> > +
> > +           if ((dp->curval != -1) && ( ret != HCI_FAILURE))
> > +                   return (0);
> > +           
> > +   }
> > +
> > +   return (1);
> > +}
> > +
> > +int
> > +acpitoshiba_set_param(struct wsdisplay_param *dp)
> > +{
> > +   int ret;
> > +
> > +   switch (dp->param) {
> > +   case WSDISPLAYIO_PARAM_BRIGHTNESS:
> > +           ret = set_param_brightness(dp);
> > +           return (ret);
> > +   default:
> > +           return (1);
> > +   }
> > +}
> > +
> > +int
> > +toshiba_find_brightness(struct acpitoshiba_softc *sc, int *new_blevel)
> > +{
> > +   int ret, current_blevel;
> > +
> > +   ret = toshiba_get_brightness(sc, &current_blevel);
> > +   if ( ret != HCI_SUCCESS)
> > +           return (1);
> > +
> > +   if ( current_blevel != *new_blevel) {
> > +           if ( *new_blevel >= HCI_LCD_BRIGHTNESS_MAX)
> > +                   *new_blevel = current_blevel = HCI_LCD_BRIGHTNESS_MAX;
> > +           else if (*new_blevel <= HCI_LCD_BRIGHTNESS_MIN)
> > +                   *new_blevel = current_blevel = HCI_LCD_BRIGHTNESS_MIN;
> > +           else
> > +                   current_blevel = *new_blevel;
> > +
> > +           ret = toshiba_set_brightness(sc, &current_blevel);
> > +           if ( ret != HCI_SUCCESS)
> > +                   return (1);
> > +   }
> > +
> > +   return (0);
> > +}
> > +
> > +int
> > +toshiba_match(struct device *parent, void *match, void *aux)
> > +{
> > +      struct acpi_attach_args *aa = aux;
> > +      struct cfdata              *cf = match;
> > +
> > +   if ( aa->aaa_name == NULL ||
> > +      strcmp(aa->aaa_name, cf->cf_driver->cd_name) != 0 ||
> > +      aa->aaa_table != NULL)
> > +         return (0);
> > +
> > +      return (1);
> > +
> > +}
> > +
> > +int
> > +toshiba_enable_events(struct acpitoshiba_softc *sc)
> > +{
> > +   if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI_ENABLE,
> > +               0, NULL, NULL)) {
> > +           printf("%s: couldn't toggle METHOD_HCI_ENABLE\n", DEVNAME(sc));
> > +           return (HCI_FAILURE);
> > +   }
> > +
> > +   return (HCI_SUCCESS);
> > +}
> > +
> > +int
> > +toshiba_read_events(struct acpitoshiba_softc *sc)
> > +{
> > +   struct aml_value args[HCI_WORDS];
> > +   struct aml_value res;
> > +   int i, val;
> > +
> > +   bzero(args, sizeof(args));
> > +   bzero(&res, sizeof(res));
> > +
> > +   for (i = 0; i < HCI_WORDS; ++i)
> > +           args[i].type = AML_OBJTYPE_INTEGER;
> > +
> > +   args[HCI_REG_AX].v_integer = HCI_GET;
> > +   args[HCI_REG_BX].v_integer = HCI_REG_SYSTEM_EVENT;
> > +
> > +   if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI,
> > +               i, args, &res)) {
> > +           printf("%s: couldn't toggle METHOD_HCI\n", DEVNAME(sc));
> > +           return (HCI_FAILURE);
> > +   }
> > +
> > +   /*
> > +    * We receive a package type so we need to get the event
> > +    * value from the HCI_REG_CX.
> > +    */
> > +   val = aml_val2int(res.v_package[HCI_REG_CX]);
> > +   aml_freevalue(&res);
> > +
> > +   return (val);
> > +}
> > +
> > +void
> > +toshiba_attach(struct device *parent, struct device *self, void *aux)
> > +{
> > +   struct acpitoshiba_softc *sc = (struct acpitoshiba_softc *)self;
> > +   struct acpi_attach_args *aa = aux;
> > +   int ret;
> > +
> > +   sc->sc_acpi = (struct acpi_softc *)parent;
> > +   sc->sc_devnode = aa->aaa_node;
> > +
> > +   printf("\n");
> > +
> > +   /* enable events and hotkeys */
> > +   ret = toshiba_enable_events(sc);
> > +   if ( ret != HCI_FAILURE) {
> > +           /* Run toshiba_hotkey on button presses */
> > +           aml_register_notify(sc->sc_devnode, aa->aaa_dev,
> > +                           toshiba_hotkey, sc, ACPIDEV_NOPOLL);
> > +
> > +           /* wsconsctl purpose */
> > +           ws_get_param = acpitoshiba_get_param;
> > +           ws_set_param = acpitoshiba_set_param;
> > +   }
> > +
> > +}
> > +
> > +int
> > +toshiba_fn_key_brightness_up(struct acpitoshiba_softc *sc)
> > +{
> > +   u_int32_t brightness_level;
> > +   int ret;
> > +
> > +   ret = toshiba_get_brightness(sc, &brightness_level);
> > +   if ( ret != HCI_FAILURE) {
> > +
> > +           if (brightness_level++ == HCI_LCD_BRIGHTNESS_MAX)
> > +                   brightness_level = HCI_LCD_BRIGHTNESS_MAX;
> > +           else
> > +                   ret = toshiba_set_brightness(sc, &brightness_level);
> > +   }
> > +
> > +   return (ret);
> > +}
> > +
> > +int
> > +toshiba_fn_key_brightness_down(struct acpitoshiba_softc *sc)
> > +{
> > +   u_int32_t brightness_level;
> > +   int ret;
> > +
> > +   ret = toshiba_get_brightness(sc, &brightness_level);
> > +   if ( ret != HCI_FAILURE) {
> > +           if (brightness_level-- == HCI_LCD_BRIGHTNESS_MIN)
> > +                   brightness_level = HCI_LCD_BRIGHTNESS_MIN;
> > +           else
> > +                   ret = toshiba_set_brightness(sc, &brightness_level);
> > +   }
> > +
> > +   return (ret);
> > +}
> > +
> > +int
> > +toshiba_fn_key_video_output(struct acpitoshiba_softc *sc)
> > +{
> > +   u_int32_t video_output;
> > +   int ret;
> > +
> > +   ret = toshiba_get_video_output(sc, &video_output);
> > +   if ( ret != HCI_FAILURE) {
> > +           video_output = (video_output + 1) % HCI_VIDEO_OUTPUT_CYCLE_MAX;
> > +
> > +           ret = toshiba_set_video_output(sc, &video_output);
> > +   }
> > +
> > +   return (ret);
> > +   
> > +}
> > +
> > +int
> > +toshiba_hotkey(struct aml_node *node, int notify, void *arg)
> > +{
> > +   struct acpitoshiba_softc *sc = arg;
> > +   int event, ret;
> > +
> > +   event = toshiba_read_events(sc);
> > +   if (!event)
> > +           return (0);
> > +
> > +   switch (event) {
> > +   case FN_KEY_BRIGHTNESS_UP:
> > +           /* Increase brightness */
> > +           ret = toshiba_fn_key_brightness_up(sc);
> > +           break;
> > +   case FN_KEY_BRIGHTNESS_DOWN:
> > +           /* Decrease brightness */
> > +           ret = toshiba_fn_key_brightness_down(sc);
> > +           break;
> > +   case FN_KEY_VIDEO_OUTPUT:
> > +           /* Cycle through video outputs. */
> > +           ret = toshiba_fn_key_video_output(sc);
> > +           break;
> > +   default:
> > +           break;
> > +   }
> > +
> > +   if ( ret != HCI_SUCCESS)
> > +           return (1);
> > +
> > +   return (0);
> > +}
> > +
> > +int
> > +toshiba_set_brightness(struct acpitoshiba_softc *sc, u_int32_t *brightness)
> > +{
> > +   struct aml_value args[HCI_WORDS];
> > +   int i;
> > +
> > +   bzero(args, sizeof(args));
> > +
> > +   for (i = 0; i < HCI_WORDS; ++i)
> > +           args[i].type = AML_OBJTYPE_INTEGER;
> > +
> > +   if ((*brightness < HCI_LCD_BRIGHTNESS_MIN) ||
> > +       (*brightness > HCI_LCD_BRIGHTNESS_MAX))
> > +                  return (HCI_FAILURE);
> > +
> > +   *brightness <<= HCI_LCD_BRIGHTNESS_SHIFT;
> > +
> > +   args[HCI_REG_AX].v_integer = HCI_SET;
> > +   args[HCI_REG_BX].v_integer = HCI_REG_LCD_BRIGHTNESS;
> > +   args[HCI_REG_CX].v_integer = *brightness;
> > +
> > +   if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI,
> > +       i, args, NULL)) {
> > +           printf("%s: set brightness failed\n", DEVNAME(sc));
> > +           return (HCI_FAILURE);
> > +   }
> > +
> > +   return (HCI_SUCCESS);
> > +}
> > +
> > +int
> > +toshiba_get_brightness(struct acpitoshiba_softc *sc, u_int32_t *brightness)
> > +{
> > +   struct aml_value args[HCI_WORDS];
> > +   struct aml_value res;
> > +   int i;
> > +
> > +   bzero(args, sizeof(args));
> > +   bzero(&res, sizeof(res));
> > +
> > +   for (i = 0; i < HCI_WORDS; ++i)
> > +           args[i].type = AML_OBJTYPE_INTEGER;
> > +
> > +   args[HCI_REG_AX].v_integer = HCI_GET;
> > +   args[HCI_REG_BX].v_integer = HCI_REG_LCD_BRIGHTNESS;
> > +
> > +   if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI,
> > +       i, args, &res)) {
> > +           printf("%s: get brightness failed\n", DEVNAME(sc));
> > +           return (HCI_FAILURE);
> > +   }
> > +
> > +   /*
> > +    * We receive a package type so we need to get the event
> > +    * value from the HCI_REG_CX.
> > +    */
> > +   *brightness = aml_val2int(res.v_package[HCI_REG_CX]);
> > +
> > +   *brightness >>= HCI_LCD_BRIGHTNESS_SHIFT;
> > +
> > +   aml_freevalue(&res);
> > +
> > +   return (HCI_SUCCESS);
> > +}
> > +
> > +int
> > +toshiba_get_video_output(struct acpitoshiba_softc *sc, u_int32_t 
> > *video_output)
> > +{
> > +   struct aml_value res, args[HCI_WORDS];
> > +   int i;
> > +
> > +   bzero(args, sizeof(args));
> > +   bzero(&res, sizeof(res));
> > +
> > +   for (i = 0; i < HCI_WORDS; ++i)
> > +           args[i].type = AML_OBJTYPE_INTEGER;
> > +
> > +   args[HCI_REG_AX].v_integer = HCI_GET;
> > +   args[HCI_REG_BX].v_integer = HCI_REG_VIDEO_OUTPUT;
> > +
> > +   if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI,
> > +       i, args, &res)) {
> > +           printf("%s: get video output failed\n", DEVNAME(sc));
> > +           return (HCI_FAILURE);
> > +   }
> > +
> > +   /*
> > +    * We receive a package type so we need to get the event
> > +    * value from the HCI_REG_CX.
> > +    */
> > +   *video_output = aml_val2int(res.v_package[HCI_REG_CX]);
> > +
> > +   *video_output &= 0xff;
> > +
> > +   aml_freevalue(&res);
> > +
> > +   return (HCI_SUCCESS);
> > +}
> > +
> > +int
> > +toshiba_set_video_output(struct acpitoshiba_softc *sc, u_int32_t 
> > *video_output)
> > +{
> > +   struct aml_value args[HCI_WORDS];
> > +   int i;
> > +
> > +   bzero(args, sizeof(args));
> > +
> > +   if ((*video_output < HCI_VIDEO_OUTPUT_CYCLE_MIN) ||
> > +       (*video_output > HCI_VIDEO_OUTPUT_CYCLE_MAX))
> > +           return (HCI_FAILURE);
> > +
> > +   *video_output |= HCI_VIDEO_OUTPUT_FLAG;
> > +
> > +   for (i = 0; i < HCI_WORDS; ++i)
> > +           args[i].type = AML_OBJTYPE_INTEGER;
> > +
> > +   args[HCI_REG_AX].v_integer = HCI_SET;
> > +   args[HCI_REG_BX].v_integer = HCI_REG_VIDEO_OUTPUT;
> > +   args[HCI_REG_CX].v_integer = *video_output;
> > +
> > +   if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI,
> > +       i, args, NULL)) {
> > +           printf("%s: set video output failed\n", DEVNAME(sc));
> > +           return (HCI_FAILURE);
> > +   }
> > +
> > +   return (HCI_SUCCESS);
> > +}
> > Index: dev/acpi/files.acpi
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/acpi/files.acpi,v
> > retrieving revision 1.25
> > diff -u -p -r1.25 files.acpi
> > --- dev/acpi/files.acpi     4 Jan 2011 21:17:49 -0000       1.25
> > +++ dev/acpi/files.acpi     15 Jun 2011 19:35:27 -0000
> > @@ -81,6 +81,11 @@ device   acpithinkpad
> >  attach     acpithinkpad at acpi
> >  file       dev/acpi/acpithinkpad.c         acpithinkpad
> >  
> > +# Toshiba support
> > +device     acpitoshiba
> > +attach     acpitoshiba at acpi
> > +file       dev/acpi/acpitoshiba.c          acpitoshiba
> > +
> >  # Sony support
> >  device     acpisony
> >  attach     acpisony at acpi

Reply via email to