Skip to content

Commit

Permalink
ACPI / scan: Simplify acpi_match_device()
Browse files Browse the repository at this point in the history
Redefine acpi_companion_match() to return an ACPI device object
pointer instead of a bool and use it to remove some redundant code
from acpi_match_device().

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
  • Loading branch information
rafaeljw committed Apr 10, 2015
1 parent 54fe9ce commit e1acdeb
Showing 1 changed file with 11 additions and 19 deletions.
30 changes: 11 additions & 19 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,8 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
*
* Check if the given device has an ACPI companion and if that companion has
* a valid list of PNP IDs, and if the device is the first (primary) physical
* device associated with it.
* device associated with it. Return the companion pointer if that's the case
* or NULL otherwise.
*
* If multiple physical devices are attached to a single ACPI companion, we need
* to be careful. The usage scenario for this kind of relationship is that all
Expand All @@ -208,31 +209,31 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
* resources available from it but they will be matched normally using functions
* provided by their bus types (and analogously for their modalias).
*/
static bool acpi_companion_match(const struct device *dev)
static struct acpi_device *acpi_companion_match(const struct device *dev)
{
struct acpi_device *adev;
bool ret;

adev = ACPI_COMPANION(dev);
if (!adev)
return false;
return NULL;

if (list_empty(&adev->pnp.ids))
return false;
return NULL;

mutex_lock(&adev->physical_node_lock);
if (list_empty(&adev->physical_node_list)) {
ret = false;
adev = NULL;
} else {
const struct acpi_device_physical_node *node;

node = list_first_entry(&adev->physical_node_list,
struct acpi_device_physical_node, node);
ret = node->dev == dev;
if (node->dev != dev)
adev = NULL;
}
mutex_unlock(&adev->physical_node_lock);

return ret;
return adev;
}

/*
Expand Down Expand Up @@ -904,7 +905,7 @@ static const struct acpi_device_id *__acpi_match_device(
* If the device is not present, it is unnecessary to load device
* driver for it.
*/
if (!device->status.present)
if (!device || !device->status.present)
return NULL;

for (id = ids; id->id[0]; id++)
Expand All @@ -929,16 +930,7 @@ static const struct acpi_device_id *__acpi_match_device(
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
const struct device *dev)
{
struct acpi_device *adev;
acpi_handle handle = ACPI_HANDLE(dev);

if (!ids || !handle || acpi_bus_get_device(handle, &adev))
return NULL;

if (!acpi_companion_match(dev))
return NULL;

return __acpi_match_device(adev, ids);
return __acpi_match_device(acpi_companion_match(dev), ids);
}
EXPORT_SYMBOL_GPL(acpi_match_device);

Expand Down

0 comments on commit e1acdeb

Please sign in to comment.