[PATCH/RFC 4/4]An experimental implementation for IDE bus

From: Li Shaohua
Date: Sun Nov 07 2004 - 23:26:22 EST


Hi,
A sample patch to bind IDE devices. I'm not familar with IDE driver, so
the patch possibly is completely wrong, though it can show correct ACPI
path in my laptop. This test case just shows the framework works, please
don't apply it.

Thanks,
Shaohua
---

2.6-root/drivers/ide/ide.c | 43
+++++++++++++++++++++++++++++++++++++++++++
1 files changed, 43 insertions(+)

diff -puN drivers/ide/ide.c~ide-bind-acpi drivers/ide/ide.c
--- 2.6/drivers/ide/ide.c~ide-bind-acpi 2004-11-08 11:09:12.625009440
+0800
+++ 2.6-root/drivers/ide/ide.c 2004-11-08 11:10:04.477126720 +0800
@@ -2412,10 +2412,53 @@ EXPORT_SYMBOL(ide_fops);

EXPORT_SYMBOL(ide_lock);

+#ifdef CONFIG_ACPI
+#include <linux/acpi.h>
+int generic_ide_platform_bind(struct device *dev)
+{
+ acpi_handle parent_handle = NULL;
+ acpi_integer address;
+ int i;
+
+ /* Seems dev->parent->parent is the PCI IDE controller */
+ if (dev->parent && dev->parent->parent)
+ parent_handle = dev->parent->parent->handle;
+
+ if (!parent_handle) {
+ printk("Can't find parent handle \n");
+ return -1;
+ }
+ /* Please ref to ACPI spec for syntax of _ADR */
+ sscanf(dev->bus_id, "%d", &i);
+ address = i;
+ dev->handle = acpi_get_child(parent_handle, address);
+
+#if 1
+ {/* For debug */
+ char name[80] = {'?','\0'};
+ struct acpi_buffer buffer = {sizeof(name), name};
+
+ printk("IDE device %d:", i);
+ if (dev->handle) {
+ acpi_get_name(dev->handle, ACPI_FULL_PATHNAME,
&buffer);
+ printk("%s", name);
+ }
+ printk("\n");
+ }
+#endif
+ return 0;
+}
+#else
+int generic_ide_platform_bind(struct device *dev)
+{
+ return 0;
+}
+#endif
struct bus_type ide_bus_type = {
.name = "ide",
.suspend = generic_ide_suspend,
.resume = generic_ide_resume,
+ .platform_bind = generic_ide_platform_bind,
};

/*
_


A sample patch to bind IDE devices. I'm not familar with IDE driver, so the
patch possibly is completely wrong, though it can show correct ACPI path in
my laptop. This test case just shows the framework works, please don't apply.

---

2.6-root/drivers/ide/ide.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 43 insertions(+)

diff -puN drivers/ide/ide.c~ide-bind-acpi drivers/ide/ide.c
--- 2.6/drivers/ide/ide.c~ide-bind-acpi 2004-11-08 11:09:12.625009440 +0800
+++ 2.6-root/drivers/ide/ide.c 2004-11-08 11:10:04.477126720 +0800
@@ -2412,10 +2412,53 @@ EXPORT_SYMBOL(ide_fops);

EXPORT_SYMBOL(ide_lock);

+#ifdef CONFIG_ACPI
+#include <linux/acpi.h>
+int generic_ide_platform_bind(struct device *dev)
+{
+ acpi_handle parent_handle = NULL;
+ acpi_integer address;
+ int i;
+
+ /* Seems dev->parent->parent is the PCI IDE controller */
+ if (dev->parent && dev->parent->parent)
+ parent_handle = dev->parent->parent->handle;
+
+ if (!parent_handle) {
+ printk("Can't find parent handle \n");
+ return -1;
+ }
+ /* Please ref to ACPI spec for syntax of _ADR */
+ sscanf(dev->bus_id, "%d", &i);
+ address = i;
+ dev->handle = acpi_get_child(parent_handle, address);
+
+#if 1
+ {/* For debug */
+ char name[80] = {'?','\0'};
+ struct acpi_buffer buffer = {sizeof(name), name};
+
+ printk("IDE device %d:", i);
+ if (dev->handle) {
+ acpi_get_name(dev->handle, ACPI_FULL_PATHNAME, &buffer);
+ printk("%s", name);
+ }
+ printk("\n");
+ }
+#endif
+ return 0;
+}
+#else
+int generic_ide_platform_bind(struct device *dev)
+{
+ return 0;
+}
+#endif
struct bus_type ide_bus_type = {
.name = "ide",
.suspend = generic_ide_suspend,
.resume = generic_ide_resume,
+ .platform_bind = generic_ide_platform_bind,
};

/*
_