Commit 09ed395b authored by Dan Murphy's avatar Dan Murphy Committed by Mark Brown

ASoC: tas2562: Add voltage sense slot configuration

Add Vsense slot configuration based on the device tree.  Adding this
property enables the slot programming to be moved to the tdm_set_slot
callback.  This in affect sets the slots for the Isense and Vsense and
enabling this these modes are now based on whether these features were
powered on or not.
Signed-off-by: default avatarDan Murphy <dmurphy@ti.com>
Link: https://lore.kernel.org/r/20200626154143.20351-3-dmurphy@ti.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent d7bd40ae
...@@ -250,12 +250,26 @@ static int tas2562_set_dai_tdm_slot(struct snd_soc_dai *dai, ...@@ -250,12 +250,26 @@ static int tas2562_set_dai_tdm_slot(struct snd_soc_dai *dai,
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = snd_soc_component_update_bits(component, TAS2562_TDM_CFG5,
TAS2562_TDM_CFG5_VSNS_SLOT_MASK,
tas2562->v_sense_slot);
if (ret < 0)
return ret;
ret = snd_soc_component_update_bits(component, TAS2562_TDM_CFG6,
TAS2562_TDM_CFG6_ISNS_SLOT_MASK,
tas2562->i_sense_slot);
if (ret < 0)
return ret;
return 0; return 0;
} }
static int tas2562_set_bitwidth(struct tas2562_data *tas2562, int bitwidth) static int tas2562_set_bitwidth(struct tas2562_data *tas2562, int bitwidth)
{ {
int ret; int ret;
int val;
int sense_en;
switch (bitwidth) { switch (bitwidth) {
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
...@@ -263,21 +277,18 @@ static int tas2562_set_bitwidth(struct tas2562_data *tas2562, int bitwidth) ...@@ -263,21 +277,18 @@ static int tas2562_set_bitwidth(struct tas2562_data *tas2562, int bitwidth)
TAS2562_TDM_CFG2, TAS2562_TDM_CFG2,
TAS2562_TDM_CFG2_RXWLEN_MASK, TAS2562_TDM_CFG2_RXWLEN_MASK,
TAS2562_TDM_CFG2_RXWLEN_16B); TAS2562_TDM_CFG2_RXWLEN_16B);
tas2562->v_sense_slot = tas2562->i_sense_slot + 2;
break; break;
case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_LE:
snd_soc_component_update_bits(tas2562->component, snd_soc_component_update_bits(tas2562->component,
TAS2562_TDM_CFG2, TAS2562_TDM_CFG2,
TAS2562_TDM_CFG2_RXWLEN_MASK, TAS2562_TDM_CFG2_RXWLEN_MASK,
TAS2562_TDM_CFG2_RXWLEN_24B); TAS2562_TDM_CFG2_RXWLEN_24B);
tas2562->v_sense_slot = tas2562->i_sense_slot + 4;
break; break;
case SNDRV_PCM_FORMAT_S32_LE: case SNDRV_PCM_FORMAT_S32_LE:
snd_soc_component_update_bits(tas2562->component, snd_soc_component_update_bits(tas2562->component,
TAS2562_TDM_CFG2, TAS2562_TDM_CFG2,
TAS2562_TDM_CFG2_RXWLEN_MASK, TAS2562_TDM_CFG2_RXWLEN_MASK,
TAS2562_TDM_CFG2_RXWLEN_32B); TAS2562_TDM_CFG2_RXWLEN_32B);
tas2562->v_sense_slot = tas2562->i_sense_slot + 4;
break; break;
default: default:
...@@ -285,17 +296,27 @@ static int tas2562_set_bitwidth(struct tas2562_data *tas2562, int bitwidth) ...@@ -285,17 +296,27 @@ static int tas2562_set_bitwidth(struct tas2562_data *tas2562, int bitwidth)
return -EINVAL; return -EINVAL;
} }
ret = snd_soc_component_update_bits(tas2562->component, val = snd_soc_component_read(tas2562->component, TAS2562_PWR_CTRL);
TAS2562_TDM_CFG5, if (val < 0)
TAS2562_TDM_CFG5_VSNS_EN | TAS2562_TDM_CFG5_VSNS_SLOT_MASK, return val;
TAS2562_TDM_CFG5_VSNS_EN | tas2562->v_sense_slot);
if (val & (1 << TAS2562_VSENSE_POWER_EN))
sense_en = 0;
else
sense_en = TAS2562_TDM_CFG5_VSNS_EN;
ret = snd_soc_component_update_bits(tas2562->component, TAS2562_TDM_CFG5,
TAS2562_TDM_CFG5_VSNS_EN, sense_en);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = snd_soc_component_update_bits(tas2562->component, if (val & (1 << TAS2562_ISENSE_POWER_EN))
TAS2562_TDM_CFG6, sense_en = 0;
TAS2562_TDM_CFG6_ISNS_EN | TAS2562_TDM_CFG6_ISNS_SLOT_MASK, else
TAS2562_TDM_CFG6_ISNS_EN | tas2562->i_sense_slot); sense_en = TAS2562_TDM_CFG6_ISNS_EN;
ret = snd_soc_component_update_bits(tas2562->component, TAS2562_TDM_CFG6,
TAS2562_TDM_CFG6_ISNS_EN, sense_en);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -669,9 +690,25 @@ static int tas2562_parse_dt(struct tas2562_data *tas2562) ...@@ -669,9 +690,25 @@ static int tas2562_parse_dt(struct tas2562_data *tas2562)
ret = fwnode_property_read_u32(dev->fwnode, "ti,imon-slot-no", ret = fwnode_property_read_u32(dev->fwnode, "ti,imon-slot-no",
&tas2562->i_sense_slot); &tas2562->i_sense_slot);
if (ret) if (ret) {
dev_err(dev, "Looking up %s property failed %d\n", dev_err(dev, "Property %s is missing setting default slot\n",
"ti,imon-slot-no", ret); "ti,imon-slot-no");
tas2562->i_sense_slot = 0;
}
ret = fwnode_property_read_u32(dev->fwnode, "ti,vmon-slot-no",
&tas2562->v_sense_slot);
if (ret) {
dev_info(dev, "Property %s is missing setting default slot\n",
"ti,vmon-slot-no");
tas2562->v_sense_slot = 2;
}
if (tas2562->v_sense_slot < tas2562->i_sense_slot) {
dev_err(dev, "Vsense slot must be greater than Isense slot\n");
return -EINVAL;
}
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment