From owner-acpi-jp@jp.freebsd.org  Fri Oct  6 23:52:30 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id XAA50509;
	Fri, 6 Oct 2000 23:52:30 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id XAA50504
	for <acpi-jp@jp.freebsd.org>; Fri, 6 Oct 2000 23:52:29 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (iwasaki.imasy.or.jp [202.227.24.92])
	by tasogare.imasy.or.jp (8.10.2+3.3W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id e96EqSr88717
	for <acpi-jp@jp.freebsd.org>; Fri, 6 Oct 2000 23:52:28 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20001006235205R.iwasaki@jp.FreeBSD.org>
Date: Fri, 06 Oct 2000 23:52:05 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 76
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 804
Subject: [acpi-jp 804] acpi_lid patch
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

I implemented lid notify handler code a bit.  This evaluates _LID method
to get status of lid.  _PRW & _PSW code will come later.

BTW, does anybody woking on Power/Sleep button driver?  If no, I'm
going to try it.

Index: acpi_lid.c
===================================================================
RCS file: /home/iwasaki/cvs/acpica-bsd/dev/acpica/acpi_lid.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 acpi_lid.c
--- acpi_lid.c	2000/10/05 12:30:37	1.1.1.1
+++ acpi_lid.c	2000/10/06 14:40:11
@@ -51,6 +51,7 @@
 struct acpi_lid_softc {
     device_t	lid_dev;
     ACPI_HANDLE	lid_handle;
+    int		lid_status;	/* open or closed */
 };
 
 static int	acpi_lid_probe(device_t dev);
@@ -104,11 +105,53 @@
     return(0);
 }
 
+static void
+acpi_lid_notify_status_changed(void *arg)
+{
+    struct acpi_lid_softc	*sc;
+    ACPI_BUFFER			Buffer;
+    ACPI_OBJECT			Object;
+
+    sc = (struct acpi_lid_softc *)arg;
+
+    /*
+     * Evaluate _LID
+     *	Zero:		The lid is closed
+     *	Non-zero:	The lid is open
+     */
+    Buffer.Length = sizeof(Object);
+    Buffer.Pointer = &Object;
+    if (AcpiEvaluateObject(sc->lid_handle, "_LID", NULL, &Buffer) != AE_OK) {
+	return;
+    }
+    if (Object.Type != ACPI_TYPE_NUMBER) {
+	return;	/* wrong return object type */
+    }
+
+    /* update lid status */
+    sc->lid_status = Object.Number.Value;
+
+    device_printf(sc->lid_dev, "status changed: %d\n", sc->lid_status);
+
+    if (sc->lid_status == 0) {
+	/* TODO: generate Sleep event. */
+    }
+}
+
+/* XXX maybe not here */
+#define	ACPI_NOTIFY_STATUS_CHANGED	0x80
+
 static void 
 acpi_lid_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
 {
     struct acpi_lid_softc	*sc = (struct acpi_lid_softc *)context;
 
-    device_printf(sc->lid_dev, "NOTIFY %x\n", notify);
+    switch (notify) {
+    case ACPI_NOTIFY_STATUS_CHANGED:
+	timeout(acpi_lid_notify_status_changed, (void *)sc, hz/2);
+	break;
+    default:
+	return;		/* unknown notification value */
+    }
 }
 
