svn commit: r184625 - in head: etc sys/dev/acpi_support

Rui Paulo rpaulo at FreeBSD.org
Tue Nov 4 03:52:50 PST 2008


Author: rpaulo
Date: Tue Nov  4 11:52:50 2008
New Revision: 184625
URL: http://svn.freebsd.org/changeset/base/184625

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

Modified:
  head/etc/devd.conf
  head/sys/dev/acpi_support/acpi_asus.c

Modified: head/etc/devd.conf
==============================================================================
--- head/etc/devd.conf	Tue Nov  4 11:31:09 2008	(r184624)
+++ head/etc/devd.conf	Tue Nov  4 11:52:50 2008	(r184625)
@@ -255,6 +255,28 @@ notify 10 {
 	action "/etc/rc.resume acpi $notify";
 };
 
+# The next blocks enable volume hotkeys that can be found on the Asus laptops
+notify 0 {
+	match "system"		"ACPI";
+	match "subsystem"	"ASUS";
+	match "notify"		"0x32";
+	action			"mixer 0";
+};
+
+notify 0 {
+	match "system"		"ACPI";
+	match "subsystem"i	"ASUS";
+	match "notify"		"0x31";
+	action			"mixer vol -10";
+};
+
+notify 0 {
+	match "system"		"ACPI";
+	match "subsystem"	"ASUS";
+	match "notify"		"0x30";
+	action			"mixer vol +10";
+};
+
 # The next blocks enable volume hotkeys that can be found on the Asus EeePC
 # The four keys above the keyboard notify 0x1a through to 0x1d respectively
 notify 0 {

Modified: head/sys/dev/acpi_support/acpi_asus.c
==============================================================================
--- head/sys/dev/acpi_support/acpi_asus.c	Tue Nov  4 11:31:09 2008	(r184624)
+++ head/sys/dev/acpi_support/acpi_asus.c	Tue Nov  4 11:52:50 2008	(r184625)
@@ -93,6 +93,9 @@ struct acpi_asus_model {
 	char	*wlan_set;
 
 	void	(*n_func)(ACPI_HANDLE, UINT32, void *);
+
+	char	*lcdd;
+	void	(*lcdd_n_func)(ACPI_HANDLE, UINT32, void *);
 };
 
 struct acpi_asus_led {
@@ -113,6 +116,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;
@@ -133,6 +137,9 @@ struct acpi_asus_softc {
 	int			s_wlan;
 };
 
+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.
@@ -205,6 +212,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",
@@ -762,6 +783,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);
 }
 
@@ -796,6 +833,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);
@@ -1165,6 +1209,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);
@@ -1173,6 +1223,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;


More information about the svn-src-head mailing list