[PATCH] ASoC: Intel: add sof-nau8825 machine driver

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Thu Oct 28 16:28:48 CEST 2021



On 10/28/21 1:19 AM, Mac Chiang wrote:
> From: David Lin <CTLIN0 at nuvoton.com>
> 
> The machine driver is a generic machine driver for SOF with nau8825
> codec w or w/o speaker additionally. Depending on the SOC
> HDMI, DMIC, Bluetooth offload support are added dynamically.
> 
> Only add information related to SOF since the machine driver was
> only tested with SOF.
> 
> There are currently 4 i2s machine variants of ADL.
> This supports the headphone NUA8825(SSP0) alone or with smart or dumb
> speakers.
> Board 2,3,4 use SSP2 for Bluetooth offload support except board 1.
> 
> Board 1 : NAU8825 + RT1019P(SSP2)
> Board 2 : NAU8825 + MAX98373(SSP1)
> Board 3 : NAU8825 + MAX98360A(SSP1)
> Board 4 : NAU8825
> 
> Signed-off-by: David Lin <CTLIN0 at nuvoton.com>
> Co-developed-by: Mac Chiang <mac.chiang at intel.com>
> Signed-off-by: Mac Chiang <mac.chiang at intel.com>

The code looks mostly good, just a couple of minor things to update, see
below

> +struct sof_card_private {
> +	struct clk *mclk;
> +	struct snd_soc_jack sof_headset;
> +	struct list_head hdmi_pcm_list;
> +	bool common_hdmi_codec_drv;

we no longer need this 'common_hdmi_codec_drv' for new drivers, this was
a transition step that we've removed for newer machine drivers.

Please look at the sof_es8336 example.

> +static int sof_card_late_probe(struct snd_soc_card *card)
> +{
> +	struct sof_card_private *ctx = snd_soc_card_get_drvdata(card);
> +	struct snd_soc_component *component = NULL;
> +	struct snd_soc_dapm_context *dapm = &card->dapm;
> +	char jack_name[NAME_SIZE];
> +	struct sof_hdmi_pcm *pcm;
> +	int err;
> +	int i = 0;
> +
> +	if (list_empty(&ctx->hdmi_pcm_list))
> +		return -EINVAL;
> +
> +	if (ctx->common_hdmi_codec_drv) {
> +		pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm,
> +				       head);
> +		component = pcm->codec_dai->component;
> +		return hda_dsp_hdmi_build_controls(card, component);
> +	}

no longer needed.

> +	/* speaker amp */
> +	if (sof_nau8825_quirk & SOF_SPEAKER_AMP_PRESENT) {
> +		links[id].name = devm_kasprintf(dev, GFP_KERNEL,
> +						"SSP%d-Codec", ssp_amp);
> +		if (!links[id].name)
> +			goto devm_err;
> +
> +		links[id].id = id;
> +		if (sof_nau8825_quirk & SOF_RT1019P_SPEAKER_AMP_PRESENT) {
> +			links[id].codecs = rt1019p_component;
> +			links[id].num_codecs = ARRAY_SIZE(rt1019p_component);
> +			links[id].init = speaker_codec_init;
> +		} else if (sof_nau8825_quirk &
> +				SOF_MAX98373_SPEAKER_AMP_PRESENT) {
> +			links[id].codecs = max_98373_components;
> +			links[id].num_codecs = ARRAY_SIZE(max_98373_components);
> +			links[id].init = max_98373_spk_codec_init;
> +			links[id].ops = &max_98373_ops;
> +			/* feedback stream */
> +			links[id].dpcm_capture = 1;
> +		} else if (sof_nau8825_quirk &
> +				SOF_MAX98360A_SPEAKER_AMP_PRESENT) {
> +			max_98360a_dai_link(&links[id]);
> +		} else {
> +			max_98360a_dai_link(&links[id]);
> +		}

cppcheck complains that the two last branches are identical.

> +
> +		links[id].platforms = platform_component;
> +		links[id].num_platforms = ARRAY_SIZE(platform_component);
> +		links[id].dpcm_playback = 1;
> +		links[id].no_pcm = 1;
> +		links[id].cpus = &cpus[id];
> +		links[id].num_cpus = 1;
> +		links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL,
> +							  "SSP%d Pin",
> +							  ssp_amp);
> +		if (!links[id].cpus->dai_name)
> +			goto devm_err;
> +		id++;
> +	}
> +
> +	/* BT audio offload */
> +	if (sof_nau8825_quirk & SOF_SSP_BT_OFFLOAD_PRESENT) {
> +		int port = (sof_nau8825_quirk & SOF_BT_OFFLOAD_SSP_MASK) >>
> +				SOF_BT_OFFLOAD_SSP_SHIFT;
> +
> +		links[id].id = id;
> +		links[id].cpus = &cpus[id];
> +		links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL,
> +							  "SSP%d Pin", port);
> +		if (!links[id].cpus->dai_name)
> +			goto devm_err;
> +		links[id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT", port);
> +		if (!links[id].name)
> +			goto devm_err;
> +		links[id].codecs = dummy_component;
> +		links[id].num_codecs = ARRAY_SIZE(dummy_component);
> +		links[id].platforms = platform_component;
> +		links[id].num_platforms = ARRAY_SIZE(platform_component);
> +		links[id].dpcm_playback = 1;
> +		links[id].dpcm_capture = 1;
> +		links[id].no_pcm = 1;
> +		links[id].num_cpus = 1;
> +	}
> +
> +	return links;
> +devm_err:
> +	return NULL;
> +}

[...]

> +
> +	/* set platform name for each dailink */
> +	ret = snd_soc_fixup_dai_links_platform_name(&sof_audio_card_nau8825,
> +						    mach->mach_params.platform);
> +	if (ret)
> +		return ret;
> +
> +	ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv;

not needed.

> +
> +	snd_soc_card_set_drvdata(&sof_audio_card_nau8825, ctx);
> +
> +	return devm_snd_soc_register_card(&pdev->dev,
> +					  &sof_audio_card_nau8825);
> +}

> +MODULE_AUTHOR("Mac Chiang <mac.chiang at intel.com>");
> +MODULE_LICENSE("GPL v2");

"GPL"




More information about the Alsa-devel mailing list