Messages in this thread Patches in this message | | | Subject | [PATCH 2/4]An implementation for binding PCI device with ACPI device | From | Li Shaohua <> | Date | Wed, 05 Jan 2005 10:50:55 +0800 |
| |
Hi, This is an implementation for binding ACPI devices with PCI devices.
Thanks, Shaohua
Signed-off-by: Li Shaohua<shaohua.li@intel.com> ---
2.5-root/drivers/pci/pci-acpi.c | 46 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 46 insertions(+)
diff -puN drivers/pci/pci-acpi.c~bind-acpi-pci drivers/pci/pci-acpi.c --- 2.5/drivers/pci/pci-acpi.c~bind-acpi-pci 2005-01-05 09:57:26.863944152 +0800 +++ 2.5-root/drivers/pci/pci-acpi.c 2005-01-05 09:57:26.866943696 +0800 @@ -207,3 +207,49 @@ acpi_status pci_osc_control_set(u32 flag return status; } EXPORT_SYMBOL(pci_osc_control_set); + +/* ACPI bus type */ +int pci_acpi_bind_device(struct device *dev, acpi_handle *handle) +{ + struct pci_dev * pci_dev; + acpi_integer addr; + + pci_dev = to_pci_dev(dev); + /* Please ref to ACPI spec for the syntax of _ADR */ + addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); + *handle = acpi_get_child(DEVICE_ACPI_HANDLE(dev->parent), addr); + if (!*handle) + return -ENODEV; + return 0; +} + +static int pci_acpi_bind_root_bridge(struct device *dev, acpi_handle *handle) +{ + int num; + unsigned int seg, bus; + + num = sscanf(dev->bus_id, "pci%04x:%02x", &seg, &bus); + if (num != 2) + return -ENODEV; + *handle = acpi_get_pci_rootbridge_handle(seg, bus); + if (!*handle) + return -ENODEV; + return 0; +} + +static struct acpi_bus_type pci_acpi_bus = { + .bus = &pci_bus_type, + .find_device = pci_acpi_bind_device, + .find_bridge = pci_acpi_bind_root_bridge, +}; + +static int __init pci_acpi_init(void) +{ + int ret; + + ret = register_acpi_bus_type(&pci_acpi_bus); + if (ret) + return 0; + return 0; +} +arch_initcall(pci_acpi_init); _
An implementation for binding ACPI devices with PCI devices.
---
2.5-root/drivers/pci/pci-acpi.c | 46 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 46 insertions(+)
diff -puN drivers/pci/pci-acpi.c~bind-acpi-pci drivers/pci/pci-acpi.c --- 2.5/drivers/pci/pci-acpi.c~bind-acpi-pci 2005-01-05 09:57:26.863944152 +0800 +++ 2.5-root/drivers/pci/pci-acpi.c 2005-01-05 09:57:26.866943696 +0800 @@ -207,3 +207,49 @@ acpi_status pci_osc_control_set(u32 flag return status; } EXPORT_SYMBOL(pci_osc_control_set); + +/* ACPI bus type */ +int pci_acpi_bind_device(struct device *dev, acpi_handle *handle) +{ + struct pci_dev * pci_dev; + acpi_integer addr; + + pci_dev = to_pci_dev(dev); + /* Please ref to ACPI spec for the syntax of _ADR */ + addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); + *handle = acpi_get_child(DEVICE_ACPI_HANDLE(dev->parent), addr); + if (!*handle) + return -ENODEV; + return 0; +} + +static int pci_acpi_bind_root_bridge(struct device *dev, acpi_handle *handle) +{ + int num; + unsigned int seg, bus; + + num = sscanf(dev->bus_id, "pci%04x:%02x", &seg, &bus); + if (num != 2) + return -ENODEV; + *handle = acpi_get_pci_rootbridge_handle(seg, bus); + if (!*handle) + return -ENODEV; + return 0; +} + +static struct acpi_bus_type pci_acpi_bus = { + .bus = &pci_bus_type, + .find_device = pci_acpi_bind_device, + .find_bridge = pci_acpi_bind_root_bridge, +}; + +static int __init pci_acpi_init(void) +{ + int ret; + + ret = register_acpi_bus_type(&pci_acpi_bus); + if (ret) + return 0; + return 0; +} +arch_initcall(pci_acpi_init); _ | |