2 * sst_match_apci.c - SST (LPE) match for ACPI enumeration.
4 * Copyright (c) 2013-15, Intel Corporation.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms and conditions of the GNU General Public License,
9 * version 2, as published by the Free Software Foundation.
11 * This program is distributed in the hope it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 static acpi_status
sst_acpi_find_name(acpi_handle handle
, u32 level
,
20 void *context
, void **ret
)
22 struct acpi_device
*adev
;
23 const char *name
= NULL
;
25 if (acpi_bus_get_device(handle
, &adev
))
28 if (adev
->status
.present
&& adev
->status
.functional
) {
29 name
= acpi_dev_name(adev
);
30 *(const char **)ret
= name
;
31 return AE_CTRL_TERMINATE
;
37 const char *sst_acpi_find_name_from_hid(const u8 hid
[ACPI_ID_LEN
])
39 const char *name
= NULL
;
42 status
= acpi_get_devices(hid
, sst_acpi_find_name
, NULL
,
45 if (ACPI_FAILURE(status
) || name
[0] == '\0')
50 EXPORT_SYMBOL_GPL(sst_acpi_find_name_from_hid
);
52 static acpi_status
sst_acpi_mach_match(acpi_handle handle
, u32 level
,
53 void *context
, void **ret
)
55 unsigned long long sta
;
58 *(bool *)context
= true;
59 status
= acpi_evaluate_integer(handle
, "_STA", NULL
, &sta
);
60 if (ACPI_FAILURE(status
) || !(sta
& ACPI_STA_DEVICE_PRESENT
))
61 *(bool *)context
= false;
66 struct sst_acpi_mach
*sst_acpi_find_machine(struct sst_acpi_mach
*machines
)
68 struct sst_acpi_mach
*mach
;
71 for (mach
= machines
; mach
->id
[0]; mach
++)
72 if (ACPI_SUCCESS(acpi_get_devices(mach
->id
,
74 &found
, NULL
)) && found
)
78 EXPORT_SYMBOL_GPL(sst_acpi_find_machine
);
80 static acpi_status
sst_acpi_find_package(acpi_handle handle
, u32 level
,
81 void *context
, void **ret
)
83 struct acpi_device
*adev
;
84 acpi_status status
= AE_OK
;
85 struct sst_acpi_package_context
*pkg_ctx
= context
;
87 pkg_ctx
->data_valid
= false;
89 if (acpi_bus_get_device(handle
, &adev
))
92 if (adev
->status
.present
&& adev
->status
.functional
) {
93 struct acpi_buffer buffer
= {ACPI_ALLOCATE_BUFFER
, NULL
};
94 union acpi_object
*myobj
= NULL
;
96 status
= acpi_evaluate_object_typed(handle
, pkg_ctx
->name
,
99 if (ACPI_FAILURE(status
))
102 myobj
= buffer
.pointer
;
103 if (!myobj
|| myobj
->package
.count
!= pkg_ctx
->length
) {
104 kfree(buffer
.pointer
);
108 status
= acpi_extract_package(myobj
,
109 pkg_ctx
->format
, pkg_ctx
->state
);
110 if (ACPI_FAILURE(status
)) {
111 kfree(buffer
.pointer
);
115 kfree(buffer
.pointer
);
116 pkg_ctx
->data_valid
= true;
117 return AE_CTRL_TERMINATE
;
123 bool sst_acpi_find_package_from_hid(const u8 hid
[ACPI_ID_LEN
],
124 struct sst_acpi_package_context
*ctx
)
128 status
= acpi_get_devices(hid
, sst_acpi_find_package
, ctx
, NULL
);
130 if (ACPI_FAILURE(status
) || !ctx
->data_valid
)
135 EXPORT_SYMBOL_GPL(sst_acpi_find_package_from_hid
);
137 MODULE_LICENSE("GPL v2");
138 MODULE_DESCRIPTION("Intel Common ACPI Match module");