Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: imx-card: Add WM8524 support

WM8524 is a stereo DAC. Add support for this codec in imx-card ASoC
machine driver.

Signed-off-by: Chancel Liu <chancel.liu@nxp.com>
Link: https://patch.msgid.link/20250723073725.787844-1-chancel.liu@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Chancel Liu and committed by
Mark Brown
2260bc6e c58c35ef

+40
+40
sound/soc/fsl/imx-card.c
··· 26 26 CODEC_AK4497, 27 27 CODEC_AK5552, 28 28 CODEC_CS42888, 29 + CODEC_WM8524, 29 30 }; 30 31 31 32 /* ··· 197 196 { .min = 256, .max = 256, .mul = 256 }, 198 197 }; 199 198 199 + static struct imx_akcodec_fs_mul wm8524_fs_mul[] = { 200 + { .rmin = 8000, .rmax = 32000, .wmin = 256, .wmax = 1152, }, 201 + { .rmin = 44100, .rmax = 48000, .wmin = 256, .wmax = 768, }, 202 + { .rmin = 88200, .rmax = 96000, .wmin = 128, .wmax = 384, }, 203 + { .rmin = 176400, .rmax = 192000, .wmin = 128, .wmax = 192, }, 204 + }; 205 + 200 206 static const u32 akcodec_rates[] = { 201 207 8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 202 208 96000, 176400, 192000, 352800, 384000, 705600, 768000, ··· 235 227 236 228 static const u32 cs42888_tdm_channels[] = { 237 229 1, 2, 3, 4, 5, 6, 7, 8, 230 + }; 231 + 232 + static const u32 wm8524_channels[] = { 233 + 2, 238 234 }; 239 235 240 236 static bool format_is_dsd(struct snd_pcm_hw_params *params) ··· 273 261 case CODEC_AK5558: 274 262 case CODEC_AK5552: 275 263 case CODEC_CS42888: 264 + case CODEC_WM8524: 276 265 return true; 277 266 default: 278 267 break; ··· 490 477 return ret; 491 478 } 492 479 480 + static void imx_aif_shutdown(struct snd_pcm_substream *substream) 481 + { 482 + struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 483 + struct snd_soc_dai *cpu_dai; 484 + struct snd_soc_dai *codec_dai; 485 + int i; 486 + 487 + for_each_rtd_cpu_dais(rtd, i, cpu_dai) 488 + snd_soc_dai_set_sysclk(cpu_dai, 0, 0, SND_SOC_CLOCK_OUT); 489 + 490 + for_each_rtd_codec_dais(rtd, i, codec_dai) 491 + snd_soc_dai_set_sysclk(codec_dai, 0, 0, SND_SOC_CLOCK_IN); 492 + } 493 + 493 494 static const struct snd_soc_ops imx_aif_ops = { 494 495 .hw_params = imx_aif_hw_params, 495 496 .startup = imx_aif_startup, 497 + .shutdown = imx_aif_shutdown, 496 498 }; 497 499 498 500 static const struct snd_soc_ops imx_aif_ops_be = { ··· 660 632 plat_data->type = CODEC_AK5552; 661 633 else if (!strcmp(link->codecs->dai_name, "cs42888")) 662 634 plat_data->type = CODEC_CS42888; 635 + else if (!strcmp(link->codecs->dai_name, "wm8524-hifi")) 636 + plat_data->type = CODEC_WM8524; 663 637 664 638 } else { 665 639 link->codecs = &snd_soc_dummy_dlc; ··· 835 805 data->dapm_routes[1].sink = "CPU-Capture"; 836 806 data->dapm_routes[1].source = "Capture"; 837 807 break; 808 + case CODEC_WM8524: 809 + data->dapm_routes[0].sink = "Playback"; 810 + data->dapm_routes[0].source = "CPU-Playback"; 811 + break; 838 812 default: 839 813 break; 840 814 } ··· 887 853 plat_data->num_channels = ARRAY_SIZE(cs42888_channels); 888 854 plat_data->support_tdm_channels = cs42888_tdm_channels; 889 855 plat_data->num_tdm_channels = ARRAY_SIZE(cs42888_tdm_channels); 856 + break; 857 + case CODEC_WM8524: 858 + plat_data->fs_mul = wm8524_fs_mul; 859 + plat_data->num_fs_mul = ARRAY_SIZE(wm8524_fs_mul); 860 + plat_data->support_channels = wm8524_channels; 861 + plat_data->num_channels = ARRAY_SIZE(wm8524_channels); 890 862 break; 891 863 default: 892 864 break;