[PATCH 15/28] ASoC: tas2764: Set up V/ISENSE on codec probe

From: James Calligeros

Date: Sun Sep 20 2026 - 00:57:37 EST


Setup V/ISENSE on codec probe rather than doing so on every hw_params
or TDM slot call so that it is configured at the same time as the
rest of the codec.

Signed-off-by: James Calligeros <jcalligeros99@xxxxxxxxx>
---
sound/soc/codecs/tas2764.c | 61 ++++++++-----------------
1 file changed, 20 insertions(+), 41 deletions(-)

diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c
index 6654100ac91d..39372d0446d0 100644
--- a/sound/soc/codecs/tas2764.c
+++ b/sound/soc/codecs/tas2764.c
@@ -266,8 +266,6 @@ static int tas2764_mute(struct snd_soc_dai *dai, int mute, int direction)
static int tas2764_set_bitwidth(struct tas2764_priv *tas2764, int bitwidth)
{
struct snd_soc_component *component = tas2764->component;
- int sense_en;
- int val;
int ret;

switch (bitwidth) {
@@ -297,32 +295,6 @@ static int tas2764_set_bitwidth(struct tas2764_priv *tas2764, int bitwidth)
if (ret < 0)
return ret;

- val = snd_soc_component_read(tas2764->component, TAS2764_PWR_CTRL);
- if (val < 0)
- return val;
-
- if (val & (1 << TAS2764_VSENSE_POWER_EN))
- sense_en = 0;
- else
- sense_en = TAS2764_TDM_CFG5_VSNS_ENABLE;
-
- ret = snd_soc_component_update_bits(tas2764->component, TAS2764_TDM_CFG5,
- TAS2764_TDM_CFG5_VSNS_ENABLE,
- sense_en);
- if (ret < 0)
- return ret;
-
- if (val & (1 << TAS2764_ISENSE_POWER_EN))
- sense_en = 0;
- else
- sense_en = TAS2764_TDM_CFG6_ISNS_ENABLE;
-
- ret = snd_soc_component_update_bits(tas2764->component, TAS2764_TDM_CFG6,
- TAS2764_TDM_CFG6_ISNS_ENABLE,
- sense_en);
- if (ret < 0)
- return ret;
-
return 0;
}

@@ -452,7 +424,6 @@ static int tas2764_set_dai_tdm_slot(struct snd_soc_dai *dai,
int slots, int slot_width)
{
struct snd_soc_component *component = dai->component;
- struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component);
int left_slot, right_slot;
int slots_cfg;
int slot_size;
@@ -499,15 +470,26 @@ static int tas2764_set_dai_tdm_slot(struct snd_soc_dai *dai,
if (ret < 0)
return ret;

- ret = snd_soc_component_update_bits(component, TAS2764_TDM_CFG5,
+ return 0;
+}
+
+static int tas2764_set_visense(struct tas2764_priv *tas2764, int vslot, int islot)
+{
+ int ret;
+
+ ret = snd_soc_component_update_bits(tas2764->component, TAS2764_TDM_CFG5,
+ TAS2764_TDM_CFG5_VSNS_ENABLE |
TAS2764_TDM_CFG5_50_MASK,
- tas2764->v_sense_slot);
+ TAS2764_TDM_CFG5_VSNS_ENABLE |
+ vslot);
if (ret < 0)
return ret;

- ret = snd_soc_component_update_bits(component, TAS2764_TDM_CFG6,
+ ret = snd_soc_component_update_bits(tas2764->component, TAS2764_TDM_CFG6,
+ TAS2764_TDM_CFG6_ISNS_ENABLE |
TAS2764_TDM_CFG6_50_MASK,
- tas2764->i_sense_slot);
+ TAS2764_TDM_CFG6_ISNS_ENABLE |
+ islot);
if (ret < 0)
return ret;

@@ -821,15 +803,12 @@ static int tas2764_codec_probe(struct snd_soc_component *component)
dev_warn(tas2764->dev, "failed to request IRQ: %d\n", ret);
}

- ret = snd_soc_component_update_bits(tas2764->component, TAS2764_TDM_CFG5,
- TAS2764_TDM_CFG5_VSNS_ENABLE, 0);
- if (ret < 0)
- return ret;
+ if (tas2764->v_sense_slot != -1 || tas2764->i_sense_slot != -1) {
+ ret = tas2764_set_visense(tas2764, tas2764->v_sense_slot, tas2764->i_sense_slot);
+ if (ret < 0)
+ return ret;
+ }

- ret = snd_soc_component_update_bits(tas2764->component, TAS2764_TDM_CFG6,
- TAS2764_TDM_CFG6_ISNS_ENABLE, 0);
- if (ret < 0)
- return ret;

switch (tas2764->devid) {
case DEVID_SN012776:

--
2.55.0