Hi!

Here it how it looks just now. This is work in progress, but feel free
to apply. [You may want to restructure it somehow, move it into
different place maybe, and call its init from convient place].

Oh, and "ACPI_OK" should be killed. It is too easy to write it instead
of AE_OK.

                                                                Pavel

--- clean/drivers/acpi/namespace/nsxfobj.c      Sun Apr  1 00:23:00 2001
+++ linux/drivers/acpi/namespace/nsxfobj.c      Thu Apr  5 22:49:18 2001
@@ -30,6 +30,9 @@
 #include "acnamesp.h"
 #include "acdispat.h"
 
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/proc_fs.h>
 
 #define _COMPONENT          NAMESPACE
         MODULE_NAME         ("nsxfobj")
@@ -694,3 +697,137 @@
 
        return (status);
 }
+
+static int
+proc_read_device_info(char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+{
+       ACPI_HANDLE             obj_handle = (u32) data;
+       ACPI_NAMESPACE_NODE     *node;
+       ACPI_STATUS             status;
+       char *p = page;
+       int len;
+       u32 flags;
+       DEVICE_ID               device_id;
+
+       /* don't get info more than once for a single proc read */
+       if (off != 0)
+               goto end;
+
+       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
+
+       printk("acpi_read_device_info: %lx\n", obj_handle);
+       node = acpi_ns_convert_handle_to_entry (obj_handle);
+
+       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
+
+       status = acpi_cm_execute_STA (node, &flags);
+       if (ACPI_FAILURE (status))
+               p += sprintf(p, "Present:       No (%lx)\n", status);
+       else    p += sprintf(p, "Present:       Yes (flags %lx)\n", flags);
+
+       status = acpi_cm_execute_HID (node, &device_id);
+       if (!ACPI_FAILURE (status))
+               p += sprintf(p, "HID ident:     %s\n", &device_id.buffer );
+
+       status = acpi_cm_execute_UID (node, &device_id);
+       if (!ACPI_FAILURE (status))
+               p += sprintf(p, "UID ident:     %s\n", &device_id.buffer );
+
+       p += sprintf(p, "This is some random information\n");
+end:
+       len = (p - page);
+       if (len <= off+count) *eof = 1;
+       *start = page + off;
+       len -= off;
+       if (len>count) len = count;
+       if (len<0) len = 0;
+       return len;
+}
+
+static ACPI_STATUS
+acpi_ns_add_proc_callback (
+       ACPI_HANDLE             obj_handle,
+       u32                     nesting_level,
+       void                    *context,
+       void                    **return_value)
+{
+       ACPI_STATUS             status;
+       ACPI_NAMESPACE_NODE     *node;
+       u32                     flags;
+       DEVICE_ID               device_id;
+       ACPI_GET_DEVICES_INFO   *info;
+
+
+       info = context;
+
+       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
+
+       printk("acpi_add_proc_callback: %lx\n", obj_handle);
+       node = acpi_ns_convert_handle_to_entry (obj_handle);
+
+       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
+
+       if (!node) {
+               return (AE_BAD_PARAMETER);
+       }
+
+       /*
+        * Run _STA to determine if device is present
+        */
+
+       status = acpi_cm_execute_STA (node, &flags);
+       if (ACPI_FAILURE (status)) {
+               return (AE_OK);
+       }
+
+       if (!(flags & 0x01)) {
+               /* don't return at the device or children of the device if not there */
+
+               return (AE_CTRL_DEPTH);
+       }
+
+       {
+               char proc_name[120];
+
+               status = acpi_cm_execute_HID (node, &device_id);
+
+               if (status == AE_NOT_FOUND) {
+                       return (AE_OK);
+               }
+
+               else if (ACPI_FAILURE (status)) {
+                       return (status);
+               }
+
+               sprintf(proc_name, "power/device_%s_%lx", device_id.buffer, obj_handle 
+);
+               printk("ACPI: creating %s\n", proc_name);
+               create_proc_read_entry(proc_name, 0, NULL,
+                       proc_read_device_info, (void *) obj_handle);
+       }
+
+       return (AE_OK);
+}
+
+
+void
+acpi_namespace_init(
+       void)
+{
+       ACPI_STATUS             status;
+       void ** return_value;
+
+       printk("ACPI: initializing namespace\n");
+
+       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
+       status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE,
+                          ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
+                          NS_WALK_UNLOCK,
+                          acpi_ns_add_proc_callback, NULL,
+                          return_value);
+
+       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
+
+       return (status);
+}
+

-- 
I'm [EMAIL PROTECTED] "In my country we have almost anarchy and I don't care."
Panos Katsaloulis describing me w.r.t. patents at [EMAIL PROTECTED]
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to