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

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: intel: Add CS42L43 sdw machine driver support

Merge series from Bard Liao <yung-chuan.liao@linux.intel.com>:

Add cs42l43 codec support to sof_sdw machine driver.

+269 -1
+4
sound/soc/intel/boards/Kconfig
··· 689 689 select SND_SOC_RT1318_SDW 690 690 select SND_SOC_RT5682_SDW 691 691 select SND_SOC_CS42L42_SDW 692 + select SND_SOC_CS42L43 693 + select SND_SOC_CS42L43_SDW 694 + select MFD_CS42L43 695 + select MFD_CS42L43_SDW 692 696 select SND_SOC_CS35L56_SDW 693 697 select SND_SOC_DMIC 694 698 select SND_SOC_INTEL_HDA_DSP_COMMON
+2 -1
sound/soc/intel/boards/Makefile
··· 42 42 sof_sdw_rt711.o sof_sdw_rt_sdca_jack_common.o \ 43 43 sof_sdw_rt712_sdca.o sof_sdw_rt715.o \ 44 44 sof_sdw_rt715_sdca.o sof_sdw_dmic.o \ 45 - sof_sdw_cs42l42.o sof_sdw_cs_amp.o \ 45 + sof_sdw_cs42l42.o sof_sdw_cs42l43.o \ 46 + sof_sdw_cs_amp.o \ 46 47 sof_sdw_hdmi.o 47 48 obj-$(CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH) += snd-soc-sof_rt5682.o 48 49 obj-$(CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH) += snd-soc-sof_cs42l42.o
+27
sound/soc/intel/boards/sof_sdw.c
··· 916 916 .dai_num = 1, 917 917 }, 918 918 { 919 + .part_id = 0x4243, 920 + .codec_name = "cs42l43-codec", 921 + .dais = { 922 + { 923 + .direction = {true, false}, 924 + .dai_name = "cs42l43-dp5", 925 + .dai_type = SOF_SDW_DAI_TYPE_JACK, 926 + .dailink = {SDW_JACK_OUT_DAI_ID, SDW_UNUSED_DAI_ID}, 927 + .init = sof_sdw_cs42l43_hs_init, 928 + }, 929 + { 930 + .direction = {false, true}, 931 + .dai_name = "cs42l43-dp1", 932 + .dai_type = SOF_SDW_DAI_TYPE_JACK, 933 + .dailink = {SDW_UNUSED_DAI_ID, SDW_JACK_IN_DAI_ID}, 934 + }, 935 + { 936 + .direction = {false, true}, 937 + .dai_name = "cs42l43-dp2", 938 + .dai_type = SOF_SDW_DAI_TYPE_MIC, 939 + .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 940 + .init = sof_sdw_cs42l43_dmic_init, 941 + } 942 + }, 943 + .dai_num = 3, 944 + }, 945 + { 919 946 .part_id = 0xaaaa, /* generic codec mockup */ 920 947 .version_id = 0, 921 948 .dais = {
+13
sound/soc/intel/boards/sof_sdw_common.h
··· 210 210 struct sof_sdw_codec_info *info, 211 211 bool playback); 212 212 213 + /* CS42L43 support */ 214 + int sof_sdw_cs42l43_hs_init(struct snd_soc_card *card, 215 + const struct snd_soc_acpi_link_adr *link, 216 + struct snd_soc_dai_link *dai_links, 217 + struct sof_sdw_codec_info *info, 218 + bool playback); 219 + 220 + int sof_sdw_cs42l43_dmic_init(struct snd_soc_card *card, 221 + const struct snd_soc_acpi_link_adr *link, 222 + struct snd_soc_dai_link *dai_links, 223 + struct sof_sdw_codec_info *info, 224 + bool playback); 225 + 213 226 /* CS AMP support */ 214 227 int sof_sdw_cs_amp_init(struct snd_soc_card *card, 215 228 const struct snd_soc_acpi_link_adr *link,
+145
sound/soc/intel/boards/sof_sdw_cs42l43.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + // Based on sof_sdw_rt5682.c 3 + // Copyright (c) 2023 Intel Corporation 4 + 5 + /* 6 + * sof_sdw_cs42l43 - Helpers to handle CS42L43 from generic machine driver 7 + */ 8 + #include <linux/device.h> 9 + #include <linux/errno.h> 10 + #include <linux/input.h> 11 + #include <sound/jack.h> 12 + #include <linux/soundwire/sdw.h> 13 + #include <linux/soundwire/sdw_type.h> 14 + #include <sound/cs42l43.h> 15 + #include <sound/control.h> 16 + #include <sound/soc.h> 17 + #include <sound/soc-acpi.h> 18 + #include <sound/soc-dapm.h> 19 + #include "sof_sdw_common.h" 20 + 21 + static const struct snd_soc_dapm_widget cs42l43_hs_widgets[] = { 22 + SND_SOC_DAPM_HP("Headphone", NULL), 23 + SND_SOC_DAPM_MIC("Headset Mic", NULL), 24 + }; 25 + 26 + static const struct snd_soc_dapm_route cs42l43_hs_map[] = { 27 + { "Headphone", NULL, "cs42l43 AMP3_OUT" }, 28 + { "Headphone", NULL, "cs42l43 AMP4_OUT" }, 29 + { "cs42l43 ADC1_IN1_P", NULL, "Headset Mic" }, 30 + { "cs42l43 ADC1_IN1_N", NULL, "Headset Mic" }, 31 + }; 32 + 33 + static const struct snd_soc_dapm_widget cs42l43_dmic_widgets[] = { 34 + SND_SOC_DAPM_MIC("DMIC", NULL), 35 + }; 36 + 37 + static const struct snd_soc_dapm_route cs42l43_dmic_map[] = { 38 + { "cs42l43 PDM1_DIN", NULL, "DMIC" }, 39 + { "cs42l43 PDM2_DIN", NULL, "DMIC" }, 40 + }; 41 + 42 + static int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd) 43 + { 44 + struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component; 45 + struct mc_private *ctx = snd_soc_card_get_drvdata(rtd->card); 46 + struct snd_soc_jack *jack = &ctx->sdw_headset; 47 + struct snd_soc_card *card = rtd->card; 48 + int ret; 49 + 50 + card->components = devm_kasprintf(card->dev, GFP_KERNEL, "%s hs:cs42l43", card->components); 51 + if (!card->components) 52 + return -ENOMEM; 53 + 54 + ret = snd_soc_dapm_new_controls(&card->dapm, cs42l43_hs_widgets, 55 + ARRAY_SIZE(cs42l43_hs_widgets)); 56 + if (ret) { 57 + dev_err(card->dev, "cs42l43 hs widgets addition failed: %d\n", ret); 58 + return ret; 59 + } 60 + 61 + ret = snd_soc_dapm_add_routes(&card->dapm, cs42l43_hs_map, 62 + ARRAY_SIZE(cs42l43_hs_map)); 63 + 64 + if (ret) { 65 + dev_err(card->dev, "cs42l43 hs map addition failed: %d\n", ret); 66 + return ret; 67 + } 68 + 69 + ret = snd_soc_card_jack_new(card, "Headphone Jack", 70 + SND_JACK_MECHANICAL | SND_JACK_AVOUT | 71 + SND_JACK_HEADSET | SND_JACK_LINEOUT | 72 + SND_JACK_BTN_0 | SND_JACK_BTN_1 | 73 + SND_JACK_BTN_2 | SND_JACK_BTN_3, 74 + jack); 75 + if (ret) { 76 + dev_err(card->dev, "Failed to create jack: %d\n", ret); 77 + return ret; 78 + } 79 + 80 + snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 81 + snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 82 + snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 83 + snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 84 + 85 + ret = snd_soc_component_set_jack(component, jack, NULL); 86 + if (ret) { 87 + dev_err(card->dev, "Failed to register jack: %d\n", ret); 88 + return ret; 89 + } 90 + 91 + ret = snd_soc_component_set_sysclk(component, CS42L43_SYSCLK, CS42L43_SYSCLK_SDW, 92 + 0, SND_SOC_CLOCK_IN); 93 + if (ret) 94 + dev_err(card->dev, "Failed to set sysclk: %d\n", ret); 95 + 96 + return ret; 97 + } 98 + 99 + int sof_sdw_cs42l43_hs_init(struct snd_soc_card *card, const struct snd_soc_acpi_link_adr *link, 100 + struct snd_soc_dai_link *dai_links, struct sof_sdw_codec_info *info, 101 + bool playback) 102 + { 103 + /* 104 + * No need to test if (!playback) like other codecs as cs42l43 uses separated dai for 105 + * playback and capture, and sof_sdw_cs42l43_init is only linked to the playback dai. 106 + */ 107 + 108 + dai_links->init = cs42l43_hs_rtd_init; 109 + 110 + return 0; 111 + } 112 + 113 + static int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd) 114 + { 115 + struct snd_soc_card *card = rtd->card; 116 + int ret; 117 + 118 + card->components = devm_kasprintf(card->dev, GFP_KERNEL, "%s mic:cs42l43-dmic", 119 + card->components); 120 + if (!card->components) 121 + return -ENOMEM; 122 + 123 + ret = snd_soc_dapm_new_controls(&card->dapm, cs42l43_dmic_widgets, 124 + ARRAY_SIZE(cs42l43_dmic_widgets)); 125 + if (ret) { 126 + dev_err(card->dev, "cs42l43 dmic widgets addition failed: %d\n", ret); 127 + return ret; 128 + } 129 + 130 + ret = snd_soc_dapm_add_routes(&card->dapm, cs42l43_dmic_map, 131 + ARRAY_SIZE(cs42l43_dmic_map)); 132 + 133 + if (ret) 134 + dev_err(card->dev, "cs42l43 dmic map addition failed: %d\n", ret); 135 + 136 + return ret; 137 + } 138 + 139 + int sof_sdw_cs42l43_dmic_init(struct snd_soc_card *card, const struct snd_soc_acpi_link_adr *link, 140 + struct snd_soc_dai_link *dai_links, struct sof_sdw_codec_info *info, 141 + bool playback) 142 + { 143 + dai_links->init = cs42l43_dmic_rtd_init; 144 + return 0; 145 + }
+78
sound/soc/intel/common/soc-acpi-intel-mtl-match.c
··· 92 92 }, 93 93 }; 94 94 95 + static const struct snd_soc_acpi_endpoint spk_2_endpoint = { 96 + .num = 0, 97 + .aggregated = 1, 98 + .group_position = 2, 99 + .group_id = 1, 100 + }; 101 + 102 + static const struct snd_soc_acpi_endpoint spk_3_endpoint = { 103 + .num = 0, 104 + .aggregated = 1, 105 + .group_position = 3, 106 + .group_id = 1, 107 + }; 108 + 95 109 static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = { 96 110 { 97 111 .adr = 0x000030025D071101ull, ··· 225 211 {} 226 212 }; 227 213 214 + static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = { 215 + { 216 + .adr = 0x00003001FA424301ull, 217 + .num_endpoints = 1, 218 + .endpoints = &single_endpoint, 219 + .name_prefix = "cs42l43" 220 + } 221 + }; 222 + 223 + static const struct snd_soc_acpi_adr_device cs35l56_1_adr[] = { 224 + { 225 + .adr = 0x00013701FA355601ull, 226 + .num_endpoints = 1, 227 + .endpoints = &spk_r_endpoint, 228 + .name_prefix = "cs35l56-8" 229 + }, 230 + { 231 + .adr = 0x00013601FA355601ull, 232 + .num_endpoints = 1, 233 + .endpoints = &spk_3_endpoint, 234 + .name_prefix = "cs35l56-7" 235 + } 236 + }; 237 + 238 + static const struct snd_soc_acpi_adr_device cs35l56_2_adr[] = { 239 + { 240 + .adr = 0x00023301FA355601ull, 241 + .num_endpoints = 1, 242 + .endpoints = &spk_l_endpoint, 243 + .name_prefix = "cs35l56-1" 244 + }, 245 + { 246 + .adr = 0x00023201FA355601ull, 247 + .num_endpoints = 1, 248 + .endpoints = &spk_2_endpoint, 249 + .name_prefix = "cs35l56-2" 250 + } 251 + }; 252 + 228 253 static const struct snd_soc_acpi_link_adr rt5682_link2_max98373_link0[] = { 229 254 /* Expected order: jack -> amp */ 230 255 { ··· 370 317 {} 371 318 }; 372 319 320 + static const struct snd_soc_acpi_link_adr mtl_cs42l43_cs35l56[] = { 321 + { 322 + .mask = BIT(0), 323 + .num_adr = ARRAY_SIZE(cs42l43_0_adr), 324 + .adr_d = cs42l43_0_adr, 325 + }, 326 + { 327 + .mask = BIT(1), 328 + .num_adr = ARRAY_SIZE(cs35l56_1_adr), 329 + .adr_d = cs35l56_1_adr, 330 + }, 331 + { 332 + .mask = BIT(2), 333 + .num_adr = ARRAY_SIZE(cs35l56_2_adr), 334 + .adr_d = cs35l56_2_adr, 335 + }, 336 + {} 337 + }; 338 + 373 339 /* this table is used when there is no I2S codec present */ 374 340 struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = { 375 341 /* mockup tests need to be first */ ··· 421 349 .links = mtl_sdw_rt1318_l12_rt714_l0, 422 350 .drv_name = "sof_sdw", 423 351 .sof_tplg_filename = "sof-mtl-rt1318-l12-rt714-l0.tplg" 352 + }, 353 + { 354 + .link_mask = GENMASK(2, 0), 355 + .links = mtl_cs42l43_cs35l56, 356 + .drv_name = "sof_sdw", 357 + .sof_tplg_filename = "sof-mtl-cs42l43-l0-cs35l56-l12.tplg", 424 358 }, 425 359 { 426 360 .link_mask = GENMASK(3, 0),