aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r--drivers/acpi/scan.c30
1 files changed, 11 insertions, 19 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 99f97ac64aa4..b4d5549265ed 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -194,7 +194,8 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
194 * 194 *
195 * Check if the given device has an ACPI companion and if that companion has 195 * Check if the given device has an ACPI companion and if that companion has
196 * a valid list of PNP IDs, and if the device is the first (primary) physical 196 * a valid list of PNP IDs, and if the device is the first (primary) physical
197 * device associated with it. 197 * device associated with it. Return the companion pointer if that's the case
198 * or NULL otherwise.
198 * 199 *
199 * If multiple physical devices are attached to a single ACPI companion, we need 200 * If multiple physical devices are attached to a single ACPI companion, we need
200 * to be careful. The usage scenario for this kind of relationship is that all 201 * to be careful. The usage scenario for this kind of relationship is that all
@@ -208,31 +209,31 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
208 * resources available from it but they will be matched normally using functions 209 * resources available from it but they will be matched normally using functions
209 * provided by their bus types (and analogously for their modalias). 210 * provided by their bus types (and analogously for their modalias).
210 */ 211 */
211static bool acpi_companion_match(const struct device *dev) 212static struct acpi_device *acpi_companion_match(const struct device *dev)
212{ 213{
213 struct acpi_device *adev; 214 struct acpi_device *adev;
214 bool ret;
215 215
216 adev = ACPI_COMPANION(dev); 216 adev = ACPI_COMPANION(dev);
217 if (!adev) 217 if (!adev)
218 return false; 218 return NULL;
219 219
220 if (list_empty(&adev->pnp.ids)) 220 if (list_empty(&adev->pnp.ids))
221 return false; 221 return NULL;
222 222
223 mutex_lock(&adev->physical_node_lock); 223 mutex_lock(&adev->physical_node_lock);
224 if (list_empty(&adev->physical_node_list)) { 224 if (list_empty(&adev->physical_node_list)) {
225 ret = false; 225 adev = NULL;
226 } else { 226 } else {
227 const struct acpi_device_physical_node *node; 227 const struct acpi_device_physical_node *node;
228 228
229 node = list_first_entry(&adev->physical_node_list, 229 node = list_first_entry(&adev->physical_node_list,
230 struct acpi_device_physical_node, node); 230 struct acpi_device_physical_node, node);
231 ret = node->dev == dev; 231 if (node->dev != dev)
232 adev = NULL;
232 } 233 }
233 mutex_unlock(&adev->physical_node_lock); 234 mutex_unlock(&adev->physical_node_lock);
234 235
235 return ret; 236 return adev;
236} 237}
237 238
238/* 239/*
@@ -904,7 +905,7 @@ static const struct acpi_device_id *__acpi_match_device(
904 * If the device is not present, it is unnecessary to load device 905 * If the device is not present, it is unnecessary to load device
905 * driver for it. 906 * driver for it.
906 */ 907 */
907 if (!device->status.present) 908 if (!device || !device->status.present)
908 return NULL; 909 return NULL;
909 910
910 for (id = ids; id->id[0]; id++) 911 for (id = ids; id->id[0]; id++)
@@ -929,16 +930,7 @@ static const struct acpi_device_id *__acpi_match_device(
929const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, 930const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
930 const struct device *dev) 931 const struct device *dev)
931{ 932{
932 struct acpi_device *adev; 933 return __acpi_match_device(acpi_companion_match(dev), ids);
933 acpi_handle handle = ACPI_HANDLE(dev);
934
935 if (!ids || !handle || acpi_bus_get_device(handle, &adev))
936 return NULL;
937
938 if (!acpi_companion_match(dev))
939 return NULL;
940
941 return __acpi_match_device(adev, ids);
942} 934}
943EXPORT_SYMBOL_GPL(acpi_match_device); 935EXPORT_SYMBOL_GPL(acpi_match_device);
944 936