FYI: ACPI devices put into proc

Pavel Machek (pavel@suse.cz)
Thu, 5 Apr 2001 22:52:53 +0200


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 pavel@ucw.cz. "In my country we have almost anarchy and I don't care."
Panos Katsaloulis describing me w.r.t. patents at discuss@linmodems.org
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/