Author: rpaulo
Date: Sun Feb  8 19:55:13 2009
New Revision: 188324
URL: http://svn.freebsd.org/changeset/base/188324

Log:
  MFC r184625:
        Add support for Asus A8Sr notebooks.
  
        PR:             128553
        Submitted by:   Eygene Ryabinkin <rea-fbsd at codelabs.ru>

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/acpi_support/acpi_asus.c
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)

Modified: stable/7/sys/dev/acpi_support/acpi_asus.c
==============================================================================
--- stable/7/sys/dev/acpi_support/acpi_asus.c   Sun Feb  8 19:55:03 2009        
(r188323)
+++ stable/7/sys/dev/acpi_support/acpi_asus.c   Sun Feb  8 19:55:13 2009        
(r188324)
@@ -89,6 +89,9 @@ struct acpi_asus_model {
        char    *crd_set;
 
        void    (*n_func)(ACPI_HANDLE, UINT32, void *);
+
+       char    *lcdd;
+       void    (*lcdd_n_func)(ACPI_HANDLE, UINT32, void *);
 };
 
 struct acpi_asus_led {
@@ -109,6 +112,7 @@ struct acpi_asus_led {
 struct acpi_asus_softc {
        device_t                dev;
        ACPI_HANDLE             handle;
+       ACPI_HANDLE             lcdd_handle;
 
        struct acpi_asus_model  *model;
        struct sysctl_ctx_list  sysctl_ctx;
@@ -128,6 +132,9 @@ struct acpi_asus_softc {
        int                     s_crd;
 };
 
+static void    acpi_asus_lcdd_notify(ACPI_HANDLE h, UINT32 notify,
+    void *context);
+
 /*
  * We can identify Asus laptops from the string they return
  * as a result of calling the ATK0100 'INIT' method.
@@ -200,6 +207,20 @@ static struct acpi_asus_model acpi_asus_
                .disp_set       = "SDSP"
        },
        {
+               .name           = "A8SR",
+               .bled_set       = "BLED",
+               .mled_set       = "MLED",
+               .wled_set       = "WLED",
+               .lcd_get        = NULL,
+               .lcd_set        = "\\_SB.PCI0.SBRG.EC0._Q10",
+               .brn_get        = "GPLV",
+               .brn_set        = "SPLV",
+               .disp_get       = "\\_SB.PCI0.P0P1.VGA.GETD",
+               .disp_set       = "SDSP",
+               .lcdd           = "\\_SB.PCI0.P0P1.VGA.LCDD",
+               .lcdd_n_func    = acpi_asus_lcdd_notify
+       },
+       {
                .name           = "D1x",
                .mled_set       = "MLED",
                .lcd_get        = "\\GP11",
@@ -749,6 +770,22 @@ acpi_asus_attach(device_t dev)
        AcpiInstallNotifyHandler(sc->handle, ACPI_SYSTEM_NOTIFY,
            sc->model->n_func, dev);
 
+       /* Find and hook the 'LCDD' object */
+       if (sc->model->lcdd != NULL && sc->model->lcdd_n_func != NULL) {
+               ACPI_STATUS res;
+
+               sc->lcdd_handle = NULL;
+               res = AcpiGetHandle((sc->model->lcdd[0] == '\\' ?
+                   NULL : sc->handle), sc->model->lcdd, &(sc->lcdd_handle));
+               if (ACPI_SUCCESS(res)) {
+                       AcpiInstallNotifyHandler((sc->lcdd_handle),
+                           ACPI_DEVICE_NOTIFY, sc->model->lcdd_n_func, dev);
+               } else {
+                       printf("%s: unable to find LCD device '%s'\n",
+                           __func__, sc->model->lcdd);
+               }
+       }
+
        return (0);
 }
 
@@ -783,6 +820,13 @@ acpi_asus_detach(device_t dev)
        /* Remove notify handler */
        AcpiRemoveNotifyHandler(sc->handle, ACPI_SYSTEM_NOTIFY,
            acpi_asus_notify);
+       
+       if (sc->lcdd_handle) {
+               KASSERT(sc->model->lcdd_n_func != NULL,
+                   ("model->lcdd_n_func is NULL, but lcdd_handle is 
non-zero"));
+               AcpiRemoveNotifyHandler((sc->lcdd_handle),
+                   ACPI_DEVICE_NOTIFY, sc->model->lcdd_n_func);
+       }
 
        /* Free sysctl tree */
        sysctl_ctx_free(&sc->sysctl_ctx);
@@ -1124,6 +1168,12 @@ acpi_asus_notify(ACPI_HANDLE h, UINT32 n
        } else if (notify == 0x34) {
                sc->s_lcd = 0;
                ACPI_VPRINT(sc->dev, acpi_sc, "LCD turned off\n");
+       } else if (notify == 0x86) {
+               acpi_asus_sysctl_set(sc, ACPI_ASUS_METHOD_BRN, sc->s_brn-1);
+               ACPI_VPRINT(sc->dev, acpi_sc, "Brightness decreased\n");
+       } else if (notify == 0x87) {
+               acpi_asus_sysctl_set(sc, ACPI_ASUS_METHOD_BRN, sc->s_brn+1);
+               ACPI_VPRINT(sc->dev, acpi_sc, "Brightness increased\n");
        } else {
                /* Notify devd(8) */
                acpi_UserNotify("ASUS", h, notify);
@@ -1132,6 +1182,31 @@ acpi_asus_notify(ACPI_HANDLE h, UINT32 n
 }
 
 static void
+acpi_asus_lcdd_notify(ACPI_HANDLE h, UINT32 notify, void *context)
+{
+       struct acpi_asus_softc  *sc;
+       struct acpi_softc       *acpi_sc;
+
+       ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+
+       sc = device_get_softc((device_t)context);
+       acpi_sc = acpi_device_get_parent_softc(sc->dev);
+
+       ACPI_SERIAL_BEGIN(asus);
+       switch (notify) {
+       case 0x87:
+               acpi_asus_sysctl_set(sc, ACPI_ASUS_METHOD_BRN, sc->s_brn-1);
+               ACPI_VPRINT(sc->dev, acpi_sc, "Brightness decreased\n");
+               break;
+       case 0x86:
+               acpi_asus_sysctl_set(sc, ACPI_ASUS_METHOD_BRN, sc->s_brn+1);
+               ACPI_VPRINT(sc->dev, acpi_sc, "Brightness increased\n");
+               break;
+       }
+       ACPI_SERIAL_END(asus);
+}
+
+static void
 acpi_asus_eeepc_notify(ACPI_HANDLE h, UINT32 notify, void *context)
 {
        struct acpi_asus_softc  *sc;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to