lkml.org 
[lkml]   [2004]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
Subject[PATCH/RFC 4/4]An experimental implementation for IDE bus
From
Date
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,
};

/*
_
\
 
 \ /
  Last update: 2005-03-22 14:07    [W:0.063 / U:0.056 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site