Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 46427
b: refs/heads/master
c: e8bdc5a
h: refs/heads/master
i:
  46425: 3b134b3
  46423: e4e38cf
v: v3
  • Loading branch information
Len Brown committed Feb 3, 2007
1 parent 3665e71 commit 4229bab
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 142 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b0b7eaaf0c7aefd118d3ff8640fbed75a9fad9a1
refs/heads/master: e8bdc5a9c56c140c732246a298922c3cf3777460
2 changes: 1 addition & 1 deletion trunk/drivers/acpi/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ config ACPI_BUTTON

config ACPI_VIDEO
tristate "Video"
depends on X86
depends on X86 && BACKLIGHT_CLASS_DEVICE
help
This driver implement the ACPI Extensions For Display Adapters
for integrated graphics devices on motherboard, as specified in
Expand Down
123 changes: 0 additions & 123 deletions trunk/drivers/acpi/glue.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,129 +86,6 @@ static int acpi_find_bridge_device(struct device *dev, acpi_handle * handle)
return ret;
}

/* Get PCI root bridge's handle from its segment and bus number */
struct acpi_find_pci_root {
unsigned int seg;
unsigned int bus;
acpi_handle handle;
};

static acpi_status
do_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
{
unsigned long *busnr = data;
struct acpi_resource_address64 address;

if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
return AE_OK;

acpi_resource_to_address64(resource, &address);
if ((address.address_length > 0) &&
(address.resource_type == ACPI_BUS_NUMBER_RANGE))
*busnr = address.minimum;

return AE_OK;
}

static int get_root_bridge_busnr(acpi_handle handle)
{
acpi_status status;
unsigned long bus, bbn;
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };

acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);

status = acpi_evaluate_integer(handle, METHOD_NAME__BBN, NULL,
&bbn);
if (status == AE_NOT_FOUND) {
/* Assume bus = 0 */
printk(KERN_INFO PREFIX
"Assume root bridge [%s] bus is 0\n",
(char *)buffer.pointer);
status = AE_OK;
bbn = 0;
}
if (ACPI_FAILURE(status)) {
bbn = -ENODEV;
goto exit;
}
if (bbn > 0)
goto exit;

/* _BBN in some systems return 0 for all root bridges */
bus = -1;
status = acpi_walk_resources(handle, METHOD_NAME__CRS,
do_root_bridge_busnr_callback, &bus);
/* If _CRS failed, we just use _BBN */
if (ACPI_FAILURE(status) || (bus == -1))
goto exit;
/* We select _CRS */
if (bbn != bus) {
printk(KERN_INFO PREFIX
"_BBN and _CRS returns different value for %s. Select _CRS\n",
(char *)buffer.pointer);
bbn = bus;
}
exit:
kfree(buffer.pointer);
return (int)bbn;
}

static acpi_status
find_pci_rootbridge(acpi_handle handle, u32 lvl, void *context, void **rv)
{
struct acpi_find_pci_root *find = (struct acpi_find_pci_root *)context;
unsigned long seg, bus;
acpi_status status;
int tmp;
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };

acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);

status = acpi_evaluate_integer(handle, METHOD_NAME__SEG, NULL, &seg);
if (status == AE_NOT_FOUND) {
/* Assume seg = 0 */
status = AE_OK;
seg = 0;
}
if (ACPI_FAILURE(status)) {
status = AE_CTRL_DEPTH;
goto exit;
}

tmp = get_root_bridge_busnr(handle);
if (tmp < 0) {
printk(KERN_ERR PREFIX
"Find root bridge failed for %s\n",
(char *)buffer.pointer);
status = AE_CTRL_DEPTH;
goto exit;
}
bus = tmp;

if (seg == find->seg && bus == find->bus)
{
find->handle = handle;
status = AE_CTRL_TERMINATE;
}
else
status = AE_OK;
exit:
kfree(buffer.pointer);
return status;
}

acpi_handle acpi_get_pci_rootbridge_handle(unsigned int seg, unsigned int bus)
{
struct acpi_find_pci_root find = { seg, bus, NULL };

acpi_get_devices(PCI_ROOT_HID_STRING, find_pci_rootbridge, &find, NULL);
return find.handle;
}
EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle);

/* Get device's handler per its address under its parent */
struct acpi_find_child {
acpi_handle handle;
Expand Down
13 changes: 13 additions & 0 deletions trunk/drivers/acpi/pci_root.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,19 @@ void acpi_pci_unregister_driver(struct acpi_pci_driver *driver)

EXPORT_SYMBOL(acpi_pci_unregister_driver);

acpi_handle acpi_get_pci_rootbridge_handle(unsigned int seg, unsigned int bus)
{
struct acpi_pci_root *tmp;

list_for_each_entry(tmp, &acpi_pci_roots, node) {
if ((tmp->id.segment == (u16) seg) && (tmp->id.bus == (u16) bus))
return tmp->device->handle;
}
return NULL;
}

EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle);

static acpi_status
get_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
{
Expand Down
Loading

0 comments on commit 4229bab

Please sign in to comment.