From: James Calligeros <jcalligeros99@gmail.com>
To: Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <s.hauer@pengutronix.de>,
Pengutronix Kernel Team <kernel@pengutronix.de>,
Fabio Estevam <festevam@gmail.com>,
Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
Shengjiu Wang <shengjiu.wang@nxp.com>,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
Shenghao Ding <shenghao-ding@ti.com>, Kevin Lu <kevin-lu@ti.com>,
Baojun Xu <baojun.xu@ti.com>
Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org,
imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, asahi@lists.linux.dev,
James Calligeros <jcalligeros99@gmail.com>
Subject: [PATCH 7/7] ASoC: tas2770: expose SDOUT bus keeper via set_tdm_idle
Date: Tue, 09 Dec 2025 19:31:20 +1000 [thread overview]
Message-ID: <20251209-tdm-idle-slots-v1-7-38dabf6bc01e@gmail.com> (raw)
In-Reply-To: <20251209-tdm-idle-slots-v1-0-38dabf6bc01e@gmail.com>
TAS2770 includes a bus keeper which can be used to control the behaviour
of the SDOUT pin during specified TDM slots. The chip can either pull
the pin to ground, actively transmit zeroes, or keep the pin floating
(default/uninitialised behaviour).
Expose the bus keeper via the set_tdm_idle DAI op so that it can be
configured by consumers.
Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
---
sound/soc/codecs/tas2770.c | 75 +++++++++++++++++++++++++
sound/soc/codecs/tas2770.h | 12 ++++
2 files changed, 87 insertions(+)
diff --git a/sound/soc/codecs/tas2770.c b/sound/soc/codecs/tas2770.c
index 6f878b01716f..d4d7d056141b 100644
--- a/sound/soc/codecs/tas2770.c
+++ b/sound/soc/codecs/tas2770.c
@@ -492,11 +492,86 @@ static int tas2770_set_dai_tdm_slot(struct snd_soc_dai *dai,
return 0;
}
+static int tas2770_set_dai_tdm_idle(struct snd_soc_dai *dai,
+ unsigned int tx_mask,
+ unsigned int rx_mask,
+ int tx_mode, int rx_mode)
+{
+ struct snd_soc_component *component = dai->component;
+ struct tas2770_priv *tas2770 = snd_soc_component_get_drvdata(component);
+ int ret;
+
+ /* We don't support setting anything for SDIN */
+ if (rx_mode)
+ return -EOPNOTSUPP;
+
+ if (tas2770->idle_tx_mode == tx_mode)
+ return 0;
+
+ switch (tx_mode) {
+ case SND_SOC_DAI_TDM_IDLE_PULLDOWN:
+ ret = snd_soc_component_update_bits(component, TAS2770_DIN_PD,
+ TAS2770_DIN_PD_SDOUT,
+ TAS2770_DIN_PD_SDOUT);
+ if (ret)
+ return ret;
+
+ break;
+ case SND_SOC_DAI_TDM_IDLE_ZERO:
+ ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG4,
+ TAS2770_TDM_CFG_REG4_TX_KEEPER,
+ TAS2770_TDM_CFG_REG4_TX_KEEPER);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG4,
+ TAS2770_TDM_CFG_REG4_TX_FILL, 0);
+ if (ret)
+ return ret;
+
+ break;
+ case SND_SOC_DAI_TDM_IDLE_HIZ:
+ ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG4,
+ TAS2770_TDM_CFG_REG4_TX_KEEPER,
+ TAS2770_TDM_CFG_REG4_TX_KEEPER);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG4,
+ TAS2770_TDM_CFG_REG4_TX_FILL,
+ TAS2770_TDM_CFG_REG4_TX_FILL);
+ if (ret)
+ return ret;
+
+ break;
+ case SND_SOC_DAI_TDM_IDLE_OFF:
+ ret = snd_soc_component_update_bits(component, TAS2770_DIN_PD,
+ TAS2770_DIN_PD_SDOUT, 0);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG4,
+ TAS2770_TDM_CFG_REG4_TX_KEEPER, 0);
+ if (ret)
+ return ret;
+
+ break;
+
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ tas2770->idle_tx_mode = tx_mode;
+
+ return 0;
+}
+
static const struct snd_soc_dai_ops tas2770_dai_ops = {
.mute_stream = tas2770_mute,
.hw_params = tas2770_hw_params,
.set_fmt = tas2770_set_fmt,
.set_tdm_slot = tas2770_set_dai_tdm_slot,
+ .set_tdm_idle = tas2770_set_dai_tdm_idle,
.no_capture_mute = 1,
};
diff --git a/sound/soc/codecs/tas2770.h b/sound/soc/codecs/tas2770.h
index 3fd2e7003c50..102040b6bdf8 100644
--- a/sound/soc/codecs/tas2770.h
+++ b/sound/soc/codecs/tas2770.h
@@ -67,6 +67,14 @@
#define TAS2770_TDM_CFG_REG3_RXS_SHIFT 0x4
#define TAS2770_TDM_CFG_REG3_30_MASK GENMASK(3, 0)
#define TAS2770_TDM_CFG_REG3_30_SHIFT 0
+ /* TDM Configuration Reg4 */
+#define TAS2770_TDM_CFG_REG4 TAS2770_REG(0X0, 0x0E)
+#define TAS2770_TDM_CFG_REG4_TX_LSB_CFG BIT(7)
+#define TAS2770_TDM_CFG_REG4_TX_KEEPER_CFG BIT(6)
+#define TAS2770_TDM_CFG_REG4_TX_KEEPER BIT(5)
+#define TAS2770_TDM_CFG_REG4_TX_FILL BIT(4)
+#define TAS2770_TDM_CFG_REG4_TX_OFFSET_MASK GENMASK(3, 1)
+#define TAS2770_TDM_CFG_REG4_TX_EDGE_FALLING BIT(0)
/* TDM Configuration Reg5 */
#define TAS2770_TDM_CFG_REG5 TAS2770_REG(0X0, 0x0F)
#define TAS2770_TDM_CFG_REG5_VSNS_MASK BIT(6)
@@ -115,6 +123,9 @@
#define TAS2770_TEMP_LSB TAS2770_REG(0X0, 0x2A)
/* Interrupt Configuration */
#define TAS2770_INT_CFG TAS2770_REG(0X0, 0x30)
+ /* Data In Pull-Down */
+#define TAS2770_DIN_PD TAS2770_REG(0X0, 0x31)
+#define TAS2770_DIN_PD_SDOUT BIT(7)
/* Misc IRQ */
#define TAS2770_MISC_IRQ TAS2770_REG(0X0, 0x32)
/* Clock Configuration */
@@ -146,6 +157,7 @@ struct tas2770_priv {
int pdm_slot;
bool dac_powered;
bool unmuted;
+ int idle_tx_mode;
};
#endif /* __TAS2770__ */
--
2.52.0
next prev parent reply other threads:[~2025-12-09 9:32 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-09 9:31 [PATCH 0/7] ASoC: basic support for configuring bus keepers James Calligeros
2025-12-09 9:31 ` [PATCH 1/7] ASoC: dt-bindings: convert tdm-slot to YAML James Calligeros
2025-12-09 10:38 ` Rob Herring (Arm)
2025-12-09 9:31 ` [PATCH 2/7] ASoC: dt-bindings: update tdm-slot.txt references to tdm-slot.yaml James Calligeros
2025-12-09 16:11 ` Frank Li
2025-12-09 19:13 ` Rob Herring
2025-12-09 9:31 ` [PATCH 3/7] ASoC: dt-bindings: add TDM slot idle mode properties James Calligeros
2025-12-09 9:31 ` [PATCH 4/7] ASoC: soc-dai: define TDM idle behaviour modes James Calligeros
2025-12-10 2:22 ` Mark Brown
2025-12-10 3:57 ` James Calligeros
2025-12-11 1:48 ` Mark Brown
2025-12-09 9:31 ` [PATCH 5/7] ASoC: soc-dai: add common operation to set TDM idle mode James Calligeros
2025-12-09 9:31 ` [PATCH 6/7] ASoC: tas2764: expose SDOUT bus keeper via set_tdm_idle operation James Calligeros
2025-12-09 9:31 ` James Calligeros [this message]
2025-12-10 2:43 ` [PATCH 0/7] ASoC: basic support for configuring bus keepers Mark Brown
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=20251209-tdm-idle-slots-v1-7-38dabf6bc01e@gmail.com \
--to=jcalligeros99@gmail.com \
--cc=asahi@lists.linux.dev \
--cc=baojun.xu@ti.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=festevam@gmail.com \
--cc=imx@lists.linux.dev \
--cc=kernel@pengutronix.de \
--cc=kevin-lu@ti.com \
--cc=krzk+dt@kernel.org \
--cc=kuninori.morimoto.gx@renesas.com \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=robh@kernel.org \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
--cc=shenghao-ding@ti.com \
--cc=shengjiu.wang@nxp.com \
--cc=tiwai@suse.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).