From patchwork Sun Mar 9 18:15:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Dakinevich X-Patchwork-Id: 14008858 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D2105C28B28 for ; Sun, 9 Mar 2025 18:33:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:To:From:Reply-To:Cc:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=MZTFXTWIM6j2JqZG+ZdvtGTJFFPy9IHnJnJv53VrLIc=; b=jdMPhhPXwiXoFoBg6bG+Zq9jkS pd9RvoyQoiq72rSfw9bYvCnQhaATwlVf3EALAyLL8oO0X4RsgcHo/iTkVXrMJNDoueJzaRdRoo5Ud U2mm1RuvC/6gVMCyKK9eZtUukv7l/c+zG1djDDhtr8M8hJRL1OZrlXv+yo6zNJAEyhz3uTl0lzHi9 ludZadMwMEAPBZI6d9D5F2U5eLJnOZdvBE4IUdXM9a0+KeLRLd1zTchAag0E+whD+5/22TeDt4SUH cQM5fbh/+JKmjCvB/Ob5OotUqXIGGIKOrFbSfQzXZuzPX+kDXrsFyQvDZcUgG79MOYrx4IYjQz+Aw 0LtZzcRA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1trLTA-00000000yoF-2NId; Sun, 09 Mar 2025 18:33:48 +0000 Received: from mx1.sberdevices.ru ([37.18.73.165]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1trLC4-00000000wer-2pOH; Sun, 09 Mar 2025 18:16:10 +0000 Received: from p-infra-ksmg-sc-msk01.sberdevices.ru (localhost [127.0.0.1]) by mx1.sberdevices.ru (Postfix) with ESMTP id 2AA7B100004; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.sberdevices.ru 2AA7B100004 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=salutedevices.com; s=mail; t=1741544167; bh=MZTFXTWIM6j2JqZG+ZdvtGTJFFPy9IHnJnJv53VrLIc=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=MKDer2u4dHvEDfLthxWtL5c5OII9Zt8ghvKo+DA6303ocBxiMwbNti3ng4E3G3Amq RH72LgVsG/tZoH7s0mr0zvIkiLf2YivPmiK4JVhSlsr6GZkA8qbIt1HbnYBh789HcA wi2EuHLaM7L0xtmJYMM/4L+3NhOI2t/OhtmUYnveWPOl0ONhCK6eVA9ZUU8DhneciU Ggmb8wIvuC9h5RAH90OofVJrEdaRwfYb3ZGOrt59VaUKh+8kAdWKvn/urg9U6JN+C9 M7V5naFjQ6+sejo8QN4ZGQKynE+Slw32zQ5BHCXyuT5+mlK/sjKfB05THIHYspwXku PG2ZqkwrpxxUg== Received: from smtp.sberdevices.ru (p-exch-cas-a-m1.sberdevices.ru [172.24.201.216]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.sberdevices.ru (Postfix) with ESMTPS; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) From: Jan Dakinevich To: Jan Dakinevich , Conor Dooley , , Jaroslav Kysela , Jerome Brunet , Kevin Hilman , Krzysztof Kozlowski , Liam Girdwood , , , , , Mark Brown , Martin Blumenstingl , Neil Armstrong , Rob Herring , Takashi Iwai Subject: [PATCH v2 1/4] ASoC: meson: codec-glue: add support for capture stream Date: Sun, 9 Mar 2025 21:15:57 +0300 Message-ID: <20250309181600.1322701-2-jan.dakinevich@salutedevices.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> References: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> MIME-Version: 1.0 X-Originating-IP: [172.28.64.252] X-ClientProxiedBy: p-i-exch-a-m2.sberdevices.ru (172.24.196.120) To p-exch-cas-a-m1.sberdevices.ru (172.24.201.216) X-KSMG-Rule-ID: 1 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Lua-Profiles: 191599 [Mar 09 2025] X-KSMG-AntiSpam-Version: 6.1.1.11 X-KSMG-AntiSpam-Envelope-From: YVDakinevich@sberdevices.ru X-KSMG-AntiSpam-Rate: 0 X-KSMG-AntiSpam-Status: not_detected X-KSMG-AntiSpam-Method: none X-KSMG-AntiSpam-Auth: dkim=none X-KSMG-AntiSpam-Info: LuaCore: 51 0.3.51 68896fb0083a027476849bf400a331a2d5d94398, {Tracking_smtp_not_equal_from}, 127.0.0.199:7.1.2;smtp.sberdevices.ru:7.1.1,5.0.1;sberdevices.ru:7.1.1,5.0.1;salutedevices.com:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1, {Tracking_smtp_domain_mismatch}, {Tracking_smtp_domain_2level_mismatch}, {Tracking_sender_alignment_int}, {Tracking_white_helo}, FromAlignment: n X-MS-Exchange-Organization-SCL: -1 X-KSMG-AntiSpam-Interceptor-Info: scan successful X-KSMG-AntiPhishing: Clean X-KSMG-LinksScanning: Clean X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.0.1.6960, bases: 2025/03/09 17:28:00 #27692143 X-KSMG-AntiVirus-Status: Clean, skipped X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250309_111609_064077_92FD4852 X-CRM114-Status: GOOD ( 20.62 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The glue saves stream's private data in front-end dai and then backend dai can reach them searching backward from sink to source. For capture stream everything left the same, but searching should be performed from source to sink. Signed-off-by: Jan Dakinevich --- Hope, I haven't misinterpreted the terminology and codec-glue's behavior too much. --- sound/soc/meson/meson-codec-glue.c | 174 ++++++++++++++++++++++------- sound/soc/meson/meson-codec-glue.h | 23 ++++ 2 files changed, 158 insertions(+), 39 deletions(-) diff --git a/sound/soc/meson/meson-codec-glue.c b/sound/soc/meson/meson-codec-glue.c index f8c5643f3cfe..da6d65e58d90 100644 --- a/sound/soc/meson/meson-codec-glue.c +++ b/sound/soc/meson/meson-codec-glue.c @@ -11,65 +11,94 @@ #include "meson-codec-glue.h" static struct snd_soc_dapm_widget * -meson_codec_glue_get_input(struct snd_soc_dapm_widget *w) +meson_codec_glue_get_data_widget(struct snd_soc_dapm_widget *w, bool playback) { struct snd_soc_dapm_path *p; - struct snd_soc_dapm_widget *in; - - snd_soc_dapm_widget_for_each_source_path(w, p) { + struct snd_soc_dapm_widget *node; + enum snd_soc_dapm_type id = playback ? snd_soc_dapm_dai_in + : snd_soc_dapm_dai_out; + enum snd_soc_dapm_direction dir = playback ? SND_SOC_DAPM_DIR_IN + : SND_SOC_DAPM_DIR_OUT; + enum snd_soc_dapm_direction rdir = playback ? SND_SOC_DAPM_DIR_OUT + : SND_SOC_DAPM_DIR_IN; + + snd_soc_dapm_widget_for_each_path(w, rdir, p) { if (!p->connect) continue; /* Check that we still are in the same component */ if (snd_soc_dapm_to_component(w->dapm) != - snd_soc_dapm_to_component(p->source->dapm)) + snd_soc_dapm_to_component(p->node[dir]->dapm)) continue; - if (p->source->id == snd_soc_dapm_dai_in) - return p->source; + if (p->node[dir]->id == id) + return p->node[dir]; - in = meson_codec_glue_get_input(p->source); - if (in) - return in; + node = meson_codec_glue_get_data_widget(p->node[dir], playback); + if (node) + return node; } return NULL; } -static void meson_codec_glue_input_set_data(struct snd_soc_dai *dai, - struct meson_codec_glue_input *data) +static void meson_codec_glue_set_data(struct snd_soc_dai *dai, + struct meson_codec_glue_input *data, + bool playback) +{ + int stream = playback ? SNDRV_PCM_STREAM_PLAYBACK + : SNDRV_PCM_STREAM_CAPTURE; + + snd_soc_dai_dma_data_set(dai, stream, data); +} + +static struct meson_codec_glue_input * +meson_codec_glue_get_data(struct snd_soc_dai *dai, bool playback) { - snd_soc_dai_dma_data_set_playback(dai, data); + int stream = playback ? SNDRV_PCM_STREAM_PLAYBACK + : SNDRV_PCM_STREAM_CAPTURE; + + return snd_soc_dai_dma_data_get(dai, stream); } struct meson_codec_glue_input * meson_codec_glue_input_get_data(struct snd_soc_dai *dai) { - return snd_soc_dai_dma_data_get_playback(dai); + return meson_codec_glue_get_data(dai, true); } EXPORT_SYMBOL_GPL(meson_codec_glue_input_get_data); +struct meson_codec_glue_input * +meson_codec_glue_capture_output_get_data(struct snd_soc_dai *dai) +{ + return meson_codec_glue_get_data(dai, false); +} +EXPORT_SYMBOL_GPL(meson_codec_glue_capture_output_get_data); + static struct meson_codec_glue_input * -meson_codec_glue_output_get_input_data(struct snd_soc_dapm_widget *w) +meson_codec_glue_data(struct snd_soc_dapm_widget *w, bool playback) { - struct snd_soc_dapm_widget *in = - meson_codec_glue_get_input(w); + struct snd_soc_dapm_widget *node = + meson_codec_glue_get_data_widget(w, playback); struct snd_soc_dai *dai; - if (WARN_ON(!in)) + if (WARN_ON(!node)) return NULL; - dai = in->priv; + dai = node->priv; - return meson_codec_glue_input_get_data(dai); + return meson_codec_glue_get_data(dai, playback); } -int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) +static int meson_codec_glue_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai, + bool playback) { struct meson_codec_glue_input *data = - meson_codec_glue_input_get_data(dai); + meson_codec_glue_get_data(dai, playback); + struct snd_soc_pcm_stream *stream = playback ? &dai->driver->playback + : &dai->driver->capture; data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params)); data->params.rate_min = params_rate(params); @@ -77,32 +106,64 @@ int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream, data->params.formats = 1ULL << (__force int) params_format(params); data->params.channels_min = params_channels(params); data->params.channels_max = params_channels(params); - data->params.sig_bits = dai->driver->playback.sig_bits; + data->params.sig_bits = stream->sig_bits; return 0; } + +int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + return meson_codec_glue_hw_params(substream, params, dai, true); +} EXPORT_SYMBOL_GPL(meson_codec_glue_input_hw_params); -int meson_codec_glue_input_set_fmt(struct snd_soc_dai *dai, - unsigned int fmt) +int meson_codec_glue_capture_output_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + return meson_codec_glue_hw_params(substream, params, dai, false); +} +EXPORT_SYMBOL_GPL(meson_codec_glue_capture_output_hw_params); + +static int meson_codec_glue_set_fmt(struct snd_soc_dai *dai, + unsigned int fmt, + bool playback) { struct meson_codec_glue_input *data = - meson_codec_glue_input_get_data(dai); + meson_codec_glue_get_data(dai, playback); /* Save the source stream format for the downstream link */ data->fmt = fmt; return 0; } + +int meson_codec_glue_input_set_fmt(struct snd_soc_dai *dai, + unsigned int fmt) +{ + return meson_codec_glue_set_fmt(dai, fmt, true); +} EXPORT_SYMBOL_GPL(meson_codec_glue_input_set_fmt); -int meson_codec_glue_output_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) +int meson_codec_glue_capture_output_set_fmt(struct snd_soc_dai *dai, + unsigned int fmt) +{ + return meson_codec_glue_set_fmt(dai, fmt, false); +} +EXPORT_SYMBOL_GPL(meson_codec_glue_capture_output_set_fmt); + +static int meson_codec_glue_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai, + bool playback) { + int stream = playback ? SNDRV_PCM_STREAM_CAPTURE + : SNDRV_PCM_STREAM_PLAYBACK; struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); - struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget_capture(dai); - struct meson_codec_glue_input *in_data = meson_codec_glue_output_get_input_data(w); + struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(dai, stream); + struct meson_codec_glue_input *data = meson_codec_glue_data(w, playback); - if (!in_data) + if (!data) return -ENODEV; if (WARN_ON(!rtd->dai_link->c2c_params)) { @@ -111,14 +172,27 @@ int meson_codec_glue_output_startup(struct snd_pcm_substream *substream, } /* Replace link params with the input params */ - rtd->dai_link->c2c_params = &in_data->params; + rtd->dai_link->c2c_params = &data->params; rtd->dai_link->num_c2c_params = 1; - return snd_soc_runtime_set_dai_fmt(rtd, in_data->fmt); + return snd_soc_runtime_set_dai_fmt(rtd, data->fmt); +} + +int meson_codec_glue_output_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + return meson_codec_glue_startup(substream, dai, true); } EXPORT_SYMBOL_GPL(meson_codec_glue_output_startup); -int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai) +int meson_codec_glue_capture_input_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + return meson_codec_glue_startup(substream, dai, false); +} +EXPORT_SYMBOL_GPL(meson_codec_glue_capture_input_startup); + +static int meson_codec_glue_dai_probe(struct snd_soc_dai *dai, bool playback) { struct meson_codec_glue_input *data; @@ -126,21 +200,43 @@ int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai) if (!data) return -ENOMEM; - meson_codec_glue_input_set_data(dai, data); + meson_codec_glue_set_data(dai, data, playback); return 0; } + +int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai) +{ + return meson_codec_glue_dai_probe(dai, true); +} EXPORT_SYMBOL_GPL(meson_codec_glue_input_dai_probe); -int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai) +int meson_codec_glue_capture_output_dai_probe(struct snd_soc_dai *dai) +{ + return meson_codec_glue_dai_probe(dai, false); +} +EXPORT_SYMBOL_GPL(meson_codec_glue_capture_output_dai_probe); + +static int meson_codec_glue_dai_remove(struct snd_soc_dai *dai, bool playback) { struct meson_codec_glue_input *data = - meson_codec_glue_input_get_data(dai); + meson_codec_glue_get_data(dai, playback); kfree(data); return 0; } + +int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai) +{ + return meson_codec_glue_dai_remove(dai, true); +} EXPORT_SYMBOL_GPL(meson_codec_glue_input_dai_remove); +int meson_codec_glue_capture_output_dai_remove(struct snd_soc_dai *dai) +{ + return meson_codec_glue_dai_remove(dai, false); +} +EXPORT_SYMBOL_GPL(meson_codec_glue_capture_output_dai_remove); + MODULE_AUTHOR("Jerome Brunet "); MODULE_DESCRIPTION("Amlogic Codec Glue Helpers"); MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/meson/meson-codec-glue.h b/sound/soc/meson/meson-codec-glue.h index 07f99446c0c6..75d20aa75638 100644 --- a/sound/soc/meson/meson-codec-glue.h +++ b/sound/soc/meson/meson-codec-glue.h @@ -14,6 +14,10 @@ struct meson_codec_glue_input { unsigned int fmt; }; +/* + * Playback stream + */ + /* Input helpers */ struct meson_codec_glue_input * meson_codec_glue_input_get_data(struct snd_soc_dai *dai); @@ -29,4 +33,23 @@ int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai); int meson_codec_glue_output_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); +/* + * Capture stream + */ + +/* Output helpers */ +struct meson_codec_glue_input * +meson_codec_glue_capture_output_get_data(struct snd_soc_dai *dai); +int meson_codec_glue_capture_output_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai); +int meson_codec_glue_capture_output_set_fmt(struct snd_soc_dai *dai, + unsigned int fmt); +int meson_codec_glue_capture_output_dai_probe(struct snd_soc_dai *dai); +int meson_codec_glue_capture_output_dai_remove(struct snd_soc_dai *dai); + +/* Input helpers */ +int meson_codec_glue_capture_input_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai); + #endif /* _MESON_CODEC_GLUE_H */ From patchwork Sun Mar 9 18:15:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Dakinevich X-Patchwork-Id: 14008863 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 67068C28B28 for ; Sun, 9 Mar 2025 18:37:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:To:From:Reply-To:Cc:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=sgZ5TA0paPDH75/eNcrHtc6x37F89OMtaKXUAsxSe4o=; b=dWxHfaZG43VBUact4YNXzSg+wn hqCQOuO99A/9pXykOwSFI8Cq167KAWjMdvdzXGJQi65tkfrngns1CqjQc3vacEYbzxPCH9quKMJKq pyxDF7SzwWwzjdX5RR70rjf0jQg0Of2eqayQbDQstXnMUdy6TxXFJzn7vS5KUs8Kl2fZriZDsRyBQ M2iO0gthJeqR+dmZH7Gz7g3E7UVDPPW7/PGDjzKkzYTgHLUzFUTHG81WkXPOaNF1kG8vr/7DP26KA kKtu0OJIxdKpLi7icOcRQOj8Ix6vbC/VAI/11fjv4ekrSa/iOhwLrtvrOV6tXAGZLXxfeFLldy3v6 ANWbj+gA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1trLWK-00000000z3n-29EC; Sun, 09 Mar 2025 18:37:04 +0000 Received: from mx2.sberdevices.ru ([45.89.224.132] helo=mx1.sberdevices.ru) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1trLC4-00000000wes-3L5v; Sun, 09 Mar 2025 18:16:11 +0000 Received: from p-infra-ksmg-sc-msk02.sberdevices.ru (localhost [127.0.0.1]) by mx1.sberdevices.ru (Postfix) with ESMTP id 6C7C9120006; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.sberdevices.ru 6C7C9120006 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=salutedevices.com; s=mail; t=1741544167; bh=sgZ5TA0paPDH75/eNcrHtc6x37F89OMtaKXUAsxSe4o=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=SJ7UHoVAqJojzSa1EPwkkVJy4LYKnHEBWgcTvr4MaO3d1TdfLJC/U7kUXAlAVLNtD lijI1pJScsd1mqWNLcda99/PYaUkHZJckRG9OImLNvSpaqL/TaqBUx0ZJUguNvCRal aeZz5Z9ZAZF+kMJPtO+NV3cWzqI0MxjIg2k/pKcuiCa9HMJvkxEijqkar/G0MosGxE 0e0GbRIsmaI+6nyCOOetCCtUDnssH30RCsSIBC39Esv6ye1/xn5jyWtxfY4ru9f4hn UYrtuJTWul63uaknesGoC44mjEDIMdMlNPMuDT3FDx80850n70p8GZJoq8uypkykcG tCxPwW4Qdceag== Received: from smtp.sberdevices.ru (p-exch-cas-a-m1.sberdevices.ru [172.24.201.216]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.sberdevices.ru (Postfix) with ESMTPS; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) From: Jan Dakinevich To: Jan Dakinevich , Conor Dooley , , Jaroslav Kysela , Jerome Brunet , Kevin Hilman , Krzysztof Kozlowski , Liam Girdwood , , , , , Mark Brown , Martin Blumenstingl , Neil Armstrong , Rob Herring , Takashi Iwai Subject: [PATCH v2 2/4] ASoC: meson: g12a-toacodec: drop the definition of bits Date: Sun, 9 Mar 2025 21:15:58 +0300 Message-ID: <20250309181600.1322701-3-jan.dakinevich@salutedevices.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> References: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> MIME-Version: 1.0 X-Originating-IP: [172.28.64.252] X-ClientProxiedBy: p-i-exch-a-m2.sberdevices.ru (172.24.196.120) To p-exch-cas-a-m1.sberdevices.ru (172.24.201.216) X-KSMG-Rule-ID: 1 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Lua-Profiles: 191599 [Mar 09 2025] X-KSMG-AntiSpam-Version: 6.1.1.11 X-KSMG-AntiSpam-Envelope-From: YVDakinevich@sberdevices.ru X-KSMG-AntiSpam-Rate: 0 X-KSMG-AntiSpam-Status: not_detected X-KSMG-AntiSpam-Method: none X-KSMG-AntiSpam-Auth: dkim=none X-KSMG-AntiSpam-Info: LuaCore: 51 0.3.51 68896fb0083a027476849bf400a331a2d5d94398, {Tracking_smtp_not_equal_from}, {Tracking_uf_ne_domains}, salutedevices.com:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1;127.0.0.199:7.1.2;sberdevices.ru:5.0.1,7.1.1;smtp.sberdevices.ru:5.0.1,7.1.1;lore.kernel.org:7.1.1, {Tracking_smtp_domain_mismatch}, {Tracking_smtp_domain_2level_mismatch}, {Tracking_sender_alignment_int}, {Tracking_white_helo}, FromAlignment: n X-MS-Exchange-Organization-SCL: -1 X-KSMG-AntiSpam-Interceptor-Info: scan successful X-KSMG-AntiPhishing: Clean, bases: 2025/03/09 17:18:00 X-KSMG-LinksScanning: Clean, bases: 2025/03/09 17:18:00 X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.0.1.6960, bases: 2025/03/09 17:28:00 #27692143 X-KSMG-AntiVirus-Status: Clean, skipped X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250309_111609_195757_AAD4D9A9 X-CRM114-Status: GOOD ( 15.77 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org There are many of defines, but several of them are unused, other are used once. It would easier to read if these values would occure in the place of their usage. Signed-off-by: Jan Dakinevich --- Also, there was an another attempt to rework bits' definition: https://lore.kernel.org/all/20240325235311.411920-1-jan.dakinevich@salutedevices.com/ --- sound/soc/meson/g12a-toacodec.c | 45 ++++++++------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c index 531bb8707a3e..03bde8d8d192 100644 --- a/sound/soc/meson/g12a-toacodec.c +++ b/sound/soc/meson/g12a-toacodec.c @@ -20,26 +20,6 @@ #define G12A_TOACODEC_DRV_NAME "g12a-toacodec" #define TOACODEC_CTRL0 0x0 -#define CTRL0_ENABLE_SHIFT 31 -#define CTRL0_DAT_SEL_SM1_MSB 19 -#define CTRL0_DAT_SEL_SM1_LSB 18 -#define CTRL0_DAT_SEL_MSB 15 -#define CTRL0_DAT_SEL_LSB 14 -#define CTRL0_LANE_SEL_SM1 16 -#define CTRL0_LANE_SEL 12 -#define CTRL0_LRCLK_SEL_SM1_MSB 14 -#define CTRL0_LRCLK_SEL_SM1_LSB 12 -#define CTRL0_LRCLK_SEL_MSB 9 -#define CTRL0_LRCLK_SEL_LSB 8 -#define CTRL0_LRCLK_INV_SM1 BIT(10) -#define CTRL0_BLK_CAP_INV_SM1 BIT(9) -#define CTRL0_BLK_CAP_INV BIT(7) -#define CTRL0_BCLK_O_INV_SM1 BIT(8) -#define CTRL0_BCLK_O_INV BIT(6) -#define CTRL0_BCLK_SEL_SM1_MSB 6 -#define CTRL0_BCLK_SEL_MSB 5 -#define CTRL0_BCLK_SEL_LSB 4 -#define CTRL0_MCLK_SEL GENMASK(2, 0) #define TOACODEC_OUT_CHMAX 2 @@ -69,6 +49,7 @@ static int g12a_toacodec_mux_put_enum(struct snd_kcontrol *kcontrol, struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + unsigned int mclk_sel = GENMASK(2, 0); unsigned int mux, reg; if (ucontrol->value.enumerated.item[0] >= e->items) @@ -98,21 +79,18 @@ static int g12a_toacodec_mux_put_enum(struct snd_kcontrol *kcontrol, * source. For that, we will need regmap backed clock mux which * is a work in progress */ - snd_soc_component_update_bits(component, e->reg, - CTRL0_MCLK_SEL, - FIELD_PREP(CTRL0_MCLK_SEL, mux)); + snd_soc_component_update_bits(component, e->reg, mclk_sel, + FIELD_PREP(mclk_sel, mux)); snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); return 1; } -static SOC_ENUM_SINGLE_DECL(g12a_toacodec_mux_enum, TOACODEC_CTRL0, - CTRL0_DAT_SEL_LSB, +static SOC_ENUM_SINGLE_DECL(g12a_toacodec_mux_enum, TOACODEC_CTRL0, 14, g12a_toacodec_mux_texts); -static SOC_ENUM_SINGLE_DECL(sm1_toacodec_mux_enum, TOACODEC_CTRL0, - CTRL0_DAT_SEL_SM1_LSB, +static SOC_ENUM_SINGLE_DECL(sm1_toacodec_mux_enum, TOACODEC_CTRL0, 18, g12a_toacodec_mux_texts); static const struct snd_kcontrol_new g12a_toacodec_mux = @@ -126,8 +104,7 @@ static const struct snd_kcontrol_new sm1_toacodec_mux = g12a_toacodec_mux_put_enum); static const struct snd_kcontrol_new g12a_toacodec_out_enable = - SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0, - CTRL0_ENABLE_SHIFT, 1, 0); + SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0, 31, 1, 0); static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = { SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0, @@ -209,15 +186,13 @@ static struct snd_soc_dai_driver g12a_toacodec_dai_drv[] = { static int g12a_toacodec_component_probe(struct snd_soc_component *c) { /* Initialize the static clock parameters */ - return snd_soc_component_write(c, TOACODEC_CTRL0, - CTRL0_BLK_CAP_INV); + return snd_soc_component_write(c, TOACODEC_CTRL0, BIT(7)); } static int sm1_toacodec_component_probe(struct snd_soc_component *c) { /* Initialize the static clock parameters */ - return snd_soc_component_write(c, TOACODEC_CTRL0, - CTRL0_BLK_CAP_INV_SM1); + return snd_soc_component_write(c, TOACODEC_CTRL0, BIT(9)); } static const struct snd_soc_dapm_route g12a_toacodec_routes[] = { @@ -229,11 +204,11 @@ static const struct snd_soc_dapm_route g12a_toacodec_routes[] = { }; static const struct snd_kcontrol_new g12a_toacodec_controls[] = { - SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL, 3, 0), + SOC_SINGLE("Lane Select", TOACODEC_CTRL0, 12, 3, 0), }; static const struct snd_kcontrol_new sm1_toacodec_controls[] = { - SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 3, 0), + SOC_SINGLE("Lane Select", TOACODEC_CTRL0, 16, 3, 0), }; static const struct snd_soc_component_driver g12a_toacodec_component_drv = { From patchwork Sun Mar 9 18:15:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Dakinevich X-Patchwork-Id: 14008859 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 984B7C28B28 for ; Sun, 9 Mar 2025 18:35:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:To:From:Reply-To:Cc:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=NK0/S9lD6J4LrJ0za2Y5lt/Fq95o4i6toJkcTTbksdo=; b=BP79kAuNbVPx9rE1NpGB5irNQp 7Ix75d9VCvwzhfs4bxQLbzEt8i2oFg/NVd/pWZSuqxSs3eLfMN4I/wtH5b6VWNikQ4nGBnJx8QoM4 N14h2fbpqsNErIuQJ0aAAtiVZk+A5kpHGX0e/uYDimL0+g5SGcTPIlGl5M4tqCOVagJnNTzfq374z DoRKleabyYRsH1QVgwCVvwZaB8a8Pqo7RLykFUznIDWiUX/57M+JQTv85ApWbFvvm3Bo1pYnTSoW5 350tCPsIMqioNX5H7DDv8KcVLWxgiq9jy3R6L5OzEEWxUoFeyA5xq0rl4a/dlwg7wlZnDhXHR2bip pC2t8jew==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1trLUl-00000000ywf-2Kox; Sun, 09 Mar 2025 18:35:27 +0000 Received: from mx1.sberdevices.ru ([37.18.73.165]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1trLC5-00000000wex-1KWY; Sun, 09 Mar 2025 18:16:11 +0000 Received: from p-infra-ksmg-sc-msk01.sberdevices.ru (localhost [127.0.0.1]) by mx1.sberdevices.ru (Postfix) with ESMTP id E0F0C100006; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.sberdevices.ru E0F0C100006 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=salutedevices.com; s=mail; t=1741544167; bh=NK0/S9lD6J4LrJ0za2Y5lt/Fq95o4i6toJkcTTbksdo=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=a9kYQhLSEKIt9eH6h05y5xl2QBhpA6VlsTPW615kc77SZZOXCMnmdOuzKpgIOpobO QvQdxHs4WPutsKwdFD/Xs0Dq/IvMdzi9RQC7IXwET26Vo1cGWFFhlqVe4QlcvKHSVO fbAZKDdnmcR+b058Ct7VP3b8Z21oY3rW9JOlFcoRaYy6UUpcaVWkTHPWQR5B8HF/pN kGWZDtWVN2ArLvfMTuQ31p6vk+F3K7Guq22gLh0AeWLkI7vdysd1C8nXsCBvVyDmKZ p30kGxlC3p5vEB1S5JlzgcG/UV/iWf2STa1CU5f2V0mU/qAoRObNOBuiX0bb99jTM2 qrcA71gAq0NBQ== Received: from smtp.sberdevices.ru (p-exch-cas-a-m1.sberdevices.ru [172.24.201.216]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.sberdevices.ru (Postfix) with ESMTPS; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) From: Jan Dakinevich To: Jan Dakinevich , Conor Dooley , , Jaroslav Kysela , Jerome Brunet , Kevin Hilman , Krzysztof Kozlowski , Liam Girdwood , , , , , Mark Brown , Martin Blumenstingl , Neil Armstrong , Rob Herring , Takashi Iwai Subject: [PATCH v2 3/4] ASoC: dt-bindings: meson: g12a-toacodec: add support for A1 SoC family Date: Sun, 9 Mar 2025 21:15:59 +0300 Message-ID: <20250309181600.1322701-4-jan.dakinevich@salutedevices.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> References: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> MIME-Version: 1.0 X-Originating-IP: [172.28.64.252] X-ClientProxiedBy: p-i-exch-a-m2.sberdevices.ru (172.24.196.120) To p-exch-cas-a-m1.sberdevices.ru (172.24.201.216) X-KSMG-Rule-ID: 1 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Lua-Profiles: 191599 [Mar 09 2025] X-KSMG-AntiSpam-Version: 6.1.1.11 X-KSMG-AntiSpam-Envelope-From: YVDakinevich@sberdevices.ru X-KSMG-AntiSpam-Rate: 0 X-KSMG-AntiSpam-Status: not_detected X-KSMG-AntiSpam-Method: none X-KSMG-AntiSpam-Auth: dkim=none X-KSMG-AntiSpam-Info: LuaCore: 51 0.3.51 68896fb0083a027476849bf400a331a2d5d94398, {Tracking_smtp_not_equal_from}, 127.0.0.199:7.1.2;smtp.sberdevices.ru:7.1.1,5.0.1;sberdevices.ru:7.1.1,5.0.1;salutedevices.com:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1, {Tracking_smtp_domain_mismatch}, {Tracking_smtp_domain_2level_mismatch}, {Tracking_sender_alignment_int}, {Tracking_white_helo}, FromAlignment: n X-MS-Exchange-Organization-SCL: -1 X-KSMG-AntiSpam-Interceptor-Info: scan successful X-KSMG-AntiPhishing: Clean X-KSMG-LinksScanning: Clean X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.0.1.6960, bases: 2025/03/09 17:28:00 #27692143 X-KSMG-AntiVirus-Status: Clean, skipped X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250309_111609_692059_4D21B64A X-CRM114-Status: GOOD ( 12.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add support for "toacodec" audio component found A1 SoC family. On this SoC the component supports capture streams, additional DAI ids are added to configure this feature. Signed-off-by: Jan Dakinevich --- .../devicetree/bindings/sound/amlogic,g12a-toacodec.yaml | 1 + include/dt-bindings/sound/meson-g12a-toacodec.h | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml index 23f82bb89750..c47604aa590f 100644 --- a/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml +++ b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml @@ -26,6 +26,7 @@ properties: - items: - enum: - amlogic,sm1-toacodec + - amlogic,a1-toacodec - const: amlogic,g12a-toacodec reg: diff --git a/include/dt-bindings/sound/meson-g12a-toacodec.h b/include/dt-bindings/sound/meson-g12a-toacodec.h index 69d7a75592a2..f726e2c6064d 100644 --- a/include/dt-bindings/sound/meson-g12a-toacodec.h +++ b/include/dt-bindings/sound/meson-g12a-toacodec.h @@ -7,4 +7,9 @@ #define TOACODEC_IN_C 2 #define TOACODEC_OUT 3 +#define TOACODEC_CAPTURE_OUT_A 4 +#define TOACODEC_CAPTURE_OUT_B 5 +#define TOACODEC_CAPTURE_OUT_C 6 +#define TOACODEC_CAPTURE_IN 7 + #endif /* __DT_MESON_G12A_TOACODEC_H */ From patchwork Sun Mar 9 18:16:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Dakinevich X-Patchwork-Id: 14008864 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 12FBBC28B28 for ; Sun, 9 Mar 2025 18:38:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:To:From:Reply-To:Cc:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=eIx0W1LfWeznA2Pzk63TeCGu+WicnlgfsVi9g83ynS8=; b=ezhijJtMbAiEg21CR/gtr4zAjh v03qX2xYC/I5K3loAv1t7OyfSblt6+VKV9zuTP7GnCaNWgkNDt7R1jgr6NZGNVW0woBdzXjVyZN6I Nnp8xCrVDw7sQ8aB7RtUbjRJBTT0LMyjpSGTLxJ+UgSLgLO2FXSnYupNPgzZKXDpMA1QBzaoMR5hV XxYMtrMhwi6UAoOVIATwFQ0ayBGRFLDMo72kBNvLGYd2KNdFjmvRIXCAXE2XNNZaU7GdLThaYU2xK 2tshctEhoCa+8Mi+03W4jsww7wOTDY/BdVE8p1HGLJwuaH1M241VYsAYqAfvMpX0l/PhN9J5LSZA0 td72yp+w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1trLXu-00000000zBg-2RBC; Sun, 09 Mar 2025 18:38:42 +0000 Received: from mx1.sberdevices.ru ([37.18.73.165]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1trLC5-00000000wf0-2HCl; Sun, 09 Mar 2025 18:16:11 +0000 Received: from p-infra-ksmg-sc-msk01.sberdevices.ru (localhost [127.0.0.1]) by mx1.sberdevices.ru (Postfix) with ESMTP id 1DA57100008; Sun, 9 Mar 2025 21:16:08 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.sberdevices.ru 1DA57100008 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=salutedevices.com; s=mail; t=1741544168; bh=eIx0W1LfWeznA2Pzk63TeCGu+WicnlgfsVi9g83ynS8=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=Z+mc+EbZWuDgUgBTqYf+GlzTeFxTFodC8Tl6Qli37SaqZlmiZetcBK7+ahR1FmFhr aK+JORJYFeZXe1QU/c68fhwXf4y6IbYRmTihX6DgVU0+2HysrOXfs/1hQItwqK7Qhe KQCOhT400Y5LRPQEyBGsvCQUBspS8PSv4qAnRowPN7Qd0ymZwr2Vr8aJu3Vo+yMm7O +DOG+MYb6jW6JcEA4d5i+AQybwYnPY4heN+xya3ii7jZB7XvfklfLlAg6Kiumx8eY/ LkT+i8HWU3UovQZL/5CcEy4Ho/tLgq2NNwQDa7zT/+n06Wtut9YKCM387XeI4gM0i/ 4zWTPNhY1Ph8g== Received: from smtp.sberdevices.ru (p-exch-cas-a-m1.sberdevices.ru [172.24.201.216]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.sberdevices.ru (Postfix) with ESMTPS; Sun, 9 Mar 2025 21:16:07 +0300 (MSK) From: Jan Dakinevich To: Jan Dakinevich , Conor Dooley , , Jaroslav Kysela , Jerome Brunet , Kevin Hilman , Krzysztof Kozlowski , Liam Girdwood , , , , , Mark Brown , Martin Blumenstingl , Neil Armstrong , Rob Herring , Takashi Iwai Subject: [PATCH v2 4/4] ASoC: meson: g12a-toacodec: add support for A1 SoC family Date: Sun, 9 Mar 2025 21:16:00 +0300 Message-ID: <20250309181600.1322701-5-jan.dakinevich@salutedevices.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> References: <20250309181600.1322701-1-jan.dakinevich@salutedevices.com> MIME-Version: 1.0 X-Originating-IP: [172.28.64.252] X-ClientProxiedBy: p-i-exch-a-m2.sberdevices.ru (172.24.196.120) To p-exch-cas-a-m1.sberdevices.ru (172.24.201.216) X-KSMG-Rule-ID: 1 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Lua-Profiles: 191599 [Mar 09 2025] X-KSMG-AntiSpam-Version: 6.1.1.11 X-KSMG-AntiSpam-Envelope-From: YVDakinevich@sberdevices.ru X-KSMG-AntiSpam-Rate: 0 X-KSMG-AntiSpam-Status: not_detected X-KSMG-AntiSpam-Method: none X-KSMG-AntiSpam-Auth: dkim=none X-KSMG-AntiSpam-Info: LuaCore: 51 0.3.51 68896fb0083a027476849bf400a331a2d5d94398, {Tracking_smtp_not_equal_from}, 127.0.0.199:7.1.2;smtp.sberdevices.ru:7.1.1,5.0.1;sberdevices.ru:7.1.1,5.0.1;salutedevices.com:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1, {Tracking_smtp_domain_mismatch}, {Tracking_smtp_domain_2level_mismatch}, {Tracking_sender_alignment_int}, {Tracking_white_helo}, FromAlignment: n X-MS-Exchange-Organization-SCL: -1 X-KSMG-AntiSpam-Interceptor-Info: scan successful X-KSMG-AntiPhishing: Clean X-KSMG-LinksScanning: Clean X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.0.1.6960, bases: 2025/03/09 17:28:00 #27692143 X-KSMG-AntiVirus-Status: Clean, skipped X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250309_111609_959607_A871156F X-CRM114-Status: GOOD ( 22.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Internal codec on A1 SoC has ADC and this commit adds support for capturing from it. Also, regmap now uses caching for all platforms. Values that are written to toacodec's register on A1 SoC can not be read back, that breaks regmap_update_bits() functionality. Let's hope the caching will not break anything on other platforms. Since .max_register now is explicitly equal to 0, .reg_stride is also removed. Signed-off-by: Jan Dakinevich --- sound/soc/meson/g12a-toacodec.c | 197 +++++++++++++++++++++++++++++--- 1 file changed, 184 insertions(+), 13 deletions(-) diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c index 03bde8d8d192..431fcd364001 100644 --- a/sound/soc/meson/g12a-toacodec.c +++ b/sound/soc/meson/g12a-toacodec.c @@ -31,6 +31,8 @@ struct g12a_toacodec { struct g12a_toacodec_match_data { const struct snd_soc_component_driver *component_drv; + struct snd_soc_dai_driver *dai_drv; + int num_dai_drv; struct reg_field field_dat_sel; struct reg_field field_lrclk_sel; struct reg_field field_bclk_sel; @@ -40,6 +42,10 @@ static const char * const g12a_toacodec_mux_texts[] = { "I2S A", "I2S B", "I2S C", }; +static const char * const a1_toacodec_mux_texts[] = { + "I2S A", "I2S B", +}; + static int g12a_toacodec_mux_put_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -93,8 +99,11 @@ static SOC_ENUM_SINGLE_DECL(g12a_toacodec_mux_enum, TOACODEC_CTRL0, 14, static SOC_ENUM_SINGLE_DECL(sm1_toacodec_mux_enum, TOACODEC_CTRL0, 18, g12a_toacodec_mux_texts); -static const struct snd_kcontrol_new g12a_toacodec_mux = - SOC_DAPM_ENUM_EXT("Source", g12a_toacodec_mux_enum, +static SOC_ENUM_SINGLE_DECL(a1_toacodec_mux_enum, TOACODEC_CTRL0, 19, + a1_toacodec_mux_texts); + +static const struct snd_kcontrol_new a1_toacodec_mux = + SOC_DAPM_ENUM_EXT("Source", a1_toacodec_mux_enum, snd_soc_dapm_get_enum_double, g12a_toacodec_mux_put_enum); @@ -103,9 +112,20 @@ static const struct snd_kcontrol_new sm1_toacodec_mux = snd_soc_dapm_get_enum_double, g12a_toacodec_mux_put_enum); +static const struct snd_kcontrol_new g12a_toacodec_mux = + SOC_DAPM_ENUM_EXT("Source", g12a_toacodec_mux_enum, + snd_soc_dapm_get_enum_double, + g12a_toacodec_mux_put_enum); + static const struct snd_kcontrol_new g12a_toacodec_out_enable = SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0, 31, 1, 0); +/* Don't use AUTODISABLE unlike G12A. On A1 it causes noise after playback + * is stopped. + */ +static const struct snd_kcontrol_new a1_toacodec_enable = + SOC_DAPM_SINGLE("Switch", TOACODEC_CTRL0, 31, 1, 0); + static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = { SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0, &g12a_toacodec_mux), @@ -120,19 +140,34 @@ static const struct snd_soc_dapm_widget sm1_toacodec_widgets[] = { &g12a_toacodec_out_enable), }; -static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) +static const struct snd_soc_dapm_widget a1_toacodec_widgets[] = { + SND_SOC_DAPM_SWITCH("EN", SND_SOC_NOPM, 0, 0, + &a1_toacodec_enable), + SND_SOC_DAPM_MUX("Playback SRC", SND_SOC_NOPM, 0, 0, + &a1_toacodec_mux), + SND_SOC_DAPM_MUX("Capture SRC A", SND_SOC_NOPM, 0, 0, + &a1_toacodec_mux), + SND_SOC_DAPM_MUX("Capture SRC B", SND_SOC_NOPM, 0, 0, + &a1_toacodec_mux), +}; + +static int g12a_toacodec_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai, + bool playback) { struct meson_codec_glue_input *data; int ret; - ret = meson_codec_glue_input_hw_params(substream, params, dai); + ret = playback ? meson_codec_glue_input_hw_params(substream, params, dai) + : meson_codec_glue_capture_output_hw_params(substream, + params, dai); if (ret) return ret; /* The glue will provide 1 lane out of the 4 to the output */ - data = meson_codec_glue_input_get_data(dai); + data = playback ? meson_codec_glue_input_get_data(dai) + : meson_codec_glue_capture_output_get_data(dai); data->params.channels_min = min_t(unsigned int, TOACODEC_OUT_CHMAX, data->params.channels_min); data->params.channels_max = min_t(unsigned int, TOACODEC_OUT_CHMAX, @@ -141,6 +176,21 @@ static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream, return 0; } +static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + return g12a_toacodec_hw_params(substream, params, dai, true); +} + +static int +g12a_toacodec_capture_output_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + return g12a_toacodec_hw_params(substream, params, dai, false); +} + static const struct snd_soc_dai_ops g12a_toacodec_input_ops = { .probe = meson_codec_glue_input_dai_probe, .remove = meson_codec_glue_input_dai_remove, @@ -152,6 +202,17 @@ static const struct snd_soc_dai_ops g12a_toacodec_output_ops = { .startup = meson_codec_glue_output_startup, }; +static const struct snd_soc_dai_ops g12a_toacodec_capture_output_ops = { + .probe = meson_codec_glue_capture_output_dai_probe, + .remove = meson_codec_glue_capture_output_dai_remove, + .hw_params = g12a_toacodec_capture_output_hw_params, + .set_fmt = meson_codec_glue_capture_output_set_fmt, +}; + +static const struct snd_soc_dai_ops g12a_toacodec_capture_input_ops = { + .startup = meson_codec_glue_capture_input_startup, +}; + #define TOACODEC_STREAM(xname, xsuffix, xchmax) \ { \ .stream_name = xname " " xsuffix, \ @@ -176,6 +237,20 @@ static const struct snd_soc_dai_ops g12a_toacodec_output_ops = { .ops = &g12a_toacodec_output_ops, \ } +#define TOACODEC_CAPTURE_INPUT(xname, xid) { \ + .name = xname, \ + .id = (xid), \ + .playback = TOACODEC_STREAM(xname, "Playback", 2), \ + .ops = &g12a_toacodec_capture_input_ops, \ +} + +#define TOACODEC_CAPTURE_OUTPUT(xname, xid) { \ + .name = xname, \ + .id = (xid), \ + .capture = TOACODEC_STREAM(xname, "Capture", 2), \ + .ops = &g12a_toacodec_capture_output_ops, \ +} + static struct snd_soc_dai_driver g12a_toacodec_dai_drv[] = { TOACODEC_INPUT("IN A", TOACODEC_IN_A), TOACODEC_INPUT("IN B", TOACODEC_IN_B), @@ -183,6 +258,16 @@ static struct snd_soc_dai_driver g12a_toacodec_dai_drv[] = { TOACODEC_OUTPUT("OUT", TOACODEC_OUT), }; +static struct snd_soc_dai_driver a1_toacodec_dai_drv[] = { + TOACODEC_INPUT("IN A", TOACODEC_IN_A), + TOACODEC_INPUT("IN B", TOACODEC_IN_B), + TOACODEC_OUTPUT("OUT", TOACODEC_OUT), + + TOACODEC_CAPTURE_OUTPUT("OUT A", TOACODEC_CAPTURE_OUT_A), + TOACODEC_CAPTURE_OUTPUT("OUT B", TOACODEC_CAPTURE_OUT_B), + TOACODEC_CAPTURE_INPUT("IN", TOACODEC_CAPTURE_IN), +}; + static int g12a_toacodec_component_probe(struct snd_soc_component *c) { /* Initialize the static clock parameters */ @@ -195,6 +280,31 @@ static int sm1_toacodec_component_probe(struct snd_soc_component *c) return snd_soc_component_write(c, TOACODEC_CTRL0, BIT(9)); } +static int a1_toacodec_component_probe(struct snd_soc_component *c) +{ + /* Initialize the static clock parameters */ + return snd_soc_component_write(c, TOACODEC_CTRL0, BIT(9)); +} + +static int a1_toacodec_of_xlate_dai_name(struct snd_soc_component *component, + const struct of_phandle_args *args, + const char **dai_name) +{ + struct snd_soc_dai *dai; + + if (args->args_count != 1) + return -EINVAL; + + for_each_component_dais(component, dai) { + if (dai->id == args->args[0]) { + *dai_name = dai->driver->name; + return 0; + } + } + + return -EINVAL; +} + static const struct snd_soc_dapm_route g12a_toacodec_routes[] = { { "SRC", "I2S A", "IN A Playback" }, { "SRC", "I2S B", "IN B Playback" }, @@ -203,6 +313,19 @@ static const struct snd_soc_dapm_route g12a_toacodec_routes[] = { { "OUT Capture", NULL, "OUT EN" }, }; +static const struct snd_soc_dapm_route a1_toacodec_routes[] = { + { "Playback SRC", "I2S A", "IN A Playback" }, + { "Playback SRC", "I2S B", "IN B Playback" }, + { "EN", "Switch", "Playback SRC" }, + { "OUT Capture", NULL, "Playback SRC" }, + + { "EN", "Switch", "IN Playback" }, + { "Capture SRC A", "I2S A", "EN" }, + { "Capture SRC B", "I2S B", "EN" }, + { "OUT A Capture", NULL, "Capture SRC A" }, + { "OUT B Capture", NULL, "Capture SRC B" }, +}; + static const struct snd_kcontrol_new g12a_toacodec_controls[] = { SOC_SINGLE("Lane Select", TOACODEC_CTRL0, 12, 3, 0), }; @@ -211,6 +334,10 @@ static const struct snd_kcontrol_new sm1_toacodec_controls[] = { SOC_SINGLE("Lane Select", TOACODEC_CTRL0, 16, 3, 0), }; +static const struct snd_kcontrol_new a1_toacodec_controls[] = { + SOC_SINGLE("Lane Select", TOACODEC_CTRL0, 16, 3, 0), +}; + static const struct snd_soc_component_driver g12a_toacodec_component_drv = { .probe = g12a_toacodec_component_probe, .controls = g12a_toacodec_controls, @@ -233,14 +360,43 @@ static const struct snd_soc_component_driver sm1_toacodec_component_drv = { .endianness = 1, }; +static const struct snd_soc_component_driver a1_toacodec_component_drv = { + .probe = a1_toacodec_component_probe, + .of_xlate_dai_name = a1_toacodec_of_xlate_dai_name, + .controls = a1_toacodec_controls, + .num_controls = ARRAY_SIZE(a1_toacodec_controls), + .dapm_widgets = a1_toacodec_widgets, + .num_dapm_widgets = ARRAY_SIZE(a1_toacodec_widgets), + .dapm_routes = a1_toacodec_routes, + .num_dapm_routes = ARRAY_SIZE(a1_toacodec_routes), + .endianness = 1, +}; + +static const struct reg_default g12a_toacodec_reg_default[] = { + { TOACODEC_CTRL0, 0x0 }, +}; + +static bool g12_toacodec_readable_reg(struct device *dev, unsigned int reg) +{ + /* There are no readable registers */ + return false; +} + static const struct regmap_config g12a_toacodec_regmap_cfg = { - .reg_bits = 32, - .val_bits = 32, - .reg_stride = 4, + .reg_bits = 32, + .val_bits = 32, + .max_register = TOACODEC_CTRL0, + .max_register_is_0 = true, + .cache_type = REGCACHE_FLAT, + .reg_defaults = g12a_toacodec_reg_default, + .num_reg_defaults = ARRAY_SIZE(g12a_toacodec_reg_default), + .readable_reg = g12_toacodec_readable_reg, }; static const struct g12a_toacodec_match_data g12a_toacodec_match_data = { .component_drv = &g12a_toacodec_component_drv, + .dai_drv = g12a_toacodec_dai_drv, + .num_dai_drv = ARRAY_SIZE(g12a_toacodec_dai_drv), .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 14, 15), .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 8, 9), .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 5), @@ -248,11 +404,22 @@ static const struct g12a_toacodec_match_data g12a_toacodec_match_data = { static const struct g12a_toacodec_match_data sm1_toacodec_match_data = { .component_drv = &sm1_toacodec_component_drv, + .dai_drv = g12a_toacodec_dai_drv, + .num_dai_drv = ARRAY_SIZE(g12a_toacodec_dai_drv), .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 18, 19), .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 12, 14), .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6), }; +static const struct g12a_toacodec_match_data a1_toacodec_match_data = { + .component_drv = &a1_toacodec_component_drv, + .dai_drv = a1_toacodec_dai_drv, + .num_dai_drv = ARRAY_SIZE(a1_toacodec_dai_drv), + .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 19, 19), + .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 12, 14), + .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6), +}; + static const struct of_device_id g12a_toacodec_of_match[] = { { .compatible = "amlogic,g12a-toacodec", @@ -262,6 +429,10 @@ static const struct of_device_id g12a_toacodec_of_match[] = { .compatible = "amlogic,sm1-toacodec", .data = &sm1_toacodec_match_data, }, + { + .compatible = "amlogic,a1-toacodec", + .data = &a1_toacodec_match_data, + }, {} }; MODULE_DEVICE_TABLE(of, g12a_toacodec_of_match); @@ -314,9 +485,9 @@ static int g12a_toacodec_probe(struct platform_device *pdev) if (IS_ERR(priv->field_bclk_sel)) return PTR_ERR(priv->field_bclk_sel); - return devm_snd_soc_register_component(dev, - data->component_drv, g12a_toacodec_dai_drv, - ARRAY_SIZE(g12a_toacodec_dai_drv)); + return devm_snd_soc_register_component(dev, data->component_drv, + data->dai_drv, + data->num_dai_drv); } static struct platform_driver g12a_toacodec_pdrv = {