// 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 <Vijendar.Mukunda@amd.com> /* * 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");