[PATCH 04/20] ALSA: intel-nhlt: add helper to detect SSP link mask

Cezary Rojewski cezary.rojewski at intel.com
Wed Mar 9 18:01:23 CET 2022


On 2022-03-08 8:25 PM, Pierre-Louis Bossart wrote:
> The NHLT information can be used to figure out which SSPs are enabled
> in a platform.
> 
> The 'SSP' link type is too broad for machine drivers, since it can
> cover the Bluetooth sideband and the analog audio codec connections,
> so this helper exposes a parameter to filter with the device
> type (DEVICE_I2S refers to analog audio codec in NHLT parlance).
> 
> The helper returns a mask, since more than one SSP may be used for
> analog audio, e.g. the NHLT spec describes the use of SSP0 for
> amplifiers and SSP1 for headset codec. Note that if more than one bit
> is set, it's impossible to determine which SSP is connected to what
> external component. Additional platform-specific information based on
> e.g. DMI quirks would still be required in the machine driver to
> configure the relevant dailinks.

...

> diff --git a/sound/hda/intel-nhlt.c b/sound/hda/intel-nhlt.c
> index 128476aa7c61..4063da378283 100644
> --- a/sound/hda/intel-nhlt.c
> +++ b/sound/hda/intel-nhlt.c
> @@ -130,6 +130,28 @@ bool intel_nhlt_has_endpoint_type(struct nhlt_acpi_table *nhlt, u8 link_type)
>   }
>   EXPORT_SYMBOL(intel_nhlt_has_endpoint_type);
>   
> +int intel_nhlt_ssp_endpoint_mask(struct nhlt_acpi_table *nhlt, u8 device_type)
> +{
> +	struct nhlt_endpoint *epnt;
> +	int ssp_mask = 0;
> +	int i;
> +
> +	if (!nhlt || (device_type != NHLT_DEVICE_BT && device_type != NHLT_DEVICE_I2S))

The '!nhlt' safety is superfluous in my opinion. Kernel core API e.g.: 
device one assumes caller is sane in basically all cases.

> +		return 0;
> +
> +	epnt = (struct nhlt_endpoint *)nhlt->desc;
> +	for (i = 0; i < nhlt->endpoint_count; i++) {
> +		if (epnt->linktype == NHLT_LINK_SSP && epnt->device_type == device_type) {
> +			/* for SSP the virtual bus id is the SSP port */
> +			ssp_mask |= BIT(epnt->virtual_bus_id);
> +		}
> +		epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
> +	}
> +
> +	return ssp_mask;
> +}
> +EXPORT_SYMBOL(intel_nhlt_ssp_endpoint_mask);

Since this is a *public* API - not direct part of any driver, really - 
providing kernel-doc is recommended.


Regards,
Czarek


More information about the Alsa-devel mailing list