1 // SPDX-License-Identifier: GPL-2.0
3 // soc-apci.c - support for ACPI enumeration.
5 // Copyright (c) 2013-15, Intel Corporation.
7 #include <sound/soc-acpi.h>
9 struct snd_soc_acpi_mach
*
10 snd_soc_acpi_find_machine(struct snd_soc_acpi_mach
*machines
)
12 struct snd_soc_acpi_mach
*mach
;
13 struct snd_soc_acpi_mach
*mach_alt
;
15 for (mach
= machines
; mach
->id
[0]; mach
++) {
16 if (acpi_dev_present(mach
->id
, NULL
, -1)) {
17 if (mach
->machine_quirk
) {
18 mach_alt
= mach
->machine_quirk(mach
);
20 continue; /* not full match, ignore */
29 EXPORT_SYMBOL_GPL(snd_soc_acpi_find_machine
);
31 static acpi_status
snd_soc_acpi_find_package(acpi_handle handle
, u32 level
,
32 void *context
, void **ret
)
34 struct acpi_device
*adev
;
35 acpi_status status
= AE_OK
;
36 struct snd_soc_acpi_package_context
*pkg_ctx
= context
;
38 pkg_ctx
->data_valid
= false;
40 if (acpi_bus_get_device(handle
, &adev
))
43 if (adev
->status
.present
&& adev
->status
.functional
) {
44 struct acpi_buffer buffer
= {ACPI_ALLOCATE_BUFFER
, NULL
};
45 union acpi_object
*myobj
= NULL
;
47 status
= acpi_evaluate_object_typed(handle
, pkg_ctx
->name
,
50 if (ACPI_FAILURE(status
))
53 myobj
= buffer
.pointer
;
54 if (!myobj
|| myobj
->package
.count
!= pkg_ctx
->length
) {
55 kfree(buffer
.pointer
);
59 status
= acpi_extract_package(myobj
,
60 pkg_ctx
->format
, pkg_ctx
->state
);
61 if (ACPI_FAILURE(status
)) {
62 kfree(buffer
.pointer
);
66 kfree(buffer
.pointer
);
67 pkg_ctx
->data_valid
= true;
68 return AE_CTRL_TERMINATE
;
74 bool snd_soc_acpi_find_package_from_hid(const u8 hid
[ACPI_ID_LEN
],
75 struct snd_soc_acpi_package_context
*ctx
)
79 status
= acpi_get_devices(hid
, snd_soc_acpi_find_package
, ctx
, NULL
);
81 if (ACPI_FAILURE(status
) || !ctx
->data_valid
)
86 EXPORT_SYMBOL_GPL(snd_soc_acpi_find_package_from_hid
);
88 struct snd_soc_acpi_mach
*snd_soc_acpi_codec_list(void *arg
)
90 struct snd_soc_acpi_mach
*mach
= arg
;
91 struct snd_soc_acpi_codecs
*codec_list
=
92 (struct snd_soc_acpi_codecs
*) mach
->quirk_data
;
95 if (mach
->quirk_data
== NULL
)
98 for (i
= 0; i
< codec_list
->num_codecs
; i
++) {
99 if (!acpi_dev_present(codec_list
->codecs
[i
], NULL
, -1))
105 EXPORT_SYMBOL_GPL(snd_soc_acpi_codec_list
);
107 MODULE_LICENSE("GPL v2");
108 MODULE_DESCRIPTION("ALSA SoC ACPI module");