Skip to content

Commit

Permalink
ACPI / bind: Rework struct acpi_bus_type
Browse files Browse the repository at this point in the history
Replace the .find_device function pointer in struct acpi_bus_type
with a new one, .find_companion, that is supposed to point to a
function returning struct acpi_device pointer (instead of an int)
and takes one argument (instead of two).  This way the role of
this callback is more clear and the implementation of it can
be more straightforward.

Update all of the users of struct acpi_bus_type (PCI, PNP/ACPI and
USB) to reflect the structure change.

Signed-off-by: Rafael J. Wysocki <[email protected]>
Tested-by: Lan Tianyu <[email protected]> # for USB/ACPI
  • Loading branch information
rafaeljw committed Dec 7, 2013
1 parent 9c5ad36 commit e3f02c5
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 48 deletions.
12 changes: 7 additions & 5 deletions drivers/acpi/glue.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ int register_acpi_bus_type(struct acpi_bus_type *type)
{
if (acpi_disabled)
return -ENODEV;
if (type && type->match && type->find_device) {
if (type && type->match && type->find_companion) {
down_write(&bus_type_sem);
list_add_tail(&type->list, &bus_type_list);
up_write(&bus_type_sem);
Expand Down Expand Up @@ -302,17 +302,19 @@ EXPORT_SYMBOL_GPL(acpi_unbind_one);
static int acpi_platform_notify(struct device *dev)
{
struct acpi_bus_type *type = acpi_get_bus_type(dev);
acpi_handle handle;
int ret;

ret = acpi_bind_one(dev, NULL);
if (ret && type) {
ret = type->find_device(dev, &handle);
if (ret) {
struct acpi_device *adev;

adev = type->find_companion(dev);
if (!adev) {
DBG("Unable to get handle for %s\n", dev_name(dev));
ret = -ENODEV;
goto out;
}
ret = acpi_bind_one(dev, handle);
ret = acpi_bind_one(dev, adev->handle);
if (ret)
goto out;
}
Expand Down
12 changes: 3 additions & 9 deletions drivers/pci/pci-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,9 @@ void acpi_pci_remove_bus(struct pci_bus *bus)
}

/* ACPI bus type */
static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)
static struct acpi_device *acpi_pci_find_companion(struct device *dev)
{
struct pci_dev *pci_dev = to_pci_dev(dev);
struct acpi_device *adev;
bool check_children;
u64 addr;

Expand All @@ -319,13 +318,8 @@ static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)
|| pci_dev->hdr_type == PCI_HEADER_TYPE_CARDBUS;
/* Please ref to ACPI spec for the syntax of _ADR */
addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn);
adev = acpi_find_child_device(ACPI_COMPANION(dev->parent), addr,
return acpi_find_child_device(ACPI_COMPANION(dev->parent), addr,
check_children);
if (adev) {
*handle = adev->handle;
return 0;
}
return -ENODEV;
}

static void pci_acpi_setup(struct device *dev)
Expand Down Expand Up @@ -365,7 +359,7 @@ static bool pci_acpi_bus_match(struct device *dev)
static struct acpi_bus_type acpi_pci_bus = {
.name = "PCI",
.match = pci_acpi_bus_match,
.find_device = acpi_pci_find_device,
.find_companion = acpi_pci_find_companion,
.setup = pci_acpi_setup,
.cleanup = pci_acpi_cleanup,
};
Expand Down
21 changes: 8 additions & 13 deletions drivers/pnp/pnpacpi/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,20 +328,15 @@ static int __init acpi_pnp_match(struct device *dev, void *_pnp)
&& compare_pnp_id(pnp->id, acpi_device_hid(acpi));
}

static int __init acpi_pnp_find_device(struct device *dev, acpi_handle * handle)
static struct acpi_device * __init acpi_pnp_find_companion(struct device *dev)
{
struct device *adev;
struct acpi_device *acpi;

adev = bus_find_device(&acpi_bus_type, NULL,
to_pnp_dev(dev), acpi_pnp_match);
if (!adev)
return -ENODEV;
dev = bus_find_device(&acpi_bus_type, NULL, to_pnp_dev(dev),
acpi_pnp_match);
if (!dev)
return NULL;

acpi = to_acpi_device(adev);
*handle = acpi->handle;
put_device(adev);
return 0;
put_device(dev);
return to_acpi_device(dev);
}

/* complete initialization of a PNPACPI device includes having
Expand All @@ -355,7 +350,7 @@ static bool acpi_pnp_bus_match(struct device *dev)
static struct acpi_bus_type __initdata acpi_pnp_bus = {
.name = "PNP",
.match = acpi_pnp_bus_match,
.find_device = acpi_pnp_find_device,
.find_companion = acpi_pnp_find_companion,
};

int pnpacpi_disabled __initdata;
Expand Down
40 changes: 20 additions & 20 deletions drivers/usb/core/usb-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ static int usb_acpi_check_port_connect_type(struct usb_device *hdev,
return ret;
}

static int usb_acpi_find_device(struct device *dev, acpi_handle *handle)
static struct acpi_device *usb_acpi_find_companion(struct device *dev)
{
struct usb_device *udev;
acpi_handle *parent_handle;
Expand Down Expand Up @@ -168,16 +168,15 @@ static int usb_acpi_find_device(struct device *dev, acpi_handle *handle)
break;
}

return -ENODEV;
return NULL;
}

/* root hub's parent is the usb hcd. */
parent_handle = ACPI_HANDLE(dev->parent);
*handle = acpi_get_child(parent_handle, udev->portnum);
if (!*handle)
return -ENODEV;
return 0;
return acpi_find_child_device(ACPI_COMPANION(dev->parent),
udev->portnum, false);
} else if (is_usb_port(dev)) {
struct acpi_device *adev = NULL;

sscanf(dev_name(dev), "port%d", &port_num);
/* Get the struct usb_device point of port's hub */
udev = to_usb_device(dev->parent->parent);
Expand All @@ -193,26 +192,27 @@ static int usb_acpi_find_device(struct device *dev, acpi_handle *handle)

raw_port_num = usb_hcd_find_raw_port_number(hcd,
port_num);
*handle = acpi_get_child(ACPI_HANDLE(&udev->dev),
raw_port_num);
if (!*handle)
return -ENODEV;
adev = acpi_find_child_device(ACPI_COMPANION(&udev->dev),
raw_port_num, false);
if (!adev)
return NULL;
} else {
parent_handle =
usb_get_hub_port_acpi_handle(udev->parent,
udev->portnum);
if (!parent_handle)
return -ENODEV;
return NULL;

*handle = acpi_get_child(parent_handle, port_num);
if (!*handle)
return -ENODEV;
acpi_bus_get_device(parent_handle, &adev);
adev = acpi_find_child_device(adev, port_num, false);
if (!adev)
return NULL;
}
usb_acpi_check_port_connect_type(udev, *handle, port_num);
} else
return -ENODEV;
usb_acpi_check_port_connect_type(udev, adev->handle, port_num);
return adev;
}

return 0;
return NULL;
}

static bool usb_acpi_bus_match(struct device *dev)
Expand All @@ -223,7 +223,7 @@ static bool usb_acpi_bus_match(struct device *dev)
static struct acpi_bus_type usb_acpi_bus = {
.name = "USB",
.match = usb_acpi_bus_match,
.find_device = usb_acpi_find_device,
.find_companion = usb_acpi_find_companion,
};

int usb_acpi_register(void)
Expand Down
2 changes: 1 addition & 1 deletion include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ struct acpi_bus_type {
struct list_head list;
const char *name;
bool (*match)(struct device *dev);
int (*find_device) (struct device *, acpi_handle *);
struct acpi_device * (*find_companion)(struct device *);
void (*setup)(struct device *);
void (*cleanup)(struct device *);
};
Expand Down

0 comments on commit e3f02c5

Please sign in to comment.