Commit d70d141b authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

ACPI: utils: Introduce helper for _DEP list lookup

The ACPI LPSS driver and the Surface platform driver code use almost the
same code pattern for checking if one ACPI device is present in the list
returned by _DEP for another ACPI device.

To reduce the resulting code duplication, introduce a helper for that
called acpi_device_dep() and invoke it from both places.

No intentional functional impact.
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 4c660ffe
...@@ -562,31 +562,6 @@ static struct device *acpi_lpss_find_device(const char *hid, const char *uid) ...@@ -562,31 +562,6 @@ static struct device *acpi_lpss_find_device(const char *hid, const char *uid)
return bus_find_device(&pci_bus_type, NULL, &data, match_hid_uid); return bus_find_device(&pci_bus_type, NULL, &data, match_hid_uid);
} }
static bool acpi_lpss_dep(struct acpi_device *adev, acpi_handle handle)
{
struct acpi_handle_list dep_devices;
bool ret = false;
int i;
if (!acpi_has_method(adev->handle, "_DEP"))
return false;
if (!acpi_evaluate_reference(adev->handle, "_DEP", NULL, &dep_devices)) {
dev_dbg(&adev->dev, "Failed to evaluate _DEP.\n");
return false;
}
for (i = 0; i < dep_devices.count; i++) {
if (dep_devices.handles[i] == handle) {
ret = true;
break;
}
}
acpi_handle_list_free(&dep_devices);
return ret;
}
static void acpi_lpss_link_consumer(struct device *dev1, static void acpi_lpss_link_consumer(struct device *dev1,
const struct lpss_device_links *link) const struct lpss_device_links *link)
{ {
...@@ -597,7 +572,7 @@ static void acpi_lpss_link_consumer(struct device *dev1, ...@@ -597,7 +572,7 @@ static void acpi_lpss_link_consumer(struct device *dev1,
return; return;
if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids)) if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids))
|| acpi_lpss_dep(ACPI_COMPANION(dev2), ACPI_HANDLE(dev1))) || acpi_device_dep(ACPI_HANDLE(dev2), ACPI_HANDLE(dev1)))
device_link_add(dev2, dev1, link->flags); device_link_add(dev2, dev1, link->flags);
put_device(dev2); put_device(dev2);
...@@ -613,7 +588,7 @@ static void acpi_lpss_link_supplier(struct device *dev1, ...@@ -613,7 +588,7 @@ static void acpi_lpss_link_supplier(struct device *dev1,
return; return;
if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids)) if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids))
|| acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2))) || acpi_device_dep(ACPI_HANDLE(dev1), ACPI_HANDLE(dev2)))
device_link_add(dev1, dev2, link->flags); device_link_add(dev1, dev2, link->flags);
put_device(dev2); put_device(dev2);
......
...@@ -450,6 +450,40 @@ void acpi_handle_list_free(struct acpi_handle_list *list) ...@@ -450,6 +450,40 @@ void acpi_handle_list_free(struct acpi_handle_list *list)
} }
EXPORT_SYMBOL_GPL(acpi_handle_list_free); EXPORT_SYMBOL_GPL(acpi_handle_list_free);
/**
* acpi_device_dep - Check ACPI device dependency
* @target: ACPI handle of the target ACPI device.
* @match: ACPI handle to look up in the target's _DEP list.
*
* Return true if @match is present in the list returned by _DEP for
* @target or false otherwise.
*/
bool acpi_device_dep(acpi_handle target, acpi_handle match)
{
struct acpi_handle_list dep_devices;
bool ret = false;
int i;
if (!acpi_has_method(target, "_DEP"))
return false;
if (!acpi_evaluate_reference(target, "_DEP", NULL, &dep_devices)) {
acpi_handle_debug(target, "Failed to evaluate _DEP.\n");
return false;
}
for (i = 0; i < dep_devices.count; i++) {
if (dep_devices.handles[i] == match) {
ret = true;
break;
}
}
acpi_handle_list_free(&dep_devices);
return ret;
}
EXPORT_SYMBOL_GPL(acpi_device_dep);
acpi_status acpi_status
acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld) acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld)
{ {
......
...@@ -736,32 +736,6 @@ do { \ ...@@ -736,32 +736,6 @@ do { \
#define san_consumer_warn(dev, handle, fmt, ...) \ #define san_consumer_warn(dev, handle, fmt, ...) \
san_consumer_printk(warn, dev, handle, fmt, ##__VA_ARGS__) san_consumer_printk(warn, dev, handle, fmt, ##__VA_ARGS__)
static bool is_san_consumer(struct platform_device *pdev, acpi_handle handle)
{
struct acpi_handle_list dep_devices;
acpi_handle supplier = ACPI_HANDLE(&pdev->dev);
bool ret = false;
int i;
if (!acpi_has_method(handle, "_DEP"))
return false;
if (!acpi_evaluate_reference(handle, "_DEP", NULL, &dep_devices)) {
san_consumer_dbg(&pdev->dev, handle, "failed to evaluate _DEP\n");
return false;
}
for (i = 0; i < dep_devices.count; i++) {
if (dep_devices.handles[i] == supplier) {
ret = true;
break;
}
}
acpi_handle_list_free(&dep_devices);
return ret;
}
static acpi_status san_consumer_setup(acpi_handle handle, u32 lvl, static acpi_status san_consumer_setup(acpi_handle handle, u32 lvl,
void *context, void **rv) void *context, void **rv)
{ {
...@@ -770,7 +744,7 @@ static acpi_status san_consumer_setup(acpi_handle handle, u32 lvl, ...@@ -770,7 +744,7 @@ static acpi_status san_consumer_setup(acpi_handle handle, u32 lvl,
struct acpi_device *adev; struct acpi_device *adev;
struct device_link *link; struct device_link *link;
if (!is_san_consumer(pdev, handle)) if (!acpi_device_dep(handle, ACPI_HANDLE(&pdev->dev)))
return AE_OK; return AE_OK;
/* Ignore ACPI devices that are not present. */ /* Ignore ACPI devices that are not present. */
......
...@@ -33,6 +33,7 @@ bool acpi_handle_list_equal(struct acpi_handle_list *list1, ...@@ -33,6 +33,7 @@ bool acpi_handle_list_equal(struct acpi_handle_list *list1,
void acpi_handle_list_replace(struct acpi_handle_list *dst, void acpi_handle_list_replace(struct acpi_handle_list *dst,
struct acpi_handle_list *src); struct acpi_handle_list *src);
void acpi_handle_list_free(struct acpi_handle_list *list); void acpi_handle_list_free(struct acpi_handle_list *list);
bool acpi_device_dep(acpi_handle target, acpi_handle match);
acpi_status acpi_status
acpi_evaluate_ost(acpi_handle handle, u32 source_event, u32 status_code, acpi_evaluate_ost(acpi_handle handle, u32 source_event, u32 status_code,
struct acpi_buffer *status_buf); struct acpi_buffer *status_buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment