diff options
Diffstat (limited to 'sound/soc/amd/acp/amd-sdw-acpi.c')
| -rw-r--r-- | sound/soc/amd/acp/amd-sdw-acpi.c | 62 | 
1 files changed, 62 insertions, 0 deletions
diff --git a/sound/soc/amd/acp/amd-sdw-acpi.c b/sound/soc/amd/acp/amd-sdw-acpi.c new file mode 100644 index 000000000000..babd841d3296 --- /dev/null +++ b/sound/soc/amd/acp/amd-sdw-acpi.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) +// +// This file is provided under a dual BSD/GPLv2 license. When using or +// redistributing this file, you may do so under either license. +// +// Copyright(c) 2023 Advanced Micro Devices, Inc. All rights reserved. +// +// Authors: Vijendar Mukunda <[email protected]> + +/* + * SDW AMD ACPI scan helper function + */ + +#include <linux/acpi.h> +#include <linux/bits.h> +#include <linux/bitfield.h> +#include <linux/device.h> +#include <linux/errno.h> +#include <linux/export.h> +#include <linux/fwnode.h> +#include <linux/module.h> +#include <linux/soundwire/sdw_amd.h> +#include <linux/string.h> + +int amd_sdw_scan_controller(struct sdw_amd_acpi_info *info) +{ +	struct acpi_device *adev = acpi_fetch_acpi_dev(info->handle); +	u32 sdw_bitmap = 0; +	u8 count = 0; +	int ret; + +	if (!adev) +		return -EINVAL; + +	/* Found controller, find links supported */ +	ret = fwnode_property_read_u32_array(acpi_fwnode_handle(adev), +					     "mipi-sdw-manager-list", &sdw_bitmap, 1); +	if (ret) { +		dev_err(&adev->dev, +			"Failed to read mipi-sdw-manager-list: %d\n", ret); +		return -EINVAL; +	} +	count = hweight32(sdw_bitmap); +	/* Check count is within bounds */ +	if (count > info->count) { +		dev_err(&adev->dev, "Manager count %d exceeds max %d\n", +			count, info->count); +		return -EINVAL; +	} + +	if (!count) { +		dev_dbg(&adev->dev, "No SoundWire Managers detected\n"); +		return -EINVAL; +	} +	dev_dbg(&adev->dev, "ACPI reports %d SoundWire Manager devices\n", count); +	info->link_mask = sdw_bitmap; +	return 0; +} +EXPORT_SYMBOL_NS(amd_sdw_scan_controller, SND_AMD_SOUNDWIRE_ACPI); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("AMD SoundWire ACPI helpers");  |