From: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
To: ming cong <ming.cong@senarytech.com>,
broonie@kernel.org, julianbraha@gmail.com
Cc: qianghua.wang@senarytech.com, jim.tang@senarytech.com,
"Bard Liao" <yung-chuan.liao@linux.intel.com>,
"Simon Trimmer" <simont@opensource.cirrus.com>,
"Ranjani Sridharan" <ranjani.sridharan@linux.intel.com>,
"Charles Keepax" <ckeepax@opensource.cirrus.com>,
"Niranjan H Y" <niranjan.hy@ti.com>,
"Derek Fang" <derek.fang@realtek.com>,
"Zhang Yi" <zhangyi@everest-semi.com>,
"Richard Fitzgerald" <rf@opensource.cirrus.com>,
"Péter Ujfalusi" <peter.ujfalusi@linux.intel.com>,
"Maciej Strozek" <mstrozek@opensource.cirrus.com>,
"Shuming Fan" <shumingf@realtek.com>,
"Miaoqian Lin" <linmq006@gmail.com>,
"linux-sound@vger.kernel.org" <linux-sound@vger.kernel.org>
Subject: Re: [’PATCH’ 2/3] ASoC: codecs: add new SoundWire-based SN624x
Date: Thu, 23 Jul 2026 19:34:24 +0200 [thread overview]
Message-ID: <18b06aa8-dbf5-442d-8b7d-33b5fba9df40@linux.dev> (raw)
In-Reply-To: <20260723063112.9086-1-ming.cong@senarytech.com>
> +static const struct snd_soc_dapm_route sn6242_sdca_map[] = {
> + { "Headphone", NULL, "sn6242 HP" },
> + { "sn6242 MIC2", NULL, "Headset Mic" },
> +};
> +
> +static struct snd_soc_jack_pin senary_sdca_jack_pins[] = {
> + {
> + .pin = "Headphone",
> + .mask = SND_JACK_HEADPHONE,
> + },
> + {
> + .pin = "Headset Mic",
> + .mask = SND_JACK_MICROPHONE,
> + },
> +};
> +
> +static const char * const need_sdca_suffix[] = {
> + "sn6242", "sn6244", "sn6247"
> +};
> +
> +int asoc_sdw_senary_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai)
> +{
> + struct snd_soc_card *card = rtd->card;
> + struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
> + struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
> + struct snd_soc_component *component;
> + struct snd_soc_jack *jack;
> + int ret;
> + int i;
> +
> + component = dai->component;
> + card->components = devm_kasprintf(card->dev, GFP_KERNEL,
> + "%s hs:%s",
> + card->components, component->name_prefix);
> + if (!card->components)
> + return -ENOMEM;
> +
> + for (i = 0; i < ARRAY_SIZE(need_sdca_suffix); i++) {
> + if (strstr(component->name_prefix, need_sdca_suffix[i])) {
> + /* Add -sdca suffix for existing UCMs */
> + card->components = devm_kasprintf(card->dev, GFP_KERNEL,
> + "%s-sdca", card->components);
> + if (!card->components)
> + return -ENOMEM;
> + break;
> + }
> + }
> +
> + if (strstr(component->name_prefix, "sn6242")) {
> + ret = snd_soc_dapm_add_routes(dapm, sn6242_sdca_map,
> + ARRAY_SIZE(sn6242_sdca_map));
> + } else if (strstr(component->name_prefix, "sn6244")) {
> + ret = snd_soc_dapm_add_routes(dapm, sn6242_sdca_map,
> + ARRAY_SIZE(sn6242_sdca_map));
> + } else if (strstr(component->name_prefix, "sn6247")) {
> + ret = snd_soc_dapm_add_routes(dapm, sn6242_sdca_map,
> + ARRAY_SIZE(sn6242_sdca_map));
looks like all branches do the same thing, consider refactoring all this...
> + } else {
> + dev_err(card->dev, "%s is not supported\n", component->name_prefix);
> + return -EINVAL;
> + }
> +
> + if (ret) {
> + dev_err(card->dev, "senary sdca jack map addition failed: %d\n", ret);
> + return ret;
> + }
> +
> + ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
> + SND_JACK_HEADSET | SND_JACK_BTN_0 |
> + SND_JACK_BTN_1 | SND_JACK_BTN_2 |
> + SND_JACK_BTN_3,
> + &ctx->sdw_headset,
> + senary_sdca_jack_pins,
> + ARRAY_SIZE(senary_sdca_jack_pins));
> + if (ret) {
> + dev_err(rtd->card->dev, "Headset Jack creation failed: %d\n",
> + ret);
> + return ret;
> + }
> +
> + jack = &ctx->sdw_headset;
> +
> + snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
> + snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
> + snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
> + snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
> +
> + ret = snd_soc_component_set_jack(component, jack, NULL);
> +
> + if (ret)
> + dev_err(rtd->card->dev, "Headset Jack call-back failed: %d\n",
> + ret);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_NS(asoc_sdw_senary_sdca_jack_rtd_init, "SND_SOC_SDW_UTILS");
> +
> +int asoc_sdw_senary_sdca_jack_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
> +{
> + struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
> +
> + if (!ctx->headset_codec_dev)
> + return 0;
> +
> + if (!SOC_SDW_JACK_JDSRC(ctx->mc_quirk))
> + return 0;
> +
> + device_remove_software_node(ctx->headset_codec_dev);
> + put_device(ctx->headset_codec_dev);
> + ctx->headset_codec_dev = NULL;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_NS(asoc_sdw_senary_sdca_jack_exit, "SND_SOC_SDW_UTILS");
> +
> +int asoc_sdw_senary_sdca_jack_init(struct snd_soc_card *card,
> + struct snd_soc_dai_link *dai_links,
> + struct asoc_sdw_codec_info *info,
> + bool playback)
> +{
> + struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
> + struct device *sdw_dev;
> + int ret;
> +
> + /*
> + * Jack detection should be only initialized once for headsets since
> + * the playback/capture is sharing the same jack
> + */
> + if (ctx->headset_codec_dev)
> + return 0;
> +
> + sdw_dev = bus_find_device_by_name(&sdw_bus_type, NULL, dai_links->codecs[0].name);
> + if (!sdw_dev)
> + return -EPROBE_DEFER;
> +
> + ret = senary_sdca_jack_add_codec_device_props(sdw_dev, ctx->mc_quirk);
> + if (ret < 0) {
> + put_device(sdw_dev);
> + return ret;
> + }
> + ctx->headset_codec_dev = sdw_dev;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_NS(asoc_sdw_senary_sdca_jack_init, "SND_SOC_SDW_UTILS");
quite a few lines from this file are just copy-pasted, is it time to try
and share these helpers?
> diff --git a/sound/soc/sdw_utils/soc_sdw_utils.c b/sound/soc/sdw_utils/soc_sdw_utils.c
> index d8db8fc5313e..603e57a4f09c 100644
> --- a/sound/soc/sdw_utils/soc_sdw_utils.c
> +++ b/sound/soc/sdw_utils/soc_sdw_utils.c
> @@ -1228,6 +1228,148 @@ struct asoc_sdw_codec_info codec_info_list[] = {
> },
> .dai_num = 1,
> },
> + {
> + .part_id = 0x6244,
> + .name_prefix = "sn6242",
> + .ignore_internal_dmic = true,
> + .dais = {
> + {
> + .direction = {true, true},
> + .dai_name = "sn6242-sdca-aif",
> + .dai_type = SOC_SDW_DAI_TYPE_JACK,
> + .dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
> + .init = asoc_sdw_senary_sdca_jack_init,
> + .exit = asoc_sdw_senary_sdca_jack_exit,
> + .rtd_init = asoc_sdw_senary_sdca_jack_rtd_init,
> + .controls = generic_jack_controls,
> + .num_controls = ARRAY_SIZE(generic_jack_controls),
> + .widgets = generic_jack_widgets,
> + .num_widgets = ARRAY_SIZE(generic_jack_widgets),
> + },
> + {
> + .direction = {true, false},
> + .dai_name = "sn6242-sdca-aif2",
> + .component_name = "sn6242",
not sure why there is a component_name only for capture?
> + .dai_type = SOC_SDW_DAI_TYPE_AMP,
> + .dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
> + .init = asoc_sdw_senary_amp_init,
> + .exit = asoc_sdw_senary_amp_exit,
> + .rtd_init = asoc_sdw_senary_sdca_spk_rtd_init,
> + .controls = generic_spk_controls,
> + .num_controls = ARRAY_SIZE(generic_spk_controls),
> + .widgets = generic_spk_widgets,
> + .num_widgets = ARRAY_SIZE(generic_spk_widgets),
> + .quirk = SOC_SDW_CODEC_SPKR,
> + .quirk_exclude = true,
> + },
> + {
> + .direction = {false, true},
> + .dai_name = "sn6242-sdca-aif3",
> + .dai_type = SOC_SDW_DAI_TYPE_MIC,
> + .dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
> + .rtd_init = asoc_sdw_senary_dmic_rtd_init,
> + .quirk = SOC_SDW_CODEC_MIC,
> + .quirk_exclude = true,
> + },
> + },
> + .dai_num = 3,
> + },
> + {
> + .part_id = 0x6242,
> + .name_prefix = "sn6242",
> + .ignore_internal_dmic = true,
> + .dais = {
> + {
> + .direction = {true, true},
> + .dai_name = "sn6242-sdca-aif",
> + .dai_type = SOC_SDW_DAI_TYPE_JACK,
> + .dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
> + .init = asoc_sdw_senary_sdca_jack_init,
> + .exit = asoc_sdw_senary_sdca_jack_exit,
> + .rtd_init = asoc_sdw_senary_sdca_jack_rtd_init,
> + .controls = generic_jack_controls,
> + .num_controls = ARRAY_SIZE(generic_jack_controls),
> + .widgets = generic_jack_widgets,
> + .num_widgets = ARRAY_SIZE(generic_jack_widgets),
> + },
> + {
> + .direction = {true, false},
> + .dai_name = "sn6242-sdca-aif2",
> + .component_name = "sn6242",
> + .dai_type = SOC_SDW_DAI_TYPE_AMP,
> + .dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
> + .init = asoc_sdw_senary_amp_init,
> + .exit = asoc_sdw_senary_amp_exit,
> + .rtd_init = asoc_sdw_senary_sdca_spk_rtd_init,
> + .controls = generic_spk_controls,
> + .num_controls = ARRAY_SIZE(generic_spk_controls),
> + .widgets = generic_spk_widgets,
> + .num_widgets = ARRAY_SIZE(generic_spk_widgets),
> + .quirk = SOC_SDW_CODEC_SPKR,
> + .quirk_exclude = true,
> + },
> + {
> + .direction = {false, true},
> + .dai_name = "sn6242-sdca-aif3",
> + .dai_type = SOC_SDW_DAI_TYPE_MIC,
> + .dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
> + .rtd_init = asoc_sdw_senary_dmic_rtd_init,
> + .quirk = SOC_SDW_CODEC_MIC,
> + .quirk_exclude = true,
> + },
> + },
> + .dai_num = 3,
> + },
> + {
> + .part_id = 0x6247,
> + .name_prefix = "sn6242",
> + .ignore_internal_dmic = true,
> + .dais = {
> + {
> + .direction = {true, true},
> + .dai_name = "sn6242-sdca-aif",
> + .dai_type = SOC_SDW_DAI_TYPE_JACK,
> + .dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
> + .init = asoc_sdw_senary_sdca_jack_init,
> + .exit = asoc_sdw_senary_sdca_jack_exit,
> + .rtd_init = asoc_sdw_senary_sdca_jack_rtd_init,
> + .controls = generic_jack_controls,
> + .num_controls = ARRAY_SIZE(generic_jack_controls),
> + .widgets = generic_jack_widgets,
> + .num_widgets = ARRAY_SIZE(generic_jack_widgets),
> + },
> + {
> + .direction = {true, false},
> + .dai_name = "sn6242-sdca-aif2",
> + .component_name = "sn6242",
> + .dai_type = SOC_SDW_DAI_TYPE_AMP,
> + .dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
> + .init = asoc_sdw_senary_amp_init,
> + .exit = asoc_sdw_senary_amp_exit,
> + .rtd_init = asoc_sdw_senary_sdca_spk_rtd_init,
> + .controls = generic_spk_controls,
> + .num_controls = ARRAY_SIZE(generic_spk_controls),
> + .widgets = generic_spk_widgets,
> + .num_widgets = ARRAY_SIZE(generic_spk_widgets),
> + .quirk = SOC_SDW_CODEC_SPKR,
> + .quirk_exclude = true,
> + },
> + {
> + .direction = {false, true},
> + .dai_name = "sn6242-sdca-aif3",
> + .dai_type = SOC_SDW_DAI_TYPE_MIC,
> + .dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
> + .rtd_init = asoc_sdw_senary_dmic_rtd_init,
> + .widgets = generic_dmic_widgets,
> + .num_widgets = ARRAY_SIZE(generic_dmic_widgets),
> + .controls = generic_dmic_controls,
> + .num_controls = ARRAY_SIZE(generic_dmic_controls),
> + .quirk = SOC_SDW_CODEC_MIC,
> + .quirk_exclude = true,
> + },
> + },
> + .dai_num = 3,
all those 3 dais look identical, the only difference is the part_id.
Isn't there a better way to define and represent these dais?
> + },
> };
> EXPORT_SYMBOL_NS(codec_info_list, "SND_SOC_SDW_UTILS");
>
parent reply other threads:[~2026-07-23 17:35 UTC|newest]
Thread overview: expand[flat|nested] mbox.gz Atom feed
[parent not found: <20260723063112.9086-1-ming.cong@senarytech.com>]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=18b06aa8-dbf5-442d-8b7d-33b5fba9df40@linux.dev \
--to=pierre-louis.bossart@linux.dev \
--cc=broonie@kernel.org \
--cc=ckeepax@opensource.cirrus.com \
--cc=derek.fang@realtek.com \
--cc=jim.tang@senarytech.com \
--cc=julianbraha@gmail.com \
--cc=linmq006@gmail.com \
--cc=linux-sound@vger.kernel.org \
--cc=ming.cong@senarytech.com \
--cc=mstrozek@opensource.cirrus.com \
--cc=niranjan.hy@ti.com \
--cc=peter.ujfalusi@linux.intel.com \
--cc=qianghua.wang@senarytech.com \
--cc=ranjani.sridharan@linux.intel.com \
--cc=rf@opensource.cirrus.com \
--cc=shumingf@realtek.com \
--cc=simont@opensource.cirrus.com \
--cc=yung-chuan.liao@linux.intel.com \
--cc=zhangyi@everest-semi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.