NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/50261: Please support newer Toshiba laptop hotkeys



The following reply was made to PR kern/50261; it has been noted by GNATS.

From: NONAKA Kimihiro <nonakap%gmail.com@localhost>
To: "gnats-bugs%netbsd.org@localhost" <gnats-bugs%netbsd.org@localhost>, ryoon%netbsd.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, 
	"gnats-admin%netbsd.org@localhost" <gnats-admin%netbsd.org@localhost>, "netbsd-bugs%netbsd.org@localhost" <netbsd-bugs%netbsd.org@localhost>
Subject: Re: kern/50261: Please support newer Toshiba laptop hotkeys
Date: Mon, 21 Sep 2015 21:42:07 +0900

 Could you write valz(4) man page?
 
 2015-09-20 17:25 GMT+09:00  <ryoon%netbsd.org@localhost>:
 >>Number:         50261
 >>Category:       kern
 >>Synopsis:       Please support newer Toshiba laptop hotkeys
 >>Confidential:   no
 >>Severity:       serious
 >>Priority:       medium
 >>Responsible:    kern-bug-people
 >>State:          open
 >>Class:          sw-bug
 >>Submitter-Id:   net
 >>Arrival-Date:   Sun Sep 20 08:25:00 +0000 2015
 >>Originator:     Ryo ONODERA
 >>Release:        NetBSD 7.99.21
 >>Organization:
 >
 >>Environment:
 >
 >
 > System: NetBSD brownie.elements.tetera.org 7.99.21 NetBSD 7.99.21 (DTRACE7) #247: Sun Sep 20 17:10:06 JST 2015 ryo_on%brownie.elements.tetera.org@localhost:/usr/world/7.99/amd64/obj/sys/arch/amd64/compile/DTRACE7 amd64
 > Architecture: x86_64
 > Machine: amd64
 >>Description:
 > The included patch enables LCD backlight toggle and Touchpad/trackpoint
 > toggle on Toshiba dynabook P63/PS.
 >
 >>How-To-Repeat:
 > Apply the included patch.
 >
 >>Fix:
 >
 > Index: sys/dev/acpi/valz_acpi.c
 > ===================================================================
 > RCS file: sys/dev/acpi/valz_acpi.c
 > diff -N sys/dev/acpi/valz_acpi.c
 > --- /dev/null   1 Jan 1970 00:00:00 -0000
 > +++ sys/dev/acpi/valz_acpi.c    20 Sep 2015 08:17:14 -0000
 > @@ -0,0 +1,643 @@
 > +/*     $NetBSD: vald_acpi.c,v 1.4 2010/04/15 07:02:24 jruoho Exp $ */
 > +
 > +/*-
 > + * Copyright (c) 2002 The NetBSD Foundation, Inc.
 > + * All rights reserved.
 > + *
 > + * This code is derived from software contributed to The NetBSD Foundation
 > + * by Masanori Kanaoka.
 > + *
 > + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
 > + */
 > +
 > +/*
 > + * Copyright 2001 Bill Sommerfeld.
 > + * 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.
 > + * 3. All advertising materials mentioning features or use of this software
 > + *    must display the following acknowledgement:
 > + *     This product includes software developed for the NetBSD Project by
 > + *     Wasabi Systems, Inc.
 > + * 4. The name of Wasabi Systems, Inc. may not be used to endorse
 > + *    or promote products derived from this software without specific prior
 > + *    written permission.
 > + *
 > + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
 > + * 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.
 > + */
 > +
 > +/*
 > + * ACPI VALZ Driver for Toshiba dynabook R63/PS
 > + *     This driver is based on vald_acpi.c
 > + */
 > +
 > +/*
 > + * Obtain information of Toshiba "GHCI" Method from next URL.
 > + *           http://www.buzzard.me.uk/toshiba/docs.html
 > + *           http://memebeam.org/toys/ToshibaAcpiDriver
 > + */
 > +
 > +#include <sys/cdefs.h>
 > +__KERNEL_RCSID(0, "$NetBSD: vald_acpi.c,v 1.4 2010/04/15 07:02:24 jruoho Exp $");
 > +
 > +#include <sys/param.h>
 > +#include <sys/systm.h>
 > +#include <sys/device.h>
 > +
 > +#include <dev/acpi/acpica.h>
 > +#include <dev/acpi/acpireg.h>
 > +#include <dev/acpi/acpivar.h>
 > +
 > +#define _COMPONENT             ACPI_RESOURCE_COMPONENT
 > +ACPI_MODULE_NAME               ("valz_acpi")
 > +
 > +#define METHOD_HCI             "GHCI"
 > +#define METHOD_HCI_ENABLE      "ENAB"
 > +
 > +/* Operations */
 > +/* Get */
 > +#define HCI_GET                        0xfe00
 > +#define SCI_CHECK              0xf000
 > +#define SCI_GET                        0xf300
 > +
 > +/* Set */
 > +#define HCI_SET                        0xff00
 > +#define SCI_OPEN               0xf100
 > +#define SCI_CLOSE              0xf200
 > +#define SCI_SET                        0xf400
 > +
 > +/* Return codes */
 > +#define HCI_SUCCESS            0x0000
 > +#define HCI_FAILURE            0x1000
 > +#define HCI_NOT_SUPPORTED      0x8000
 > +#define HCI_INPUT_ERROR                0x8300
 > +#define HCI_FIFO_EMPTY         0x8c00
 > +
 > +#define SCI_OPENCLOSE_OK       0x0044
 > +#define SCI_NOT_SUPPORTED      0x8000
 > +#define SCI_ALREADY_OPEN       0x8100
 > +#define SCI_NOT_OPEN           0x8200
 > +#define SCI_NOT_PRESENT                0x8600
 > +
 > +/* Functions */
 > +#define HCI_LCD_BACKLIGHT      0x0002
 > +#define HCI_ACADAPTOR          0x0003
 > +#define HCI_SYSTEM_EVENT_FIFO  0x0016
 > +#define HCI_KBD_BACKLIGHT      0x0017
 > +#define HCI_DISPLAY_DEV                0x001c
 > +#define HCI_HOTKEY_EVENT       0x001e
 > +#define HCI_LCD_BRIGHTNESS     0x002a
 > +#define HCI_CPU_SPEED          0x0032
 > +
 > +#define SCI_USB_OFF_CHARGE     0x0150
 > +#define SCI_TOUCHPAD           0x050e
 > +#define SCI_KBD_BACKLIGHT_STS  0x015c
 > +#define SCI_KBD_BACKLIGHT      0x0095
 > +
 > +#define SCI_KBD_BL_TIME_SHIFT  0x10
 > +
 > +/* Field definitions */
 > +#define HCI_LCD_BRIGHTNESS_BITS        3
 > +#define HCI_LCD_BRIGHTNESS_SFT (16 - HCI_LCD_BRIGHTNESS_BITS)
 > +#define HCI_LCD_BRIGHTNESS_MIN 0
 > +#define HCI_LCD_BRIGHTNESS_MAX 7
 > +#define HCI_VIDEO_DEVICE_FLG   0x0100
 > +#define HCI_CPU_SPEED_BITS     3
 > +#define HCI_CPU_SPEED_SFT      (16 - HCI_CPU_SPEED_BITS)
 > +#define HCI_CPU_SPEED_MAX      ((1 << HCI_CPU_SPEED_BITS) - 1)
 > +
 > +/* Key press/release events */
 > +
 > +/* Key press/release events */
 > +#define FN_RELEASE_OFFSET      0x80
 > +#  if 0
 > +/* Not used */
 > +#define FN_PRESS               0x01ff
 > +#define FN_RELEASE             0x0100
 > +#  endif
 > +#define FN_ESC_PRESS           0x0101
 > +#define FN_ESC_RELEASE         (FN_ESC_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F1_PRESS            0x013b
 > +#define FN_F1_RELEASE          (FN_F1_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F2_PRESS            0x013c
 > +#define FN_F2_RELEASE          (FN_F2_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F3_PRESS            0x013d
 > +#define FN_F3_RELEASE          (FN_F3_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F4_PRESS            0x013e
 > +#define FN_F4_RELEASE          (FN_F4_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F5_PRESS            0x013f
 > +#define FN_F5_RELEASE          (FN_F5_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F6_PRESS            0x0140
 > +#define FN_F6_RELEASE          (FN_F6_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F7_PRESS            0x0141
 > +#define FN_F7_RELEASE          (FN_F7_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F8_PRESS            0x0142
 > +#define FN_F8_RELEASE          (FN_F8_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_F9_PRESS            0x0143
 > +#define FN_F9_RELEASE          (FN_F9_PRESS + FN_RELEASE_OFFSET)
 > +/* Toggle, they are controlled by hardware */
 > +#define FN_F10_ON              0x1bb0
 > +#define FN_F10_OFF             0x1bb1
 > +#define FN_F11_ON              0x1bb2
 > +#define FN_F11_OFF             0x1bb3
 > +/* Fn+F12 does not emit keycode */
 > +/* dynabook R63/PS does not have KANJI keytop print */
 > +#define FN_KNJ_PRESS           0x0129
 > +#define FN_KNJ_RELEASE         (FN_KNJ_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_1_PRESS             0x0102
 > +#define FN_1_RELEASE           (FN_1_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_2_PRESS             0x0103
 > +#define FN_2_RELEASE           (FN_2_PRESS + FN_RELEASE_OFFSET)
 > +/* Fn+3 and Fn+4 do not emit keybode */
 > +#define FN_Z_PRESS             0x012c
 > +#define FN_Z_RELEASE           (FN_1_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_SPACE_PRESS         0x0139
 > +#define FN_SPACE_RELEASE       (FN_1_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_TAB_PRESS           0x010f
 > +#define FN_TAB_RELEASE         (FN_TAB_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_CAPS_PRESS          0x013a
 > +#define FN_CAPS_RELEASE                (FN_CAPS_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_BACKSPACE_PRESS     0x010e
 > +#define FN_BACKSPACE_RELEASE   (FN_BACKSPACE_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_INS_PRESS           0x0152
 > +#define FN_INS_RELEASE         (FN_INS_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_DEL_PRESS           0x0153
 > +#define FN_DEL_RELEASE         (FN_DEL_PRESS + FN_RELEASE_OFFSET)
 > +#define FN_PRTSC_PRESS         0x0137
 > +#define FN_PRTSC_RELEASE       (FN_PRTSC_PRESS + FN_RELEASE_OFFSET)
 > +
 > +/* HCI register definitions */
 > +#define HCI_WORDS              6 /* number of registers */
 > +#define HCI_REG_AX             0 /* Operation -> return value */
 > +#define HCI_REG_BX             1 /* Function */
 > +#define HCI_REG_CX             2 /* Argument (in or out) */
 > +#define HCI_REG_DX             3 /* unused */
 > +#define HCI_REG_SI             4 /* unused */
 > +#define HCI_REG_DI             5 /* unused */
 > +
 > +#define HCI_ON                 0x0001
 > +#define HCI_OFF                        0x0000
 > +#define HCI_ENABLE             0x0001
 > +#define HCI_DISABLE            0x0000
 > +
 > +#define HCI_LCD                        0x1
 > +#define HCI_CRT                        0x2
 > +#define HCI_TV                 0x4
 > +
 > +#define SCI_KBD_BL_MODE_MASK   0x1f
 > +#define SCI_KBD_BL_TIMO_SFT    0x10
 > +#define SCI_KBD_BL_MODE_AUTO   0x2
 > +#define SCI_KBD_BL_MODE_ON     0x8
 > +#define SCI_KBD_BL_MODE_OFF    0x10
 > +
 > +struct valz_acpi_softc {
 > +       device_t sc_dev;                /* base device glue */
 > +       struct acpi_devnode *sc_node;   /* our ACPI devnode */
 > +};
 > +
 > +static const char * const valz_acpi_hids[] = {
 > +       "TOS6208",
 > +       NULL
 > +};
 > +
 > +static int     valz_acpi_match(device_t, cfdata_t, void *);
 > +static void    valz_acpi_attach(device_t, device_t, void *);
 > +
 > +static void    valz_acpi_event(void *);
 > +static void    valz_acpi_notify_handler(ACPI_HANDLE, uint32_t, void *);
 > +
 > +#define ACPI_NOTIFY_ValzHotkeyPressed  0x80
 > +#define ACPI_NOTIFY_ValzLidClosed      0x8f
 > +#define ACPI_NOTIFY_ValzKbdBLChanges   0x92
 > +
 > +/* HCI manipulation */
 > +static ACPI_STATUS     hci_op(struct valz_acpi_softc *,
 > +                               uint32_t *, uint32_t *);
 > +static ACPI_STATUS     valz_acpi_hci_get(struct valz_acpi_softc *, uint32_t,
 > +                                       uint32_t, uint32_t *, uint32_t *);
 > +static ACPI_STATUS     valz_acpi_hci_set(struct valz_acpi_softc *, uint32_t,
 > +                                       uint32_t, uint32_t, uint32_t *);
 > +
 > +static ACPI_STATUS     sci_open(struct valz_acpi_softc *);
 > +static ACPI_STATUS     sci_close(struct valz_acpi_softc *);
 > +
 > +static ACPI_STATUS     valz_acpi_touchpad_toggle(struct valz_acpi_softc *);
 > +static ACPI_STATUS     valz_acpi_lcd_backlight_toggle(
 > +                                       struct valz_acpi_softc *sc);
 > +
 > +CFATTACH_DECL_NEW(valz_acpi, sizeof(struct valz_acpi_softc),
 > +    valz_acpi_match, valz_acpi_attach, NULL, NULL);
 > +
 > +/*
 > + * valz_acpi_match:
 > + *
 > + *     Autoconfiguration `match' routine.
 > + */
 > +static int
 > +valz_acpi_match(device_t parent, cfdata_t match, void *aux)
 > +{
 > +       struct acpi_attach_args *aa = aux;
 > +
 > +       if (aa->aa_node->ad_type != ACPI_TYPE_DEVICE)
 > +               return (0);
 > +
 > +       return (acpi_match_hid(aa->aa_node->ad_devinfo, valz_acpi_hids));
 > +}
 > +
 > +/*
 > + * valz_acpi_attach:
 > + *
 > + *     Autoconfiguration `attach' routine.
 > + */
 > +static void
 > +valz_acpi_attach(device_t parent, device_t self, void *aux)
 > +{
 > +       struct valz_acpi_softc *sc = device_private(self);
 > +       struct acpi_attach_args *aa = aux;
 > +       ACPI_STATUS rv;
 > +
 > +       aprint_naive(": Toshiba VALZ\n");
 > +       aprint_normal(": Toshiba VALZ\n");
 > +
 > +       sc->sc_node = aa->aa_node;
 > +       sc->sc_dev = self;
 > +
 > +       /* enable valz notify */
 > +       rv = AcpiEvaluateObject(sc->sc_node->ad_handle, METHOD_HCI_ENABLE,
 > +                               NULL, NULL);
 > +       if (ACPI_FAILURE(rv)) {
 > +               aprint_error("Cannot enable VALZ.\n");
 > +       } else {
 > +               (void)acpi_register_notify(sc->sc_node,
 > +                   valz_acpi_notify_handler);
 > +       }
 > +}
 > +
 > +/*
 > + * valz_acpi_notify_handler:
 > + *
 > + *     Notify handler.
 > + */
 > +static void
 > +valz_acpi_notify_handler(ACPI_HANDLE handle, uint32_t notify, void *context)
 > +{
 > +       struct valz_acpi_softc *sc;
 > +       device_t self = context;
 > +
 > +       sc = device_private(self);
 > +
 > +       switch (notify) {
 > +       case ACPI_NOTIFY_ValzHotkeyPressed:
 > +               (void)AcpiOsExecute(OSL_NOTIFY_HANDLER, valz_acpi_event, sc);
 > +               break;
 > +
 > +       case ACPI_NOTIFY_ValzLidClosed:
 > +               /* Lid closed */
 > +               break;
 > +
 > +       case ACPI_NOTIFY_ValzKbdBLChanges:
 > +               /* Keyboard backlight mode changed */
 > +               break;
 > +
 > +       default:
 > +               aprint_error_dev(sc->sc_dev,
 > +                   "unknown notify 0x%02X\n", notify);
 > +               break;
 > +       }
 > +}
 > +
 > +/*
 > + * valz_acpi_event:
 > + *
 > + *     Check hotkey event and do it, if event occur.
 > + */
 > +static void
 > +valz_acpi_event(void *arg)
 > +{
 > +       struct valz_acpi_softc *sc = arg;
 > +       ACPI_STATUS rv;
 > +       uint32_t value, result;
 > +
 > +       while(1) {
 > +               rv = valz_acpi_hci_get(sc, HCI_GET, HCI_SYSTEM_EVENT_FIFO,
 > +                       &value, &result);
 > +               if (ACPI_SUCCESS(rv) && result == 0) {
 > +                       switch (value) {
 > +                       case FN_F9_PRESS:
 > +                               valz_acpi_touchpad_toggle(sc);
 > +                               break;
 > +                       case FN_TAB_PRESS:
 > +                               valz_acpi_lcd_backlight_toggle(sc);
 > +                               break;
 > +
 > +                       default:
 > +                               /* Many unused buttons */
 > +                               aprint_debug("Pressed: 0x%x\n", value);
 > +                               break;
 > +                       }
 > +               }
 > +               if (ACPI_FAILURE(rv) || result == HCI_NOT_SUPPORTED ||
 > +                       result == HCI_FIFO_EMPTY)
 > +                       break;
 > +       }
 > +}
 > +
 > +/*
 > + * HCI/SCI operation
 > + */
 > +static ACPI_STATUS
 > +hci_op(struct valz_acpi_softc *sc, uint32_t *input, uint32_t *output)
 > +{
 > +       ACPI_STATUS rv;
 > +       ACPI_OBJECT Arg[HCI_WORDS];
 > +       ACPI_OBJECT_LIST ArgList;
 > +       ACPI_OBJECT *param, *PrtElement;
 > +       ACPI_BUFFER buf;
 > +       int             i;
 > +
 > +       for (i = 0; i < HCI_WORDS; i++) {
 > +               Arg[i].Type = ACPI_TYPE_INTEGER;
 > +               Arg[i].Integer.Value = 0;
 > +       }
 > +
 > +       for (i = 0; i < HCI_WORDS; i++) {
 > +               Arg[i].Integer.Value = input[i];
 > +       }
 > +
 > +       ArgList.Count = HCI_WORDS;
 > +       ArgList.Pointer = Arg;
 > +
 > +       buf.Pointer = NULL;
 > +       buf.Length = ACPI_ALLOCATE_BUFFER;
 > +
 > +       rv = AcpiEvaluateObjectTyped(sc->sc_node->ad_handle,
 > +           METHOD_HCI, &ArgList, &buf, ACPI_TYPE_PACKAGE);
 > +       if (ACPI_FAILURE(rv)) {
 > +               aprint_error_dev(sc->sc_dev, "failed to evaluate GHCI: %s\n",
 > +                   AcpiFormatException(rv));
 > +               return rv;
 > +       }
 > +
 > +       for (i = 0; i < HCI_WORDS; i++) {
 > +               output[i] = 0;
 > +       }
 > +       param = (ACPI_OBJECT *)buf.Pointer;
 > +       PrtElement = param->Package.Elements;
 > +       for (i = 0; i < HCI_WORDS; i++) {
 > +               if (PrtElement->Type == ACPI_TYPE_INTEGER)
 > +                       output[i] = PrtElement->Integer.Value;
 > +                       PrtElement++;
 > +       }
 > +
 > +       if (buf.Pointer)
 > +               ACPI_FREE(buf.Pointer);
 > +
 > +       return rv;
 > +}
 > +
 > +/*
 > + * valz_acpi_hci_get:
 > + *
 > + *     Get value via "GHCI" Method.
 > + */
 > +static ACPI_STATUS
 > +valz_acpi_hci_get(struct valz_acpi_softc *sc, uint32_t function,
 > +    uint32_t reg, uint32_t *value, uint32_t *result)
 > +{
 > +       ACPI_STATUS rv;
 > +
 > +       uint32_t input[HCI_WORDS];
 > +       uint32_t output[HCI_WORDS];
 > +
 > +       input[HCI_REG_AX] = function;
 > +       input[HCI_REG_BX] = reg;
 > +       input[HCI_REG_CX] = 0;
 > +       input[HCI_REG_DX] = 0;
 > +       input[HCI_REG_SI] = 0;
 > +       input[HCI_REG_DI] = 0;
 > +
 > +       rv = hci_op(sc, input, output);
 > +
 > +       *result = output[HCI_REG_AX];
 > +       *value = output[HCI_REG_CX];
 > +
 > +       return rv;
 > +}
 > +
 > +/*
 > + * valz_acpi_hci_set:
 > + *
 > + *     Set value via "GHCI" Method.
 > + */
 > +static ACPI_STATUS
 > +valz_acpi_hci_set(struct valz_acpi_softc *sc, uint32_t function,
 > +    uint32_t reg, uint32_t value, uint32_t *result)
 > +{
 > +       ACPI_STATUS rv;
 > +
 > +       uint32_t input[HCI_WORDS];
 > +       uint32_t output[HCI_WORDS];
 > +
 > +       input[HCI_REG_AX] = function;
 > +       input[HCI_REG_BX] = reg;
 > +       input[HCI_REG_CX] = value;
 > +       input[HCI_REG_DX] = 0;
 > +       input[HCI_REG_SI] = 0;
 > +       input[HCI_REG_DI] = 0;
 > +
 > +       rv = hci_op(sc, input, output);
 > +
 > +       *result = output[HCI_REG_AX];
 > +
 > +       return rv;
 > +}
 > +
 > +/*
 > + * Open SCI
 > + */
 > +static ACPI_STATUS
 > +sci_open(struct valz_acpi_softc *sc)
 > +{
 > +       ACPI_STATUS rv;
 > +       uint32_t result;
 > +
 > +       rv = valz_acpi_hci_set(sc, SCI_OPEN, 0, 0, &result);
 > +       if (ACPI_FAILURE(rv)) {
 > +               aprint_error("SCI: ACPI set error\n");
 > +       } else {
 > +               switch (result) {
 > +               case SCI_OPENCLOSE_OK:
 > +                       aprint_debug("Opening SCI\n");
 > +                       break;
 > +               case SCI_ALREADY_OPEN:
 > +                       aprint_error("SCI already open\n");
 > +                       break;
 > +               case SCI_NOT_SUPPORTED:
 > +                       aprint_error("SCI is not supported\n");
 > +                       break;
 > +               case SCI_NOT_PRESENT:
 > +                       aprint_error("SCI is not present\n");
 > +                       break;
 > +               default:
 > +                       aprint_error("SCI: undefined behavior\n");
 > +                       break;
 > +               }
 > +       }
 > +
 > +       return rv;
 > +}
 > +
 > +/*
 > + * Close SCI
 > + */
 > +static ACPI_STATUS
 > +sci_close(struct valz_acpi_softc *sc)
 > +{
 > +       ACPI_STATUS rv;
 > +       uint32_t result;
 > +
 > +       rv = valz_acpi_hci_set(sc, SCI_CLOSE, 0, 0, &result);
 > +       if (ACPI_FAILURE(rv)) {
 > +               aprint_error("SCI: ACPI set error\n");
 > +       } else {
 > +               switch (result) {
 > +               case SCI_OPENCLOSE_OK:
 > +                       aprint_debug("Closing SCI\n");
 > +                       break;
 > +               case SCI_NOT_OPEN:
 > +                       aprint_error("SCI is not opened\n");
 > +                       break;
 > +               case SCI_NOT_SUPPORTED:
 > +                       aprint_error("SCI is not supported\n");
 > +                       break;
 > +               case SCI_NOT_PRESENT:
 > +                       aprint_error("SCI is not present\n");
 > +                       break;
 > +               default:
 > +                       aprint_error("SCI: undefined behavior\n");
 > +                       break;
 > +               }
 > +       }
 > +
 > +       return rv;
 > +}
 > +
 > +/*
 > + * Enable/disable touchpad and trackpoint with HCI_ENABLE/HCI_DISABLE
 > + */
 > +static ACPI_STATUS
 > +valz_acpi_touchpad_toggle(struct valz_acpi_softc *sc)
 > +{
 > +       ACPI_STATUS rv;
 > +       uint32_t result, status, value;
 > +
 > +       rv = sci_open(sc);
 > +       if (ACPI_FAILURE(rv))
 > +               aprint_error_dev(sc->sc_dev,
 > +                               "Cannot open SCI: %s\n",
 > +                               AcpiFormatException(rv));
 > +
 > +       rv = valz_acpi_hci_get(sc, SCI_GET, SCI_TOUCHPAD, &value, &result);
 > +       if (ACPI_FAILURE(rv))
 > +               aprint_error_dev(sc->sc_dev,
 > +                               "Cannot get SCI touchpad status: %s\n",
 > +                               AcpiFormatException(rv));
 > +
 > +       switch (value) {
 > +       case HCI_ENABLE:
 > +               status = HCI_DISABLE;
 > +               break;
 > +       case HCI_DISABLE:
 > +               status = HCI_ENABLE;
 > +               break;
 > +       default:
 > +               status = HCI_ENABLE;
 > +               break;
 > +       }
 > +
 > +       rv = valz_acpi_hci_set(sc, SCI_SET, SCI_TOUCHPAD, status, &result);
 > +       if (ACPI_FAILURE(rv))
 > +               aprint_error_dev(sc->sc_dev,
 > +                               "Cannot set SCI touchpad status: %s\n",
 > +                               AcpiFormatException(rv));
 > +
 > +       rv = sci_close(sc);
 > +       if (ACPI_FAILURE(rv))
 > +               aprint_error_dev(sc->sc_dev,
 > +                               "Cannot close SCI: %s\n",
 > +                               AcpiFormatException(rv));
 > +
 > +       return rv;
 > +}
 > +
 > +/*
 > + * Enable/disable LCD backlight with HCI_ENABLE/HCI_DISABLE
 > + */
 > +static ACPI_STATUS
 > +valz_acpi_lcd_backlight_toggle(struct valz_acpi_softc *sc)
 > +{
 > +       ACPI_STATUS rv;
 > +       uint32_t result, status, value;
 > +
 > +       rv = valz_acpi_hci_get(sc, HCI_GET, HCI_LCD_BACKLIGHT, &value, &result);
 > +       if (ACPI_FAILURE(rv))
 > +               aprint_error_dev(sc->sc_dev,
 > +                               "Cannot get HCI LCD backlight status: %s\n",
 > +                               AcpiFormatException(rv));
 > +
 > +       switch (value) {
 > +       case HCI_ON:
 > +               status = HCI_OFF;
 > +               break;
 > +       case HCI_OFF:
 > +               status = HCI_ON;
 > +               break;
 > +       default:
 > +               status = HCI_ON;
 > +               break;
 > +       }
 > +
 > +       rv = valz_acpi_hci_set(sc, HCI_SET, HCI_LCD_BACKLIGHT, status, &result);
 > +       if (ACPI_FAILURE(rv))
 > +               aprint_error_dev(sc->sc_dev,
 > +                               "Cannot set HCI LCD backlight status: %s\n",
 > +                               AcpiFormatException(rv));
 > +
 > +       return rv;
 > +}
 > Index: sys/dev/acpi/files.acpi
 > ===================================================================
 > RCS file: /cvsroot/src/sys/dev/acpi/files.acpi,v
 > retrieving revision 1.95
 > diff -u -r1.95 files.acpi
 > --- sys/dev/acpi/files.acpi     14 Sep 2014 19:54:05 -0000      1.95
 > +++ sys/dev/acpi/files.acpi     20 Sep 2015 08:17:14 -0000
 > @@ -169,6 +169,11 @@
 >  attach vald at acpinodebus with vald_acpi
 >  file   dev/acpi/vald_acpi.c            vald_acpi
 >
 > +# Toshiba dynabook hotkeys
 > +device valz
 > +attach valz at acpinodebus with valz_acpi
 > +file   dev/acpi/valz_acpi.c            valz_acpi
 > +
 >  # Sony SPIC (jog dial etc.)
 >  attach spic at acpinodebus with spic_acpi
 >  file   dev/acpi/spic_acpi.c            spic_acpi
 >
 >>Unformatted:
 >
 >
 


Home | Main Index | Thread Index | Old Index