ALSA/hda: intel-sdw-acpi: add support for sdw-manager-list property read
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 1 Oct 2024 07:06:11 +0000 (15:06 +0800)
committerTakashi Iwai <tiwai@suse.de>
Tue, 15 Oct 2024 05:54:16 +0000 (07:54 +0200)
The DisCo for SoundWire 2.0 spec adds support for a new
sdw-manager-list property.  Add it in backwards-compatible mode with
'sdw-master-count', which assumed that all links between 0..count-1
exist.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20241001070611.63288-5-yung-chuan.liao@linux.intel.com
include/linux/soundwire/sdw_intel.h
sound/hda/intel-sdw-acpi.c

index 37ae69365fe263565321b1993f6319442d9ce013..734dc1fa3b5bc3227dedacf0486c8d71a38992d5 100644 (file)
@@ -227,7 +227,7 @@ struct sdw_intel_ops {
 /**
  * struct sdw_intel_acpi_info - Soundwire Intel information found in ACPI tables
  * @handle: ACPI controller handle
- * @count: link count found with "sdw-master-count" property
+ * @count: link count found with "sdw-master-count" or "sdw-manager-list" property
  * @link_mask: bit-wise mask listing links enabled by BIOS menu
  *
  * this structure could be expanded to e.g. provide all the _ADR
index 582e761e7b9fc175053ca0d34faabe7250c54956..ed530e0dd4ddcc9dc3ebe107a823835b414e6150 100644 (file)
@@ -57,8 +57,10 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
 {
        struct acpi_device *adev = acpi_fetch_acpi_dev(info->handle);
        struct fwnode_handle *fwnode;
+       unsigned long list;
        unsigned int i;
        u32 count;
+       u32 tmp;
        int ret;
 
        if (!adev)
@@ -66,10 +68,9 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
 
        fwnode = acpi_fwnode_handle(adev);
 
-       /* Found controller, find links supported */
-       ret = fwnode_property_read_u32(fwnode, "mipi-sdw-master-count", &count);
-
        /*
+        * Found controller, find links supported
+        *
         * In theory we could check the number of links supported in
         * hardware, but in that step we cannot assume SoundWire IP is
         * powered.
@@ -80,11 +81,19 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
         *
         * We will check the hardware capabilities in the startup() step
         */
-
+       ret = fwnode_property_read_u32(fwnode, "mipi-sdw-manager-list", &tmp);
        if (ret) {
-               dev_err(&adev->dev,
-                       "Failed to read mipi-sdw-master-count: %d\n", ret);
-               return ret;
+               ret = fwnode_property_read_u32(fwnode, "mipi-sdw-master-count", &count);
+               if (ret) {
+                       dev_err(&adev->dev,
+                               "Failed to read mipi-sdw-master-count: %d\n",
+                               ret);
+                       return ret;
+               }
+               list = GENMASK(count - 1, 0);
+       } else {
+               list = tmp;
+               count = hweight32(list);
        }
 
        /* Check count is within bounds */
@@ -103,7 +112,7 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
        info->count = count;
        info->link_mask = 0;
 
-       for (i = 0; i < count; i++) {
+       for_each_set_bit(i, &list, SDW_INTEL_MAX_LINKS) {
                if (ctrl_link_mask && !(ctrl_link_mask & BIT(i))) {
                        dev_dbg(&adev->dev,
                                "Link %d masked, will not be enabled\n", i);