ALSA: hda: intel-nhlt: add intel_nhlt_ssp_device_type() function
authorBrent Lu <brent.lu@intel.com>
Mon, 27 Nov 2023 12:06:56 +0000 (14:06 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 22 Mar 2024 11:40:46 +0000 (12:40 +0100)
Add a helper function intel_nhlt_ssp_device_type() to detect the type
of specific SSP port. The result is nhlt_device_type enum type which
could be NHLT_DEVICE_BT or NHLT_DEVICE_I2S.

Signed-off-by: Brent Lu <brent.lu@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Message-ID: <20231127120657.19764-2-peter.ujfalusi@linux.intel.com>

include/sound/intel-nhlt.h
sound/hda/intel-nhlt.c

index 53470d6a28d659db09e9e58e85e24ffe5e862db5..24dbe16684ae3349bae5a7f74ac5c80fd16e6211 100644 (file)
@@ -143,6 +143,9 @@ intel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt,
                             u32 bus_id, u8 link_type, u8 vbps, u8 bps,
                             u8 num_ch, u32 rate, u8 dir, u8 dev_type);
 
+int intel_nhlt_ssp_device_type(struct device *dev, struct nhlt_acpi_table *nhlt,
+                              u8 virtual_bus_id);
+
 #else
 
 static inline struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)
@@ -184,6 +187,13 @@ intel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt,
        return NULL;
 }
 
+static inline int intel_nhlt_ssp_device_type(struct device *dev,
+                                            struct nhlt_acpi_table *nhlt,
+                                            u8 virtual_bus_id)
+{
+       return -EINVAL;
+}
+
 #endif
 
 #endif
index 696a958d93e9c336dea68748e59685e4c0569ee9..088cff799e0bee5003f8d09ae0cb0087cc46ab33 100644 (file)
@@ -343,3 +343,29 @@ intel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt,
        return NULL;
 }
 EXPORT_SYMBOL(intel_nhlt_get_endpoint_blob);
+
+int intel_nhlt_ssp_device_type(struct device *dev, struct nhlt_acpi_table *nhlt,
+                              u8 virtual_bus_id)
+{
+       struct nhlt_endpoint *epnt;
+       int i;
+
+       if (!nhlt)
+               return -EINVAL;
+
+       epnt = (struct nhlt_endpoint *)nhlt->desc;
+       for (i = 0; i < nhlt->endpoint_count; i++) {
+               /* for SSP link the virtual bus id is the SSP port number */
+               if (epnt->linktype == NHLT_LINK_SSP &&
+                   epnt->virtual_bus_id == virtual_bus_id) {
+                       dev_dbg(dev, "SSP%d: dev_type=%d\n", virtual_bus_id,
+                               epnt->device_type);
+                       return epnt->device_type;
+               }
+
+               epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
+       }
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL(intel_nhlt_ssp_device_type);