1 | // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
2 | // |
3 | // This file is provided under a dual BSD/GPLv2 license. When using or |
4 | // redistributing this file, you may do so under either license. |
5 | // |
6 | // Copyright(c) 2023 Advanced Micro Devices, Inc. All rights reserved. |
7 | // |
8 | // Authors: Vijendar Mukunda <Vijendar.Mukunda@amd.com> |
9 | |
10 | /* |
11 | * SDW AMD ACPI scan helper function |
12 | */ |
13 | |
14 | #include <linux/acpi.h> |
15 | #include <linux/bits.h> |
16 | #include <linux/bitfield.h> |
17 | #include <linux/device.h> |
18 | #include <linux/errno.h> |
19 | #include <linux/export.h> |
20 | #include <linux/fwnode.h> |
21 | #include <linux/module.h> |
22 | #include <linux/soundwire/sdw_amd.h> |
23 | #include <linux/string.h> |
24 | |
25 | int amd_sdw_scan_controller(struct sdw_amd_acpi_info *info) |
26 | { |
27 | struct acpi_device *adev = acpi_fetch_acpi_dev(handle: info->handle); |
28 | u32 sdw_bitmap = 0; |
29 | u8 count = 0; |
30 | int ret; |
31 | |
32 | if (!adev) |
33 | return -EINVAL; |
34 | |
35 | /* Found controller, find links supported */ |
36 | ret = fwnode_property_read_u32_array(fwnode: acpi_fwnode_handle(adev), |
37 | propname: "mipi-sdw-manager-list" , val: &sdw_bitmap, nval: 1); |
38 | if (ret) { |
39 | dev_err(&adev->dev, |
40 | "Failed to read mipi-sdw-manager-list: %d\n" , ret); |
41 | return -EINVAL; |
42 | } |
43 | count = hweight32(sdw_bitmap); |
44 | /* Check count is within bounds */ |
45 | if (count > info->count) { |
46 | dev_err(&adev->dev, "Manager count %d exceeds max %d\n" , |
47 | count, info->count); |
48 | return -EINVAL; |
49 | } |
50 | |
51 | if (!count) { |
52 | dev_dbg(&adev->dev, "No SoundWire Managers detected\n" ); |
53 | return -EINVAL; |
54 | } |
55 | dev_dbg(&adev->dev, "ACPI reports %d SoundWire Manager devices\n" , count); |
56 | info->link_mask = sdw_bitmap; |
57 | return 0; |
58 | } |
59 | EXPORT_SYMBOL_NS(amd_sdw_scan_controller, SND_AMD_SOUNDWIRE_ACPI); |
60 | |
61 | MODULE_LICENSE("Dual BSD/GPL" ); |
62 | MODULE_DESCRIPTION("AMD SoundWire ACPI helpers" ); |
63 | |